采用stm32f10制作了一个网络授时时钟,通过连接esp8266获得网络上的北京时间,使用www点k780点com提供的免费api,有兴趣的小伙伴们,可以去官方研究下。这里简要的说一下制作这个网络授时时钟的思路,大概就是先使用串口调试助手调试好esp8266的波特率、工作模式等,然后将其连接入家庭的路由器,或者开启手机热点让esp8266连接进去。我这里设置其波特率为115200,工作模式为AP模式。设置好这些基本的参数之后,就是开启单连接模式,连接入远程的tcp服务器,开启透传模式,发送get+数据商提供的key,获得北京时间的JSON信息,然后采用cJSON库进行,json的数据解析工作,可以解析出北京时间,然后再将得到的时间更新给DS1302模块,之后就开始不停的从DS1302模块里面获取时间了。当然大家感兴趣的。还可以获取天气等信息呢。
制作出来的实物图如下:
OLED显示屏显示时间
整体图
wifi模块
DS1302
单片机源程序如下:
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "key.h"
- #include "malloc.h"
- #include "usart3.h"
- #include "wifista.h"
- #include "weather.h"
- #include "cJSON.h"
- #include "ds1302.h"
- #include "oled12864.h"
- void show_time(void);
- u8 IntegralPointFlag = 0;
- int main(void)
- {
- u8 key;
- u16 t=0;
- u8 constate=0; // 连接状态
- delay_init(); // 延时函数初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
- uart_init(115200); // 串口初始化为115200
-
- LED_Init(); //初始化与LED连接的硬件接口
-
- KEY_Init(); //初始化按键
- usart3_init(115200); //初始化串口3
- DS1302_Init();
-
- OLED_Init();
- // Step_Num
- OLED_P8x16Num(0,0,1); // 显示屏初始化
- OLED_P8x16Num(8,0,9);
- OLED_P8x16Str(16,0,"-");
- OLED_P8x16Num(24,0,0);
- OLED_P8x16Num(32,0,5);
- OLED_P8x16Str(40,0,"-");
- OLED_P8x16Num(48,0,0);
- OLED_P8x16Num(56,0,7);
- OLED_P8x16Num(64,2,2);
- OLED_P8x16Num(72,2,2);
- OLED_P8x16Str(80,2,":");
- OLED_P8x16Num(88,2,2);
- OLED_P8x16Num(96,2,9);
- OLED_P8x16Str(104,2,":");
- OLED_P8x16Num(112,2,1);
- OLED_P8x16Num(120,2,9);
-
- delay_ms(200);
- atk_8266_wifista_config();
-
- printf("wifi init ok!");
-
- delay_ms(1000);
- get_beijing_time();
-
- delay_ms(1000);
- delay_ms(1000);
-
- get_beijing_time();
- delay_ms(1000);
-
- printf("Time: %d-%d-%d %d:%d:%d\r\n",nwt.year,nwt.month,nwt.date,nwt.hour,nwt.min,nwt.sec);
- DS1302_Write_Time();
-
- while(1)
- {
- // DS1302_Get_Time(time);
-
- key = KEY_Scan(0);
- if(key==WKUP_PRES)
- {
- get_beijing_time();
- printf("Time: %d-%d-%d %d:%d:%d\r\n",nwt.year,nwt.month,nwt.date,nwt.hour,nwt.min,nwt.sec);
- DS1302_Write_Time();
- }
- delay_ms(10);
- t++;
- if(t==1000)
- {
- constate=atk_8266_consta_check();//得到连接状态
- t=0;
- }
- else if((t%100)==0)
- {
- LED1 = !LED1;
- show_time();
- }
- atk_8266_at_response(1);
- }
- }
- void show_time(void)
- {
- // DS1302_Read_Time();
- // printf("%d-%d-%d %d:%d:%d\r\n",nwt.year,nwt.month,nwt.date,nwt.hour,nwt.min,nwt.sec);
- u8 time[15];
- DS1302_Get_Time(time);
- // printf("%d%d%d%d年%d%d月%d%d日 ", time[0],time[1],time[2],time[3],time[4],time[5],time[6],time[7]);
- // printf("%d%d时%d%d分%d%d秒 星期%d\n", time[9],time[10],time[11],time[12],time[13],time[14],time[8]);
- OLED_P8x16Num(0,0,time[2]);
- OLED_P8x16Num(8,0,time[3]);
- OLED_P8x16Num(24,0,time[4]);
- OLED_P8x16Num(32,0,time[5]);
- OLED_P8x16Num(48,0,time[6]);
- OLED_P8x16Num(56,0,time[7]);
-
- OLED_P8x16Num(64,2,time[9]);
- OLED_P8x16Num(72,2,time[10]);
-
- OLED_P8x16Num(88,2,time[11]);
- OLED_P8x16Num(96,2,time[12]);
-
- OLED_P8x16Num(112,2,time[13]);
- OLED_P8x16Num(120,2,time[14]);
- // 判断分钟为0 秒 小于等于 3 则可以判断 当前时间为整点 启动报时
- if(time[11] == 0 && time[12] == 0 && time[13] == 0 && time[14] <= 1)
- {
-
-
-
- }
- }
复制代码
所有资料51hei提供下载:
ESP8266.7z
(474.02 KB, 下载次数: 197)
|