大棚检测系统
视频演示01—项目简介系统功能多参数环境监测实时采集空气温度、湿度、光照强度、CO₂浓度、土壤湿度。本地显示通过 0.96 英寸 OLED 屏幕直观显示各项数据。无线传输通过 HC-04/05 蓝牙模块将数据发送至手机或上位机支持简单 JSON 格式便于后续 App 或 PC 端解析。简单报警当 CO₂ 浓度过高或土壤湿度过低时触发蜂鸣器提醒。数据刷新每 2 秒左右更新一次数据兼顾 DHT11 传感器特性与实时性。系统可作为完整智能大棚的基础监测层后续可扩展自动控制如通风、灌溉、补光等执行机构。硬件组成主控板STM32F103C8T6 最小系统板温湿度传感器DHT11数字单总线光照传感器GY-302BH1750I²C 接口土壤湿度传感器电容式模拟输出接 ADCCO₂ 传感器JW01类似 MH-Z19UART 命令式显示模块0.96 英寸 OLEDSSD1306I²C无线模块HC-04/05 蓝牙UART 透明传输02—PCB原理图设计03—程序设计1DHT11 温湿度传感器驱动uint8_t DHT11_ReadData(uint8_t *temp, uint8_t *hum) { uint8_t buf[5] {0}; /* 开始信号 */ HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_RESET); HAL_Delay(18); HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_SET); delay_us(40); // 需要自行实现微秒延时 if (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) 0) { delay_us(80); if (HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) 1) { /* 读取5个字节 */ for (uint8_t i 0; i 5; i) { buf[i] DHT11_ReadByte(); } /* 校验和验证 */ if (buf[4] (buf[0] buf[1] buf[2] buf[3])) { *hum buf[0]; // 湿度整数部分 *temp buf[2]; // 温度整数部分 return 1; // 读取成功 } } } return 0; // 读取失败 }2BH1750 光照传感器驱动void BH1750_Init(I2C_HandleTypeDef *hi2c) { uint8_t cmd 0x01; // Power On HAL_I2C_Master_Transmit(hi2c, BH1750_ADDR, cmd, 1, 100); HAL_Delay(10); cmd 0x10; // 连续高分辨率模式 HAL_I2C_Master_Transmit(hi2c, BH1750_ADDR, cmd, 1, 100); } uint16_t BH1750_ReadLux(I2C_HandleTypeDef *hi2c) { uint8_t buf[2]; HAL_I2C_Master_Receive(hi2c, BH1750_ADDR, buf, 2, 200); uint16_t lux (buf[0] 8) | buf[1]; return lux / 1.2; // 转换为实际 Lux 值 }3土壤湿度传感器驱动uint16_t Soil_ReadADC(ADC_HandleTypeDef *hadc) { HAL_ADC_Start(hadc); HAL_ADC_PollForConversion(hadc, 50); return HAL_ADC_GetValue(hadc); } float Soil_GetMoisturePercent(uint16_t adc_value) { // 根据实际标定调整映射关系示例 float moisture 100.0f * (4095.0f - adc_value) / 4095.0f; if (moisture 0) moisture 0; if (moisture 100) moisture 100; return moisture; }4CO₂ 传感器驱动const uint8_t CO2_GET_CMD[9] {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79}; uint16_t CO2_ReadPPM(UART_HandleTypeDef *huart) { uint8_t rx_buf[9] {0}; HAL_UART_Transmit(huart, (uint8_t*)CO2_GET_CMD, 9, 100); if (HAL_UART_Receive(huart, rx_buf, 9, 500) HAL_OK) { if (rx_buf[0] 0xFF rx_buf[1] 0x86) { return (rx_buf[2] 8) | rx_buf[3]; // 返回 CO₂ 浓度 (ppm) } } return 0; // 读取失败返回 0 }5OLED 显示函数void OLED_ShowSensorData(uint8_t temp, uint8_t hum, uint16_t lux, uint16_t co2, float soil) { char str[32]; SSD1306_Fill(0); sprintf(str, Temp: %2d°C, temp); SSD1306_GotoXY(4, 4); SSD1306_Puts(str, Font_11x18, 1); sprintf(str, Hum : %2d%%, hum); SSD1306_GotoXY(4, 26); SSD1306_Puts(str, Font_11x18, 1); sprintf(str, Light: %4d Lux, lux); SSD1306_GotoXY(4, 48); SSD1306_Puts(str, Font_7x10, 1); sprintf(str, CO2 : %4d ppm, co2); SSD1306_GotoXY(4, 60); SSD1306_Puts(str, Font_7x10, 1); sprintf(str, Soil: %.0f%%, soil); SSD1306_GotoXY(80, 48); SSD1306_Puts(str, Font_7x10, 1); SSD1306_UpdateScreen(); }6蓝牙数据发送JSON 格式void Bluetooth_SendSensorData(UART_HandleTypeDef *huart, uint8_t temp, uint8_t hum, uint16_t co2, float soil) { char json[128]; sprintf(json, {\temp\:%d,\hum\:%d,\light\:%d,\co2\:%d,\soil\:%.1f}\r\n, temp, hum, lux, co2, soil); // lux 需要自行传入或改为全局变量 HAL_UART_Transmit(huart, (uint8_t*)json, strlen(json), 200); }主程序循环示例while(1)while (1) { uint8_t temperature 0, humidity 0; uint16_t light_lux 0; uint16_t co2_ppm 0; float soil_percent 0.0f; /* 读取所有传感器 */ DHT11_ReadData(temperature, humidity); light_lux BH1750_ReadLux(hi2c1); co2_ppm CO2_ReadPPM(huart2); uint16_t adc_raw Soil_ReadADC(hadc1); soil_percent Soil_GetMoisturePercent(adc_raw); /* 显示与传输 */ OLED_ShowSensorData(temperature, humidity, light_lux, co2_ppm, soil_percent); Bluetooth_SendSensorData(huart1, temperature, humidity, co2_ppm, soil_percent); /* 简单报警逻辑 */ if (co2_ppm 1200 || soil_percent 30) { HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET); HAL_Delay(300); HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_RESET); } HAL_Delay(2000); // 每2秒刷新一次 }欢迎咨询
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2512589.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!