Mục lục:

Báo cáo thời tiết bằng ứng dụng ThingSpeak MQTT và IFTTT: 8 bước
Báo cáo thời tiết bằng ứng dụng ThingSpeak MQTT và IFTTT: 8 bước

Video: Báo cáo thời tiết bằng ứng dụng ThingSpeak MQTT và IFTTT: 8 bước

Video: Báo cáo thời tiết bằng ứng dụng ThingSpeak MQTT và IFTTT: 8 bước
Video: HCMUS - IoT - Vật lí đại cương 2 - IFTTT, Open Weather, NodeRED, Thing Speak, Firebase 2024, Tháng mười một
Anonim
Báo cáo thời tiết bằng ứng dụng ThingSpeak MQTT và IFTTT
Báo cáo thời tiết bằng ứng dụng ThingSpeak MQTT và IFTTT

Giới thiệu

Một ứng dụng thời tiết dựa trên đám mây cung cấp báo cáo thời tiết hàng ngày dưới dạng thông báo qua email. Ứng dụng web này đo Nhiệt độ và Độ ẩm bằng SHT25 và Adafruit Huzzah ESP8266. Nó cung cấp cho chúng tôi dữ liệu Nhiệt độ và Độ ẩm theo thời gian thực và phân tích hàng giờ. Dữ liệu được gửi bằng ThingSpeak MQTT API và sau đó, chúng tôi sẽ cung cấp thông báo qua email cho người dùng bất cứ khi nào nhiệt độ đạt đến ngưỡng được chỉ định bằng giao thức IFTTT. SHT25 là cảm biến nhiệt độ và độ ẩm do Sensirion sản xuất. SHT25 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.

Đặc trưng

  • Cung cấp cho bạn số liệu thống kê và phân tích thời gian thực bằng cách sử dụng Thing Speak MQTT API
  • Thông báo qua email được cung cấp cho người dùng vào thời điểm được chỉ định bằng IFTTT
  • Bộ lập lịch tác vụ được sử dụng để Lập lịch tác vụ như tìm nạp dữ liệu từ các cảm biến, Xuất bản các bài đọc của bộ cảm biến, Đăng ký chủ đề MQTT
  • Nó sử dụng giao thức I2C để tìm nạp chỉ số cảm biến chính xác hơn, có thể mở rộng và có thể mở rộng
  • chế độ ngủ khi thiết bị không hoạt động hoặc không có lệnh gọi lại tác vụ nào được gọi.
  • lập lịch tác vụ hiệu quả cung cấp cách sử dụng không rắc rối
  • Một trang web riêng biệt được lưu trữ trong đó người dùng phải cung cấp thông tin đăng nhập người dùng của mình để tránh thiết bị của bạn nhấp nháy mỗi khi tiếp cận với các mạng Wi-Fi khác
  • SPIFFS được sử dụng để lưu trữ trang web của chúng tôi để làm cho mã của chúng tôi có thể đọc được và ít vụng về hơn

Bước 1: Đặc điểm kỹ thuật phần cứng và phần mềm

Đặc điểm kỹ thuật phần cứng và phần mềm
Đặc điểm kỹ thuật phần cứng và phần mềm
Đặc điểm kỹ thuật phần cứng và phần mềm
Đặc điểm kỹ thuật phần cứng và phần mềm

Đặc điểm kỹ thuật phần cứng

  • Adafruit esp8266 Hội đồng quản trị Huzzah
  • Huzzah Board Shield
  • Mô-đun cảm biến SHT25
  • Cáp I2C

Đặc điểm kỹ thuật phần mềm

  • Arduino IDE
  • IFTTT Thing Nói
  • API MQTT

Bước 2: Lưu trữ thông tin đăng nhập của người dùng

Lưu trữ thông tin đăng nhập của người dùng
Lưu trữ thông tin đăng nhập của người dùng
Lưu trữ thông tin đăng nhập của người dùng
Lưu trữ thông tin đăng nhập của người dùng

Ở đây chúng tôi đang sử dụng cảm biến SHT25 I2C để đọc giá trị thời gian thực của Nhiệt độ và Độ ẩm tương đối và đăng các giá trị này lên đám mây. Để cập nhật giá trị cảm biến theo thời gian và đăng các cập nhật này đồng thời, chúng tôi đang sử dụng Thư viện lập lịch tác vụ của Arduino. Đối với các hoạt động trên đám mây, chúng tôi đang sử dụng API ThingSpeak MQTT. Sau đó, chúng tôi sẽ cung cấp báo cáo thời tiết theo thời gian thực cho người dùng bằng các ứng dụng IFTTT. Bạn có thể làm theo các bước sau để tạo trạm thời tiết của riêng mình. Vì vậy, hãy tự làm.

Trước khi tiếp tục. Chúng tôi cần lưu thông tin đăng nhập của người dùng. Vì mục đích này, chúng tôi đang lưu trữ một máy chủ web tại 192.169.1.4. Chúng tôi đã lưu trữ biểu mẫu web của mình trong SPIFFS. Khi thiết bị khởi động, nó sẽ lưu trữ một máy chủ web trong 60 giây. Người dùng nên làm theo các bước sau.

  • Kết nối với AP ESPuser, Điều này được liệt kê trong danh sách mạng wifi khả dụng của bạn. Kết nối với AP này và nhập mật khẩu "*******"
  • Khi nó được kết nối, hãy vào trình duyệt của bạn, nhập IP 192.168.1.4.
  • Nhập SSID và mật khẩu của WiFi cục bộ của bạn vào các trường đầu vào và nhập SUBMIT
  • Thông tin đăng nhập này sẽ được lưu trong EEPROM
  • Sau 60 giây Thiết bị sẽ tự động ngắt kết nối khỏi AP
  • Lần tới khi bạn bật thiết bị, Người dùng không phải làm theo quy trình này, Thiết bị sẽ tự động lấy thông tin đăng nhập của người dùng từ EEPROM và tiếp tục nhận các bài đọc cảm biến từ Giao diện I2C và đăng nó lên đám mây

// --------- Cấu hình AP ------------ // IPAddress ap_local_IP (192, 168, 1, 4); IPAddress ap_gateway (192, 168, 1, 254); IPAddress ap_subnet (255, 255, 255, 0);

Serial.print ("Đang định cấu hình điểm truy cập…");

WiFi.softAPConfig (ap_local_IP, ap_gateway, ap_subnet);

Serial.print ("Thiết lập thông tin đăng nhập của người dùng");

WiFi.softAP (ssidAP, passAP);

server.on ("/", handleRoot);

server.onNotFound (onHandleNotFound);

server.begin ();

APTimer = millis ();

while (millis () - APTimer <APInterval) {

server.handleClient ();

}

// **************************** XỬ LÝ ROOT ****************** ********* // void xử lý () {

if (server.hasArg ("ssid") && server.hasArg ("mật khẩu"))

{

// Nếu tất cả các trường biểu mẫu đều chứa lệnh gọi dữ liệu

handelSubmit ()

handleSubmit (); }

khác {

// Hiển thị lại biểu mẫu

// đọc tệp chứa trong spiffs

Tệp tin = SPIFFS.open ("/ webform.html", "r");

server.streamFile (tệp, "text / html");

// đừng quên đóng tệp

file.close ();

}}

// Kiểm tra trạng thái rằng nó có các đối số ssid và mật khẩu

// Sau đó ghi thông tin đăng nhập vào ROM

ROMwrite (Chuỗi (server.arg ("ssid")), Chuỗi (server.arg ("mật khẩu")))

Bước 3: Thiết lập biểu mẫu web của bạn trong SPIFFS

SPIFFS

Hệ thống tệp Flash giao diện ngoại vi nối tiếp, gọi tắt là SPIFFS. Đó là một hệ thống tệp trọng lượng nhẹ dành cho bộ vi điều khiển với chip flash SPI. Chip flash tích hợp của ESP8266 có nhiều dung lượng cho các trang web của bạn, đặc biệt nếu bạn có phiên bản 1MB, 2MB hoặc 4MB. Chúng tôi cũng đã lưu trữ trang web của mình trong Hệ thống Flash. Chúng tôi cần làm theo một số bước để tải dữ liệu lên mức tăng đột biến

  1. Tải xuống công cụ:
  2. Trong thư mục sổ phác thảo Arduino của bạn, hãy tạo thư mục công cụ nếu nó chưa tồn tại
  3. Giải nén công cụ vào thư mục công cụ (đường dẫn sẽ giống như /Arduino/tools/ESP8266FS/tool/esp8266fs.jar)
  4. Khởi động lại Arduino IDE
  5. Mở một bản phác thảo (hoặc tạo một bản phác thảo mới và lưu nó)
  6. Đi tới thư mục phác thảo (chọn Sketch> Show Sketch Folder)
  7. Tạo một thư mục có tên dữ liệu và bất kỳ tệp nào bạn muốn trong hệ thống tệp ở đó. Chúng tôi đã tải lên trang HTML của mình với tên webform.html
  8. Đảm bảo rằng bạn đã chọn bo mạch, cổng và màn hình nối tiếp đã đóng
  9. Chọn Công cụ> Tải lên dữ liệu phác thảo ESP8266. Thao tác này sẽ bắt đầu tải các tệp lên hệ thống tệp flash ESP8266. Khi hoàn tất, thanh trạng thái IDE sẽ hiển thị thông báo SPIFFS Image Uploaded.

Tệp tin = SPIFFS.open ("/ webform.html", "r");

server.streamFile (tệp, "text / html");

// đừng quên đóng tệp

file.close ();

Bước 4: Lập lịch tác vụ

Trong hướng dẫn này, chúng tôi đang thực hiện hai thao tác:

  • Đọc dữ liệu từ SHT25 bằng giao thức I2C
  • Đăng dữ liệu cập nhật lên đám mây bằng ThingSpeak MQTT API

Để đạ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 hai nhiệm vụ khác nhau đề cập đến hai 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ờ Chúng tôi đang kết nối với Wifi cục bộ và nhà môi giới MQTT.
  • Bây giờ Nhiệm vụ 2 đã được bật và chúng tôi đang tắt Nhiệm vụ 1 Nhiệm vụ 2 là để xuất bản dữ liệu cảm biến tới nhà môi giới Thing Speak MQTT, tác vụ này sẽ chạy trong 20 giây cho đến khi hết thời gian chờ 20 giây
  • Khi Task2 hết thời gian chờ, Task 1 được bật lại và Task2 bị vô hiệu hóa. ở đây một lần nữa, chúng tôi đang nhận được giá trị cập nhật và quá trình tiếp tục
  • Khi không có cuộc gọi lại nào được gọi hoặc thiết bị không hoạt động, nó sẽ chuyển sang chế độ Ngủ sáng, do đó tiết kiệm điện năng.

// --------- nguyên mẫu cho lệnh gọi lại tác vụ ------------ //

void taskI2CCallback ();

void taskI2CDisable ();

void taskWiFiCallback ();

void taskWiFiDisable ();

// --------- Nhiệm vụ ------------ //

Tác vụ tI2C (2 * TASK_SECOND, TASK_FOREVER, & taskI2CCallback, & ts, false, NULL, & taskI2CDisable);

Tác vụ tWiFi (20 * TASK_SECOND, TASK_FOREVER, & taskWiFiCallback, & ts, false, NULL, & taskWiFiDisable);

// cho phép tI2C tI2C.enable ();

Bước 5: Đọc các giá trị nhiệt độ và độ ẩm từ SHT25

Đọc các giá trị nhiệt độ và độ ẩm từ SHT25
Đọc các giá trị nhiệt độ và độ ẩm từ SHT25

I2C là giao diện hai dây chỉ sử dụng hai dây để giao tiếp với thiết bị chính. Một là SCL (Serial Clock) và một là SDA (Serial Data). Mỗi thiết bị nô lệ có một địa chỉ duy nhất. SHT 25 cũng có địa chỉ 8 bit và có thể được truy cập bằng địa chỉ 0x44. nó có địa chỉ 8bits trong đó 7 bit là địa chỉ thực và trong khi LSB bit 0 ở ngoài cùng bên phải được sử dụng để báo hiệu việc đọc hoặc ghi vào thiết bị. Nếu bit 0 được đặt thành 1 thì thiết bị chủ sẽ đọc từ thiết bị I2C phụ. I2C đáng tin cậy hơn, có thể mở rộng và nhanh chóng và thậm chí nó còn có nhiều chế độ hoạt động giúp tiết kiệm năng lượng hơn nhiều

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 SHT25. SHT25 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 bắn một lần

Bước 6: Xuất bản giá trị cho ThingSpeak bằng API ThingSpeak MQTT

Xuất bản các giá trị thành ThingSpeak bằng API ThingSpeak MQTT
Xuất bản các giá trị thành ThingSpeak bằng API ThingSpeak MQTT

Để đăng các giá trị nhiệt độ và độ ẩm của chúng tôi lên đám mây, chúng tôi đang sử dụng ThingSpeak MQTT API. ThingSpeak là một nền tảng IoT. ThingSpeak là một dịch vụ web miễn phí cho phép bạn thu thập và lưu trữ dữ liệu cảm biến trên đám mây. MQTT là một giao thức phổ biến được sử dụng trong các hệ thống IoT để kết nối các thiết bị và cảm biến cấp thấp. MQTT được sử dụng để chuyển các tin nhắn ngắn đến và đi từ một nhà môi giới. ThingSpeak gần đây đã thêm một nhà môi giới MQTT để các thiết bị có thể gửi tin nhắn đến ThingSpeak. Bạn có thể làm theo quy trình để thiết lập Kênh ThingSpeak từ bài đăng này

ThingSpeak MQTT

MQTT là một kiến trúc xuất bản / đăng ký được phát triển chủ yếu để kết nối băng thông và các thiết bị hạn chế năng lượng qua mạng không dây. Nó là một giao thức đơn giản và nhẹ, chạy qua các ổ cắm TCP / IP hoặc WebSockets. MQTT qua WebSockets có thể được bảo mật bằng SSL. Kiến trúc xuất bản / đăng ký cho phép thông báo được đẩy đến các thiết bị khách mà thiết bị không cần phải liên tục thăm dò máy chủ. Ứng dụng khách là bất kỳ thiết bị nào kết nối với nhà môi giới và có thể xuất bản hoặc đăng ký các chủ đề để truy cập thông tin. Một chủ đề chứa thông tin định tuyến cho nhà môi giới. Mỗi khách hàng muốn gửi tin nhắn sẽ xuất bản chúng theo một chủ đề nhất định và mỗi khách hàng muốn nhận tin nhắn đăng ký một chủ đề nhất định

Xuất bản và Đăng ký bằng ThingSpeak MQTT

  • Xuất bản lên các kênh nguồn cấp dữ liệu kênh / xuất bản /
  • Xuất bản lên một kênh trường cụ thể / xuất bản / các lĩnh vực / lĩnh vực /
  • Đăng ký kênh trường kênh / subscribe //
  • Đăng ký kênh nguồn cấp dữ liệu kênh riêng // subscribe / fields / field /
  • Đăng ký tất cả các lĩnh vực của kênh. các kênh // subscribe / fields / feild /

void taskWiFiCallback ()

{

Serial.println ("taskWiFiCallbackStarted");

Serial.print ("thời gian chờ cho tác vụ này: / t");

Serial.println (tWiFi.getTimeout ());

if (! mqttCli.connected ())

{

Serial.println ("Máy khách không được kết nối");

kết nối lạiMQTT ();

}

String topicString = "channel /" + String (channelID) + "/ Publishing /" + String (writeAPIKey);

int topicLength = topicString.length () + 1;

char topicBuffer [topicLength];

topicString.toCharArray (topicBuffer, topicLength + 1);

Serial.println (topicBuffer);

Chuỗi dataString = String ("field1 =" + String (tempC, 1) + "& field2 =" + String (tempF, 1) + "& field3 =" + String (ẩm, 1));

int dataLength = dataString.length () + 1;

byte dataBuffer [dataLength];

dataString.getBytes (dataBuffer, dataLength);

mqttCli.beginPublish (topicBuffer, dataLength, false);

Serial.println (mqttCli.write (dataBuffer, dataLength)? "Publishers": "đã xuất bản không thành công");

mqttCli.endPublish ();

//mqttCli.loop ();

}

Bước 7: Thông báo qua email của Báo cáo thời tiết

Báo cáo thời tiết Thông báo qua email
Báo cáo thời tiết Thông báo qua email
Báo cáo thời tiết Thông báo qua email
Báo cáo thời tiết Thông báo qua email

Chúng tôi đang sử dụng các ứng dụng IFTTT để cung cấp thông báo qua email cho báo cáo thời tiết theo thời gian thực cho người dùng. Vì vậy, chúng tôi đã triển khai nó thông qua ThingSpeak. Chúng tôi đang tính trung bình các giá trị 5 ngày của nhiệt độ và độ ẩm. Bất cứ khi nào giá trị của mục nhập cuối cùng lớn hơn giá trị trung bình. Nó sẽ kích hoạt một thông báo qua email "đó là một ngày nóng". và khi nó nhỏ hơn giá trị trung bình. Nó sẽ kích hoạt một email thông báo "Thật là một ngày đẹp trời". Hàng ngày, vào khoảng 10:00 sáng (IST), chúng tôi sẽ nhận được thông báo qua email

channelID = ******;

iftttURL = 'https://maker.ifttt.com/**************';

MoistData = thingSpeakRead (channelID, 'Fields', 3, 'NumDays', 5); tempData = thingSpeakRead (channelID, 'Trường', 1, 'NumDays', 5);

perHumid = max (Dữ liệu độ ẩm) -min (Dữ liệu độ ẩm);

MoistValue = 0,1 * perHumid + phút (Dữ liệu độ ẩm);

perTemp = max (tempData) -min (tempData);

tempValue = 0,1 * perTemp + min (tempData);

urlTemp = strcat ('https://api.thingspeak.com/channels/', string (channelID), '/fields/1/last.txt');

urlHumid = strcat ('https://api.thingspeak.com/channels/', string (channelID), '/fields/3/last.txt'); lastTempValue = str2num (webread (urlTemp)); lastHumidValue = str2num (webread (urlHumid));

if (lastTempValue

if (lastTempValue> tempValue || lastHumidValue> wetValue)

plantMessage = 'Hôm nay trời nóng quá.'; webwrite (iftttURL, 'value1', plantMessage, 'value2', lastTempValue, 'value3', lastHumidValue); kết thúc

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

Mã tổng thể
Mã tổng thể
Mã tổng thể
Mã tổng thể
Mã tổng thể
Mã tổng thể

Mã tổng thể

Mã tổng thể có sẵn trong kho lưu trữ GitHub này

Hạn chế

  • Có một số vấn đề với việc xuất bản dữ liệu bằng cách sử dụng phương thức xuất bản cho phần lớn dữ liệu. Để giải quyết vấn đề này, chúng tôi đang sử dụng hàm write ()
  • SPIFFS phải được định dạng trước khi tải dữ liệu mới lên SPIFFS.
  • Bạn không được sử dụng hàm delay (). delay () cản trở hoạt động nền. Thay vào đó, chỉ tạo độ trễ bằng cách sử dụng millis () nếu cần thiết

Tín dụng

  • ESP826WebServer
  • Bảng kế hoạch
  • SHT 25
  • API ThingSpeak MQTT
  • IFTTT
  • PubSubClient

Đề xuất: