当前位置: 首页 > news >正文

基于stm32的智能晾衣杆(开源)

功能演示

 

基于stm32的智能晾衣杆

简介

这是最近别人让我帮他做的一个毕业设计,总体来说非常简单,半天都不需要就可以实现,我做完之后,打算开源在这里让大家进行学习,我们先看一下他的任务书吧:

  1. 按键结合液晶屏幕并通过按键设置光照强度和湿度阈值,实现按键切换功能。
  2. 通过光敏传感器采集当前的光照强度,显示到显示屏上面。
  3. 通过DHT11传感器采集温湿度,显示到显示屏上面。
  4. 液晶屏显示功能提醒词、系统的状态、已设置的参数等。
  5. 如果湿度大于设置阈值,蜂鸣器提醒可能下雨。
  6. 当湿度小于阈值并且光强大于阈值,也就是天晴,自动打开晾衣杆(LED)。
  7. 语音播报模块进行对应语音的播报。
  8. 联网,可以在手机app中查看环境状态以及手动控制。

硬件资料 

序号元器件型号数量
#DescriptionCommentQuantity
1STM32F103C8T6最小系统板/1
20.96寸OLED屏幕/1
3esp8266esp8266 01s1
4有源蜂鸣器有源蜂鸣器1
5三极管SS80501
6电阻 4.7KR06031
7DHT11温湿度模块DHT111
8语音播报模块JQ8900-16P1
9麦克风8欧3W喇叭1
10光敏传感器BH17501
11按键TS665CJ4
12继电器SRD-05VDC-SL-C1
13三极管BFS17PE6327HTSA11
14二极管1N41481
15电阻 200RFR06032
16排母 4PPM254-1-04-Z-8.52
17排母 3PPM254-1-03-Z-8.51
18排母 20PPM254-1-20-Z-8.52
19排母 8PPM254-1-08-Z-8.62
20排针 2P2.54mm 1*2P1
21排母 2*2P2.54mm,2×4Doublerowfemale1

PCB以及原理图

硬件框图

软件分析

工程文件       

 

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_change=1;//界面刚刚切换的时候,为1,以防一个界面,重复刷新同样的内容
uint8_t Set_Choose;//阈值设置选项 0:光照强度 1:空气湿度
DHT11_Data_TypeDef  DHT11_Data;//DTH11读取到的参数
u16 BH1750_Data;//光照强度
u8 key_num;//读取到的键值
u8 DHT11_threshold=50;//湿度阈值
u16 BH1750_threshold=2500;//光照阈值
u16 Sensor_time=Refresh_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 i=0;i<8;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(jiemian==0&&jiemian_change==1){Show_ZJM();jiemian_change=0;}else if(jiemian==0&&jiemian_change==0){Show_Sensor();}else if(jiemian==1&&jiemian_change==1){Show_Set();jiemian_change=0;}else if(jiemian==1&&jiemian_change==0) {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_time==0){//关闭定时器2,防止影响时序(其实不关也没事)TIM_SetCounter(TIM2,0);TIM_Cmd(TIM2, DISABLE);DHT11_Read_TempAndHumidity(&DHT11_Data);//读取温湿度BH1750_Data=bh_data_read();//读取光照强度TIM_Cmd(TIM2,ENABLE);//开启定时器2Sensor_time=Refresh_Sensor_time;}if(jiemian==0)//如果在主界面{/*显示传感器数值*/OLED_ShowNum(2,10,BH1750_Data,4);//光照强度OLED_ShowNum(3,10,DHT11_Data.humi_int,4);//空气湿度,显示个整数部分即可/*判断此时天气状况*/if(Weather_state==0)//晴天{OLED_ShowF16x16(4,10,24);OLED_ShowF16x16(4,12,17);}else if(Weather_state==1)//阴天{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_Choose==0)//光照强度{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_num=Key_GetNum();if(key_num==4&&jiemian==0)//切换到设置阈值界面{jiemian=1;jiemian_change=1;}else if(key_num==4&&jiemian==1)//切换到主界面{jiemian=0;jiemian_change=1;}else if(key_num==3&&jiemian==1)//阈值设置选项切换{Set_Choose=(Set_Choose==0)?1:0;}else if(key_num==2&&jiemian==1)//阈值减{if(Set_Choose==0)//光强 减50{BH1750_threshold-=50;}else //湿度 减1{DHT11_threshold-=1;}}else if(key_num==1&&jiemian==1)//阈值加{if(Set_Choose==0)//光强 加50{BH1750_threshold+=50;}else //湿度 加1{DHT11_threshold+=1;}}key_num=0;}

13、判断天气状况(通过对比读取到的传感器数值和对应阈值,判断出此时的天气状况,然后进行对应处理)

void Weather_Judge(void)//判断天气
{if(DHT11_Data.humi_int>DHT11_threshold)//下雨{Weather_state=2;if(led==1)//关闭晾衣杆{led=0;LED_TIP_OFF;lingsheng(1);//下雨了,晾衣杆已关闭}	}else if(DHT11_Data.humi_int<DHT11_threshold&&BH1750_threshold<BH1750_Data)//晴天{Weather_state=0;if(led==0)//打开晾衣杆{led=1;LED_TIP_ON;lingsheng(2);//大晴天,晾衣杆已打开}}else{Weather_state=1;//阴天}}

14、刷新网络参数更新到手机app(将最新的数值刷新到网络协议参数,协议检测到数值发生变化之后,会通过相应的协议,上传到手机APP)

void userHandle(void)
{currentDataPoint.valueDHT11_Data = DHT11_Data.humi_int;//Add Sensor Data CollectioncurrentDataPoint.valueBH1750_Data = BH1750_Data;//Add Sensor Data CollectioncurrentDataPoint.valueBH1750_threshold=BH1750_threshold;currentDataPoint.valueDHT11_threshold=DHT11_threshold;currentDataPoint.valueled=led;
}

15、联网,上传数据,接收下发数据(这里我们通过接收到手机app发送来的对应事件,进行对应事件的处理,我们这里的事件就是我们对应值的事件,我们在事件中,将网络参数更新到我们单片机中的对应值,实习手机app下发数据到我们的单片机,具体操作流程需要去查看机智云官方文件,文件中会有教你)

int32_t gizwitsHandle(dataPoint_t *currentData)
{int8_t ret = 0;
#ifdef PROTOCOL_DEBUGuint16_t i = 0;
#endifuint8_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_ENABLEint8_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(i=0; i<protocolLen;i++){
//            GIZWITS_LOG("%02x ", gizwitsProtocol.protocolBuf[i]);}
//        GIZWITS_LOG("\n");
#endifrecvHead = (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.protocolBuf+sizeof(protocolHead_t)+offset, protocolLen-(sizeof(protocolHead_t)+offset+1), 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_ENABLEcase 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 exceptionrecvHead = (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_ENABLEif (romUpdate.otaBusyModeFlag == 0){gizDevReportPolicy(currentData);}
#elsegizDevReportPolicy(currentData);
#endifreturn 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_change=1;//界面刚刚切换的时候,为1,以防一个界面,重复刷新同样的内容
uint8_t Set_Choose;//阈值设置选项 0:光照强度 1:空气湿度
DHT11_Data_TypeDef  DHT11_Data;//DTH11读取到的参数
u16 BH1750_Data;//光照强度
u8 key_num;//读取到的键值
u8 DHT11_threshold=50;//湿度阈值
u16 BH1750_threshold=2500;//光照阈值
u16 Sensor_time=Refresh_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 i=0;i<8;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_num=Key_GetNum();if(key_num==4&&jiemian==0)//切换到设置阈值界面{jiemian=1;jiemian_change=1;}else if(key_num==4&&jiemian==1)//切换到主界面{jiemian=0;jiemian_change=1;}else if(key_num==3&&jiemian==1)//阈值设置选项切换{Set_Choose=(Set_Choose==0)?1:0;}else if(key_num==2&&jiemian==1)//阈值减{if(Set_Choose==0)//光强 减50{BH1750_threshold-=50;}else //湿度 减1{DHT11_threshold-=1;}}else if(key_num==1&&jiemian==1)//阈值加{if(Set_Choose==0)//光强 加50{BH1750_threshold+=50;}else //湿度 加1{DHT11_threshold+=1;}}key_num=0;}void Show_OLED(void)//屏幕显示
{if(jiemian==0&&jiemian_change==1){Show_ZJM();jiemian_change=0;}else if(jiemian==0&&jiemian_change==0){Show_Sensor();}else if(jiemian==1&&jiemian_change==1){Show_Set();jiemian_change=0;}else if(jiemian==1&&jiemian_change==0) {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_time==0){//关闭定时器2,防止影响时序(其实不关也没事)TIM_SetCounter(TIM2,0);TIM_Cmd(TIM2, DISABLE);DHT11_Read_TempAndHumidity(&DHT11_Data);//读取温湿度BH1750_Data=bh_data_read();//读取光照强度TIM_Cmd(TIM2,ENABLE);//开启定时器2Sensor_time=Refresh_Sensor_time;}if(jiemian==0)//如果在主界面{/*显示传感器数值*/OLED_ShowNum(2,10,BH1750_Data,4);//光照强度OLED_ShowNum(3,10,DHT11_Data.humi_int,4);//空气湿度,显示个整数部分即可/*判断此时天气状况*/if(Weather_state==0)//晴天{OLED_ShowF16x16(4,10,24);OLED_ShowF16x16(4,12,17);}else if(Weather_state==1)//阴天{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_Choose==0)//光照强度{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_int>DHT11_threshold)//下雨{Weather_state=2;if(led==1)//关闭晾衣杆{led=0;LED_TIP_OFF;lingsheng(1);//下雨了,晾衣杆已关闭}	}else if(DHT11_Data.humi_int<DHT11_threshold&&BH1750_threshold<BH1750_Data)//晴天{Weather_state=0;if(led==0)//打开晾衣杆{led=1;LED_TIP_ON;lingsheng(2);//大晴天,晾衣杆已打开}}else{Weather_state=1;//阴天}}

总结

其实你只要学过一点stm32,以上资料完全够你手动复刻,去购买我硬件清单的对应模块,然后找到商家要驱动代码,移植到你的工程,然后调用相应的函数到我给你的main.c里面,关于网络配置这一块,读者需要自己去查阅机智云官方的指导书进行学习,不过其实这个项目将联网这几个函数删掉也完全可以,联网只是为了让这个项目高级那么一点罢了,只要看懂我这些,自己去找对应模块代码移植,这个项目就可以轻而易举的复刻出来了,希望我这篇文章可以帮助到你,如果需要完整的工程,可以私信我。


http://www.mrgr.cn/news/70650.html

相关文章:

  • 如何使用GPT API 自定义 自己的 RAG
  • vue2 项目中使用echarts 渲染时视图模糊的解决办法
  • python爬取小说内容
  • 4.3 MySQL 存储函数
  • PyQT开发与实践:全面掌握跨平台桌面应用开发
  • java-贪心算法
  • uniapp中webview全屏不显示导航栏解决方案
  • 20个Python自动化脚本,提升编程能力
  • 图形几何之美系列:仿射变换矩阵之先转后偏
  • 元岭村停车场的收费情况探寻
  • C#-objetc中的方法
  • mysql数据库(四)单表查询
  • 20241111_室内定位
  • 把握鸿蒙生态崛起的机遇:开发者视角的探讨
  • 应用系统开发(4)CMOS 模拟开关芯片HCF4053BE
  • CS144_01
  • 快手推出可灵AI独立APP,视频美学表达和运动表现持续领先
  • tiktok 用户主页接口API服务
  • 【Vue3】基础语法案例
  • Unity学习笔记(3):场景绘制和叠层设置 Tilemap
  • CCI3.0-HQ:用于预训练大型语言模型的高质量大规模中文数据集
  • 剖析源码,带你看懂JUC线程池运行机制
  • [ Linux 命令基础 2 ] Linux 命令详解-系统管理命令
  • Qt | QMediaPlayer+QGraphicsVideoItem视频播放器
  • 无线局域网四种类型
  • 图论算法:最短路径算法详解【c语言版】(无权最短路径、Dijkstra算法)