esp8266使用mqtt协议上传温湿度数据

硬件: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;
}
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值