硬件:esp8266 + dht11
服务代理程序:mosquitto
使用wifi连接网络。
代码
#include <ESP8266WiFi.h>
#include <DHTesp.h>
#include "Adafruit_MQTT.h".
#include "Adafruit_MQTT_Client.h"
//====================================================================================
#if 0 //1:使用串口打印输出 0:禁止串口输出
#define coutInit(x) Serial.begin(x)
#define cout Serial.print
#define coutln Serial.println
#else
#define coutInit(x)
#define cout(x)
#define coutln(x)
#endif
//====================================================================================
#define WLAN_SSID "求约得密码"
#define WLAN_PASS "12345678"
void WifiConnect()
{
cout("\nConnecting to ");
coutln(WLAN_SSID);
WiFi.begin(WLAN_SSID, WLAN_PASS);
int wifiCount = 120; //60s没有连接上就重启
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
cout(".");
wifiCount --;
if(wifiCount <= 0)
{
cout("\nReset system......");
system_restart();
}
}
coutln();
cout("WiFi connected,IP address: ");
coutln(WiFi.localIP());
}
//====================================================================================
//服务器启动服务命令: mosquitto -c /etc/mosquitto/mosquitto.conf -d
WiFiClient client;
#define AIO_SERVER "8.888.888.88"
#define AIO_SERVERPORT 1883
#define AIO_USERNAME "jtMqtt"
#define AIO_KEY "123456"
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
void MQTT_connect(int reconnect = 0) //失联情况下会自动重新连接
{
int8_t ret;
if(!reconnect)
{
if (mqtt.connected())
return;
}
cout("Connecting to MQTT... ");
int retries = 10; //自动重连10次,10次后连不上进入死循环,等待看门狗重启
while ((ret = mqtt.connect()) != 0) // connect will return 0 for connected
{
coutln(mqtt.connectErrorString(ret));
coutln("Retrying MQTT connection in 5 seconds...");
mqtt.disconnect();
delay(5000);
retries--;
if (retries <= 0)
{
//while (1);
//cout("\nReset system......");
//system_restart();
WifiConnect();
}
}
coutln("MQTT Connected!");
}
Adafruit_MQTT_Publish updataCount = Adafruit_MQTT_Publish(&mqtt,"esp_updataCount_SW",0); //用于监测数据更新次数
bool sendUpdataCount()
{
static unsigned int runCount = 0;
cout(F("Sending updataCount val: ")); cout(runCount); cout("...");
bool res = updataCount.publish(runCount++);
if(res)
coutln(F("OK!"));
else
coutln(F("Failed"));
return res;
}
//======================================== 温湿度传感器 ============================================
#define dhtPin 2
DHTesp dht;
Adafruit_MQTT_Publish pub_temp = Adafruit_MQTT_Publish(&mqtt,"esp_temp_SW",0);
Adafruit_MQTT_Publish pub_hum = Adafruit_MQTT_Publish(&mqtt,"esp_hum_SW",0);
void dht11Init()
{
coutln("DHT11 initialization...");
dht.setup(dhtPin, DHTesp::DHT11);
}
float dht_temp; //全局温度变量
float dht_hum; //全局湿度变量
void getDHT11Data()
{
TempAndHumidity dhtValues = dht.getTempAndHumidity();
dht_temp = dhtValues.temperature;
dht_hum = dhtValues.humidity;
}
bool sendDHT()
{
getDHT11Data(); //获取温湿度
cout(F("Sending DHT11 - temp:"));
cout(dht_temp);cout("...");
bool res1 = pub_temp.publish(dht_temp);
if(res1)
coutln(F("OK!"));
else
coutln(F("Failed"));
cout(F("Sending DHT11 - hum:"));
cout(dht_hum);cout("...");
bool res2 = pub_hum.publish(dht_hum);
if(res2)
coutln(F("OK!"));
else
coutln(F("Failed"));
return res1|res2;
}
//====================================================================================
void setup()
{
coutInit(115200);
delay(20);
//===== 初始化各种传感器 =====
dht11Init();
//===== 连接wifi =====
WifiConnect();
}
void loop()
{
delay(2000);
MQTT_connect();
int succes_count = 0; //发送成功计数,用于判断连接状态,MQTT_connect函数短时间无法判断。
//===== 发送计数 =====
if(sendUpdataCount())
succes_count ++;
//===== 发送温度、湿度(DHT11) =====
if(sendDHT())
succes_count ++;
coutln(F("==========================="));
//===== 发送失败处理方式 =====
static int sendFaildCount = 0; //连续全部发送失败次数
if(succes_count == 0) //表示全部发送失败
{
sendFaildCount ++;
if(sendFaildCount >= 2)
{
MQTT_connect(1); //强制重连
sendFaildCount = 0;
}
}
else
sendFaildCount = 0;
}