Webserver thu thập dữ liệu DHT11 với ESP8266

Ở bài trước chúng ta đã làm quen với việc lấy nội dung trang web thì hôm nay chúng ta sẽ quay trở lại với việc sử dụng ESP8266 đọc dữ liệu nhiệt độ độ ẩm môi trường từ cảm biến DHT11, sau đó sẽ thực hiện lập trình để có thể quan sát được thông tin về nhiệt độ độ ẩm thông qua wifi.

Đọc nhiệt độ độ ẩm với DHT11

Đầu tiên để có thể giao tiếp được với DHT11 thì cần tải thư viện bằng cách chọn Sketch > Include Library > Manage Libraries hoặc bạn có thể tải và cài thủ công thư viện tại đây

dht11_lib

Tiếp theo là kết nối theo sơ đồ tương tự như hình với ESP8266 v1 (dùng GPIO2) và ESP8266 v7/v12 (dùng GPIO5).

Lưu ý: Nguồn cấp cho DHT11 có thể dùng 3.3 – 5V.

esp8266-esp-01-gpio-dht11

Chương trình kiểm tra nhiệt độ và độ ẩm

Sau khi nạp xuống ta quan sát qua terminal sẽ thấy được thông tin như sau

esp8266_dht11_result

Theo dõi nhiệt độ độ ẩm qua mạng Wifi

Ta đã đọc được nhiệt độ và độ ẩm rồi thì làm thế nào để gửi nó lên mạng wifi trong nhà ? Có cần phải tạo web gì không ? Thật may mắn là ESP8266 có thể tạo ra một server và web ở trên địa chỉ sẵn có của nó, ta chỉ cần đăng nhập vào địa chỉ (ví dụ 192.168.1.xx) là có thông tin về nhiệt độ, độ ẩm rồi. Vậy cách làm thế nào, mình sẽ giải thích một số ý chính trong code dưới đây

Trước hết là cần thay đổi chỗ mang_wifipass_wifi thành tên và pass wifi nhà bạn là được.
Tiếp tục là tạo một web server với port là 80 bằng lệnh

Tạo xong rồi ta thực hiện kết nối ESP8266 vào mạng

Sau đó là khởi động server và in địa chỉ IP ra

Trong vòng lặp vô tận chúng ta sẽ thực hiện kiểm tra có client nào kết nối tới không bằng lệnh
WiFiClient client = server.available();  đồng thời đọc nhiệt độ và độ ẩm

Tiếp tục chờ yêu cầu (request) từ client (máy tính hoặc điện thoại khác cùng mạng wifi)

Coi như đã xong bước nhận yêu cầu, giờ là chuẩn bị câu trả lời cho yêu cầu từ client, ở đây ta sẽ tạo ra một trang web HTML sử dụng Bootstrap CSS để tự động reload trang sau mỗi một phút

Cuối cùng là hiển thị nhiệt độ và độ ẩm đọc được từ DHT11 lên và đợi cho tới khi client ngắt kết nối với ESP8266

Kết quả hoạt động tốt khi theo dõi qua laptop và điện thoại

web_dht11

1477802380142_4785

Bạn có thể tham khảo chương trình tại esp8266_dth11 và esp8266_dht11_web

Và các project liên quan tại  ESP8266 Arduino

Kết

Thế kà chúng ta đã thực hiện được giao tiếp với DHT11 để đọc nhiệt độ và độ ẩm, sau đó tạo webserver để gửi dữ liệu đã đọc được khi có yêu cầu từ laptop hoặc điện thoại, đây là cách đơn giản nhất để bạn có thể giám sát được thông tin, chẳng hạn như độ ẩm, nhiệt độ của đất cây trồng chẳng hạn. Cách này vẫn còn bị giới hạn chỉ những client trong cùng một mạng wifi mới có thể quan sát được thông tin. Nhưng không sao, mình sẽ giới thiệu với các bạn cách để bạn ở bất cứ nơi nào cũng có thể xem được thông tin ở những bài sau 😀

 

43 thoughts on “Webserver thu thập dữ liệu DHT11 với ESP8266

      1. của em nó cũng báo nan không biết cảm biến của em có bị hư không nữa. ban đầu hình như em cắm lộn hay sao mà nó nóng lắm sau đó em sửa lại thì nó cứ báo nan

  1. chào anh, em điều khiển động cơ bằng tiva c, sau đó em lại muốn dùng 8266 để điều khiển động cơ từ xa thì giưa 8266 và tiva cần giao tiếp gì ạ

    1. Hi em,
      Cái này thì em phải lập trình STM32 giao tiếp với NodeMCU qua lệnh AT nhé, hoặc một cách khác là giao tiếp I2C gửi dữ liệu từ STM32F4 sang NodeMCU

  2. Chào anh ! Cho e hỏi
    + Vì PC hay Smartphone phải cùng 1 mạng wifi với esp nên cách này chỉ hoạt động trong phạm vi wifi đó thôi phải không ạ?
    +”cách để bạn ở bất cứ nơi nào cũng có thể xem được thông tin ở những bài sau ????” là bài nào vậy ạ?
    +Sau khi hiển thị được em muốn lưu vào database thì làm thế nào ạ?
    Cám ơn anh

    1. Hi em, chính xác là như thế đó em, cái này chỉ hoạt động ở mạng cục bộ thôi
      Xem thông tin ở mọi nơi thì anh mới làm bài đơn giản là dùng blynk thôi em
      Muốn lưu database thì em dùng firebase là nhanh nhất nhé.

  3. Minh sử dụng cảm biến đo nhịp tim và huyết áp Max30100, no cũng tương tự như DHT11, nhưng s mình lam theo hướng dẫn trên thì nó không lấy được dữ liệu từ cảm biến.

  4. ad cho e hỏi xíu, em dùng blynk với web server để điều khiển cùng lúc thiết bị nhưng mà code của riêng 2 cái thì hoạt động bình thường, khi trộn code blynk với code webserver chung lại để điều khiển cùng lúc thì nó lại ko connect được, ad có biết vì sao k ạ

  5. Chào anh!
    em là là người bắt đầu., bây giờ mà em muốn thay ESP8266 thì phải làm thế nào? Anh có bài hướng dẫn làm với stm32 không ạ?

  6. Chào anh, với đề tài như vậy say khi mà em đã đọc được các thông số và cảm biến và hiển thị trên webserver rồi. Tiếp theo em muốn vẽ đồ thị các thông số đó thì có cách nào hay code ra sao để làm được không ạ?

    1. Đầu tiên để có thể giao tiếp được với DHT11 thì cần tải thư viện bằng cách chọn ….
      Kéo lên trên cùng đầu bài viết đọc đi bạn

  7. Chào mọi người, em muốn đưa dữ liệu từ PLC lên website bằng esp thì kết nối qua cổng RS485 được không ạ.
    Mọi người có tài liệu gì cho mình xin với.

    1. Hi em, được nhé, em dùng arduino thu thập dữ liệu, sau đó giao tiếp với ESP thông qua tập lệnh AT để gửi dữ liệu đi nhé

  8. Anh ơi cho em hỏi: E cắm mạch y hệt, dùng esp8266 v1, mạch nạp usb to com PL2303, lúc nạp chọn Generic Module ESP8266, Port chọn COM8, đã reset là esp, nhưng khi nạp lại báo lỗi bo Error compiling for board Generic ESP8266 Module. Như vậy là sao hả anh?

  9. tại sao mình lỗi như vậy
    warning: espcomm_sync failed
    error: espcomm_open failed
    error: espcomm_upload_mem failed
    error: espcomm_upload_mem failed
    giúp mình với

    1. Hi bạn, lỗi này là không upload được firmware nhé, bạn chỉ cần làm lại các bước theo thứ tự như ban đầu là được

  10. lỗi này là sao a
    warning: espcomm_sync failed
    error: espcomm_open failed
    error: espcomm_upload_mem failed
    error: espcomm_upload_mem failed
    giúp e với ,

    1. GPIO2 thì phải khai báo là chân D4 nha bạn, nó có cái hình map chân tương ứng với GPIO đó, hoặc bạn muốn dễ hơn thì #define DHTPIN 2

  11. Em là người mới bắt đầu và cũng chưa đượ chọc qua về lập trình. Nay em có 1 sensor cảm biến âm thanh cn07, 1 esp8266, 1 relay, e sử dụng đoạn code có sẵn trong arduino IDE nhưng vẫn không thể hoạt động được ý muốn là esp8266 nhận âm thanh và mở relay.
    Anh có thể giúp em được không ạ.
    Em cảm ơn.

      1. DẠ CODE E LÀM LÀ:
        #include
        #include
        #include

        const char *ssid = “artrend”; // tên của AP
        const char *password = “artrend2012”; // mật khẩu truy cập, để rỗng nếu không muốn cài mật khẩu
        int relayPin = 14; // mã GPIO của chân D5
        int sensor = 2;
        boolean val=1;//Mặc định không phát hiện âm thanh
        boolean relayPin=0;//Mặc định không bật đrelay
        ESP8266WebServer server(80); // khai báo server

        void handleRoot() { // tạo giao diện Web server
        response();
        }

        void handlerelayOn() {
        val=digitalRead(sensor);
        if(val==0) relayPin = 1; // bật sensor
        digitalWrite(relayPin, LOW); // gửi tín hiệu LOW đến relay để bật đèn
        response(); // cập nhật lại giao diện
        }

        void handlerelayOff() {
        val=digitalRead(sensor);
        if(val=0) relayPin = 0;
        digitalWrite(relayPin, HIGH);
        response();
        }

        void response(){ // code HTML cho phần giao diện điều khiển
        String s;
        s = “”
        “”
        “”
        “html, body {height:100%}”
        “a {text-decoration:none;}”
        “.css {display:block;width:100%;height:50%;color:white;font-size:50px}”
        “.on {background-color:#8BC34A}”
        “.off {background-color:#F44336}”
        “”
        “”

        “ON”


        “OFF”

        “”
        “”;

        server.send(200, “text/html”, s);
        }

        void setup() {
        delay(1000);
        Serial.begin(115200);

        WiFi.softAP(ssid, password); // tạo AP

        IPAddress apip = WiFi.softAPIP(); // lấy địa chỉ IP của AP để truy cập
        Serial.println(“Open browser and access to this IP: ” + apip);
        server.on(“/”, handleRoot); // tải giao diện khi vào IP
        server.on(“/RelayOn”, handlerelayOn); // nhận sự kiện từ web server và gọi hàm tương ứng
        server.on(“/RelayOff”, handlerelayOff);
        server.begin(); // mở server
        Serial.println(“HTTP server beginned”);

        pinMode(sensor, INPUT);
        // khai báo chân pin cần sử dụng
        pinMode(relayPin, OUTPUT);
        val=digitalRead(sensor);
        if(val==0) relayPin = 1; // gửi tín hiệu mặc định khi khởi động
        digitalWrite(relayPin, LOW);
        }

        void loop() {
        server.handleClient(); // chờ bắt sự kiện từ web server
        }

        1. Rồi giờ em bị lỗi chỗ nào ? Giao diện webserver ở đây của em có tác dụng gì thế ? Điều khiển bằng tay hay hiển thị trạng thái ?Vì nếu như yêu cầu của em ban đầu thì ko cần tới giao diện này để làm gì cả

Add Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.