久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: esp8266 MQTT綜合功能程序 自動(dòng)配網(wǎng) 時(shí)間獲取 AD轉(zhuǎn)換 任務(wù)調(diào)度 自動(dòng)生成訂.... [打印本頁(yè)]

作者: xuzuxiong    時(shí)間: 2021-8-4 07:13
標(biāo)題: esp8266 MQTT綜合功能程序 自動(dòng)配網(wǎng) 時(shí)間獲取 AD轉(zhuǎn)換 任務(wù)調(diào)度 自動(dòng)生成訂....
/*專(zhuān)門(mén)為自己用的模板*/
/*包含的頭文件*/
#include <Arduino.h>
#include <NTPClient.h>//
#include <EEPROM.h>//EEPROM】
#include <PubSubClient.h>//網(wǎng)絡(luò)連接相關(guān)
#include <ESP8266WiFi.h>//wifi相關(guān)
#include <ESP8266WiFiMulti.h>//wifi相關(guān)
#include <WiFiUdp.h>//wifi相關(guān)
#include <ESP8266Ping.h>//ping網(wǎng)絡(luò)
#include <Ticker.h> //時(shí)間調(diào)度器
#include <ESP8266HTTPClient.h>
#include <ESP8266httpUpdate.h>
#include <EspSaveCrash.h>//模塊重啟
#define USE_SERIAL Serial

/*************聲明所需其他功能參數(shù)***********************************/
Ticker myTicker; //建立一個(gè)需要定時(shí)調(diào)度的對(duì)象
WiFiClient espClient;
ESP8266WiFiMulti WiFiMulti;
const char* mqtt_server = "0.0.0.0";//服務(wù)器地址
PubSubClient client(espClient);
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 3600, 60000);

/**********************************************************************/
/* 功能描述:eeprom結(jié)構(gòu)體操作*/
struct config_type
{
  char fabu[64]; //發(fā)布ID


};
config_type config;
/**************************************************/
/*定義項(xiàng)目所需要的變量*/
float Voltage;//電壓儲(chǔ)存變量
char  V[32];//電壓運(yùn)算結(jié)果儲(chǔ)存數(shù)組
char  TAGE[32]="V電壓:";
char address[64]="http://0.0.0.0/";//升級(jí)文件服務(wù)器地址
char bin[64];//儲(chǔ)存升級(jí)地址的中間數(shù)組
char Bin[64]=".bin";
uint32_t chipid;
uint8_t MAC_array_AP[6];//MAC地址數(shù)組
char MAC_char_AP[18];//MAC地址數(shù)組
char string[64];//數(shù)據(jù)轉(zhuǎn)化數(shù)組
char id[64]="xzx/";//切記用中文/要不遠(yuǎn)程O(píng)TA升級(jí)會(huì)出錯(cuò)。
int information=1,shi,fen,miao,count;//計(jì)數(shù)
bool upgrade = false; // 升級(jí)觸發(fā)標(biāo)志變量
char  UP[10]="升級(jí)";
char  cache[10];//升級(jí)觸發(fā)緩存變量可以用于別的地方
int aa=1,bb=1,cc=1,dd=1,a=0,b=0,c=0,d=0;
/************************變量******************************/
/**********定義項(xiàng)目所需要的IO端口****************************/
int A= 12;//A
int B= 13;//A
int C= 14;//A
int D= 16;//A
int state =02;//狀態(tài)指示燈


/*************************功能函數(shù)****************/
/*************處理升級(jí)文件服務(wù)器地址以及文件名*************************/
void Take()//預(yù)處理升級(jí)地址
{
int len = strlen(id);
for(int i=0;i<8;i++)//獲取數(shù)組長(zhǎng)度取需要的信息
{
  len--;
}         
  for(int i=0;i<len;i++){ bin[ i]=id[ i]; }//賦值給其他數(shù)組
  strcat( bin,  Bin );//信息合并
  strcat( address,  bin );//信息合并

  }

/*檢測(cè)wifi連接20秒超時(shí)*/
bool autoConfig()//連接到網(wǎng)絡(luò)方法
  {
   WiFi.begin();
   for (int i = 0; i < 10; i++)
    {
    int wstatus = WiFi.status();
    if (wstatus == WL_CONNECTED){
    WiFi.printDiag(Serial);
    return true;                             
      }
    else
      {
      Serial.print("等待連接網(wǎng)絡(luò)......");//自動(dòng)配置等待  
       Serial.println(i);  
       delay(1000);
       }                     
     }
  return false;
}

/*獲取到IP地址后自動(dòng)連接網(wǎng)絡(luò)方法*/
void smartConfig()//wifi配置方法
{
      WiFi.mode(WIFI_STA);
      Serial.println("請(qǐng)配置wifi連接");
      WiFi.beginSmartConfig();
      count=80;
      Serial.println("開(kāi)始倒計(jì)時(shí),計(jì)時(shí)結(jié)束還未配置重啟模塊");
      while (1)
     {
      digitalWrite(state,!digitalRead(state));//指示燈閃爍提示配網(wǎng)
      Serial.print(">");
      Serial.print(count);
      count--;
      if (WiFi.smartConfigDone())
           {
           WiFi.setAutoConnect(true);  // 設(shè)置自動(dòng)連接
           break;                              }
           delay(1000); // 這個(gè)地方一定要加延時(shí),否則極易崩潰重啟   
           if(count==0){ count=80;
           ESP.restart();
             }
         }
}
/***********************************************************/
/******************收到MQTT數(shù)據(jù)處理***************************/
void callback(char* topic, byte* payload, unsigned int length)//收到MQTT數(shù)據(jù)處理方法
   {
  for (int i = 0; i < length; i++)
        {  
          Serial.print((char)payload[ i]);//收到的信息打印到串口
          cache[ i]=(char)payload[ i];//收到的信息復(fù)制給緩存數(shù)組
        }
    if ((char)payload[0] == '1')
       {

/*這里可以讓模塊收到信息執(zhí)行命令*/   
       }

    }

/**********************數(shù)組比對(duì)是否相等******************************/
void comparison()//升級(jí)命令判斷方法
{
  const int SIZE = 5;
  bool arraysEqual = true; // 標(biāo)志變量
   count = 0; //循環(huán)控制變量
while (arraysEqual && count < SIZE)//用while控制對(duì)比結(jié)果相等就完整循環(huán),不等就立即退出,返回標(biāo)志量結(jié)果
{
    if (cache[count] != UP[count])
        arraysEqual = false;
    count++;

}                                    //顯示合適的消息
if (arraysEqual)
   { Serial.println("相等");
     upgrade=true;//升級(jí)控制位
   }
else
   {
    Serial.println("不等");
    upgrade=false;//升級(jí)控制位
   }
  }


/*********************連接服務(wù)器方法***************************/
void reconnect() //連接服務(wù)器方法
     {
      count=5;
  while (!client.connected()) {
    Serial.println("以連接服務(wù)器");
     if (client.connect(("%s\r\n",MAC_char_AP),"賬號(hào)","密碼"))//mqtt賬號(hào)和密碼
        {
        client.publish(config.fabu ,"ok");//發(fā)布的信息   
        client.subscribe(("%s\r\n", string));//訂閱的信息
          }
       else
          {
       delay(100);

        count--;
        Serial.print("網(wǎng)絡(luò)連接中斷即將重啟設(shè)備");
        Serial.print(count);
     if(count==0){ ESP.restart(); }
          }
      }
}
/***************時(shí)間獲取方法****************************/
void Networktime()//時(shí)間獲取方法
     {
    timeClient.update();                            //獲取網(wǎng)絡(luò)時(shí)間
   shi  =timeClient.getHours()+7;                  //接收小時(shí)時(shí)間
   fen = timeClient.getMinutes();                 //  接收分鐘時(shí)間
   miao =timeClient.getSeconds();                 //  接收秒鐘時(shí)間
  if(shi==24){shi=0;}if(shi==25){shi=1;}if(shi==26){shi=2;}if(shi==27){shi=3;}
  if(shi==28){shi=4;}if(shi==29){shi=5;}if(shi==30){shi=6;}//將時(shí)間變量與現(xiàn)時(shí)時(shí)間匹配
}
/**************************數(shù)據(jù)轉(zhuǎn)換*****************/
void dataconversion()//數(shù)據(jù)轉(zhuǎn)換方法
      {
  chipid= ESP.getChipId(); //獲取ID號(hào)
  itoa(chipid, string, 10);//將ID號(hào)轉(zhuǎn)換
  strcat( id,  string );//將ID號(hào)與訂閱信息合并
  strcpy(config.fabu, id);//將合并后的信息傳入發(fā)布變量
        }
void MAC()//獲取MIC地址
{        
     for (int i = 0; i < sizeof(MAC_array_AP); ++i){ //獲取MIC地址
     sprintf(MAC_char_AP, "%s%02x:", MAC_char_AP, MAC_array_AP[ i]); }//打印MIC地址
}
/*******************************網(wǎng)絡(luò)連接方法*************************/
void Connect()//網(wǎng)絡(luò)連接判斷
{
  if (!autoConfig()){
  Serial.println("啟動(dòng)模塊網(wǎng)絡(luò)配置");//啟動(dòng)模塊
smartConfig();
                }
  }
/*****************AD轉(zhuǎn)換方法***************************************/
void ADC()
  {
      Voltage=analogRead(A0)*0.0048828125;
      dtostrf(Voltage,1,2,V);//將帶小數(shù)點(diǎn)的電壓值轉(zhuǎn)換為數(shù)組中
   // itoa( Voltage,V,10);//將電壓轉(zhuǎn)換為整數(shù)到數(shù)組
      strcat( V,TAGE );//將ID號(hào)與訂閱信息合并
      delay(10);
      Serial.println(("%s\r\n", V));
      Serial.println(Voltage);
     client.publish(config.fabu,("%s\r\n",V)); //將電壓數(shù)據(jù)發(fā)布到MQTT
    delay(10);
  }
/***************************服務(wù)器遠(yuǎn)程升級(jí)方法************************/
void Upgrade()//服務(wù)器升級(jí)函數(shù)
{
if ((WiFiMulti.run() == WL_CONNECTED))
   {count++;
   if(count==20){ESP.restart();}//嘗試20次升級(jí)如果都失敗重啟模塊
    WiFiClient client;
    ESPhttpUpdate.setLedPin(LED_BUILTIN, LOW);
    t_httpUpdate_return ret = ESPhttpUpdate.update(client, ("%s\r\n",address));
     switch (ret) {
     case  HTTP_UPDATE_FAILED:      
   if(count==20){ESP.restart();}//嘗試20次升級(jí)如果都失敗重啟模塊
      USE_SERIAL.printf("HTTP更新失敗錯(cuò)誤 (%d): %s\n", ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str());
      ESP.restart();
      break;
      case HTTP_UPDATE_NO_UPDATES:        
   if(count==20){ESP.restart();}//嘗試20次升級(jí)如果都失敗重啟模塊
      USE_SERIAL.println("HTTP_UPDATE_NO_更新");
     ESP.restart();
      break;
      case HTTP_UPDATE_OK:
      USE_SERIAL.println("更新HTTP u OK");
      break;
        }
      }
}
/*************************模塊啟動(dòng)準(zhǔn)備*************************/
void startUP()//啟動(dòng)效果
    {
    digitalWrite(state, LOW);//打開(kāi)指示模塊開(kāi)始工作
    for (uint8_t t = 5; t > 0; t--)
    USE_SERIAL.printf("[start-up] Get ready %d...\n", t);
    USE_SERIAL.flush();
    delay(1000);
    }

/********************************初始化方法*****************************/
void setup() //初始化
{
     /*初始化代碼*/
    dataconversion();//ID數(shù)據(jù)轉(zhuǎn)換方法
    timeClient.begin();
    USE_SERIAL.begin(115200);
       pinMode(state, OUTPUT);//定義指示燈引腳為輸出功能
       digitalWrite(state, HIGH);//定義指示燈引腳初始為高電平
   // pinMode(state,INPUT);//定義指示燈引腳為輸入功能
   // digitalWrite(state, LOW);//定義指示燈引腳初始為低電平
   // digitalWrite(state,!digitalRead(state)); //取反指示燈引腳
   // delay(1);//延時(shí)函數(shù)
   pinMode(A, INPUT);  
   pinMode(B, INPUT);
   pinMode(C, INPUT);
   pinMode(D, INPUT);  

    USE_SERIAL.println();
    startUP();
    client.setServer(mqtt_server, 1883);
    client.setCallback(callback);
    Connect();//網(wǎng)絡(luò)連接判斷
    WiFi.softAPmacAddress(MAC_array_AP);
    MAC();
    Serial.println("初始化完成");            
    myTicker.attach(2, tickerHandle); //初始化調(diào)度任務(wù),1=1秒執(zhí)行一次tickerHandle()
    Take();//運(yùn)行轉(zhuǎn)換信息任務(wù)
}


void tickerHandle() //任務(wù)調(diào)度器/實(shí)現(xiàn)多任務(wù)運(yùn)行
{
/*需要執(zhí)行的任務(wù)*/
   // Serial.println(millis()); //打印當(dāng)前時(shí)間
   Serial.println("任務(wù)調(diào)度器");
    comparison();  //判斷升級(jí)信息
/*代碼代碼代碼代碼代碼代碼代碼代碼代碼代碼代碼代碼
代碼代碼代碼代碼代碼代碼代碼代碼代碼代碼代碼代碼代碼代碼代碼
碼代碼代碼代碼代碼代碼代碼代碼代碼代碼代碼代碼代碼代*/


}
/************************************主循環(huán)方法*****************************/
void loop()//主循環(huán)方法

{
int INA = digitalRead(A);  
int INB = digitalRead(B);  
int INC = digitalRead(C);  
int IND = digitalRead(D);  

if(INA==0)
  {
    while(aa){
    client.publish(config.fabu ,"A");
    aa=0;
    a=1;
    }
   }//發(fā)布的信息
if(INB==0)
  {
    while(bb){
    client.publish(config.fabu ,"B");
     bb=0;
     b=1;
    }
   }//發(fā)布的信息
if(INC==0)
  {
     while(cc){
    client.publish(config.fabu ,"C");
     cc=0;
     c=1;
    }
  }//發(fā)布的信息
if(IND==0)
{
   while(dd){
  client.publish(config.fabu ,"D");
    dd=0;
    d=1;
    }
}//發(fā)布的信息


if(INA==1)
  {
    while(a){
    client.publish(config.fabu ,"a");
    a=0;
    aa=1;
    }
    }//發(fā)布的信息
if(INB==1)
  {
     while(b){
    client.publish(config.fabu ,"b");
     b=0;
     bb=1;
    }  
  }//發(fā)布的信息
if(INC==1)
  {
    while(c){
    client.publish(config.fabu ,"c");
     c=0;
    cc=1;
    }  
  }//發(fā)布的信息
if(IND==1)
  {
     while(d){
    client.publish(config.fabu ,"d");
     d=0;
    dd=1;
    }   
  }//發(fā)布的信息   


Networktime();//獲取實(shí)時(shí)時(shí)間
while(information)
       {
        Serial.print("實(shí)時(shí)時(shí)間時(shí):");
        Serial.print(shi);
        Serial.print("時(shí)");
        Serial.print(fen);
        Serial.print("分");
        Serial.print(miao);
        Serial.println("秒");
        Serial.print("MAC:");
        Serial.println(MAC_char_AP);
        Serial.printf("無(wú)線網(wǎng)絡(luò)名稱:%s\r\n", WiFi.SSID().c_str());
        Serial.printf("無(wú)線網(wǎng)絡(luò)密碼:%s\r\n", WiFi.psk().c_str());
        Serial.print("IP地址: ");
        Serial.println(WiFi.localIP());
        Serial.print("連接的服務(wù)器地址:");
        Serial.println(mqtt_server);
        Serial.println("MQTT用戶名:xzx 密碼:xzx123456");
        Serial.print("訂閱的主題:");
        Serial.println(string);
        Serial.print("發(fā)布的主題:");
        Serial.println(config.fabu);
        Serial.print("模塊自己的ID號(hào):");
        Serial.println(chipid);
        Serial.print("升級(jí)文件的服務(wù)器地址:");
        Serial.println(address);
        Serial.print("升級(jí)文件命名名稱:");
        Serial.println(bin);
        Serial.println("以上時(shí)模塊所有信息:此程序是一個(gè)MQTT連接的程序");
        information=0;
       }

//ESP.deepSleep(1200000000, WAKE_RF_DEFAULT);//休眠20分鐘//模塊低功耗模式啟動(dòng)方法需要將GP016與模塊的RST相連,參數(shù)為微妙,最大大約71分鐘 遇到此方法模塊就低功耗休眠

/*遠(yuǎn)程升級(jí)*/
  if(upgrade) {Serial.println("模塊自動(dòng)升級(jí)");delay(100);Upgrade();}//升級(jí)

  if (!client.connected()) {
    reconnect();
  }
  client.loop();
}

作者: 黑米粥粥    時(shí)間: 2023-2-26 21:57
大佬 NTPClient.h 這些庫(kù)去哪里下載呀




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 91免费版在线观看 | 一级aaaaaa毛片免费同男同女 | 国产精品一码二码三码在线 | 国产欧美精品区一区二区三区 | 国产精品精品视频一区二区三区 | 99这里只有精品视频 | 免费a在线 | 嫩草视频网站 | 99这里只有精品视频 | 国产精品久久久久久久久久久免费看 | 久久国产精品-国产精品 | 国产欧美精品一区 | 久久青视频 | 亚洲视频在线看 | 亚洲精品永久免费 | 91视频国产区 | 欧美福利在线 | 久久99精品久久久久久 | 精品在线观看一区二区 | 亚洲高清成人在线 | 欧美视频日韩 | 久久久久久色 | 久久国内精品 | 亚洲久久 | 在线看亚洲 | 精品国产一区二区三区久久久四川 | 久久一 | 一级片子| 中文字幕亚洲视频 | 日韩午夜网站 | 男女av| 国产精品久久久久久久久久久免费看 | 精品久久久久久久人人人人传媒 | 99久久免费精品国产免费高清 | 国产免费福利 | 一区二区在线免费观看 | 日韩欧美在线观看 | 一区二区三区视频在线观看 | 欧美狠狠操| 草草网| av一级|