Mục lục:

Ứng dụng web thời tiết sử dụng Esp8266: 7 bước
Ứng dụng web thời tiết sử dụng Esp8266: 7 bước

Video: Ứng dụng web thời tiết sử dụng Esp8266: 7 bước

Video: Ứng dụng web thời tiết sử dụng Esp8266: 7 bước
Video: [Lập trình ESP 8266]Bài 7 - Kỹ thuật ajax trong truyền nhận dữ liệu trên web server 2024, Có thể
Anonim
Ứng dụng web thời tiết bằng Esp8266
Ứng dụng web thời tiết bằng Esp8266

SHT 31 là Cảm biến Nhiệt độ và Độ ẩm do Sensirion sản xuất. SHT31 cung cấp độ chính xác cao khoảng ± 2% RH. Phạm vi độ ẩm của nó là từ 0 đến 100% và phạm vi nhiệt độ là từ -40 đến 125 ° C. Nó đáng tin cậy và nhanh hơn nhiều với thời gian phản hồi của Cảm biến 8 giây. Chức năng của nó bao gồm xử lý tín hiệu nâng cao và khả năng tương thích I2C. Nó có các chế độ hoạt động khác nhau giúp tiết kiệm năng lượng.

Trong hướng dẫn này, chúng tôi đã giao tiếp SHT 31 với bảng Adafruit Huzzah. Để đọc các giá trị Nhiệt độ và Độ ẩm, chúng tôi đã sử dụng tấm chắn I2C ESP8266. Bộ điều hợp này giúp người dùng có thể truy cập tất cả các chân và cung cấp môi trường I2C thân thiện với người dùng.

Bước 1: Yêu cầu phần cứng

Yêu cầu phần cứng
Yêu cầu phần cứng
Yêu cầu phần cứng
Yêu cầu phần cứng
Yêu cầu phần cứng
Yêu cầu phần cứng

Phần cứng được sử dụng để hoàn thành tác vụ này:

1. SHT31

2. Adafruit Huzzah ESP8266

3. Bộ chuyển đổi I2C ESP8266

4. Cáp I2C

Bước 2: Kết nối phần cứng

Kết nối phần cứng
Kết nối phần cứng
Kết nối phần cứng
Kết nối phần cứng

Bước này bao gồm hướng dẫn kết nối phần cứng. Phần này giải thích về cơ bản các kết nối dây cần thiết giữa cảm biến và ESP8266. Các kết nối như sau.

  1. SHT31 hoạt động trên I2C. Hình ảnh trên minh họa kết nối giữa mô-đun ESP8266 và SHT31. Chúng tôi đang sử dụng cáp I2C cho nó hoặc chúng tôi có thể sử dụng 4 dây nối F đến F.
  2. một dây được sử dụng cho Vcc, dây thứ hai cho GND và hai dây khác tương ứng cho SDA và SCL.
  3. Theo bộ điều hợp I2C, chân 2 và chân 14 của bảng ESP8266 được sử dụng làm SDA và SCL tương ứng

Bước 3: Mã lập lịch tác vụ

Trong hướng dẫn này, chúng tôi đang thực hiện ba hoạt động

  • Đọc dữ liệu từ SHT11 bằng giao thức I2C
  • lưu trữ máy chủ web và đăng kết quả đọc cảm biến lên trang web
  • đăng các bài đọc cảm biến lên API ThingSpeak

Để đạt được điều này, chúng tôi sử dụng thư viện TaskScheduler. Chúng tôi đã lên lịch cho ba nhiệm vụ khác nhau đề cập đến ba hoạt động kiểm soát khác nhau. Điều này được thực hiện như sau

  • Nhiệm vụ 1 là để đọc giá trị cảm biến, nhiệm vụ này chạy trong 1 giây cho đến khi hết thời gian chờ 10 giây.
  • Khi Task1 hết thời gian chờ, Task 2 được bật và Task1 bị tắt.
  • Chúng tôi kết nối với AP trong lần gọi lại này, Hai biến boolean được thực hiện để xử lý việc chuyển đổi giữa STA và AP
  • Trong Tác vụ 2, chúng tôi đang lưu trữ một máy chủ web tại 192.168.1.4. Tác vụ này chạy cứ sau 5 giây cho đến khi hết thời gian chờ là 50 giây
  • Khi Nhiệm vụ 2 hết thời gian chờ, Nhiệm vụ 3 được bật và Tác vụ 2 bị vô hiệu hóa.
  • Chúng tôi kết nối với STA (IP cục bộ) trong cuộc gọi lại này
  • Trong Nhiệm vụ 3, chúng tôi sẽ đăng việc đọc cảm biến lên API ThingSpeak trên đám mây
  • Tác vụ 3 chạy cứ sau năm giây cho đến khi hết thời gian chờ, tức là 50 giây
  • Khi Task3 hết thời gian chờ, Task 1 được bật lại và Task3 bị vô hiệu hóa.
  • Khi không có cuộc gọi lại nào hoặc thiết bị không hoạt động, nó sẽ chuyển sang chế độ Ngủ sáng để tiết kiệm điện năng.

Bộ lập lịch ts;

// Nhiệm vụ cho i2c, lưu trữ máy chủ web và đăng trên thingspeak

Tác vụ tI2C (1 * TASK_SECOND, TASK_FOREVER, & taskI2CCallback, & ts, false, NULL, & taskI2CDisable); Task tAP (5 * TASK_SECOND, TASK_FOREVER, & taskAPCallback, & ts, false, NULL, & taskAPDisable); Tác vụ tWiFi (5 * TASK_SECOND, TASK_FOREVER, & taskWiFiCallback, & ts, false, NULL, & taskWiFiDisable); // thời gian chờ cho các tác vụ tI2C.setTimeout (10 * TASK_SECOND); tAP.setTimeout (50 * TASK_SECOND); tWiFi.setTimeout (50 * TASK_SECOND); // kích hoạt tác vụ I2C tI2C.enable ();

Bước 4: Mã để đọc các giá trị nhiệt độ và độ ẩm

Chúng tôi đang sử dụng thư viện Wire.h để đọc các giá trị nhiệt độ và độ ẩm. Thư viện này hỗ trợ giao tiếp i2c giữa cảm biến và thiết bị chính. 0x44 là địa chỉ I2C cho SHT31.

SHT31 hoạt động ở một phương thức hoạt động khác. Bạn có thể tham khảo biểu dữ liệu cho điều đó.

Chúng tôi đang sử dụng 0x2C và 0x06 làm MSB và LSB tương ứng cho hoạt động chụp một lần.

// Gọi lại nhiệm vụ I2C void taskI2CCallback ()

{Serial.println ("taskI2CStarted"); unsigned int root [6]; // bắt đầu truyền từ 0x44; Wire.beginTransmission (Addr); // để truyền một lần với độ lặp lại cao, chúng tôi sử dụng 0x2C (MSB) và 0x06 (LSB) Wire.write (0x2C); Wire.write (0x06); // kết thúc truyền Wire.endTransmission (); // yêu cầu byte từ 0x44 Wire.beginTransmission (Addr); Wire.endTransmission (); Wire.requestFrom (Addr, 6); if (Wire.available () == 6) {// data [0] và data [1] chứa 16 bit nhiệt độ. root [0] = Wire.read (); root [1] = Wire.read (); // data [2] chứa 8 bit gốc CRC [2] = Wire.read (); // data [3] và data [4] chứa 16 bit gốc độ ẩm [3] = Wire.read (); root [4] = Wire.read (); // data [5] gồm 8 bit CRC root [5] = Wire.read (); } int temp = (root [0] * 256) + root [1]; // shift MSB 8 bit thêm LSB float cTemp = -45.0 + (175.0 * temp / 65535.0); float fTemp = (cTemp * 1.8) + 32.0; // dịch chuyển MSB 8 bit thêm LSB vào nó bằng độ phân giải đầy đủ và * 100 cho độ ẩm phần trăm float = (100.0 * ((root [3] * 256.0) + root [4])) / 65535.0;

tempC = cTemp;

tempF = fTemp; ẩm = độ ẩm; Serial.print ("Nhiệt độ tính bằng C: / t"); Serial.println (String (cTemp, 1)); Serial.print ("Nhiệt độ tính bằng F: / t"); Serial.println (String (fTemp, 1)); Serial.print ("Độ ẩm: / t"); Serial.println (Chuỗi (độ ẩm, 1)); }

Bước 5: Mã để lưu trữ một máy chủ trang web

Mã để lưu trữ một máy chủ trang web
Mã để lưu trữ một máy chủ trang web
Mã để lưu trữ một máy chủ trang web
Mã để lưu trữ một máy chủ trang web

Chúng tôi đã lưu trữ một máy chủ web từ thiết bị của mình trên một IP tĩnh.

  • Thư viện ESP8266WebServer được sử dụng để lưu trữ máy chủ web
  • Đầu tiên chúng ta cần khai báo địa chỉ IP, Gateway và mặt nạ mạng con để tạo IP tĩnh của chúng ta
  • Bây giờ hãy khai báo ssid và mật khẩu cho Điểm truy cập của bạn.
  • kết nối với Điểm truy cập từ bất kỳ thiết bị STA nào
  • lưu trữ máy chủ trên cổng 80 là cổng mặc định cho giao thức truyền thông internet, Giao thức truyền siêu văn bản (HTTP)
  • nhập 192.168.1.4 trên trình duyệt web của bạn cho trang web giới thiệu và 192.168.1.4/Value cho trang web đọc cảm biến

// Ip tĩnh cho AP

IPAddress ap_local_IP (192, 168, 1, 4);

IPAddress ap_gateway (192, 168, 1, 254);

IPAddress ap_subnet (255, 255, 255, 0); // ssid và AP cho WiFi cục bộ ở chế độ STA

const char WiFissid = "*********";

const char WiFipass = "*********";

// ssid và chuyển cho AP

const char APssid = "********";

const char APpass = "********";

Máy chủ ESP8266WebServer (80);

thiết lập vô hiệu {

server.on ("/", onHandleDataRoot);

server.on ("/ Giá trị", onHandleDataFeed);

server.onNotFound (onHandleNotFound);

}

void taskAPCallback () {

Serial.println ("taskAP đã bắt đầu");

server.handleClient ();

}

void onHandleDataRoot () {server.send (200, "text / html", PAGE1); }

void onHandleDataFeed () {

server.send (200, "text / html", PAGE2); }

void onHandleNotFound () {

String message = "Không tìm thấy tệp / n / n";

tin nhắn + = "URI:";

message + = server.uri ();

tin nhắn + = "\ nMethod:";

message + = (server.method () == HTTP_GET)? "GET": "POST";

message + = "\ nĐối số:";

message + = server.args ();

tin nhắn + = "\ n";

server.send (404, "văn bản / đồng bằng", thông báo);}

void kết nối lạiAPWiFi () {

WiFi.mode (WIFI_AP_STA);

chậm trễ (100);

WiFi.disconnect ();

trạng thái boolean = WiFi.softAPConfig (ap_local_IP, ap_gateway, ap_subnet);

if (status == true) {

Serial.print ("Đặt soft-AP…");

boolean ap = WiFi.softAP (APssid, APpass);

if (ap == true) {

Serial.print ("được kết nối với: / t");

// IPAddress myIP = WiFi.softAPIP ();

Serial.println (WiFi.softAPIP ());

}

server.begin ();

}

}

Bước 6: Mã để đăng dữ liệu cần nói

Mã để đăng dữ liệu để nói
Mã để đăng dữ liệu để nói
Mã để đăng dữ liệu để nói
Mã để đăng dữ liệu để nói
Mã để đăng dữ liệu để nói
Mã để đăng dữ liệu để nói
Mã để đăng dữ liệu để nói
Mã để đăng dữ liệu để nói

Ở đây chúng tôi đăng các bài đọc cảm biến lên Thing Speak. các bước sau là cần thiết để hoàn thành nhiệm vụ này-

  • Tạo tài khoản của bạn bằng cách nói
  • Tạo các kênh và trường để lưu trữ dữ liệu cảm biến của bạn
  • chúng ta có thể lấy và đăng dữ liệu từ ESP lên thingSpeak và ngược lại bằng cách sử dụng các yêu cầu GET và POST tới api.
  • chúng ta có thể đăng dữ liệu của mình lên ThingSpeak như sau

void taskWiFiCallback () {

WiFiClient wifiClient; if (wifiClient.connect (hostId, 80)) {String postStr = apiKey; postStr + = "& field1 ="; postStr + = String (ẩm); postStr + = "& field2 ="; postStr + = String (tempC); postStr + = "& field3 ="; postStr + = String (tempF); postStr + = "\ r / n / r / n"; wifiClient.print ("ĐĂNG / cập nhật HTTP / 1.1 / n"); wifiClient.print ("Máy chủ: api.thingspeak.com / n"); wifiClient.print ("Kết nối: close / n"); wifiClient.print ("X-THINGSPEAKAPIKEY:" + apiKey + "\ n"); wifiClient.print ("Loại-Nội dung: application / x-www-form-urlencoded / n"); wifiClient.print ("Nội dung-Độ dài:"); wifiClient.print (postStr.length ()); wifiClient.print ("\ n / n"); wifiClient.print (postStr); } wifiClient.stop (); }

Bước 7: Mã tổng thể

Mã tổng thể có sẵn trong kho lưu trữ github của tôi

Tín dụng:

  • Arduino JSON: ArduinoJson
  • ESP826WebServer
  • Bảng kế hoạch
  • SHT 31
  • Quét I2C
  • HIH6130 hướng dẫn có sẵn
  • Dây Arduino
  • NCD.io

Đề xuất: