本帖最后由 阿信 于 2024-7-26 18:07 编辑
目录
一、前言
二、项目简介
1.功能详解
2.主要器件
三、原理图设计
四、PCB硬件设计
1.PCB图
2.PCB板打样焊接图
五、程序设计
六、实验效果
七、资料内容
项目分享
一、前言
项目成品图片:
哔哩哔哩视频链接: https://www.bilibili.com/video/BV1Rw4m117jv/?share_source=copy_web&vd_source=097fdeaf6b6ecfed8a9ff7119c32faf2 二、项目简介 1.功能详解 STM32基于机智云的智能温室大棚系统。功能如下:
温湿度采集:使用DHT11温湿度传感器采集环境温湿度 土壤湿度采集:通过土壤湿度模块采集土壤湿度 光照强度采集:通过光敏电阻采集环境光照强度 二氧化碳浓度采集:通过CO2气敏传感器检测二氧化碳浓度 土壤温度采集:通过DS18B20传感器采集土壤温度 风扇控制:可自动模式下根据环境温度触发或手动模式下APP开闭 水泵控制:可自动模式下根据土壤湿度触发或手动模式下APP开闭 LED照明灯控制:可自动模式下根据环境光强触发或手动模式下按键开闭 通风口:通过步进电机模拟通风口 OLED显示:将检测到的环境数据显示在oled屏幕上。 蜂鸣器报警:危险情况下本地蜂鸣器触发报警 APP功能:使用机智云APP,包括功能有控制并显示风扇、水泵、通风口和补光灯状态,选择工作模式为手动或自动模式,显示当前环境温湿度、土壤温湿度以及光照强度和二氧化碳浓度信息 2.主要器件 STM32F103C8T6最小系统板 DHT11温湿度传感器 OLED显示屏(4针I2C协议) WiFi模块(esp8266-01s) 土壤湿度传感器 二氧化碳传感器 DS18B20温度传感器 28BYJ51步进电机 5V风扇模块 5V水泵模块 蜂鸣器 LED灯 三、原理图设计
四、PCB硬件设计 1.PCB图
2.PCB板打样焊接图
五、程序设计
- int main(void)
- {
- ADCX_Init();
- Timer2_Init(9,14398);
- Uart2_Init(9600);
- Uart1_Init(115200);
- Uart3_Init();
- IWDG_Init(); //初始化看门狗
- LDR_Init();
- YL69_Init();
- OLED_Init();
- DHT11_Init();
- LED_Init();
- Buzzer_Init();
- Relay_Init();
- MOTOR_Init();
- Key_Init();
- Sensorthreshold.CO2Value = FLASH_R(FLASH_START_ADDR); //从指定页的地址读FLASH
- Sensorthreshold.luxValue = FLASH_R(FLASH_START_ADDR+2); //从指定页的地址读FLASH
- Sensorthreshold.tempValue = FLASH_R(FLASH_START_ADDR+4); //从指定页的地址读FLASH
- Sensorthreshold.humiValue = FLASH_R(FLASH_START_ADDR+6); //从指定页的地址读FLASH
- Sensorthreshold.soilTempValue = FLASH_R(FLASH_START_ADDR+8); //从指定页的地址读FLASH
- Sensorthreshold.soilHumiValue = FLASH_R(FLASH_START_ADDR+10); //从指定页的地址读FLASH
- GENERAL_TIM_Init();
- userInit(); //完成机智云初始赋值
- gizwitsInit(); //开辟一个环形缓冲区
- while (1)
- {
- IWDG_ReloadCounter(); //重新加载计数值 喂狗
- SensorScan(); //获取传感器数据
- switch (menu)
- {
- case display_page1:
- SensorDataDisplay1(); //显示传感器1数据
- OLED_Menu1(); //显示主页面1固定信息
- if (KeyNum == KEY_2) //是否按下按键2
- {
- KeyNum = 0;
- OLED_Clear(); //清屏
- menu = display_page2; //menu = 主页面2
- }
- MotorOperation();
- break;
- case display_page2:
- SensorDataDisplay2(); //显示传感器2数据
- OLED_Menu2(); //显示主页面2固定信息
- if (KeyNum == KEY_2) //是否按下按键2
- {
- KeyNum = 0;
- OLED_Clear(); //清屏
- menu = display_page1; //menu = 主页面1
- }
- MotorOperation();
- break;
- case settingsPage:
- //从主页面跳转至设置页面时进行一次清屏
- if (OLED_Clear_Flag)
- {
- OLED_Clear_Flag = 0; //清除清屏标志位
- OLED_Clear(); //清屏
- }
- ThresholdModification(SetSelection()); //调节传感器阈值
- OLED_Option(SetSelection()); //获取按键次数,从而判断“>”显示位置
- //按键次数小于等于4时,显示设置页面1
- if (SetSelection() <= 4)
- {
- settingsThresholdDisplay1(); //显示传感器阈值1数据
- OLED_settingsPage1(); //显示阈值设置界面1固定信息
- }
- else //否则显示设置页面2
- {
- settingsThresholdDisplay2(); //显示传感器阈值2数据
- OLED_settingsPage2(); //显示阈值设置界面2固定信息
- }
- if (KeyNum == KEY_2) //判断用户是否按下退出按键
- {
- KeyNum = 0;
- OLED_Clear(); //清屏
- menu = display_page1; //回到主页面1
- //存储修改的传感器阈值至flash内
- FLASH_W(FLASH_START_ADDR, Sensorthreshold.CO2Value, Sensorthreshold.luxValue,
- Sensorthreshold.tempValue, Sensorthreshold.humiValue,
- Sensorthreshold.soilTempValue, Sensorthreshold.soilHumiValue);
- }
- break;
- default: break;
- }
- userHandle(); //更新机智云数据点变量存储的值
- gizwitsHandle((dataPoint_t *)¤tDataPoint); //数据上传至机智云
- }
- }
复制代码
六、实验效果
|