资讯详情

arduino IDE编写实现OTA无线上传程序,ESP8266自动配网 读取SNTP服务器时间,读取DS19B20温度,在数码管上...

硬件主控为ESP8266 温度传感器为DS19B20 显示为8段数码管 关键库涉及自动配网WiFiManager、获取SNTP校准服务器时间ESPPerfectTime、单总线读写温度DallasTemperature

//#include <sntp_pt.h> #include <WiFiManager.h> //  #include <ArduinoOTA.h> #include <ESPPerfectTime.h> #include <TZ.h> #include <DallasTemperature.h>  //闪烁时间间隔(秒)Aa123456Hi pqaguest unsigned long t,tSave,tSave0,tSave1,tSave2; int hour=9,minute=0,second=0;  //WiFiUDP ntpUDP; ///初始时间偏移为8小时60*60*8=28800 europe.pool.ntp.org //NTPClient timeClient(ntpUDP,"europe.pool.ntp.org", 28800, 60000);  //const char *ntpServer = "ntp.nict.jp";//日本ntp获取时间慢的服务器 const char *ntpServer = "europe.pool.ntp.org";  void printTime(struct tm *tm, suseconds_t usec) { 
          Serial.printf("d/d/d d:d:d.ld\n",                 tm->tm_year   1900,                 tm->tm_mon   1,                 tm->tm_mday,                 tm->tm_hour,                 tm->tm_min,                 tm->tm_sec,                 usec);  } /******************** 本地常量声明 **************************************************/                              // 0 1 2 3 4 5 6 7 8 9 A B C D E F 消隐 0x11 0x12 t o C 0x16 unsigned char  Display_Code[]={ 
        0xA0,0xFC,0x62,0x68,0x3C,0x29,0x21,0xEC,0x20,0x28,0x24,0x31,0xA3,0x70,0x23,0x27,0xFF,0X7F,0XFF,0x33,0x2E,0x83,0x40,0x20};  //段码


/******************** 本地变量声明 ******************************************/
unsigned char  COM_Buff[]={ 
       0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00};   


/***************************管脚定义**************************************************/
int  P_HC595_SER   = 5; //pin 5 SER data input
int  P_HC595_RCLK  = 4; //pin 4 RCLk store (latch) clock
int  P_HC595_SRCLK = 0; //pin 0 SRCLK Shift data clock


void P_HC595_SER_Set(void ) { 
       digitalWrite(P_HC595_SER,true );} 
void P_HC595_SER_Clr(void ) { 
        digitalWrite(P_HC595_SER,false);}
void P_HC595_RCLK_Set(void ) { 
        digitalWrite(P_HC595_RCLK,true);}
void P_HC595_RCLK_Clr(void ) { 
        digitalWrite(P_HC595_RCLK,false);}
void P_HC595_SRCLK_Set(void ) { 
        digitalWrite(P_HC595_SRCLK,true);}
void P_HC595_SRCLK_Clr(void ) { 
        digitalWrite(P_HC595_SRCLK,false);}

/************************************************************************************* 函数功能 :向74HC595发送一个字节 输入参数 :ADD,写入74HC595地址. 输出参数 :无 编 写 人 : 梁秋勇 修 改 人 : *************************************************************************************/
void Send_595(unsigned char DAT)  
{ 
          
  unsigned char i;
  for(i=0; i<8; i++)
  { 
       
    if(DAT & 0x80)  P_HC595_SER_Set();
    else      P_HC595_SER_Clr();
    P_HC595_SRCLK_Set();
    P_HC595_SRCLK_Clr();
    DAT    = DAT << 1;
  }
}
/************************************************************************************* 函数功能 :字符显示 输入参数 :无 输出参数 :无 编 写 人 : 梁秋勇 修 改 人 : *************************************************************************************/
void Numeral_Display(int n0,unsigned char * COM_B)
{ 
       
  int i;
  P_HC595_RCLK_Clr();
  for(i=0;i<n0;i++)
  { 
       
    Send_595(Display_Code[COM_B[i]]);
  }
  P_HC595_RCLK_Set(); 
}

#define ONE_WIRE_BUS 2 // DQ接ESP8266引脚D4(GPIO2)
 
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
 


void setup() { 
       
    // put your setup code here, to run once:
    Serial.begin(115200);
    //pinMode(LED_BUILTIN, OUTPUT); 
    pinMode(P_HC595_SER, OUTPUT); 
    pinMode(P_HC595_RCLK, OUTPUT);
    pinMode(P_HC595_SRCLK, OUTPUT);

    sensors.begin();
   
    //本地初始化。一旦它的业务完成,就没有必要让它继续存在
    WiFiManager wifiManager;
    //重置保存的设置
    //wifiManager.resetSettings(); 
    //为端口户设置自定义ip
    //wifiManager.setAPStaticIPConfig(IPAddress(10,0,1,1), IPAddress(10,0,1,1), IPAddress(255,255,255,0));
    //从eeprom获取ssid和pass并尝试连接;如果未连接,则会启动具有指定名称的访问点;这里是“自动连接图”;然后进入阻塞循环等待配置;或者将其用于自动生成的名称ESP+芯片ID
    wifiManager.autoConnect("自动连接AP");
   
    //如果你到了这里,你已经连接到WiFi了
    Serial.println("WiFi 连接点成功");
    
    // OTA设置并启动
    ArduinoOTA.setHostname(WiFi.SSID().c_str());
    ArduinoOTA.setPassword( WiFi.psk().c_str());     
    ArduinoOTA.begin();
    //显示Wifi名称,WiFi密码
    Serial.println("WiFi Name:"+ WiFi.SSID());
    Serial.println("WiFi Key:"+ WiFi.psk());
    
    //timeClient.begin();
    //timeClient.update(); //从NTP服务器更新时间
    //初始化为8小时的时间偏移60*60*8=28800 europe.pool.ntp.org
    
    pftime::configTzTime("TZ_Asia_Tokyo", ntpServer);
    pftime::configTime(8 * 3600, 0, ntpServer);
     //Serial.println(JST-9);
}

float tt=18.0;
unsigned int displayHide,secHide;

void loop() { 
       
  
    ArduinoOTA.handle();
    t = millis();//micros()为微妙 millis()毫秒 
    if((t-tSave)>1000)
    { 
       
      
      if(displayHide>4)
      displayHide=0;
       secHide++;
      //Serial.println(tt); //打印LED状态 
       //digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); //ESP8266板载LED亮灭 
       //Serial.println(!digitalRead(LED_BUILTIN)); //打印LED状态
       tSave = millis();                                      // 
                        
      //Serial.println(timeClient.getFormattedTime());//返回时间格式为'hh:mm:ss`
      //hour = timeClient.getHours();
      //minute = timeClient.getMinutes();
      //second = timeClient.getSeconds();

      struct tm *tm = pftime::localtime(nullptr);
      suseconds_t usec;
      tm = pftime::localtime(nullptr, &usec);
      // time_t t = pftime::time(nullptr);
      // tm = pftime::localtime(&t);
      //printTime(tm, usec);
      //Serial.println();
      //显示时间及秒闪烁
      //Serial.printf("%02d:%02d:%02d",tm->tm_hour,tm->tm_min,tm->tm_sec); 
      //Serial.println();

      COM_Buff[11] = 0x10;
      COM_Buff[10] = tm->tm_min%100%10;        //
      COM_Buff[9]  = tm->tm_min%100/10;        // 
      if(secHide%2 == 0)  COM_Buff[8]  = 0x10; 
      else                COM_Buff[8]  = 0x11; 
      COM_Buff[7]  = tm->tm_hour%100%10;   //
      if((tm->tm_hour%100/10)>0)  COM_Buff[6]  = tm->tm_hour%100/10;   //
      else                        COM_Buff[6]  = 0x10;
      
   
      if(displayHide<=3) //日期
      { 
       
        COM_Buff[5]  = 0x10;            //
        COM_Buff[4]  = tm->tm_mday%100%10;   //
        COM_Buff[3]  = tm->tm_mday%100/10;   //
        COM_Buff[2]  = 0x11;            //
        COM_Buff[1]  = (tm->tm_mon+1)%100%10;     //
        if(((tm->tm_mon+1)%100/10)>0)   COM_Buff[0]  = (tm->tm_mon+1)%100/10;     //
        else                            COM_Buff[0]  = 0x10; 

        //Serial.printf("%02d-%02d-%02d",tm->tm_year,tm->tm_mon+1,tm->tm_mday); 
        //Serial.println();
      }
      else          //显示温度
      { 
       
        
        COM_Buff[5]  = 0x10;            
        COM_Buff[4]  = 0x10;   
        COM_Buff[3]  = 0x15;   
        COM_Buff[2]  = 0x14;           
        COM_Buff[1]  = (unsigned int)tt%100%10;     
        COM_Buff[0]  = (unsigned int)tt%100/10;

        //.printf("%2f",tt);
        //Serial.println("************************"); 
      }    
      Numeral_Display(12,COM_Buff);     
    }   
    

    if((t-tSave0)>500)
    { 
       
      tSave0 = millis();
      secHide++;
      if(++displayHide>8)
      displayHide=0;
      
    }

  
  if((t-tSave1)>1000*60)//每60秒从NTP服务器更新时间
  { 
       
    tSave1 = millis();  
    //timeClient.update(); //从NTP服务器更新时间
  } 
  
  if((t-tSave2)>1000*15)//每15秒从更新温度
  { 
       
    tSave2 = millis();
    sensors.requestTemperatures(); // 发送命令获取温度
    //Serial.print("Temp: ");
    tt = sensors.getTempCByIndex(0);
    //Serial.print(sensors.getTempCByIndex(0));
    //Serial.println(" ℃");
  }  

     
}    

标签: cj19b电容器接触器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台