大家好!我是一名在酒店工作的小编,在处理冷冻库温度问题方面深感困扰。曾经发生过由于设备问题或意外停电导致食物变质的情况,给酒店带来不小的经济损失。为了解决这一问题,我开发了一款基于ESP8266和钉钉webhook的温度报警机器人,它能够帮助监测并实时报告冷冻库的温度。通过这个智能物联网设备,我能够轻松地掌握冷冻库的状况,并及时采取措施,避免食物浪费和经济损失。🌟
💡 独特特点1:硬件设备简单易得,功能强大 🛠️
这个温度报警机器人的核心硬件是ESP8266和DS18B20温度传感器。ESP8266是一款低成本、低功耗的Wi-Fi模块,它可以将传感器采集到的温度数据发送到指定地址。而DS18B20温度传感器是一款精准、可靠的数字温度传感器,能够准确测量冷冻库的温度。通过这两个设备的组合,我们可以实现低成本高效率的温度监测系统。在使用过程中,只需将温度传感器连接到ESP8266上,并使用简单的代码即可完成配置。🔧
💡 独特特点2:自动定时上报温度数据,实时把握冷冻库状态 📊
为了避免人工定时巡查,我在代码中设置了一个定时器,每隔30分钟就会自动上报一次温度数据。这样一来,即使我不在冷冻库附近,也能及时获取最新的温度信息。同时,第一次启动后立即上传一次数据,防止启动时的漏报。这样一来,无论是白天还是夜晚,我都能随时了解冷冻库的温度情况,并在必要时采取紧急措施。📈
💡 独特特点3:钉钉群通知,及时报警提醒 📢
为了进一步提高温度报警的实时性,我选择了钉钉webhook作为通知方式。在一旦温度超过设定的安全范围时,机器人会自动向工作群发送温度报警通知。这样,我和其他工作人员都能立即收到报警提醒,可以及时采取措施,保证冷冻库中食物的安全。不仅如此,钉钉还支持在手机端接收报警通知,有效避免了漏报的风险。📲
现在,我再加上一张温度报警机器人的示意图,帮助大家更好地理解这个小设备的工作原理:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include "certs.h"
#include <OneWire.h>
#include <DallasTemperature.h>
// WiFi配置
const char* ssid = "wanjiale_AP";
const char* password = "wanjiae";
// NTP配置
const char* ntpServer = "ntp.aliyun.com";
const long gmtOffset = 8 * 3600; // GMT+8:00
const int daylightOffset = 0;
// DS18B20配置
#define ONE_WIRE_BUS D2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// HTTP请求配置
const char* dingtalk_host = "oapi.dingtalk.com";
const uint16_t dingtalk_port = 443;
const char* dingtalk_access_token = "c01e2c0c86c07a98f48328f3408b413ae2ad5ddfc9099e5604cd0c6181b93b403";
X509List cert(cert_GlobalSign_Organization_Validation_CA___SHA256___G3);
// 标志变量,用于控制上传数据的逻辑
bool isFirstLoop = true;
unsigned long lastUploadTime = 0;
const unsigned long uploadInterval = 30 * 60 * 1000; // 30分钟的间隔
// put your setup code here, to run once:
void setup() {
Serial.begin(115200);
Serial.println();
sensors.begin();
connectWiFi();
syncNTPTime();
}
// put your main code here, to run repeatedly:
void loop() {
unsigned long currentTime = millis();
// 第一次启动后立即上传一次数据
if (isFirstLoop) {
uploadData();
isFirstLoop = false;
lastUploadTime = currentTime;
}
// 间隔30分钟再次上传数据
if (currentTime - lastUploadTime >= uploadInterval) {
uploadData();
lastUploadTime = currentTime;
}
// 其他代码...
delay(100); // 适当的延迟以避免过于频繁的循环
}
void uploadData() {
WiFiClientSecure client;
Serial.print("Connecting to ");
Serial.println(dingtalk_host);
client.setTrustAnchors(&cert);
if (!client.connect(dingtalk_host, dingtalk_port)) {
Serial.println("Connection failed");
return;
}
float temperatureC = readDSTemperatureC();
String url = "/robot/send?access_token=" + String(dingtalk_access_token);
String payload = "{\"msgtype\": \"text\",\"text\": {\"content\":\"当前温度:" + String(temperatureC) + "\"}}";
sendHTTPRequest(client, url, payload);
}
void connectWiFi() {
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connection successful");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void syncNTPTime() {
configTime(gmtOffset, daylightOffset, ntpServer);
Serial.print("Waiting for NTP time sync: ");
time_t now = time(nullptr);
while (now < gmtOffset * 2) {
delay(500);
Serial.print(".");
now = time(nullptr);
}
Serial.println("");
struct tm timeinfo;
gmtime_r(&now, &timeinfo);
char dtime[20];
strftime(dtime, sizeof(dtime), "%Y-%m-%d %H:%M:%S", &timeinfo);
Serial.print("Current time: ");
Serial.print(asctime(&timeinfo));
}
float readDSTemperatureC() {
sensors.requestTemperatures();
float tempC = sensors.getTempCByIndex(0);
if (tempC == -127.00) {
Serial.println("Failed to read from DS18B20 sensor");
return -999.99; // 返回一个无效的温度值,表示读取失败
} else {
Serial.print("Temperature Celsius: ");
Serial.println(tempC);
return tempC;
}
}
void sendHTTPRequest(WiFiClientSecure& client, const String& url, const String& payload) {
Serial.print("Requesting URL: ");
Serial.println(url);
String headers = "POST " + url + " HTTP/1.1\r\n" +
"Host: " + dingtalk_host + "\r\n" +
"User-Agent: BuildFailureDetectorESP8266\r\n" +
"Content-Type: application/json\r\n" +
"Content-Length: " + String(payload.length()) + "\r\n" +
"Connection: close\r\n\r\n";
client.print(headers + payload);
Serial.println("Request sent");
Serial.println("Waiting for response...");
while (client.connected() && !client.available()) {
delay(100);
}
if (client.connected()) {
while (client.available()) {
String line = client.readStringUntil('\n');
Serial.println(line);
}
}
Serial.println("Response received");
Serial.println("Closing connection");
}
通过我的开发经验,ESP8266与钉钉webhook的结合为温度报警机器人的开发提供了一种简单而高效的解决方案。它不仅能够监测冷冻库的温度,还能及时报警提醒,帮助我们避免食物浪费和经济损失。如果你在工作或生活中也需要对温度进行监测并及时采取行动,这款温度报警机器人将是你的理想选择。快来试试吧!🌡️✨
希望这篇推荐对你有所帮助,如果你有其他问题或需要进一步了解,欢迎在评论区留言,我会尽快回复哟!😊👍