硬件主控为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(" ℃");
}
}