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.参考…

激光器温度,波长变化

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

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;以便企业上下在同一张蓝图上统一认识。 企业架构提供了整体…

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

本篇文章详细教你如何使用 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;需…

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日…

DM8误删除操作恢复方案

达梦数据库三种在误删除操作后的回退方案 一、闪回表 当用户操作不慎导致错误的删改数据时&#xff0c;闪回方式可以恢复数据。闪回技术&#xff0c;就是为了用户可以迅速处理这种 数据逻辑损坏的情况而产生的。 闪回技术主要是通过回滚段存储的 UNDO 记录来完成历史记录的还原…

C语言:编程实现1!+2!+3!+4!+……+n!

分析&#xff1a; #include<stdio.h>//这是一个预处理指令&#xff0c;将stdio.h头文件包含到程序中&#xff0c;以便使用输入输出函数。 int main()//这是程序的主函数&#xff0c;是程序执行的入口点。 int i, a 1, t 0, n;//定义了整型变量i、a、t和n。其中&#x…

13.Spring源码解析-prepareBeanFactory

点进去 此处是 Spel表达式设置 BeanExpressionResolver 此接口只有一个实现: StandardBeanExpressionResolver。接口只含有一个方法: Object evaluate(String value, BeanExpressionContext evalContext) prepareBeanFactory将一个此对象放入BeanFactory: beanFactory.setB…

使用elementPlus去除下拉框蓝色边框

// 下拉框去除蓝色边框 .el-select {--el-select-input-focus-border-color: none !important; }

算法之插入排序及希尔排序(C语言版)

我们来实现上述排序 一.插入排序. 当插入第i(i>1)个元素时&#xff0c;前面的array[0],array[1],.,array[i-1]已经排好序&#xff0c;此时用array[i的排序码与array[i-1]array[i-2].的排序码顺序进行比较&#xff0c;找到插入位置即将arrayU插入&#xff0c;原来位置上的元…