毕设系列 - 基于STM32的天气预报盒子 - 嵌入式 单片机 物联网


0 前言

🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩 基于STM32的天气预报盒子

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:4分
  • 创新点:4分

🔥 项目分享与指导:https://gitee.com/sinonfin/sharing

1 简介

一个获取天气状态的小盒子。

2 主要器件

  • STM32F103RDT6
  • ESP8266模块
  • MICRO USB模块
  • 1.8寸彩屏模块

3 实现效果

在这里插入图片描述
在这里插入图片描述
功能介绍

  • 可以获取当前实时气温和3天内天气预报。板载气压传感器和温湿度传感器监测环境状态。
  • 使用了ESP8266模块,支持长按一键配网,使用安信可科技配网工具。
  • 监测电池电压,可以给电池充电。
  • MICRO USB引出可以给电池充电,支持STM32串口ISP下载与调试输出,串口芯片连接异常增加了电源输出滤波电容,PCB已更新。
  • 接插1.8寸彩屏模块(st7735驱动)。

4 设计原理

硬件原理图
在这里插入图片描述
STM32F103RDT6

在这里插入图片描述

主体代码

在这里插入图片描述

ESP8266模块
ESP8266是一款适用于物联网和家庭自动化项目的 Wi-Fi 模块。

ESP8266系列一般具有两种开发方式:AT指令开发和SDK开发。

  • AT指令:厂家出厂时预先在ESP8266芯片烧入好固件,封装好WiFi的协议栈,内部已经实现透传,而用户只需要使用一个USB转TTL的模块或者单片机的串口就能实现与WiFi模块的通信,发送AT指令来对WiFi模块进行控制。(和蓝牙透传模块类似)

  • SDK开发:由于ESP8266本身即是可编程的芯片,可以把它视为一个带有无线通信的单片机,而用户需要在专门的IDE中编写对应的程序,然后通过烧写固件的方式将程序写入到芯片中,因此,想要实现WiFi通信,需要自定义WiFi协议栈,对用户掌握的相关知识要求更高。

部分代码

/*-------------------------------------------------
功能:ESP8266发送数据
形参:id-连接序号(0-7),databuff-发送数据,data_len-数据长度
返回值:0:无错误                                
        1:等待">"超时      
				2:未连接
				3:发送完成超时
-------------------------------------------------*/
u8 ESP8266_SendData(u8 id, char *databuff, u32 data_len)
{
	u32 i;
	u8 timeout=50;
	Clear_Buffer();
	USART2_printf("AT+CIPSEND=%d,%d\r\n",id,data_len);		
	while(timeout--)
	{  
		Delay_10ms();
		if(strstr((const char*)USART2_ReceiveData,(const char*)">"))                   //如果接收到>表示成功
			break;       						      //主动跳出while循环		
	}
	if(timeout==0)
		return 1;
	else
	{
		timeout=50;
//		Clear_Buffer();                     	  
			for(i=0;i<data_len;i++)
				USART2_printf(databuff); //发送数据	
			while(timeout--)
			{  
				Delay_10ms();
				if(strstr((const char*)USART2_ReceiveData,(const char*)"SEND OK"))
					return 0;		
											
				if(strstr((const char*)USART2_ReceiveData,(const char*)"link is not valid"))		
					return 0;		
						
			}
			return 3;
	}
}

5 部分核心代码

在这里插入图片描述

void WIFI_Send_Cmd_And_Wait_OK(uint8_t *cmd){
	Weather_Buffer_Clear();
	UART_Send_Data(&huart3,cmd,strlen((char*)cmd));	
	while(1){
		if(UART3_REC_State == Uart_Status_Ready){
			Weather_Data_Handler(Uart3_Rec_Buffer,UART3_Rec_Cnt);
			if(strstr((char*)Uart3_Rec_Buffer,"OK") != NULL){
				Weather_Buffer_Clear();
				break;
			}
			Weather_Buffer_Clear();
		}
		osDelay(10);
	}
}

void Check_Smart_Config(){
	if(ESP_Smart_Config_Flag == 1){
		printf("智能配网模式\r\n");
		ESP_Smart_Config_Flag = 0;
		osDelay(200*2);
		WIFI_Send_Cmd_And_Wait_OK(Config_Cmd[0]);
		WIFI_Send_Cmd_And_Wait_OK(Config_Cmd[1]);
		ESP_Smart_Config_Dis = 1;
	}
}

void WIFI_Mode_Init(){
	LCD_Data.Connect = 0;
	HAL_GPIO_WritePin(ESP_RST_GPIO_Port, ESP_RST_Pin, GPIO_PIN_SET);
	while(1){
		Check_Smart_Config();
		if(UART3_REC_State == Uart_Status_Ready){
			Weather_Data_Handler(Uart3_Rec_Buffer,UART3_Rec_Cnt);
			if(strstr((char*)Uart3_Rec_Buffer,"WIFI GOT IP") != NULL){
				LCD_Data.Connect = 1;
				printf("WIFI已连接\r\n");
				Weather_Buffer_Clear();
				break;
			}
			else if(strstr((char*)Uart3_Rec_Buffer,"WIFI DISCONNECT") != NULL || strstr((char*)Uart3_Rec_Buffer,"FAIL") != NULL){
				WIFI_Send_Cmd_And_Wait_OK(WEATHER_Cmd[1]);//重新配置模式
			}
			Weather_Buffer_Clear();
		}
		osDelay(10);
	}
}

void Analysis_Current_Weather(uint8_t * data,uint32_t len){
	
	/*
	{"results":[{"location":{"id":"WTSQQYHVQ973","name":"Nanjing","country":"CN","path":"Nanjing,Nanjing,Jiangsu,China","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},
"now":{"text":"Cloudy","code":"4","temperature":"37"},
"last_update":"2022-07-13T16:00:13+08:00"}]}
	*/
	char *str = NULL;
	str = strstr((char*)data,"name");
	sscanf(str+7,"%[^\"]",LCD_Data.Location);
	
	str = strstr((char*)data,"last_update");
	sscanf(str+14,"%[^T]",LCD_Data.Date);
	
	str = strstr((char*)data,"code");
	sscanf(str+7,"%u",&LCD_Data.Weather_C);
	
	str = strstr((char*)data,"temperature");
	sscanf(str+14,"%u",&LCD_Data.Temp_C);
}

void Analysis_Weather_Report(uint8_t * data,uint32_t len){
	
	/*
	{"results":[{"location":{"id":"WTSQQYHVQ973","name":"Nanjing","country":"CN","path":"Nanjing,Nanjing,Jiangsu,China","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"daily":[
{"date":"2022-07-13","text_day":"Cloudy","code_day":"4","text_night":"Cloudy","code_night":"4","high":"39","low":"29",
"rainfall":"0.00","precip":"0.00","wind_direction":"W","wind_direction_degree":"270","wind_speed":"32.8","wind_scale":"5","humidity":"66"},
{"date":"2022-07-14","text_day":"Cloudy","code_day":"4","text_night":"Cloudy","code_night":"4","high":"39","low":"30",
"rainfall":"0.00","precip":"0.00","wind_direction":"W","wind_direction_degree":"270","wind_speed":"23.4","wind_scale":"4","humidity":"67"},
{"date":"2022-07-15","text_day":"Cloudy","code_day":"4","text_night":"Cloudy","code_night":"4","high":"37","low":"28",
"rainfall":"0.00","precip":"0.00","wind_direction":"NW","wind_direction_degree":"315","wind_speed":"15.3","wind_scale":"3","humidity":"71"}],
"last_update":"2022-07-13T08:00:00+08:00"}]}
	*/
	char *s = NULL;
	char *str[3] = {NULL,NULL,NULL};
	uint32_t te = 0;
	
	str[0] = strstr((char*)data,"date");
	str[1] = strstr(str[0]+10,"date");
	str[2] = strstr(str[1]+10,"date");
	
	for(uint8_t i=0;i<3;i++){
		s = strstr((char*)str[i],"date");
		sscanf(s+7,"%[^\"]",Weather_Data[i].Date);
	}
	
	for(uint8_t i=0;i<3;i++){
		s = strstr((char*)str[i],"code_day");
		sscanf(s+11,"%u",&Weather_Data[i].Weather);
	}
	
	for(uint8_t i=0;i<3;i++){
		s = strstr((char*)str[i],"high");
		sscanf(s+7,"%u",&Weather_Data[i].Temp_H);
	}
	
	for(uint8_t i=0;i<3;i++){
		s = strstr((char*)str[i],"low");
		sscanf(s+6,"%u",&Weather_Data[i].Temp_L);
	}
	
	for(uint8_t i=0;i<3;i++){
		s = strstr((char*)str[i],"humidity");
		sscanf(s+11,"%u",&Weather_Data[i].Humi);
	}
	
	for(uint8_t i=0;i<3;i++){
		s = strstr((char*)str[i],"wind_scale");
		sscanf(s+13,"%u",&Weather_Data[i].Wind);
	}
	

}

void Weather_Run(){
		
		WIFI_Send_Cmd_And_Wait_OK(WEATHER_Cmd[3]);//连接心知天气
		WIFI_Send_Cmd_And_Wait_OK(WEATHER_Cmd[4]);//设置透传模式
		WIFI_Send_Cmd_And_Wait_OK(WEATHER_Cmd[5]);//进入透传模式
		
		UART_Send_Data(&huart3,Querry_Current_Weather,strlen((char*)Querry_Current_Weather));	
		while(1){
			if(UART3_REC_State == Uart_Status_Ready){
				Weather_Data_Handler(Uart3_Rec_Buffer,UART3_Rec_Cnt);
				Analysis_Current_Weather(Uart3_Rec_Buffer,UART3_Rec_Cnt);
				Weather_Buffer_Clear();
				break;
			}
			osDelay(10);
		}
		osDelay(200);
		UART_Send_Data(&huart3,Querry_Weather_Report,strlen((char*)Querry_Weather_Report));	
		while(1){
			if(UART3_REC_State == Uart_Status_Ready){
				Weather_Data_Handler(Uart3_Rec_Buffer,UART3_Rec_Cnt);
				Analysis_Weather_Report(Uart3_Rec_Buffer,UART3_Rec_Cnt);
				Weather_Buffer_Clear();
				break;
			}
			osDelay(10);
		}
		
		HAL_GPIO_WritePin(ESP_RST_GPIO_Port, ESP_RST_Pin, GPIO_PIN_RESET);//关闭WIFI
		
}





6 最后

🔥 项目分享与指导:https://gitee.com/sinonfin/sharing

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
物联网是指通过互联网连接和交互的物理设备,嵌入式则是指集成在其他系统中的计算机系统或电子系统。基于STM32F103的智能电子秤源代码是指使用STM32F103单片机来实现智能电子秤的代码。 智能电子秤是一种可以通过数字方式显示重量,且具备连网功能的电子秤。它可以将测得的重量数据通过物联网的技术传输到云服务器或其他终端设备中,实现远程监控和数据存储等功能。 基于STM32F103的智能电子秤源代码可以使用Keil或其他开发环境编写,实现以下功能: 1. 传感器数据采集:通过外接的传感器(如压力传感器)获取待测物体的重量信息,然后将其转换为数字信号送入STM32F103单片机。 2. 数据处理:在单片机中进行数据处理和算法运算,对传感器采集到的数据进行滤波、校准和运算等操作,得到可靠的重量数据。 3. 数据显示:使用液晶显示屏或其他显示设备将处理后的重量数据以数字形式显示出来,方便用户查看。 4. 连网功能:通过与物联网模块(如Wi-Fi模块或蓝牙模块)的连接,将重量数据传输到云服务器或其他终端设备中,实现远程监控和数据存储等功能。 5. 用户界面:通过单片机上的按键和显示设备,实现用户与智能电子秤的交互操作,如调整单位、零点校准等。 为了实现上述功能,需要使用C语言或其他编程语言编写STM32F103的智能电子秤源代码,并进行调试和验证。代码中需要涉及到STM32F103的GPIO控制、模拟数字转换(ADC)、串口通信(UART)等相关知识。 当代码编写完成后,需要将其烧录到STM32F103单片机上,然后连接外部传感器和显示设备,即可实现智能电子秤的功能。 通过物联网的技术,智能电子秤可以实现远程数据传输和远程控制,方便用户进行重量监测和数据管理。并且,基于STM32F103的嵌入式设计可以提供可靠性和稳定性,适用于各种物联网应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值