基于STM32和ESP8266的天气预报系统

本章将介绍一个关于STM32+ESP8266的练手小项目,项目来源地址在下面:

http://www.openedv.com/forum.php?mod=viewthread&tid=229818&highlight=%CC%EC%C6%F8

项目的源码地址请见文章最后。

一、实验环境要求

1.1硬件要求

● STM32单片机

● ESP8266WIFI模块

● LCD屏幕

● SD卡,安装文件系统

1.2软件环境要求

● Keil5

● 程序烧录软件

● 固件烧录软件

● 串口调试助手

二、系统示意图

系统整体示意图:

为增加学习兴趣,附上实验结果图:

三、程序流程图

程序流程图主要是主程序的流程图,如下:

在流程图中,单片机的初始化主要是一些硬件的初始化,主要有中断、串口、按键、LCD等等一些初始化,具体内容参考程序,这里即将不会介绍了。

四、ESP8266配置

4.1 AT固件烧录

由于本项目STM32单片机与WIFI模块之间是通过串口3发送AT指令来实现配置,因此需要烧录AT固件,固件相关资源见文章最后。

硬件连接示意图:

烧录步骤如下:
先打开烧录软件,软件在文的末尾提供:

然后对烧录软件进行配置,这一步很关键,按照下图进行配置:

固件是bin文件:

4.2 ESP8266配置函数atk_8266_wifista_config()

函数的具体内容参看下图:


主要通过发送AT指令来配置ESP8266,主要做了以下工作:

● 检查ESP8266硬件连接是否正常;

atk_8266_send_cmd("AT","OK",20)

● 配置wifi为STA模式;

atk_8266_send_cmd("AT+CWMODE=1","OK",50)

● 连接路由器。

atk_8266_send_cmd("AT+CIPMUX=0","OK",20);   //0:单连接;1:多连接
sprintf((char*)p,"AT+CWJAP=\"%s\",\"%s\"",wifista_ssid,wifista_password);//传输路由器参数
while(atk_8266_send_cmd(p,"WIFI GOT IP",300));    //连接路由器

五、获取天气

5.1获取天气函数get_current_weather()

函数在工程的weather.c文件中。

//获取实时天气
//成功返回0,失败返回1
u8 get_current_weather(void)
{u8 *p;u8 res;p=mymalloc(SRAMIN,40);                           sprintf((char*)p,"AT+CIPSTART=\"TCP\",\"%s\",%s",WEATHER_SERVERIP,WEATHER_PORTNUM);    //配置服务器IP和PORT,建立TCP连接res = atk_8266_send_cmd(p,"OK",200);//发送TCP连接命令if(res==1){myfree(SRAMIN,p);return 1;}delay_ms(300);atk_8266_send_cmd("AT+CIPMODE=1","OK",100);      //´开启透传模式USART3_RX_STA=0;atk_8266_send_cmd("AT+CIPSEND","OK",100);         //开始透传printf("start trans...\r\n");//发送get请求:网站密钥+目的城市u3_printf("GET https://api.seniverse.com/v3/weather/now.json?key=“修改处:你的自密钥”&location=“修改处:目的城市拼音”&language=zh-Hans&unit=c\n\n");   delay_ms(20);USART3_RX_STA=0;  delay_ms(1000);if(USART3_RX_STA&0X8000)     //接收天气数据{ USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符} parse_now_weather();     //CJSON解析atk_8266_quit_trans();//退出透传atk_8266_send_cmd("AT+CIPCLOSE","OK",50);         //关闭TCP连接myfree(SRAMIN,p);return 0;
}

分析如下:

建立TCP连接,连接天气服务器

 sprintf((char*)p,"AT+CIPSTART=\"TCP\",\"%s\",%s",WEATHER_SERVERIP,WEATHER_PORTNUM);    //配置服务器IP和PORT,建立TCP连接res = atk_8266_send_cmd(p,"OK",200);//发送TCP连接命令

开启透传模式

 atk_8266_send_cmd("AT+CIPMODE=1","OK",100);      //´开启透传模式atk_8266_send_cmd("AT+CIPSEND","OK",100);         //开始透传

发送get请求

u3_printf("GET https://api.seniverse.com/v3/weather/now.json?key=“修改处:你的自密钥”&location=“修改处:目的城市拼音”&language=zh-Hans&unit=c\n\n");

parse_now_weather()解析天气

parse_now_weather();     //CJSON解析

下一节将介绍这个函数。

关闭透传

atk_8266_quit_trans();//退出透传

断开TCP连接

atk_8266_send_cmd("AT+CIPCLOSE","OK",50);         //关闭TCP连接

说明:我用的是知心天气服务平台,密钥可以自己去知心网站申请。

5.2 CJSON解析

服务器发送给我们的数据是以CJSON格式,保存在USART3_RX_BUF缓存中,我们需要对其进行解析。

CJSON具体学习内容参考:
https://blog.csdn.net/Mculover666/article/details/103796256

我们只用到两个相关的API:

CJSON主要用到的相关的API:

extern cJSON *cJSON_Parse(const char *value);//从给定的json字符串中得到cjson对象extern cJSON *cJSON_GetArrayItem(cJSON *array,int item);//根据下标获取cjosn对象数组中的对象extern char  *cJSON_Print(cJSON *item);//从cjson对象中获取有格式的json对象extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);//根据键获取对应的值(cjson对象)extern void   cJSON_Delete(cJSON *c);//删除cjson对象,释放链表占用的内存空间

从知心天气服务器获取的数据格式如下:

{"results": [{"location": {"id": "C23NB62W20TF","name": "西雅图","country": "US","path": "西雅图,华盛顿州,美国","timezone": "America/Los_Angeles","timezone_offset": "-07:00"},"now": {"text": "多云", //天气现象文字"code": "4", //天气现象代码"temperature": "14", //温度,单位为c摄氏度或f华氏度"feels_like": "14", //体感温度,单位为c摄氏度或f华氏度"pressure": "1018", //气压,单位为mb百帕或in英寸"humidity": "76", //相对湿度,0~100,单位为百分比"visibility": "16.09", //能见度,单位为km公里或mi英里"wind_direction": "西北", //风向文字"wind_direction_degree": "340", //风向角度,范围0~360,0为正北,90为正东,180为正南,270为正西"wind_speed": "8.05", //风速,单位为km/h公里每小时或mph英里每小时"wind_scale": "2", //风力等级,请参考:http://baike.baidu.com/view/465076.htm"clouds": "90", //云量,单位%,范围0~100,天空被云覆盖的百分比 #目前不支持中国城市#"dew_point": "-12" //露点温度,请参考:http://baike.baidu.com/view/118348.htm #目前不支持中国城市#},"last_update": "2015-09-25T22:45:00-07:00" //数据更新时间(该城市的本地时间)}]
}

程序中与天气解析相关的程序:

u8 parse_now_weather(void)
{//....root = cJSON_Parse((const char*)USART3_RX_BUF);   //获取json对象if(root != NULL){pSub = cJSON_GetObjectItem(root,"results");  //获取 results 对应的值if(pSub != NULL){arrayItem = cJSON_GetArrayItem(pSub,0);  //根据下标获取josn对象数组中的对象pr = cJSON_Print(arrayItem);   pItem = cJSON_Parse(pr);        //获取json对象if(pItem != NULL){/*-------------------------------获取城市名称---------------------------*/pSubItem = cJSON_GetObjectItem(pItem,"location"); // 根据 location 键获取对应的值(cjson对象)if(pSubItem != NULL){pChildItem = cJSON_GetObjectItem(pSubItem,"name");// 根据 name 键获取对应的值(cjson对象)if(pChildItem != NULL){utf8str = pChildItem->valuestring;SwitchToGbk((const u8*)utf8str,strlen(utf8str),(u8 *)gbkstr,&len);  //获取城市名称,转化为gbk格式Show_Str(0,0,lcddev.width,lcddev.height,(u8 *)gbkstr,16,0);         //显示城市名称}}/*-------------------------------获取天气信息---------------------------*/pSubItem = cJSON_GetObjectItem(pItem,"now");if(pSubItem != NULL){pChildItem = cJSON_GetObjectItem(pSubItem,"text");  //天气现象文字,比如多云if(pChildItem != NULL){utf8str = pChildItem->valuestring;SwitchToGbk((const u8*)utf8str,strlen(utf8str),(u8 *)gbkstr,&len);Show_Str(220,25,lcddev.width,lcddev.height,(u8 *)gbkstr,16,0);    //显示天气现象文字}pChildItem = cJSON_GetObjectItem(pSubItem,"code");    //获取天气代码         if(pChildItem != NULL){gbkstr = pChildItem->valuestring;show_weather_icon((u8 *)gbkstr,0);        //根据天气代码,显示天气图片                     }pChildItem = cJSON_GetObjectItem(pSubItem,"temperature");      //获取温度if(pChildItem != NULL){gbkstr = pChildItem->valuestring;temperature = str2int((u8 *)gbkstr);gui_show_num(140,22,2,RED,54,temperature,0x80);printf("wendu = %d\r\n",temperature);}}pSubItem = cJSON_GetObjectItem(pItem,"last_update");  //获取最新更新时间if(pSubItem != NULL)        {gbkstr =pSubItem->valuestring;LCD_ShowString(0,92,200,20,12,(u8*)gbkstr);printf("1day_updata_time = %s\r\n",(u8*)gbkstr);}}cJSON_Delete(pItem);}}//...return 0;
}

通过以上解析函数就能够得到,从服务器发送过来的天气信息,获取三天信息跟以上步骤雷同,就不再赘述了。

六、资源获取

第一次写项目博客,经验不足,描述不全,希望以后提高。

最后附上工程源码,提供给大家学习:

https://github.com/caosongwang/ESP8266

基于STM32和ESP8266的天气预报系统相关推荐

  1. 基于STM32的ESP8266天气时钟(2)--------MCU获取天气数据

    前言:上一章节我们通过串口调试助手,成功获取到天气数据,这一节我们将通过MCU的串口发送.接收功能,实现MCU获取天气数据. 传送门:基于STM32F103的网络天气时钟(1)---------通过串 ...

  2. 基于STM32的ESP8266模块控制多路继电器

    基于STM32的ESP8266模块控制多路继电器 1.视频讲解 基于STM32单片机ESP8266物联网阿里云MQTT多路继电器控制 物联网视频教程STM32+ESP8266 2.实物设计 ESP82 ...

  3. 基于STM32的智能行车辅助系统(自动大灯,倒车报警,自动雨刷,温湿度传感器,TFT 1.3寸LCD屏幕显示,ESP8266WIFI)

    基于STM32+ESP8266的智能行车辅助系统 基于STM32的智能行车辅助系统(自动大灯,倒车报警,自动雨刷,温湿度传感器,TFT 1.3寸LCD屏幕显示,ESP8266WIFI),这是一个课程设 ...

  4. 基于STM32与ESP8266的太空人WiFi天气时钟(代码开源)

    前言:本文为手把手教学ESP8266著名开源项目--太空人WiFi天气时钟,不同的是本次项目采用的是STM32作为MCU.两者开发过程中有因为各自芯片的特点(时钟频率,内存大小等),导致开发程序大不相 ...

  5. 基于STM32的智能点餐系统

    提示:记录2022年4月做的毕设4 文章目录 前言 一.功能要求: 二.代码思路 三.硬件说明 四.代码以及框图等资料 喜欢请点赞哦! 前言 基于STM32的智能点餐系统,主控使用STM32F103C ...

  6. 18、基于STM32的自动浇花系统

    18.基于STM32的自动浇花系统 引言 1 系统概述 1.1设计任务 1.2设计要求 2 方案设计与论证 2.1芯片选择方案 2.2 系统概述 2.3系统总体设计思路 2.4各功能模块程序实现原理分 ...

  7. 基于STM32的ESP8266使用教程(一)

    关于为什么要写这篇文章,因为之前在做一个项目的时候需要使用WIFI模块.X宝搜WIFI模块的时候推荐ESP8266这个模块,说是价格便宜.使用方便.但是在使用的过程中发现的确使用方便(因为是基于AT指 ...

  8. 基于STM32的ESP8266使用教程(二)

    写在前面:博主懒癌晚期,考研结束之后想着HAPPY一下,结果把这事忘了,开学了又有很多事情要干,直到昨天一博友留言(有邮件提醒),才想起有这么个坑要填,特来填坑.相关软件程序请参考"基于ST ...

  9. 基于STM32的物联网智能家居系统 可以实现温度湿度的实时监控

    基于STM32的物联网智能家居系统,可以实现如下功能: 1.可以实现温度湿度的实时监控: 2.可以实现烟雾浓度的实时监控: 3.可以通过按键设置温度.湿度.烟雾浓度的阈值: 4.当温度高于阈值时风扇打 ...

  10. 基于STM32单片机的水质监测系统(Proteus仿真+程序)

    编号:14 基于STM32单片机的水质监测系统 功能描述: 14.基于STM32单片机的水质监测系统 本设计由STM32F103单片机最小系统+AMPIRE12864液晶显示模块+两路A/D转换模块组 ...

最新文章

  1. android 放大镜
  2. opencv国际象棋_国际象棋是的
  3. Tornado-Lesson05-模版继承、函数和类导入、ui_methods和ui_modules
  4. 谱聚类、Chameleon聚类、PCCA、SOM、Affinity Propagation
  5. P1468 派对灯 Party Lamps(BIG 模拟)
  6. dnSpy 强大的.Net反编译软件
  7. 带有Spring Boot 2支持的Apache Camel 2.22发布
  8. JAVA单向链表实现
  9. 初识 Vue(10)---(计算属性的 setter 和 getter)
  10. android webview 魅族,魅族 Flyme 系统出现大面积应用闪退问题,提供临时解决方法...
  11. 怎么尽可能将pdf文件压缩到最小
  12. java set 添加_Java Set add()用法及代码示例
  13. WDF队列分析(3)
  14. Oracle并集union和union all
  15. .bat文件批处理命令语法格式ech,goto,set,for,call,choise,at,set,定时关机命令
  16. Ceph Calamari安装问题汇总
  17. C中kbhit()和getch()以及gets()和getchar()的用法
  18. ecshop 评价仿京东仿淘宝 中评率 好评率 差评率
  19. 电脑有时突然黑屏,过一两秒就好了的问题解决
  20. 基于机器学习算法对电动汽车续驶里程进行估计

热门文章

  1. 基于XPDL2.0的过程定义
  2. android支付宝sdk流程,支付宝SDK
  3. csv是什么意思中文_csv文件是什么意思
  4. python三种运算符_Python 海象运算符 (:=) 的三种用法
  5. 一定不要想当然啊!!
  6. 今日学习在线编程题:小码哥的序列
  7. 无人驾驶-控制-阿克曼模型
  8. MFC无标题栏自绘对话框可拖动按钮三态仿QQ弹窗样式
  9. EPP-常见问题总结
  10. 解决:VMWare虚拟机无法开启,显示模块“Disk”启动失败