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改大,程序正常运行

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分布式锁之基于zookeeper实现分布式锁(三)

3. 基于zookeeper实现分布式锁 实现分布式锁目前有三种流行方案,分别为基于数据库、Redis、Zookeeper的方案。这里主要介绍基于zk怎么实现分布式锁。在实现分布式锁之前,先回顾zookeeper的相关知识点 3.1. 知识点回顾 3.1.1. 安装启动 安装&#xff1a…

python回溯求解电话号码组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 输入:digits "23" 输出:["ad&qu…

C语言——计算Fibonacci数列

方式一 for循环 (20位) #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int n;int a[20]{1,1};for ( n 1; n <20; n){a[n]a[n-2]a[n-1];}for ( n 0; n < 20; n){if(n%50)printf("\n");printf("%12d ",a[n]);}return 0; …

EZDML基本介绍

一、表结构设计器(EZDML) 这是一个数据库建表的小软件&#xff0c;可快速的进行数据库表结构设计&#xff0c;建立数据模型。类似大家常用的数据库建模工具如PowerDesigner、ERWIN、ER-Studio和Rational-Rose等的超级精简版。 官方下载地址&#xff1a;http://www.ezdml.com/d…

第二十章——多线程

一.线程简介 线程的特点 1.进程是资源分配的最小单位&#xff0c;线程是最小的执行单位 2.一个进程可以有多个线程 3.线程共享进程资源 二.创建线程 1.继承Thread类 1.Thread类是java.lang包中的一个类&#xff0c;从这个类实例化的对象代表线程&#xff0c;程序员启动一…

Python小技巧:探索函数调用为何加速代码执行

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Python 作为一种解释型语言&#xff0c;其执行速度相对于编译型语言可能会较慢。然而&#xff0c;在Python中&#xff0c;通常观察到代码在函数中运行得更快的现象。这个现象主要是由于函数调用的内部优化和解释…

二十一、数组(6)

本章概要 数组排序Arrays.sort的使用并行排序binarySearch二分查找parallelPrefix并行前缀 数组排序 根据对象的实际类型执行比较排序。一种方法是为不同的类型编写对应的排序方法&#xff0c;但是这样的代码不能复用。 编程设计的一个主要目标是“将易变的元素与稳定的元素…

PLC:200smart

PLC&#xff1a;200smart 第十章、数据类型、数据存储1、数据类型1.1、有符号数1.2、有符号数 2、传送指令 第十一章、比较指令、整数、浮点数的运算1、比较指令1、运算指令1.1、浮点数运算1.2、整数运算 第十章、数据类型、数据存储 1、数据类型 数据类型分为两大类 无符号数…

Cream&Me 鲜奶油饼屋广州首店正式开业!

11月16日&#xff0c;Cream&#xff06;Me 鲜奶油饼屋在广州K11首店正式开业&#xff01; Cream&#xff06;Me鲜奶油饼屋与之前广州人气日式甜品品牌【KNOTKNOT珞珞】同属同一个团队打造&#xff0c;于2022年起筹备&#xff0c;首店于广州K11商场。C&#xff06;M以生日蛋糕日…

Vue3的项目创建到启动

Vue3的项目创建 检查node版本创建 npm init vuelatest 安装依赖 项目启动 启动成功

springcloud进销存管理系统源码

开发说明&#xff1a; jdk1.8&#xff0c;mysql5.7&#xff0c;idea&#xff0c;vscode springcloud springboot mybatis vue elementui 功能介绍&#xff1a; 后台管理&#xff1a; 统计分析&#xff1a;查看产品&#xff0c;采购&#xff0c;销售数量&#xff1b;统计近…

2023年【化工自动化控制仪表】考试资料及化工自动化控制仪表新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 化工自动化控制仪表考试资料参考答案及化工自动化控制仪表考试试题解析是安全生产模拟考试一点通题库老师及化工自动化控制仪表操作证已考过的学员汇总&#xff0c;相对有效帮助化工自动化控制仪表新版试题学员顺利通…

AutoSAR Classic Platform和Adaptive Platform 区别

概述 本文主要内容分为两章节。第一章节简要介绍了AUTOSAR的软件架构&#xff0c;设计理念以及方法论&#xff0c;对Classic Platform和Adaptive Platform做了简单的比较。第二章主要介绍了Adaptive Platform的特性。 第一章 AUTOSAR架构介绍 AUTOSAR(AUTomotive Open Syste…

解决苹果手机iphone手机强制重启

强制关机&#xff1a; 方法1.同时按住左侧的&#xff0c;- 键中的一个和右侧的电源键 方法2.点击桌面的悬浮键–设备–更多–重新启动

Jquery动画特效

1&#xff0c;Jquery提供的特效方法 2&#xff0c;实例代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

小程序如何进行一键修复

在使用小程序过程中&#xff0c;难免会遇到一些问题&#xff0c;比如程序崩溃、功能异常等等。这时&#xff0c;版本一键修复就显得尤为重要了。下面&#xff0c;我们就来介绍一下小程序如何进行版本一键修复。 一、什么是版本一键修复&#xff1f; 版本一键修复是指在小程序…

【图像分割】【深度学习】PFNet官方Pytorch代码-PFNet网络损失函数模块解析

【图像分割】【深度学习】PFNet官方Pytorch代码-PFNet网络损失函数模块解析 文章目录 【图像分割】【深度学习】PFNet官方Pytorch代码-PFNet网络损失函数模块解析前言PM定位模块损失函数FM聚焦模块损失函数总结 前言 在详细解析PFNet代码之前&#xff0c;首要任务是成功运行PF…

会声会影2024旗舰版系统配置要求及格式支持

会声会影2024旗舰版是一款广受欢迎的视频编辑软件&#xff0c;它的最新版本&#xff0c;会声会影2023&#xff0c;已经发布。在这篇文章中&#xff0c;我们将探讨会声会影2024旗舰版系统配置要求及格式支持 会声会影2024是一款专业的视频剪辑软件&#xff0c;能够帮助用户制作高…

vue+uniapp校园寻物失物招领平台 微信小程序1f6z5

系统中的核心用户是管理员&#xff0c;管理员登录后&#xff0c;通过管理员菜单来管理后台系统。主要功能有&#xff1a;首页、个人中心、用户管理、物品分类管理、物品信息管理、物品归还管理、留言板管理、系统管理等功能。管理员用例如图3-7所示。 对于本网上失物招领小程序…

unity3d地图、地面跟着NPC跑

清除烘焙后&#xff0c;再 将地图、地面的设置为非静态。只设置NPC的寻路路面为静态&#xff0c;再烘焙