正点原子ESP8266
前提烧录到ESP8266的固件版本不要太老了,用比较新的(具体界限不清楚)
以安信可官网提供的AT固件举例,第5个不支持获取网络时间(AT指令不支持),我用的是第4个。
烧写固件需要注意的端口
端口 | 连接 |
---|---|
rst | 低电平复位(内部上拉) |
io_0 | 0:烧录模式 1:运行模式(内部上拉) |
1、io_0接地
2、点击下载工具的START之后,复位ESP8266,接地之后拔开
其实就两个AT指令,都不用连接(热点/路由器)
AT+CIPSNTPCFG=1,8 /* 设置时区 */
AT+CIPSNTPTIME? /* 获取时间 */
下图中,返回的时间格式:周 月 日 时:分:秒 年
提取时间可以识别 TIME: 这个字符串,不能仅仅识别 TIME 这个字符串,因为串口会回传发送的AT指令,其中有 TIME? 这个字符串。
这里我在使用的时候都会有时间不对的情况(原因未知),30s以内都会恢复到正常的时间上。
AT+CWMODE=1
AT+CWJAP="SSID","password" /* 热点名字、密码 */
AT+CIPMUX=0
AT+CIPSTART="TCP","api.seniverse.com",80 /* 连接心知天气 */
AT+CIPMODE=1
AT+CIPSEND /* 开启透传 */
配置完ESP8266之后就发送获取天气情况的代码
GET https://api.seniverse.com/v3/weather/now.json?key=xxxxxx&location=chongqing&language=zh-Hans&unit=c
"xxxxxx"对应申请的密钥,地点也可以修改,我获取的是重庆的天气
发送完成之后,服务器会返回你一个固定的格式
其中‘code’后面对应的数字就是天气代码,查看心知天气的官网文档可知道实际的天气
‘temperature’对应天气温度
官网天气代码 — 天气实际情况对应图如下
https://seniverse.yuque.com/books/share/e52aa43f-8fe9-4ffa-860d-96c0f3cf1c49/yev2c3
如何提取数据
使用C语言标准库函数:strstr(); 查找子串,返回一个指针,指向字串的首地址
注意:串口接收到的是字符!!!要转化为数值
/* 字符转十进制 */
unsigned int Char_To_Decimalism(unsigned char Char){
if(Char == '0') return 0;
else if(Char == '1') return 1;
else if(Char == '2') return 2;
else if(Char == '3') return 3;
else if(Char == '4') return 4;
else if(Char == '5') return 5;
else if(Char == '6') return 6;
else if(Char == '7') return 7;
else if(Char == '8') return 8;
else if(Char == '9') return 9;
else return 0;
}
void Get_Weather_Data(unsigned int *code,unsigned int *temp){
unsigned char temp_h,temp_l;
unsigned int data1,data2;
if(strstr((const char *)esp8266_buf, "\"code\"") != NULL){
WeatherPtr = strstr((const char *)esp8266_buf, "\"code\"");
temp_h = (*(WeatherPtr+8));
temp_l = (*(WeatherPtr+9));
if(temp_l == '"'){
data1 = Char_To_Decimalism(temp_h);
*code = data1;
}
else{
data1 = Char_To_Decimalism(temp_h);
data2 = Char_To_Decimalism(temp_l);
*code = data1*10+data2;
}
}
if(strstr((const char *)esp8266_buf, "\"temperature\"") != NULL){
WeatherPtr = strstr((const char *)esp8266_buf, "\"temperature\"");
temp_h = (*(WeatherPtr+15));
temp_l = (*(WeatherPtr+16));
if(temp_l == '"'){
data1 = Char_To_Decimalism(temp_h);
*temp = data1;
}
else{
data1 = Char_To_Decimalism(temp_h);
data2 = Char_To_Decimalism(temp_l);
*temp = data1*10+data2;
}
}
}
void Get_Net_Time(){
Usart2_SendString(get_time_buf,sizeof(get_time_buf));
if(strstr((const char *)esp8266_buf, "TIME:") != NULL){
TimePtr = strstr((const char *)esp8266_buf, "TIME:");
printf("%s\r\n",TimePtr+5);
sprintf(time_buf,"%.8s",TimePtr+16);
LCD_ShowString(100,110,200,24,24,(u8 *)time_buf);
memset(esp8266_buf,0,sizeof(esp8266_buf));
}
}
这部分实现的一个效果如下
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)