
功能演示基于stm32的智能晾衣杆简介这是最近别人让我帮他做的一个毕业设计总体来说非常简单半天都不需要就可以实现我做完之后打算开源在这里让大家进行学习我们先看一下他的任务书吧按键结合液晶屏幕并通过按键设置光照强度和湿度阈值实现按键切换功能。通过光敏传感器采集当前的光照强度显示到显示屏上面。通过DHT11传感器采集温湿度显示到显示屏上面。液晶屏显示功能提醒词、系统的状态、已设置的参数等。如果湿度大于设置阈值蜂鸣器提醒可能下雨。当湿度小于阈值并且光强大于阈值也就是天晴自动打开晾衣杆LED。语音播报模块进行对应语音的播报。联网可以在手机app中查看环境状态以及手动控制。硬件资料序号元器件型号数量#DescriptionCommentQuantity1STM32F103C8T6最小系统板/120.96寸OLED屏幕/13esp8266esp8266 01s14有源蜂鸣器有源蜂鸣器15三极管SS805016电阻 4.7KR060317DHT11温湿度模块DHT1118语音播报模块JQ8900-16P19麦克风8欧3W喇叭110光敏传感器BH1750111按键TS665CJ412继电器SRD-05VDC-SL-C113三极管BFS17PE6327HTSA1114二极管1N4148115电阻 200RFR0603216排母 4PPM254-1-04-Z-8.5217排母 3PPM254-1-03-Z-8.5118排母 20PPM254-1-20-Z-8.5219排母 8PPM254-1-08-Z-8.6220排针 2P2.54mm 1*2P121排母 2*2P2.54mm,2×4Doublerowfemale1PCB以及原理图硬件框图软件分析工程文件Start存放stm32配置的起始文件、内核相关文件、系统文件。Library存放stm32f103的标准库文件。User存放用户文件。Hardware存放硬件文件包括蜂鸣器、LED、DHT11、BH1750、按键、OLED......System存放用户写的一些系统文件例如延时、时钟配置、串口配置以及相关宏定义。Gizwits以及Utils与联网配置有关的文件。软件流程1、引用相关驱动的头文件、定义好相关的变量以及宏声明好定义的函数。#include stm32f10x.h // Device header #include delay.h #include bsp_buzzer.h #include bsp_dht11.h #include BH1750FVI.h #include voice.h #include Key.h #include led.h #include OLED.h #include Timer.h #include usart.h #include gizwits_product.h #define Refresh_Sensor_time 400 //400ms刷新一次传感器数值 uint8_t jiemian;//0:主界面 1:阈值设置界面 uint8_t jiemian_change1;//界面刚刚切换的时候为1以防一个界面重复刷新同样的内容 uint8_t Set_Choose;//阈值设置选项 0:光照强度 1:空气湿度 DHT11_Data_TypeDef DHT11_Data;//DTH11读取到的参数 u16 BH1750_Data;//光照强度 u8 key_num;//读取到的键值 u8 DHT11_threshold50;//湿度阈值 u16 BH1750_threshold2500;//光照阈值 u16 Sensor_timeRefresh_Sensor_time; u8 Weather_state;//天气状况0:晴天1:阴天2:下雨 u8 led;//0:晾衣杆关闭 1:晾衣杆打开 void Show_OLED(void);//屏幕显示 void Show_ZJM(void);//显示主界面 void Show_Set(void);//显示阈值设置界面 void Show_Sensor(void);//显示传感器数值 void Show_threshold(void);//显示阈值 void Key_Handle(void);//按键处理 void Weather_Judge(void);//判断天气2、延时初始化外设初始化(初始化定时器以及串口方便之后进行使用)delay_init(); //外设初始化 Timer2_Configuration();//定时刷新传感器数值 Timer_Init();//为机智云提供时钟 uart1_init(9600);3、模块初始化//模块初始化 Buzzer_Init();//蜂鸣器初始化 DHT11_Init();//DHT11初始化 BH1750_Init();//BH1750初始化 Key_Init();//按键初始化 OLED_Init();//oled初始化 voice_init();//语音模块初始化 LED_Init();//led初始化模拟晾衣杆4、上电初始化(初始化8s后进入系统使得模块稳定)lingsheng(3);//播报欢迎使用智能晾衣杆系统 OLED_ShowString(2,3,initialing...); for(int i0;i8;i) { delay_ms(1000); OLED_ShowNum(3,8,8-i,1); } OLED_Clear();5、网络配置(调用机智云官方代码初始化协议以及设置好配网模式)/*机智云初始化*/ userInit(); gizwitsInit(); /*一件配网模式*/ gizwitsSetMode(2);6、进入循环不断执行循环中的代码是这个项目中最重要的地方。7、显示界面(根据对应的界面显示对应的内容以及检测界面是否刚刚切换避免同样的内容多次刷新显示浪费cpu)void Show_OLED(void)//屏幕显示 { if(jiemian0jiemian_change1) { Show_ZJM(); jiemian_change0; } else if(jiemian0jiemian_change0) { Show_Sensor(); } else if(jiemian1jiemian_change1) { Show_Set(); jiemian_change0; } else if(jiemian1jiemian_change0) { Show_threshold(); } }8、主界面(显示主界面的固定内容)//智(0)能(1)晾(2)衣(3)杆(4)光(5)照(6)强(7)度(8)空(9)气(10) //湿(11)度(12)阈(13)值(14)设(15)置(16)天(17)气(18)状(19)况(20) //正(21)异(22)常(23) 晴(24)阴(25)下(26)雨(27)←(28) void Show_ZJM(void) { OLED_Clear();//清屏 //智能晾衣杆 OLED_ShowF16x16(1,4,0); OLED_ShowF16x16(1,6,1); OLED_ShowF16x16(1,8,2); OLED_ShowF16x16(1,10,3); OLED_ShowF16x16(1,12,4); //光照强度: OLED_ShowF16x16(2,1,5); OLED_ShowF16x16(2,3,6); OLED_ShowF16x16(2,5,7); OLED_ShowF16x16(2,7,8); OLED_ShowChar(2,9,:); //空气湿度: OLED_ShowF16x16(3,1,9); OLED_ShowF16x16(3,3,10); OLED_ShowF16x16(3,5,11); OLED_ShowF16x16(3,7,12); OLED_ShowChar(3,9,:); //天气状况: OLED_ShowF16x16(4,1,17); OLED_ShowF16x16(4,3,18); OLED_ShowF16x16(4,5,19); OLED_ShowF16x16(4,7,20); OLED_ShowChar(4,9,:); }9、显示传感器的数值到屏幕上(根据设定的定时器定时器刷新避免轮询不断刷新导致损坏传感器以及不现实的操作并且判断出此时的天气状况)void Show_Sensor(void) { if(Sensor_time0) { //关闭定时器2防止影响时序(其实不关也没事) TIM_SetCounter(TIM2,0); TIM_Cmd(TIM2, DISABLE); DHT11_Read_TempAndHumidity(DHT11_Data);//读取温湿度 BH1750_Databh_data_read();//读取光照强度 TIM_Cmd(TIM2,ENABLE);//开启定时器2 Sensor_timeRefresh_Sensor_time; } if(jiemian0)//如果在主界面 { /*显示传感器数值*/ OLED_ShowNum(2,10,BH1750_Data,4);//光照强度 OLED_ShowNum(3,10,DHT11_Data.humi_int,4);//空气湿度,显示个整数部分即可 /*判断此时天气状况*/ if(Weather_state0)//晴天 { OLED_ShowF16x16(4,10,24); OLED_ShowF16x16(4,12,17); } else if(Weather_state1)//阴天 { OLED_ShowF16x16(4,10,25); OLED_ShowF16x16(4,12,17); } else//雨天 { OLED_ShowF16x16(4,10,26); OLED_ShowF16x16(4,12,27); } } }10、显示设置界面(显示设置界面的固定内容避免重复显示同样的内容浪费cpu)void Show_Set(void)//显示阈值设置界面 { OLED_Clear();//清屏 //阈值设置 OLED_ShowF16x16(1,4,13); OLED_ShowF16x16(1,6,14); OLED_ShowF16x16(1,8,15); OLED_ShowF16x16(1,10,16); //光照强度: OLED_ShowF16x16(2,1,5); OLED_ShowF16x16(2,3,6); OLED_ShowF16x16(2,5,7); OLED_ShowF16x16(2,7,8); OLED_ShowChar(2,9,:); //空气湿度: OLED_ShowF16x16(3,1,9); OLED_ShowF16x16(3,3,10); OLED_ShowF16x16(3,5,11); OLED_ShowF16x16(3,7,12); OLED_ShowChar(3,9,:); }11、显示湿度阈值以及光强阈值void Show_threshold(void)//显示阈值 { if(Set_Choose0)//光照强度 { OLED_ShowF16x16(2,14,28);//← OLED_ShowString(3,14, ); } else//空气湿度 { OLED_ShowF16x16(3,14,28);//← OLED_ShowString(2,14, ); } OLED_ShowNum(2,10,BH1750_threshold,4);//光照强度阈值 OLED_ShowNum(3,10,DHT11_threshold,4);//空气湿度阈值 }12、按键处理(不断轮询按键如果检测到按键按下根据此时的界面进行对应的处理)void Key_Handle(void)//按键处理 { key_numKey_GetNum(); if(key_num4jiemian0)//切换到设置阈值界面 { jiemian1; jiemian_change1; } else if(key_num4jiemian1)//切换到主界面 { jiemian0; jiemian_change1; } else if(key_num3jiemian1)//阈值设置选项切换 { Set_Choose(Set_Choose0)?1:0; } else if(key_num2jiemian1)//阈值减 { if(Set_Choose0)//光强 减50 { BH1750_threshold-50; } else //湿度 减1 { DHT11_threshold-1; } } else if(key_num1jiemian1)//阈值加 { if(Set_Choose0)//光强 加50 { BH1750_threshold50; } else //湿度 加1 { DHT11_threshold1; } } key_num0; }13、判断天气状况(通过对比读取到的传感器数值和对应阈值判断出此时的天气状况然后进行对应处理)void Weather_Judge(void)//判断天气 { if(DHT11_Data.humi_intDHT11_threshold)//下雨 { Weather_state2; if(led1)//关闭晾衣杆 { led0; LED_TIP_OFF; lingsheng(1);//下雨了晾衣杆已关闭 } } else if(DHT11_Data.humi_intDHT11_thresholdBH1750_thresholdBH1750_Data)//晴天 { Weather_state0; if(led0)//打开晾衣杆 { led1; LED_TIP_ON; lingsheng(2);//大晴天晾衣杆已打开 } } else { Weather_state1;//阴天 } }14、刷新网络参数更新到手机app(将最新的数值刷新到网络协议参数协议检测到数值发生变化之后会通过相应的协议上传到手机APP)void userHandle(void) { currentDataPoint.valueDHT11_Data DHT11_Data.humi_int;//Add Sensor Data Collection currentDataPoint.valueBH1750_Data BH1750_Data;//Add Sensor Data Collection currentDataPoint.valueBH1750_thresholdBH1750_threshold; currentDataPoint.valueDHT11_thresholdDHT11_threshold; currentDataPoint.valueledled; }15、联网上传数据接收下发数据(这里我们通过接收到手机app发送来的对应事件进行对应事件的处理我们这里的事件就是我们对应值的事件我们在事件中将网络参数更新到我们单片机中的对应值实习手机app下发数据到我们的单片机具体操作流程需要去查看机智云官方文件文件中会有教你)int32_t gizwitsHandle(dataPoint_t *currentData) { int8_t ret 0; #ifdef PROTOCOL_DEBUG uint16_t i 0; #endif uint8_t ackData[RB_MAX_LEN]; uint16_t protocolLen 0; uint32_t ackLen 0; protocolHead_t *recvHead NULL; char *didPtr NULL; uint16_t offset 0; #ifdef OTA_ENABLE int8_t updatePieceResult 0; #endif if(NULL currentData) { // GIZWITS_LOG(GizwitsHandle Error , Illegal Param\n); return -1; } /*resend strategy*/ gizProtocolAckHandle(); ret gizProtocolGetOnePacket(pRb, gizwitsProtocol.protocolBuf, protocolLen); if(0 ret) { // GIZWITS_LOG(Get One Packet!\n); #ifdef PROTOCOL_DEBUG // GIZWITS_LOG(WiFi2MCU[%4d:%4d]: , gizGetTimerCount(), protocolLen); for(i0; iprotocolLen;i) { // GIZWITS_LOG(%02x , gizwitsProtocol.protocolBuf[i]); } // GIZWITS_LOG(\n); #endif recvHead (protocolHead_t *)gizwitsProtocol.protocolBuf; switch (recvHead-cmd) { case CMD_GET_DEVICE_INTO: gizProtocolGetDeviceInfo(recvHead); break; case CMD_ISSUED_P0: // GIZWITS_LOG(flag %x %x \n, recvHead-flags[0], recvHead-flags[1]); //offset 1; if(0 gizProtocolIssuedProcess(didPtr, gizwitsProtocol.protocolBufsizeof(protocolHead_t)offset, protocolLen-(sizeof(protocolHead_t)offset1), ackData, ackLen)) { gizProtocolIssuedDataAck(recvHead, ackData, ackLen,recvHead-flags[1]); // GIZWITS_LOG(AckData : \n); } break; case CMD_HEARTBEAT: gizProtocolCommonAck(recvHead); break; case CMD_WIFISTATUS: gizProtocolCommonAck(recvHead); gizProtocolModuleStatus((protocolWifiStatus_t *)recvHead); break; case ACK_REPORT_P0: case ACK_WIFI_CONFIG: case ACK_SET_DEFAULT: case ACK_NINABLE_MODE: case ACK_REBOOT_MODULE: gizProtocolWaitAckCheck(recvHead); break; case CMD_MCU_REBOOT: gizProtocolCommonAck(recvHead); // GIZWITS_LOG(report:MCU reboot!\n); gizProtocolReboot(); break; case CMD_ERROR_PACKAGE: break; case ACK_PRODUCTION_TEST: gizProtocolWaitAckCheck(recvHead); // GIZWITS_LOG(Ack PRODUCTION_MODE success \n); break; case ACK_GET_NTP: gizProtocolWaitAckCheck(recvHead); gizProtocolNTP(recvHead); // GIZWITS_LOG(Ack GET_UTT success \n); break; case ACK_ASK_MODULE_INFO: gizProtocolWaitAckCheck(recvHead); gizProtocolModuleInfoHandle(recvHead); // GIZWITS_LOG(Ack GET_Module success \n); break; #ifdef OTA_ENABLE case ACK_BIGDATA_READY: gizProtocolWaitAckCheck(recvHead); break; case ACK_D_STOP_BIGDATA_SEND: gizProtocolWaitAckCheck(recvHead); break; case CMD_ASK_BIGDATA: // GIZWITS_LOG(CMD_ASK_BIGDATA \n); gizProtocolCommonAck(recvHead); if(0 Pro_W2D_UpdateCmdHandle((uint8_t *)gizwitsProtocol.protocolBuf sizeof(protocolHead_t), protocolLen - sizeof(protocolCommon_t))) { romUpdate.otaBusyModeFlag 1; // GIZWITS_LOG(System In OTA Mode BusyFlag %d \n, romUpdate.otaBusyModeFlag); // //GIZWITS_LOG(CMD_ASK_BIGDATA\n); } else { // GIZWITS_LOG(Update Ask Handle Failed \n); Pro_D2W_UpdateSuspend(); } break; case CMD_BIGDATA_SEND: gizProtocolCommonAck(recvHead); updatePieceResult Pro_W2D_UpdateDataHandle((uint8_t *)gizwitsProtocol.protocolBuf sizeof(protocolHead_t), protocolLen - sizeof(protocolCommon_t),HEX); if(0 ! updatePieceResult) { romUpdate.otaBusyModeFlag 0; // GIZWITS_LOG(CMD_BIGDATA_SEND , Piece Handle Faild . System OTA Mode Over BusyFlag %d \n,romUpdate.otaBusyModeFlag); Pro_D2W_UpdateSuspend(); // GIZWITS_LOG(System Go On \n); } break; case CMD_S_STOP_BIGDATA_SEND: gizProtocolCommonAck(recvHead); romUpdate.otaBusyModeFlag 0; // GIZWITS_LOG(System OTA Mode Over BusyFlag %d \n,romUpdate.otaBusyModeFlag); break; #endif default: gizProtocolErrorCmd(recvHead,ERROR_CMD); // GIZWITS_LOG(ERR: cmd code error!\n); break; } } else if(-2 ret) { //Check failed, report exception recvHead (protocolHead_t *)gizwitsProtocol.protocolBuf; gizProtocolErrorCmd(recvHead,ERROR_ACK_SUM); // GIZWITS_LOG(ERR: check sum error!\n); return -2; } switch(gizwitsProtocol.issuedFlag) { case ACTION_CONTROL_TYPE: gizwitsProtocol.issuedFlag STATELESS_TYPE; gizwitsEventProcess(gizwitsProtocol.issuedProcessEvent, (uint8_t *)gizwitsProtocol.gizCurrentDataPoint, sizeof(dataPoint_t)); memset((uint8_t *)gizwitsProtocol.issuedProcessEvent,0x0,sizeof(gizwitsProtocol.issuedProcessEvent)); break; case WIFI_STATUS_TYPE: gizwitsProtocol.issuedFlag STATELESS_TYPE; gizwitsEventProcess(gizwitsProtocol.wifiStatusEvent, (uint8_t *)gizwitsProtocol.wifiStatusData, sizeof(moduleStatusInfo_t)); memset((uint8_t *)gizwitsProtocol.wifiStatusEvent,0x0,sizeof(gizwitsProtocol.wifiStatusEvent)); break; case ACTION_W2D_TRANSPARENT_TYPE: gizwitsProtocol.issuedFlag STATELESS_TYPE; gizwitsEventProcess(gizwitsProtocol.issuedProcessEvent, (uint8_t *)gizwitsProtocol.transparentBuff, gizwitsProtocol.transparentLen); break; case GET_NTP_TYPE: gizwitsProtocol.issuedFlag STATELESS_TYPE; gizwitsEventProcess(gizwitsProtocol.NTPEvent, (uint8_t *)gizwitsProtocol.TimeNTP, sizeof(protocolTime_t)); memset((uint8_t *)gizwitsProtocol.NTPEvent,0x0,sizeof(gizwitsProtocol.NTPEvent)); break; case GET_MODULEINFO_TYPE: gizwitsProtocol.issuedFlag STATELESS_TYPE; gizwitsEventProcess(gizwitsProtocol.moduleInfoEvent, (uint8_t *)gizwitsProtocol.wifiModuleNews, sizeof(moduleInfo_t)); memset((uint8_t *)gizwitsProtocol.moduleInfoEvent,0x0,sizeof(moduleInfo_t)); break; default: break; } #ifdef OTA_ENABLE if (romUpdate.otaBusyModeFlag 0) { gizDevReportPolicy(currentData); } #else gizDevReportPolicy(currentData); #endif return 0; }具体源码main. c#include stm32f10x.h // Device header #include delay.h #include bsp_buzzer.h #include bsp_dht11.h #include BH1750FVI.h #include voice.h #include Key.h #include led.h #include OLED.h #include Timer.h #include usart.h #include gizwits_product.h #define Refresh_Sensor_time 400 //400ms刷新一次传感器数值 uint8_t jiemian;//0:主界面 1:阈值设置界面 uint8_t jiemian_change1;//界面刚刚切换的时候为1以防一个界面重复刷新同样的内容 uint8_t Set_Choose;//阈值设置选项 0:光照强度 1:空气湿度 DHT11_Data_TypeDef DHT11_Data;//DTH11读取到的参数 u16 BH1750_Data;//光照强度 u8 key_num;//读取到的键值 u8 DHT11_threshold50;//湿度阈值 u16 BH1750_threshold2500;//光照阈值 u16 Sensor_timeRefresh_Sensor_time; u8 Weather_state;//天气状况0:晴天1:阴天2:下雨 u8 led;//0:晾衣杆关闭 1:晾衣杆打开 void Show_OLED(void);//屏幕显示 void Show_ZJM(void);//显示主界面 void Show_Set(void);//显示阈值设置界面 void Show_Sensor(void);//显示传感器数值 void Show_threshold(void);//显示阈值 void Key_Handle(void);//按键处理 void Weather_Judge(void);//判断天气 int main(void) { delay_init(); //外设初始化 Timer2_Configuration();//定时刷新传感器数值 Timer_Init();//为机智云提供时钟 uart1_init(9600); //模块初始化 Buzzer_Init();//蜂鸣器初始化 DHT11_Init();//DHT11初始化 BH1750_Init();//BH1750初始化 Key_Init();//按键初始化 OLED_Init();//oled初始化 voice_init();//语音模块初始化 LED_Init();//led初始化模拟晾衣杆 lingsheng(3);//播报欢迎使用智能晾衣杆系统 OLED_ShowString(2,3,initialing...); for(int i0;i8;i) { delay_ms(1000); OLED_ShowNum(3,8,8-i,1); } OLED_Clear(); /*机智云初始化*/ userInit(); gizwitsInit(); /*一件配网模式*/ gizwitsSetMode(2); while(1) { /*显示界面*/ Show_OLED(); /*按键处理*/ Key_Handle(); /*判断天气状况*/ Weather_Judge(); /*刷新网络参数更新到手机app*/ userHandle(); /*联网上传数据接收下发数据*/ gizwitsHandle((dataPoint_t *)currentDataPoint); } } void Key_Handle(void)//按键处理 { key_numKey_GetNum(); if(key_num4jiemian0)//切换到设置阈值界面 { jiemian1; jiemian_change1; } else if(key_num4jiemian1)//切换到主界面 { jiemian0; jiemian_change1; } else if(key_num3jiemian1)//阈值设置选项切换 { Set_Choose(Set_Choose0)?1:0; } else if(key_num2jiemian1)//阈值减 { if(Set_Choose0)//光强 减50 { BH1750_threshold-50; } else //湿度 减1 { DHT11_threshold-1; } } else if(key_num1jiemian1)//阈值加 { if(Set_Choose0)//光强 加50 { BH1750_threshold50; } else //湿度 加1 { DHT11_threshold1; } } key_num0; } void Show_OLED(void)//屏幕显示 { if(jiemian0jiemian_change1) { Show_ZJM(); jiemian_change0; } else if(jiemian0jiemian_change0) { Show_Sensor(); } else if(jiemian1jiemian_change1) { Show_Set(); jiemian_change0; } else if(jiemian1jiemian_change0) { Show_threshold(); } } //智(0)能(1)晾(2)衣(3)杆(4)光(5)照(6)强(7)度(8)空(9)气(10) //湿(11)度(12)阈(13)值(14)设(15)置(16)天(17)气(18)状(19)况(20) //正(21)异(22)常(23) 晴(24)阴(25)下(26)雨(27)←(28) void Show_ZJM(void) { OLED_Clear();//清屏 //智能晾衣杆 OLED_ShowF16x16(1,4,0); OLED_ShowF16x16(1,6,1); OLED_ShowF16x16(1,8,2); OLED_ShowF16x16(1,10,3); OLED_ShowF16x16(1,12,4); //光照强度: OLED_ShowF16x16(2,1,5); OLED_ShowF16x16(2,3,6); OLED_ShowF16x16(2,5,7); OLED_ShowF16x16(2,7,8); OLED_ShowChar(2,9,:); //空气湿度: OLED_ShowF16x16(3,1,9); OLED_ShowF16x16(3,3,10); OLED_ShowF16x16(3,5,11); OLED_ShowF16x16(3,7,12); OLED_ShowChar(3,9,:); //天气状况: OLED_ShowF16x16(4,1,17); OLED_ShowF16x16(4,3,18); OLED_ShowF16x16(4,5,19); OLED_ShowF16x16(4,7,20); OLED_ShowChar(4,9,:); } void Show_Set(void)//显示阈值设置界面 { OLED_Clear();//清屏 //阈值设置 OLED_ShowF16x16(1,4,13); OLED_ShowF16x16(1,6,14); OLED_ShowF16x16(1,8,15); OLED_ShowF16x16(1,10,16); //光照强度: OLED_ShowF16x16(2,1,5); OLED_ShowF16x16(2,3,6); OLED_ShowF16x16(2,5,7); OLED_ShowF16x16(2,7,8); OLED_ShowChar(2,9,:); //空气湿度: OLED_ShowF16x16(3,1,9); OLED_ShowF16x16(3,3,10); OLED_ShowF16x16(3,5,11); OLED_ShowF16x16(3,7,12); OLED_ShowChar(3,9,:); } void Show_Sensor(void) { if(Sensor_time0) { //关闭定时器2防止影响时序(其实不关也没事) TIM_SetCounter(TIM2,0); TIM_Cmd(TIM2, DISABLE); DHT11_Read_TempAndHumidity(DHT11_Data);//读取温湿度 BH1750_Databh_data_read();//读取光照强度 TIM_Cmd(TIM2,ENABLE);//开启定时器2 Sensor_timeRefresh_Sensor_time; } if(jiemian0)//如果在主界面 { /*显示传感器数值*/ OLED_ShowNum(2,10,BH1750_Data,4);//光照强度 OLED_ShowNum(3,10,DHT11_Data.humi_int,4);//空气湿度,显示个整数部分即可 /*判断此时天气状况*/ if(Weather_state0)//晴天 { OLED_ShowF16x16(4,10,24); OLED_ShowF16x16(4,12,17); } else if(Weather_state1)//阴天 { OLED_ShowF16x16(4,10,25); OLED_ShowF16x16(4,12,17); } else//雨天 { OLED_ShowF16x16(4,10,26); OLED_ShowF16x16(4,12,27); } } } void Show_threshold(void)//显示阈值 { if(Set_Choose0)//光照强度 { OLED_ShowF16x16(2,14,28);//← OLED_ShowString(3,14, ); } else//空气湿度 { OLED_ShowF16x16(3,14,28);//← OLED_ShowString(2,14, ); } OLED_ShowNum(2,10,BH1750_threshold,4);//光照强度阈值 OLED_ShowNum(3,10,DHT11_threshold,4);//空气湿度阈值 } void Weather_Judge(void)//判断天气 { if(DHT11_Data.humi_intDHT11_threshold)//下雨 { Weather_state2; if(led1)//关闭晾衣杆 { led0; LED_TIP_OFF; lingsheng(1);//下雨了晾衣杆已关闭 } } else if(DHT11_Data.humi_intDHT11_thresholdBH1750_thresholdBH1750_Data)//晴天 { Weather_state0; if(led0)//打开晾衣杆 { led1; LED_TIP_ON; lingsheng(2);//大晴天晾衣杆已打开 } } else { Weather_state1;//阴天 } }总结其实你只要学过一点stm32以上资料完全够你手动复刻去购买我硬件清单的对应模块然后找到商家要驱动代码移植到你的工程然后调用相应的函数到我给你的main.c里面关于网络配置这一块读者需要自己去查阅机智云官方的指导书进行学习不过其实这个项目将联网这几个函数删掉也完全可以联网只是为了让这个项目高级那么一点罢了只要看懂我这些自己去找对应模块代码移植这个项目就可以轻而易举的复刻出来了希望我这篇文章可以帮助到你如果需要完整的工程可以私信我。