开发一个钉钉温度报警机器人,让冷冻库保持安全温度!️

大家好!我是一名在酒店工作的小编,在处理冷冻库温度问题方面深感困扰。曾经发生过由于设备问题或意外停电导致食物变质的情况,给酒店带来不小的经济损失。为了解决这一问题,我开发了一款基于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的结合为温度报警机器人的开发提供了一种简单而高效的解决方案。它不仅能够监测冷冻库的温度,还能及时报警提醒,帮助我们避免食物浪费和经济损失。如果你在工作或生活中也需要对温度进行监测并及时采取行动,这款温度报警机器人将是你的理想选择。快来试试吧!🌡️✨

希望这篇推荐对你有所帮助,如果你有其他问题或需要进一步了解,欢迎在评论区留言,我会尽快回复哟!😊👍

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值