精华内容
下载资源
问答
  • 8266驱动OLED屏幕显示天气,有代码,固件,详细说明文档
  • ESP8266+OLED显示天气

    千次阅读 2021-03-10 18:13:42
    ESP8266+OLED显示天气   在太极创客学习ESP8266三四天了,记录一下学习过程,还请各位大佬多加指点。   基本思路:首先,ESP8266作客户端向心知天气API发送GET请求;然后,从心知天气响应报文体中的JSON数据解析...

    ESP8266+OLED显示天气

      在太极创客学习ESP8266三四天了,记录一下学习过程,还请各位大佬多加指点。
      基本思路:首先,ESP8266作客户端向心知天气API发送GET请求;然后,从心知天气响应报文体中的JSON数据解析出天气,气温等数据;最后用在OLED上把天气信息显示。

    1 硬件及连接

    • ESP8266-NodeMCU
    • OLED屏幕
    • 四根杜邦线
    • 数据线一条
      OLED的VCC连接ESP8266-NodeMCU的3V引脚,GND连接MCU的G引脚,SCL连接MCU的D1引脚,SDA连接MCU的D2引脚

    2 心知天气API

    在知心天气申请API,并记住私钥
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    API的地址为api.seniverse.com/v3/weather/now.json?key=私钥(填写自己申请到的)&location=Xian(填写地点)&language=en&unit=c。服务器响应了一个JSON对象

    {
    "results":
    	[
    	{
    		"location":{"id":"WQJ6YY8MHZP0","name":"Xian","country":"CN","path":"Xian,Xian,Shanxi,China","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},
    		"now":{"text":"Shower","code":"10","temperature":"7"},
    		"last_update":"2021-03-10T17:25:00+08:00"
    }
    ]
    }
    

    改JSON对象的元素是一个数组,数组的元素时三条JSON数据,数据名分别为Location,Now,以及last_update。

    3 代码

    #include <ESP8266WiFi.h>
    #include <ArduinoJson.h>
    #include <U8g2lib.h>
    #include <Wire.h>
    
    //-------Wifi信息------//
    const char* ssid = "xxxx";
    const char* password = "xxxx";
    //------------------- //
    api.seniverse.com/v3/weather/now.json?key=SbCTo-Zgsj2X_44Er&location=Xian&language=en&unit=c
    const int httpPort = 80; //端口号
    const char* host = "api.seniverse.com"; //服务器地址
    
    String reqUserKey = "xxxxxxxxxx";//知心天气API私钥
    String reqLocation = "Xian";//地址
    String reqUnit = "c";//摄氏度
    
    //-------------------http请求-----------------------------//
    String reqRes = "/v3/weather/now.json?key=" + reqUserKey +
                    + "&location=" + reqLocation +
                    "&language=en&unit=" + reqUnit;
    String httprequest = String("GET ") + reqRes + " HTTP/1.1\r\n" +
                         "Host: " + host + "\r\n" +
                         "Connection: close\r\n\r\n";
    //--------------------------------------------------------//
    
    U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0,/* reset=*/ U8X8_PIN_NONE);
    
    void OLEDDispaly(String cityName, String weather, String temperature);
    void wifi_connect();
    void httpRequest();
    void parseJson(WiFiClient client);
    
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
      u8g2.begin();
      wifi_connect();
    
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
      httpRequest();
      delay(3000);
    }
    
    void wifi_connect() {
      //提示信息
      Serial.print("Wifi connecting");
      
      u8g2.clearBuffer();
      u8g2.setFont(u8g2_font_unifont_t_chinese2);
      u8g2.setCursor(0, 16);
      u8g2.print("Wifi connecting ...");
      u8g2.sendBuffer();
      
      //连接Wifi
      WiFi.begin(ssid, password);
      while (WiFi.status() != WL_CONNECTED) {
        Serial.print(".");
        delay(500);
      }
      Serial.println("\nWifi Connected!");
      
      u8g2.clearBuffer();
      u8g2.setCursor(0, 16);
      u8g2.print("Wifi connected!!!");
      u8g2.sendBuffer();
      
    }
    
    void httpRequest() {
      WiFiClient client;
      //1 连接服务器
      if (client.connect(host, httpPort)) {
        Serial.println("连接成功,接下来发送请求");
        client.print(httprequest);//访问API接口
        String response_status = client.readStringUntil('\n');
        Serial.println(response_status);
    
        if (client.find("\r\n\r\n")) {
          Serial.println("响应报文体找到,开始解析");
        }
        parseJson(client);
      }
      else {
        Serial.println("连接服务器失败");
      }
      client.stop();
    }
    
    void OLEDDispaly(String cityName, String weather, String temperature) {
      u8g2.clearBuffer();
      u8g2.setCursor(0, 16);
      u8g2.print("City: ");
      u8g2.print(cityName);
      u8g2.setCursor(0, 36);
      u8g2.print("Weather: ");
      u8g2.print(weather);
      u8g2.setCursor(0, 52);
      u8g2.print("temperature: ");
      u8g2.print(temperature);
      u8g2.sendBuffer();
    }
    
    void parseJson(WiFiClient client) {
      const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(1) + 2 * JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(6) + 230;
      DynamicJsonDocument doc(capacity);
      deserializeJson(doc, client);
    
      JsonObject obj1 = doc["results"][0];
      String cityName = obj1["location"]["name"].as<String>();
      String weather = obj1["now"]["text"].as<String>();
      String temperature = obj1["now"]["temperature"].as<String>();
      OLEDDispaly(cityName, weather, temperature);
      Serial.println(cityName);
      Serial.println(weather);
      Serial.println(temperature);
    }
    
    展开全文
  • ESP8266+OLED屏实现天气预报+温度显示+NTP时间同步4屏带中文显示
  • stm32控制ESP8266获取指定城市天气并且在led屏幕显示 使用: 在ATK_ESP8266文件夹下面的wifista.c第14行修改wifi的ssid号和密码。编译烧录后即可使用。 在ATK_ESP8266文件夹下面的weather.c中修改85行修改天气...

    stm32控制ESP8266获取指定城市天气并且在led屏幕上显示


    使用:

    • 在ATK_ESP8266文件夹下面的wifista.c第14行修改wifi的ssid号和密码。编译烧录后即可使用。
    • 在ATK_ESP8266文件夹下面的weather.c中修改85行修改天气api。
    • 在PICTURE文件夹下面的picture.c修改led显示的背景图片。
    • 时间的显示可以使用stm32的实时时钟模块,然后串口授时;使用时间API获取北京时间。

    实验器材:

    • 战舰V3\精英STM32F103开发板
    • ESP8266wifi模块

    实验目的:

    • 学习ATK_ESP8266高性能UART_WIFI模块的使用,掌握基本的TCP,UDP通信串口AT指令配置方法.
    • 获取天气api,获得天气并且显示。

    硬件资源:
    1,DS0(连接在PB5)
    2,串口1(波特率:115200,PA9/PA10连接在板载USB转串口芯片CH340上面)
    3,串口3(波特率:115200,PB10/PB11)
    4,ALIENTEK 2.8/3.5/4.3/7寸TFTLCD模块(通过FSMC驱动,FSMC_NE4接LCD片选/A10接RS)
    5,按键KEY0(PE4)/KEY1(PE3)/KEY_UP(PA0,也称之为WK_UP)
    6,SD卡,通过SDIO(SDIO_D0D4(PC8PC11),SDIO_SCK(PC12),SDIO_CMD(PD2))连接
    7,W25Q128(SPI FLASH芯片,连接在SPI2上)
    8,24C02
    9,ATK_ESP8266 WIFI模块1个
    10.3.5寸LCD屏幕

    连接方式:
    模块与带有无线网卡的电脑或其他wifi设备连接:采用wifi连接
    模块与开发板连接(TTL串口方式):
    ATK-ESP8266 WIFI模块与精英板连接方式(通过4根杜邦线连接):
    ATK-ESP8266 WIFI模块 战舰V3\精英STM32开发板
    TXD<------------>PB11
    RXD<------------>PB10
    GND<------------>GND
    VCC<------------>3.3V\5V

    项目地址:demo
    有问题欢迎提Issues,喜欢可以给个star( ˶‾᷄࿀‾᷅˵ )

    实验现象:
    通过api获取网络天气并且图文并茂显示,led上可以显示北京时间。
    在这里插入图片描述

    展开全文
  • ESP8266+OLED屏实现天气预报+温度显示+NTP时间同步5屏带中文显示字幕 在之前原来4屏内容显示的基础上,有添加了1屏字幕内容显示,可能已经达到上限了,因为下方的页眉数量显示的点达到饱和了。 第一屏幕: 第二屏幕...

    ESP8266+OLED屏实现天气预报+温度显示+NTP时间同步5屏带中文显示字幕

    在之前原来4屏内容显示的基础上,有添加了1屏字幕内容显示,可能已经达到上限了,因为下方的页眉数量显示的点达到饱和了。

    • 最近更新

    ESP8266气象站+图形播放器

    第一屏幕:
    在这里插入图片描述
    第二屏幕:
    在这里插入图片描述
    第三屏幕:
    在这里插入图片描述
    第四屏幕:
    在这里插入图片描述

    第五屏幕:

    展开全文
  • Android 仿UC、墨迹天气左右拖动多屏幕显示效果。 
  • 基于STM32+ESP8266+TFTLCD的天气预报显示

    千次阅读 2020-10-19 10:55:51
    STM32+ESP8266+TFTLCD实现天气预报显示欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定...

    前言

    最近发现自己学的东西都太杂了,真正开始找工作,才意识到自己应该精通某样技能。认真开始使用STM32做小项目后才发现自己有好多东西不知道,感觉自己是真的菜。虽然这也不是新的技术,但是真正要做到精通,其中道理要研究的东西还是蛮多的。并且好久没有更新文章了,最近在知乎上看到别人使用STM32做了一个实时疫情的显示屏,想着自己也动手做一个显示天气预报的装置。工程源码见文末。

    项目思路

    STM32与ESP8266通过串口连接,STM32通过串口向ESP8266发送指令:连接AP,创建TCP连接,创建SSL连接,发送GET请求获取天气数据,STM32解析JSON数据,将天气数据显示在TFTLCD屏幕上。屏幕可显示最近三天的天气情况和显示实时24小时天气(最多显示至第12小时),使用按键来切换,显示不同的天气页面。

    效果演示

    系统启动默认显示当前时间之后三个小时的天气信息
    在这里插入图片描述
    按下切换按钮显示下三个小时的天气信息
    在这里插入图片描述
    按下切换按钮显示逐日天气信息
    在这里插入图片描述

    心知天气API

    我使用心知天气获取天气信息,由于STM32使用cJSON需要消耗大量内存,如果获取的数据量过大会导致JSON数据解析失败的结果,而这个API可以根据自己的要求获取一定数量的数据,不仅可以获取24小时逐小时天气数据,还可以获取逐日天气数据。
    逐日天气预报参数表
    在这里插入图片描述
    24小时逐小时天气预报
    在这里插入图片描述

    硬件部分

    材料

    STM32F103ZET6开发板,ESP8266-01,2.8寸TFTLCD屏幕。
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

    硬件连接

    ESP8266-RX->PB10
    ESP8266-TX->PB11
    ESP8266-CH_PD->3V3
    ESP8266-3V3->3V3
    ESP8266-GND->GND在这里插入图片描述

    软件部分

    ESP8266AT固件指令

    1. 连接ap指令:AT+CWJAP=“SSID”,“password”
    2. 创建TCP连接:AT+CIPSTART=“TCP”,“www.domain.com”,80
    3. 创建SSL连接:AT+CIPSTART=“SSL”,“www.domain.com”,443
    4. 设置为透传模式:AT+CIPMODE=1
    5. 发送数据:AT+CIPSEND
    6. 直接向串口发送GET请求
    7. 退出透传模式:
      +++
      AT+CIPMODE=0
    8. 断开TCP连接:AT+CIPCLOSE
    9. 断开SSL连接:AT+CIPCLOSE

    页面布局

    /*
    显示实时天气
    */
    void showRTweather(){
    	char path[15];
    	u8 i,x0=20,x1=50;
    	LCD_Fill(0,22,320,240,WHITE);	
    	for(i=0;i<3;i++){
    		LCD_ShowString(20+i*110,22,64,16,16,(u8*)weather.time[i]);
    		sprintf(path,"0:/ICONS/%s.bmp",weather.code[i]);
    		ai_load_picfile((const unsigned char*)path,x0+i*110,40,60,60,1);	
    		
    		Show_Str(10+i*110,130,32,16,"天气",16,0);
    		LCD_ShowChar(42+i*110,130,':',16,0);
    		Show_Str(x1+i*110,130,32,16,(u8*)WeatherCode[u8Tou16(weather.code[i])],16,0);
    		Show_Str(10+i*110,150,32,16,"温度",16,0);
    		LCD_ShowChar(42+i*110,150,':',16,0);
    		LCD_ShowString(x1+i*110,150,32,16,16,(u8*)weather.temperature[i]);
    		Show_Str(10+i*110,170,32,16,"湿度",16,0);
    		LCD_ShowChar(42+i*110,170,':',16,0);
    		LCD_ShowString(x1+i*110,170,32,16,16,(u8*)weather.humidity[i]);
    	}		
    }
    /*
    显示逐日天气
    */
    void showRDweather(){
    	char path[15];
    	u8 i,x0=20,x1=50;
    	LCD_Fill(0,22,320,240,WHITE);
    	for(i=0;i<3;i++){
    		Show_Str(30+i*110,22,32,16,(u8*)date[i],16,0);
    		sprintf(path,"0:/ICONS/%s.bmp",RDweather.code_day[i]);
    		ai_load_picfile((const unsigned char*)path,x0+i*110,40,60,60,1);
    		
    		Show_Str(10+i*110,130,32,16,"白天",16,0);
    		LCD_ShowChar(42+i*110,130,':',16,0);
    		Show_Str(x1+i*110,130,32,16,(u8*)WeatherCode[u8Tou16(RDweather.code_day[i])],16,0);
    		Show_Str(10+i*110,150,32,16,"夜晚",16,0);
    		LCD_ShowChar(42+i*110,150,':',16,0);
    		Show_Str(x1+i*110,150,32,16,(u8*)WeatherCode[u8Tou16(RDweather.code_night[i])],16,0);
    		Show_Str(10+i*110,170,32,16,"最高",16,0);
    		LCD_ShowChar(42+i*110,170,':',16,0);
    		LCD_ShowString(x1+i*110,170,32,16,16,(u8*)RDweather.high[i]);
    		Show_Str(10+i*110,190,32,16,"最低",16,0);
    		LCD_ShowChar(42+i*110,190,':',16,0);
    		LCD_ShowString(x1+i*110,190,32,16,16,(u8*)RDweather.low[i]);
    		Show_Str(10+i*110,210,32,16,"湿度",16,0);
    		LCD_ShowChar(42+i*110,210,':',16,0);
    		LCD_ShowString(x1+i*110,210,32,16,16,(u8*)RDweather.humidity[i]);
    	}
    }
    /*
    刷新当前页面
    */
    void refresh(){
    	if(thispage==-1){
    		getRDWeather();
    		showRDweather();
    	}else{
    		getRTWeather(thispage);
    		showRTweather();
    	}
    }
    /*
    thispage=-1,0,3,6,9
    */
    void switchWeather(){
    	u8 key=0; 
    		key=KEY_Scan(0);  //扫描按键按下
    		if(key==1){  
    				if(thispage<0){  //-1代表逐日天气页面,按下KEY1跳转0页面
    					getRTWeather(0);
    					showRTweather();	
    					thispage=0;
    				}else{  //跳转至-1页面
    					getRDWeather();  //获取逐日时间
    					showRDweather(); //显示逐日时间
    					thispage=-1;
    				}					
    		}				
    		if(key==2){
    				if(thispage==-1){  
    					getRTWeather(0);
    					showRTweather();
    					thispage=0;
    				}else{
    					if(thispage==9){ //最多显示到第9+3小时的天气
    						thispage=0;
    						getRTWeather(thispage);
    						showRTweather();		
    					}else{  //每个页面显示三个小时的天气
    						thispage=thispage+3;
    						getRTWeather(thispage);
    						showRTweather();					
    					}
    				}
    		}		
    }
    /*
    日期时间显示
    */
    void gui_load(){
    	LCD_DrawLine(0,20,320,20);							//
    	LCD_ShowNum(0,0,Localtime.year,4,16);
    	LCD_ShowStr(32,0,3);  //年
    	LCD_ShowNum(48,0,Localtime.month,2,16);
    	LCD_ShowStr(64,0,2);  //月
    	LCD_ShowNum(80,0,Localtime.day,2,16);
    	LCD_ShowStr(96,0,4);  //日
    	
    	LCD_ShowNum(130,0,Localtime.hour,2,16);
    	LCD_ShowStr(146,0,5); //时
    	LCD_ShowNum(162,0,Localtime.min,2,16);
    	LCD_ShowStr(178,0,6); //分
    	LCD_ShowNum(194,0,Localtime.sec,2,16);
    	LCD_ShowStr(210,0,7); //秒	
    }
    

    JSON数据解析

    时间JSON数据格式:

    {
      "code": 200,
      "msg": "success",
      "newslist": [
        {
          "country": "中国",
          "city": "上海",
          "timeZone": "GMT +8",
          "strtime": "2020-09-26 15:35:07",
          "timestamp": 1601105707,
          "weeknum": "6"
        }
      ]
    }
    

    天气JSON数据格式:

    {
    	"results": [{
    		"location": {
    			"id": "WTW3SJ5ZBJUY",
    			"name": "上海",
    			"country": "CN",
    			"path": "上海,上海,中国",
    			"timezone": "Asia/Shanghai",
    			"timezone_offset": "+08:00"
    		},
    		"hourly": [{
    			"time": "2020-09-30T17:00:00+08:00",
    			"text": "晴",
    			"code": "0",
    			"temperature": "25",
    			"humidity": "55",
    			"wind_direction": "北",
    			"wind_speed": "19.80"
    		}, {
    			"time": "2020-09-30T18:00:00+08:00",
    			"text": "晴",
    			"code": "1",
    			"temperature": "23",
    			"humidity": "57",
    			"wind_direction": "北",
    			"wind_speed": "16.56"
    		}]
    	}]
    }
    

    解析数据并储存在结构体中

    u8 getRDWeather(){	
    	cJSON *root,*results,*result_arr,*result0,*results_arr,*item;
    	u8 error=0;
    	int i=0;
    	ConSSL();
    	delay_ms(500);
    	SetPassThrough();
    	memset(USART_RX_BUF3,0,strlen((const char*)USART_RX_BUF3));
    	USART_RX_STA3 = 0;
    	Usart_SendString(USART3,"GET https://api.seniverse.com/v3/weather/daily.json?key=SRpZAIwb07j1twRHA&location=shanghai&language=zh-Hans&unit=c&start=0&days=3\r\n\r\n");   //获取当地天气
    	delay_ms(1000);
    	root=cJSON_Parse((char*)USART_RX_BUF3); //解析收到的JSON数据
    	RstPassThrough(); //关闭透传
    	if(root!=0){			
    			results=cJSON_GetObjectItem(root,"results");  //获取JSON对象的results属性
    			results_arr=cJSON_GetArrayItem(results,0);
    			result_arr=cJSON_GetObjectItem(results_arr,"daily");
    			if(result_arr->type==cJSON_Array){
    				for(i=0;i<3;i++){
    					result0=cJSON_GetArrayItem(result_arr,i);
    					
    					item=cJSON_GetObjectItem(result0,"code_day");
    					memcpy(RDweather.code_day[i],item->valuestring,strlen(item->valuestring)); //属性数据复制到结构体中
    					
    					item=cJSON_GetObjectItem(result0,"code_night");
    					memcpy(RDweather.code_night[i],item->valuestring,strlen(item->valuestring));		
    					printf("temperature:%s",weather.temperature[i]);
    
    					item=cJSON_GetObjectItem(result0,"high");
    					memcpy(RDweather.high[i],item->valuestring,strlen(item->valuestring));
    
    					item=cJSON_GetObjectItem(result0,"low");
    					memcpy(RDweather.low[i],item->valuestring,strlen(item->valuestring));					
    					
    					item=cJSON_GetObjectItem(result0,"humidity");
    					memcpy(RDweather.humidity[i],item->valuestring,strlen(item->valuestring));	
    					printf("humidity:%s",weather.humidity[i]);
    								
    					item=cJSON_GetObjectItem(result0,"wind_speed");
    					printf("windspeed:%s\r\n",item->valuestring);  //
    					memcpy(RDweather.wind_speed[i],item->valuestring,strlen(item->valuestring));		
    					printf("wind_speed:%s\r\n",weather.wind_speed[i]); //wind_speed:傀?
    				}
    			}
    		}else{
    			error=1;
    			printf("Error before: [%s]\n",cJSON_GetErrorPtr());
    		}	
    	cJSON_Delete(root);  //一定要释放JSON对象
    	USART_RX_STA3 = 0;
    	Usart_SendString(USART3,"AT+CIPCLOSE\r\n");	 //关闭连接
    	return error;
    }
    

    时间数据解析与计时

    /*
    将u8字符串数字转换成u16类型数字
    */
    u16 u8Tou16(char *str){
    	u8 i;
    	u16 num=0;
    	u8 len=strlen(str);
    	for(i=len;i>0;i--){
    		num+=(*str-'0')*pow(10,i-1);  //pow次方函数
    		str++;
    	}
    	return num;
    }
    /*
    转换成字符串时间
    */
    void Parse_Time(char *str){
    	u8 i=0,j=0,k=0;
    	char time[6][5]={"","","","","",""};
    	//time=malloc();
    	u8 len=strlen(str);
    	for(i=0;i<len+1;i++){  //拆分字符串
    		if(*str=='-'||*str==0x20||*str==':'||*str=='\0'){  
    			time[j][k]='\0';
    			j++;
    			str++;
    			k=0;
    		}
    		time[j][k]=*str;
    		k++;
    		str++;
    	}	
    	Localtime.year=u8Tou16(time[0]);
    	Localtime.month=u8Tou16(time[1]);	
    	Localtime.day=u8Tou16(time[2]);
    	Localtime.hour=u8Tou16(time[3]);
    	Localtime.min=u8Tou16(time[4]);
    	Localtime.sec=u8Tou16(time[5]);	
    }
    /*
    获取串口数据转换可用时间常数
    0:获取成功
    1:接口请求错误
    2:非JSON格式
    */
    u8 getTime(){
    	cJSON *root,*result_arr,*result;
    	u8 code=0,error=0;
    	const char *TimeStr;
    	char *time = (char *)malloc(sizeof(char) * 20);
    	ConTCP();
    	delay_ms(100);
    	SetPassThrough();  //透传模式
    	memset(USART_RX_BUF3,0,strlen((const char*)USART_RX_BUF3));
    	USART_RX_STA3 = 0;
    	Usart_SendString(USART3,"GET http://api.tianapi.com/txapi/worldtime/index?key=652e7ab06ae02d789f04e2b08dbfd5f6&city=上海\r\n\r\n"); //发送GET请求获取当前时间
    	delay_ms(1000);
    	if(USART_RX_BUF3[0]=='{'){	
    		root=cJSON_Parse((const char*)USART_RX_BUF3);  //"{\"code\": 200,\"newslist\": [{\"strtime\": \"2020-09-26 19:02:16\",\"weeknum\": \"6\"}]}"
    		RstPassThrough();
    		if(root!=0){	
    				code=cJSON_GetObjectItem(root,"code")->valueint;				
    				if(code==200){
    					result_arr=cJSON_GetObjectItem(root,"newslist");
    					if(result_arr->type==cJSON_Array){					
    						result=cJSON_GetObjectItem(result_arr,0);
    						TimeStr=(const char *)cJSON_GetObjectItem(result,"strtime")->valuestring;
    						Localtime.weeknum=(u8 *)cJSON_GetObjectItem(result,"weeknum")->valuestring;
    				}			
    			}else{ error=1;}
    		}else{
    			error=3;
    			printf("JSON format error:%s\r\n", cJSON_GetErrorPtr());  //堆尺寸太小,导致转换失败
    		}
    		strcpy(time,TimeStr);	
    		cJSON_Delete(root);
    		Parse_Time(time);	
    		TIM_Cmd(TIM2,ENABLE);  //获取到时间后,启动TIM2
    	}else{ error=2;}
    	USART_RX_STA3 = 0;
    	Usart_SendString(USART3,"AT+CIPCLOSEMODE=0\r\n");  //关闭连接
    	delay_ms(500);
    	Usart_SendString(USART3,"AT+CIPCLOSE=0\r\n");
    	return error;
    }
    void TimeRun(){
    	if(Localtime.sec<60){
    		Localtime.sec++;
    	}
    	if(Localtime.sec==60){  //分进位
    		Localtime.sec=0;
    		if(Localtime.min<60){
    			Localtime.min++;
    		}	
    	}
    	if(Localtime.min==60){  //时进位
    		Localtime.min=0;
    		if(Localtime.hour<24){
    			Localtime.hour++;
    		}
    	}
    	if(Localtime.hour==24){
    		Localtime.hour=0;
    	}	
    }
    
    

    遇到的问题

    1、关于字符串操作内存溢出问题
    一开始对指针的理解不深,调试时总是造成内存溢出的情况,还以为是分配的栈空间太小,最后查资料慢慢找到问题所在。字符串复制函数:memcpy函数,strcpy函数,两者都可以实现字符串的复制,由于C语言中字符串是以字符数组的形式储存,strcpy(time,TimeStr);不需要定义字符串长度,字符串长度函数中可以根据“\0”位置计算出来,如果time是一个没有定义的字符串指针,容易导致内存冲突,因为没有给time指向的数据分配空间。正确使用应该先给变量分配一定空间,要么使用动态内存分配函数分配一定长度的内存,要么定义一定长度的数组,如“char time[20];”或者“char *time = (char *)malloc(sizeof(char) * 20);”,在调用复制字符串函数就不会内存冲突。
    2、sprintf函数内存溢出问题
    使用sprintf函数也要注意先申请足够空间的内存来储存拼接后的字符串,因为sprintf函数不会考虑申请储存空间是否充足,不断地向后占用空间,如果超出了申请的内存空间就会导致内存冲突。
    3、cJSON 解析时打印的串口JSON数据明明是对的,但是解析之后却是空的
    因为是引用cJSON需要根据json数据动态申请大量的内存空间,动态申请的内存空间都是储存在堆区,如果分配的堆区尺寸过小就会导致转换结果为空。
    在这里插入图片描述

    4、使用指针总结
    指针的本质就是地址,而字符串指针本质是字符串首字符地址,字符串指针和字符串数组差不多,也就是说,定义的字符串数组地址也是数组第一位的地址。至于像print函数传入一个字符串指针,就可以打印出整个字符串而不是打印出地址,因为字符串一般以’\0’结束,所以函数中会首先计算出字符串长度,根据长度一个字符一个字符的打印出来。
    5、中文解码问题
    在这里插入图片描述

    LCD中文显示的字库采用的是GBK编码,GBK是兼容GB2312的,有时如果解码有问题就会导致屏幕上显示出与自己定义的文字不一致。发送HTTP请求其中采用的TTF-8编码,如果使用GB2312的编码发送GET请求就会请求不到数据。

    工程源码
    链接:https://pan.baidu.com/s/17sOk2epQEiIyu6FQoNo5gQ
    提取码:81kj

    个人能力有限,有什么错误的地方欢迎指正,有问题也可以提,可以一起探讨

    展开全文
  • Android 仿UC、墨迹天气左右拖动多屏幕显示效果。   
  • 显示库比蒂诺和雷德蒙德的当前天气。 我知道,令人兴奋:) 手表 一些评论 openweathermap.com 的免费计划只允许一天的历史数据(见 ),所以我调查了过去 7 个小时。 我使用 owfont ( ) 作为漂亮的图标集,但不幸的...
  • 天气预报,基于ESP8266,彩屏显示

    千次阅读 2019-05-04 11:52:10
    【1】联网获取心知天气下发的当日天气信息,如:温度、湿度、风向、风力等级等; 【2】自带RTC时钟,支持人机交互时间修改; 【3】支持2.4Gwifi连接,支持更换地点后直接修改重联wifi信息(含wifi名称、wiif密码,...
  • 【1】联网获取心知天气下发的当日天气信息,如:温度、湿度、风向、风力等级等; 【2】自带RTC时钟,支持人机交互时间修改; 【3】支持2.4Gwifi连接,支持更换地点后直接修改重联wifi信息(含wifi名称、wiif密码,...
  • Android 仿UC,墨迹天气左右拖动多屏幕显示效果源码.zip
  • Android 仿UC,墨迹天气左右拖动多屏幕显示效果源码.rar
  • 格局 左边视频,右边滚动新闻,天气预报 使用说明 1. 文件夹要放在e:盘根目录下,一定要改变路径在js/f.js文件中修改 2. 视频文件放在v文件夹中,增加或修改播放列表在vv.asx ...模仿楼道屏幕显示,用html+js实现
  • V9.2.1:1注释掉了没使用到的库:sys/time.h和coredecls.h 2.新增了一张长沙地标图片显示。 3.修复一个农历获取数据类型定义的bug。
  • Android源码——仿UC,墨迹天气左右拖动多屏幕显示效果源码.zip
  • :cloud_selector: 天气地狱 关于 天气地狱是为实习选择过程而开发的应用程序。 目的是创建一个视图以显示从API获得的数据。 技术领域 HTML CSS 引导程序 角度的 打字稿 节点 要求 节点 为了开发此应用程序,使用...
  • ESP8266+OLED屏实现天气预报+温度显示+NTP时间同步4屏带中文显示V7.8,版本从7.5以后都是6屏幕显示内容轮流切换显示。
  • ESP8266+SH1106 OLED屏实现天气预报+温度显示+NTP时间同步5屏带中文显示V7.6版,改善次日农历日期更新,版本从7.5以后都是6屏幕显示内容轮流切换显示。
  • 安卓Android源码——仿UC,墨迹天气左右拖动多屏幕显示效果源码.zip
  • 【1】联网获取心知天气下发的当日天气信息,如:温度、湿度、风向、风力等级等; 【2】自带RTC时钟,支持人机交互时间修改; 【3】支持2.4Gwifi连接,支持更换地点后直接修改重联wifi信息(含wifi名称、wiif密码,...
  • 在上一版本的基础上对eeprom存储的数据进行优化,大幅度减少对eeprom的写入次数和频率,延长eeprom的使用寿命,版本从7.5以后都是6屏幕显示内容轮流切换显示。
  • 仿UC墨迹天气左右拖动多屏幕显示效果源码.zip
  • 一个ESP32和一个ePaper显示器读取并显示天气 要独立使用,请将ZIP文件下载到您的桌面上。 转到草图>包含库...>添加.ZIP库...,然后选择ZIP文件。 加入后,转到“文件,示例”,然后向下滚动到“ ESP32-e-...
  • ESP8266 通过API获取天气信息, OLED 天气显示 - 【源码】
  • 简单天气应用 该项目从命令行应用程序开始,然后... 最初,该项目以基于命令行的程序开始,该程序从用户那里获取输入,并在命令行本身上显示天气。 然后,它演变为使用Flask并遵循MVC模式构建的WebApp。 我面临的主要
  • 共有6页,MCU上两个按键控制,K1向前翻页,K2向后翻,第1页为默认页,是switch控制的默认页,然后第二页是RTC实时时钟,翻到这页数字时钟就会自动地跑起来-- 其实它是在后台跑的,永不停歇,除非没电池了!第三页...
  • wordpress添加天气Do you want to show weather forecast in WordPress? Some website owners may want to display weather forecast to keep their users informed about weather conditions for specific ...
  • 使用ESP32显示天气

    千次阅读 2020-03-31 18:09:13
    本教程演示如何创建一个气象站,该气象站使用传感器读数在LCD屏幕上解释和显示天气数据。 使用ESP32的本教程介绍了如何使用ESP32和BMP280和SSD1306来构建气象站。 该ESP32项目使用LCD显示屏显示传感器读数。 使用ESP...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,429
精华内容 9,371
关键字:

屏幕显示天气