ESP8266 + MQTT + 土壤湿度传感器
连线

#include <Arduino.h>
#include <Ticker.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#define PIN_AO A0
#define PIN_DO 4
const char *SSID = "优美屋205";
const char *PASSWORD = "18111549";
const char *MQTT_SERVER = "broker-cn.emqx.io";
const int MQTT_PROT = 1883;
const char *MQTT_TOPIC_PUB_ONLINE = "my/home/pub_online";
const char *MQTT_TOPIC_PUB_UPDATE = "my/home/pub_update";
const char *MQTT_TOPIC_SUB_DATA = "my/home/sub_data";
const char *MQTT_TOPIC_HEARTBEAT = "my/home/heartbeat";
const char *CLIENT_ID = "esp8266-457065e5-f063-474e-2saf-cacf5cb52af5";
int M0 = 1024;
int M1 = 464;
char *msg;
Ticker ticker;
WiFiClient espClient;
PubSubClient client(espClient);
void init_wifi();
void mqtt_reconnect();
void mqtt_msg_callback(char *topic, byte *payload, unsigned int length);
void mqtt_heartbeat();
void update_data();
void setup()
{
Serial.begin(115200);
init_wifi();
client.setServer(MQTT_SERVER, MQTT_PROT);
client.setCallback(mqtt_msg_callback);
ticker.attach(1, mqtt_heartbeat);
}
void loop()
{
if (!client.connected())
{
mqtt_reconnect();
}
client.loop();
update_data();
}
void init_wifi()
{
Serial.println("Connecting to");
Serial.println(SSID);
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
}
void mqtt_reconnect()
{
while (!client.connected())
{
Serial.print("Attempting MQTT connection...");
if (client.connect(CLIENT_ID))
{
Serial.println("connected");
client.publish(MQTT_TOPIC_PUB_ONLINE, "online");
client.subscribe(MQTT_TOPIC_PUB_UPDATE);
}
else
{
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void mqtt_msg_callback(char *topic, byte *payload, unsigned int length)
{
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
String data = "";
for (unsigned int i = 0; i < length; i++)
{
Serial.print((char)payload[i]);
data += (char)payload[i];
}
Serial.println();
}
void mqtt_heartbeat()
{
if (client.connected())
{
client.publish(MQTT_TOPIC_HEARTBEAT, "1");
}
}
void update_data(){
if (client.connected())
{
Serial.print("AO => ");
Serial.print(analogRead(PIN_AO));
Serial.print(" DO =>");
Serial.print(digitalRead(PIN_DO));
float HUMI = (M0 - analogRead(PIN_AO)) / ((M0 - M1) / 100);
Serial.print("HUMI =>");
Serial.print(HUMI);
Serial.println("% ");
if(HUMI <= 30){
msg = "主人,我渴了, 我要喝水";
Serial.println("主人,我渴了, 我要喝水");
}else{
msg = "主人,我不渴";
Serial.println("主人,我不渴");
}
delay(1000);
client.publish(MQTT_TOPIC_SUB_DATA, msg);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通