WIFI模块(esp-01s)实现天气预报代码实现

目录

前言

实现图片

一、串口编程的实现

二、发送AT指令

esp01s.c

esp01s.h

三、数据处理

1、初始化

2、cjson处理函数

3、核心控制代码 

四、修改堆栈大小


前言

实现图片

 前面讲解了使用AT指令获取天气与cjson的解析数据,本章综合将时间显示到屏幕

一、串口编程的实现

uint8_t rx_dat;
char rxdata[1000];
int rx_p = 0,rx_ppre = 0;

 

int fputc(int ch,FILE *f)
{//采用轮询方式发送1字节数据,超时时间设置为无限等待HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY);return ch;
}
int fgetc(FILE *f)
{uint8_t ch;// 采用轮询方式接收 1字节数据,超时时间设置为无限等待HAL_UART_Receive( &huart1,(uint8_t*)&ch,1, HAL_MAX_DELAY );return ch;
}// 串口中断接收数据
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance == USART1){// if(rx_p >= sizeof(rxdata))  rx_p = 0;       //防止串口被刷爆rxdata[rx_p ++] = rx_dat;HAL_UART_Receive_IT(&huart1,&rx_dat,1);}
}

二、发送AT指令

esp01s.c

#include "esp01s.h"
#include "usart.h"uint8_t rx_dat;
char rxdata[1000];
int rx_p = 0,rx_ppre = 0;unsigned char Time_buff[1000];int fputc(int ch,FILE *f)
{//采用轮询方式发送1字节数据,超时时间设置为无限等待HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY);return ch;
}
int fgetc(FILE *f)
{uint8_t ch;// 采用轮询方式接收 1字节数据,超时时间设置为无限等待HAL_UART_Receive( &huart1,(uint8_t*)&ch,1, HAL_MAX_DELAY );return ch;
}// 串口中断接收数据
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart->Instance == USART1){// if(rx_p >= sizeof(rxdata))  rx_p = 0;       //防止串口被刷爆rxdata[rx_p ++] = rx_dat;HAL_UART_Receive_IT(&huart1,&rx_dat,1);}
}//清空缓存
void esp01s_clear(void)
{memset(rxdata,0,sizeof(rxdata));rx_p = 0;
}//esp01s等待接收完成 0成功 1失败
int esp01s_waitrecive(void)
{if(rx_p == 0) 							//如果接收计数为0 则说明没有处于接收数据中,所以直接跳出,结束函数return 1;if(rx_p == rx_ppre)				//如果上一次的值和这次相同,则说明接收完毕{rx_p = 0;							//清0接收计数return 0;								//返回接收完成标志}rx_ppre = rx_p;					//置为相同return 1;								//返回接收未完成标志
}//esp01s发送指令   0成功 1失败
int esp01s_sendcmd(char *cmd,char *res)
{unsigned char timeout = 250;printf(cmd);while(timeout --){if(esp01s_waitrecive() == 0)            //如果收到数据{if(strstr(rxdata,res) != NULL)      //如果检索到关键词{esp01s_clear();return 0;}}HAL_Delay(10);}return 1;
}//esp01s发送数据
void esp01s_senddata(char *data)
{esp01s_clear();								//清空接收缓存if(!esp01s_sendcmd("AT+CIPSEND\r\n",">"))				//收到‘>’时可以发送数据//printf(data);{/*发送请求数据*/printf(data);               	//发送设备连接请求数据}}unsigned char *ESP8266_GetIPD_GET(unsigned short timeOut, uint8_t *buff) //这里我用了一个全局变量将esp8266buf储存到这个全局变量里面
{do{HAL_Delay(5);}while(timeOut--);strcpy((char*)buff, (char*)rxdata);return buff;
}

esp01s.h

#ifndef __ESP01S_H
#define __ESP01S_H#include "main.h"
#include "string.h"
#include "stdio.h"extern uint8_t rx_dat;
extern char rxdata[1000];
extern int rx_p,rx_ppre;
extern unsigned char Time_buff[1000];void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
void esp01s_clear(void);
int esp01s_waitrecive(void);
int esp01s_sendcmd(char *cmd,char *res);
void esp01s_senddata(char *data);
unsigned char *ESP8266_GetIPD_GET(unsigned short timeOut, uint8_t *buff);#endif 

三、数据处理

1、初始化

esp01s_clear();while(esp01s_sendcmd("+++",""));while(esp01s_sendcmd("AT\r\n", "OK"));while(esp01s_sendcmd("AT+RST\r\n", "OK"));while(esp01s_sendcmd("AT+CWMODE=1\r\n", "OK"));while(esp01s_sendcmd("AT+CIPMUX=0\r\n", "OK"));while(esp01s_sendcmd("AT+CWJAP=\"meng\",\"20010131\"\r\n", "WIFI GOT IP"));while(esp01s_sendcmd("AT+CIPSTART=\"TCP\",\"api.seniverse.com\",80\r\n","CONNECT"));// while(esp01s_sendcmd("AT+CIPSTART=\"TCP\",\"api.pinduoduo.com\",80\r\n","CONNECT"));while(esp01s_sendcmd("AT+CIPMODE=1\r\n", "OK"));HAL_GPIO_WritePin(led_blue_GPIO_Port,led_blue_Pin,GPIO_PIN_RESET);

2、cjson处理函数

int test2_jiexi()
{char *data;cJSON *json=NULL,*arrayItem=NULL,*object=NULL,*subobject=NULL,*nowobject=NULL,*mingobject=NULL,*houobject=NULL,*nowtext=NULL,*nowhigh=NULL,*nowlow=NULL,*mingtext=NULL,*minghigh=NULL,*minglow=NULL,*houtext=NULL,*houhigh=NULL,*houlow=NULL;cJSON *nowdate = NULL,*mingdate = NULL,*houdate = NULL;data = (char*)te;json = cJSON_Parse(data);    //解析数据包// if(json == NULL)                           //解析失败// {//   sprintf(text,"Error:%s",cJSON_GetErrorPtr());//   lcd_showstr(0,0,(uint8 *)text,WHITE);//   return 1;// }if(json){ HAL_GPIO_WritePin(led_red_GPIO_Port,led_red_Pin,GPIO_PIN_RESET);if((arrayItem = cJSON_GetObjectItem(json,"results")) != NULL)     //匹配字符串results,获取数组内容{HAL_GPIO_WritePin(led_red_GPIO_Port,led_red_Pin,GPIO_PIN_RESET);int size = cJSON_GetArraySize(arrayItem);// sprintf(text,"size is %d",size);// lcd_showstr(0,0,(uint8 *)text,WHITE);if((object = cJSON_GetArrayItem(arrayItem,0)) != NULL)         //results第0位{//if((subobject = cJSON_GetObjectItem(object,"location")) != NULL);   //位置信息if((subobject = cJSON_GetObjectItem(object,"daily")) != NULL)      //天气信息{int tianqi_size = cJSON_GetArraySize(subobject);// sprintf(text,"size is %d",tianqi_size);// lcd_showstr(0,1,(uint8 *)text,WHITE);if((nowobject = cJSON_GetArrayItem(subobject,0)) != NULL)        //今天{nowtext = cJSON_GetObjectItem(nowobject,"text_day");            //天气状况nowhigh = cJSON_GetObjectItem(nowobject,"high");                //高温nowlow = cJSON_GetObjectItem(nowobject,"low");                  //低温nowdate = cJSON_GetObjectItem(nowobject,"date");                //日期sprintf(text,"%s:",nowdate->valuestring);lcd_showstr(0,0,(uint8 *)text,WHITE);sprintf(text,"%s %sC/%sC",nowtext->valuestring,nowhigh->valuestring,nowlow->valuestring);lcd_showstr(20,1,(uint8 *)text,WHITE);}if((mingobject = cJSON_GetArrayItem(subobject,1)) != NULL)        //明天{mingtext = cJSON_GetObjectItem(mingobject,"text_day");            //天气状况minghigh = cJSON_GetObjectItem(mingobject,"high");                //高温minglow = cJSON_GetObjectItem(mingobject,"low");                  //低温mingdate = cJSON_GetObjectItem(mingobject,"date");                //日期sprintf(text,"%s:",mingdate->valuestring);lcd_showstr(0,3,(uint8 *)text,WHITE);sprintf(text,"%s %sC/%sC",mingtext->valuestring,minghigh->valuestring,minglow->valuestring);lcd_showstr(20,4,(uint8 *)text,WHITE);}if((houobject = cJSON_GetArrayItem(subobject,2)) != NULL)        //后天{houtext = cJSON_GetObjectItem(houobject,"text_day");            //天气状况houhigh = cJSON_GetObjectItem(houobject,"high");                //高温houlow = cJSON_GetObjectItem(houobject,"low");                  //低温houdate = cJSON_GetObjectItem(houobject,"date");                //日期sprintf(text,"%s:",houdate->valuestring);lcd_showstr(0,6,(uint8 *)text,WHITE);sprintf(text,"%s %sC/%sC",houtext->valuestring,houhigh->valuestring,houlow->valuestring);lcd_showstr(20,7,(uint8 *)text,WHITE);}}//if((subobject = cJSON_GetObjectItem(object,"last_update")) != NULL);      //更新信息}}} cJSON_Delete(json);return 0;
}

3、核心控制代码 

u8g2_ClearBuffer(&u8g2);if(key[0].single_flag == 1){key[0].single_flag = 0;// esp01s_senddata("GET http://api.pinduoduo.com/api/server/_stm\r\n");esp01s_senddata("GET https://api.seniverse.com/v3/weather/daily.json?key=S6H95GCCwULqmbSE8&location=weifang&language=en&unit=c&start=-1&days=4\r\n");te = ESP8266_GetIPD_GET(200, Time_buff); //将串口数据取出来esp01s_clear();//清除缓存数据HAL_Delay(500);while(esp01s_sendcmd("+++", ""));      /*退出透传模式,发送两次*/HAL_GPIO_WritePin(led_blue_GPIO_Port,led_blue_Pin,GPIO_PIN_SET);}// int num1 = strlen((char*) te);// sprintf(text,"%d",num1);// lcd_showstr(0,7,(uint8 *)text,WHITE);test2_jiexi();u8g2_SendBuffer(&u8g2);// lcd_clear(BLACK);

四、修改堆栈大小

在json处理长字符串时,需要修改堆栈大小(卡了好长时间)

将 Stack_Size与Heap_Size改大,程序正常运行

有需要的可以联系我,给工程代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/178291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis的解析和运行原理

文章目录 MyBatis的解析和运行原理MyBatis的工作原理 MyBatis的解析和运行原理 MyBatis编程步骤是什么样的? 1、 创建SqlSessionFactory 2、 通过SqlSessionFactory创建SqlSession 3、 通过sqlsession执行数据库操作 4、 调用session.commit()提交事务 5、 调用…

lettcode 1089. 复写零

代码&#xff1a; class Solution {public void duplicateZeros(int[] arr) {int cur 0, dest -1, n arr.length;// 1. 先找到最后⼀个需要复写的数while (cur < n) {if (arr[cur] 0) dest 2;else dest 1;if (dest > n - 1) break;cur;}// 2. 处理⼀下边界情况if …

智能优化算法应用:基于多元宇宙算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于多元宇宙算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于多元宇宙算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.多元宇宙算法4.实验参数设定5.算法结果6.参考…

函数版 → 求小于给定整数的最大素数 ← Python

【题目描述】 求小于给定整数的最大素数。【算法分析】 ● 求n以内的最大素数&#xff0c;实现技巧之一是从n-1开始判断其是否为素数&#xff0c;这样可以提升算法效率。 ● 在Python中实现由x至1的递减操作&#xff0c;需要使用 range(x,1,-1)。注意其中的-1。● 在Python中&a…

激光器温度,波长变化

940&#xff0c;波长变化0.3nm/C

linux 驱动——原子操作

文章目录 linux驱动——原子操作原子操作 API原子位操作 API原子操作驱动原子操作 APP linux驱动——原子操作 原子操作 API Linux 内核定义了叫做 atomic_t 的结构体来完成整型数据的原操作&#xff0c;在使用是使用原子变量来代替整型变量。此结构体定义在 include/linux/t…

LeetCode Hot100 226.翻转二叉树

题目&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 递归&#xff1a;深度优先遍历 迭代&#xff1a;广度优先遍历 方法&#xff1a;迭代 class Solution {public TreeNode invertTree(TreeNode root) {if (root null…

深度学习早停机制(Early Stopping)与早退机制(Early exiting)

早停机制&#xff0c;一种机器学习模型调优策略&#xff0c;提升调优效率 下图损失值明显经过了欠拟合到过拟合 使用早停机制后&#xff0c;模型不再过拟合 模型早停是面向模型训练过程的。而在模型内部&#xff0c;也会出现类似的现象&#xff0c;这一现象被叫做过度思考(Ove…

SAP 调用OO类发送邮件测试(可发送表格和附件)

原文链接&#xff1a;https://blog.csdn.net/sapliumeng/article/details/134152739 在SAP实施中&#xff0c;邮件发送功能在很多项目都会用到&#xff0c;而且往往是把内表以Excel或者CSV的格式发送附件&#xff0c;最好是这个表格也可以显示在正文中&#xff0c;这样的话如果…

Linux中执行java命令报错:cannot execute binary file: Exec format error

网上很多文章 都是说操作系统和JDK&#xff0c;32位和64位不兼容问题 当你非常确定你的操作系统是64位&#xff0c;并且JDK也是64位的时候 或者非常确定你的操作系统是32位&#xff0c;并且JDK也是32位的时候 怎么办&#xff1f; 使用以下命令&#xff0c;查看你的操作系统…

华为的数字化转型(9)——企业架构4A集成模型

企业架构&#xff08;Enterprise Architecture&#xff0c;EA&#xff09;是衔接战略与项目实施的桥梁&#xff0c;引入企业架构方法&#xff0c;可以对数字化转型愿景进行系统性的、分层分级的梳理和解释&#xff0c;以便企业上下在同一张蓝图上统一认识。 企业架构提供了整体…

Druid数据库连接池框架

1.Druid概述 Druid 是一个开源的数据库连接池框架&#xff0c;用于管理和优化数据库连接的使用。它提供了高效的、可扩展的连接池管理&#xff0c;可以用于 Java 应用程序连接到关系型数据库。 之前有了解过 C3P0 数据库连接池&#xff0c;所谓数据库连接池就是重复利用连接数据…

接口文档自动生成工具:详细教程和实用技巧

本篇文章详细教你如何使用 Apifox 的 IDEA 插件实现自动生成接口代码。好处简单总结有以下几点&#xff1a; 自动生成接口文档&#xff1a; 不用手写&#xff0c;一键点击就可以自动 生成文档&#xff0c;当有更新时&#xff0c;点击一下就可以自动同步接口文档&#xff1b;代…

影响PPC广告成本预算的因素,如何计算亚马逊PPC广告预算——站斧浏览器

亚马逊PPC&#xff0c;又称按点击付费(Pay Per Click)&#xff0c;是一种只有用户点击你的广告时才会向你收费的模式。那么影响PPC广告成本预算的因素,如何计算亚马逊PPC广告预算&#xff1f; 影响PPC广告成本预算的因素 1、产品类别&#xff1a;不同类别的产品竞争程度不同&…

性能优化的一般策略及方法

性能优化的一般策略及方法 在汽车嵌入式开发领域&#xff0c;性能优化始终是一个无法回避的问题&#xff1a; 座舱 HMI 想要实现更流畅的人机交互 通信中间件在给定的 CPU 资源下&#xff0c;追求更高的吞吐量 更一般的场景&#xff1a;嵌入式设备 CPU 资源告急&#xff0c;需…

前端将blob转换为可下载的url及下载

一.转换 //将blob转换为url const changeBlobToUrl blobData > {return new Promise(resolve > {//创建Blob对象const blob new Blob([blobData])// 创建FileReader对象const reader new FileReader()reader.onload function (e) {resolve(e.target.result)}// 使用F…

Gin投票系统(2)

投票系统 数据库的建立 先分析需求&#xff0c;在sql中建立数据库&#xff0c;关于项目数据库如何建立可以在“goweb项目创建流程分析中看如何去建表” 成功后目前有四个表&#xff1a; vote&#xff0c;user&#xff0c;vote_opt,vote_opt_user 建立数据库&#xff0c;可以…

ERRO报错

无法下载nginx 如下解决&#xff1a; 查看是否有epel 源 安装epel源 安装第三方 yum -y install epel-release.noarch NGINX端口被占用 解决&#xff1a; 编译安装的NGINX配置文件在/usr/local/ngin/conf 修改端口

2024年天津艺术职业学院专升本报名工作的通知

天津艺术职业学院关于2024年天津市高职升本科考试报名工作的通知 请天津艺术职业学院各位2024届大专应届毕业生&#xff08;含高职扩招2024年应届毕业生&#xff09;查阅以下通知。 一、网上报名 &#xff08;一&#xff09;时间及网址&#xff1a;请于2023年12月4日9:00至6日…

【面经八股】搜广推方向:常见面试题(六)

【面经&八股】搜广推方向:常见面试题(六) 文章目录 【面经&八股】搜广推方向:常见面试题(六)1. Memorization 和 Generalization2. Wide 和 Deep3. Cross-product transformation4. 推荐系统划分5. 线性模型6. Embedding-Based 模型7. 推荐系统工作流程8. Wide P…