笔记目录
一、题目要求
温度,湿度,CO2作为农业生产中中非常重要的参数,需要准确的采样。该系统完成对于上述参数的精确采样,通过LCD显示在面板上,并将测量值发送到上位机进行显示。
(1)测量对应的温度、湿度、CO2的值。
(2)用OLED显示实际的温度值和湿度值
(3)实现对温度,湿度,CO2的实时采集。
(4)如果温湿度低于或者高于设定值,采取对应措施升降温和升降湿度值。
(5)在上位机上设计监测界面,实时显示各个测量值。
源码
链接:https://pan.baidu.com/s/1PWT5x9oD2lo6c3Wlz6RVfg
提取码:6666
二、系统总体设计
1、用到的器件和软件
控制器:stm32f407vet6核心板
显示屏:0.96寸OLED (SPI接口)
温湿度传感器:DHT11
CO2浓度传感器:SGP30 (I2C接口)
stm32编程软件:CUBEMX,keil5
上位机软件设计工具:MATLAB APP Designer
2、整体思路
通过DHT11采集温湿度和SGP30采集二氧化碳并通过OLED实时显示,1s刷新一次,通过串口将采集到的数据上传到用MATLAB做的界面中。
三、效果图
四、嵌入式硬件部分
1.原理图
五、嵌入式软件部分
1.主函数
//包含显示、初始化、和传感器读数程序
int main(void)
{
uint32_t CO2Data,TVOCData;//定义CO2浓度变量与TVOC浓度变量
uint16_t temperature;
uint16_t humidity;
unsigned long sgp30_dat;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
MX_TIM6_Init();
MX_SPI2_Init();
HAL_UART_Receive_DMA(&huart1,aRxBuffer,1); //串口DMA初始化
OLED_Init(); //OLED初始化
Show_Str(0, 2,"Initializing...", 16, 0); //显示初始化中...
//DHT11初始化
while(DHT11_Init()){
HAL_Delay(500);
}
//初始化SGP30
SGP30_Init();
HAL_Delay(100);
SGP30_Write(0x20,0x08);
sgp30_dat = SGP30_Read();//读取SGP30的值
CO2Data = (sgp30_dat & 0xffff0000) >> 16;
TVOCData = sgp30_dat & 0x0000ffff;
//SGP30模块开机需要一定时间初始化,在初始化阶段读取的CO2浓度为400ppm,TVOC为0ppd且恒定不变,因此上电后每隔500ms读取一次
//SGP30模块的值,如果CO2浓度为400ppm,TVOC为0ppd,则屏幕闪烁显示“正在检测中...”,直到SGP30模块初始化完成。
while(CO2Data == 400 && TVOCData == 0)
{
SGP30_Write(0x20,0x08);
sgp30_dat = SGP30_Read();//读取SGP30的值
CO2Data = (sgp30_dat & 0xffff0000) >> 16;//取出CO2浓度值
TVOCData = sgp30_dat & 0x0000ffff; //取出TVOC值
HAL_Delay(500);
}
OLED_Clear(); //清屏
while (1)
{
DHT11_Read_Data(&temperature,&humidity); //读取温度湿度值
SGP30_Write(0x20,0x08);
sgp30_dat = SGP30_Read();//读取SGP30的值
CO2Data = (sgp30_dat & 0xffff0000) >> 16;//取出CO2浓度值
printf("%02d%1d",temperature>>8,temperature&0xff);
printf("%02d%1d",humidity>>8,humidity&0xff);
printf("%03d",CO2Data);
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_6);
//OLED显示
//温度显示
Show_Str(4, 1,"temp:", 16, 0);
OLED_ShowNum(40,1