项目处于开发阶段,尚未完成,仍在不断更新

一、系统功能要求

  1. 设备能够检测并显示环境温湿度值
  2. 系统监控软件能够实时监控环境温湿度值
  3. 系统监控软件能够设置设备温度值的上下阈值, 设备能够发出声光报警, 监控软件能够发出报警提示或者取消报警
  4. 设备及监控软件能够查看对应设备的温度阈值信息
  5. 设备能够显示时间
    二、软硬件需求

三、软硬件精选

1、处理器:stm32 / CC2530(常用于做智能家具,支持 Z-Stack 协议栈<基于ZigBee实现的>),stm32W系列的芯片也支持 Z-Stack 协议栈。
我们选用 STM32F103VBT6

2、温湿度传感器:(1)Pt100 (热电偶),使用时需要进行校准,但是精度高。
(2)DS18B20, 单总线的
(3)DHT11:温湿度传感器(精度低) ,学习过程中暂时选用 DHT11

3、存储单元:存储阈值,
外部存储单元:AT24C02,2K存储空间,(EEPROM); Flash,128M。
内部存储单元:ROM(单片机内部的 Flash)。我们选用内部存储单元。
选用存储单元要考虑其寿命,存储单元的寿命与擦写次数有关(一般为10万次)

4、输出设备:(1)数码管:占用 16 个I/O口,显示的内容有限。
(2)LCD1602:占用 11 个I/O口(八根data线,三根电源线),两行,每行显示16个字符,不能显示汉字。
(3)TFT:多彩屏,可现实各种颜色的字以及汉字,有65536中颜色可选
有三种驱动方式:并口驱动,SPI驱动,FSMC驱动(刷屏频率更快)。
(4)LCD12864:每行显示128个字符,共64行(可显示汉字)。
(5)串口屏:串口驱动(三根线:Rx,Tx,GND),工作中使用最多。

5、通信协议:

6、传输介质:IIC、USB、SPI、SDIO 的传输近距离太近,不适合;
CAN 配置比较麻烦,但是更可靠更安全,多用于汽车以及军用;
无线,需要买一个无线模块,然后与 I/O 口连接,可以选用;
这里我们选用有线传输介质:485总线,232总线,先使用232总线,后期换为485总线。

7、输入设备:键盘、触摸屏
8、发声设备:蜂鸣器、喇叭
9、发光设备:LED
10、时钟电路:32内部的RTC
11、操作系统:uC/OS-II,创建多个任务(1、根据协议接收指令;2、指令响应;3、温湿度采样;4、输入的检测,切屏)

四、代码实现

1、由定时器控制串口接收一个字符串,并发送给上位机。

串口、定时器的配置函数略去,,

中断函数:
接收中断:接收数据,打开定时器;
定时器中断:关闭接收中断,关闭定时器,定时器计数值清零,打开发送中断;
发送中断:发送数据,发送完成后,打开接收中断,关闭发送中断。

unsigned char rsvbuff[100];
unsigned char *rsvBufferPoint;unsigned intrsvbuffcnt;void USART1_IRQHandler(void)
{
if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) == SET)
{
USART_ClearFlag(USART1, USART_FLAG_ORE);
USART_ReceiveData(USART1);
}
if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{
rsvbuff[rsvbuffcnt++] = USART_ReceiveData(USART1);USART_ClearFlag(USART1, USART_IT_RXNE);TIM_Cmd(TIM2, ENABLE);
rsvBufferPoint = rsvbuff;
}if (USART_GetITStatus(USART1, USART_IT_TXE) == SET)
{
if (rsvbuffcnt != 0)
{
USART_ClearFlag(USART1, USART_IT_TXE);USART_SendData(USART1, (char)*rsvBufferPoint);
rsvBufferPoint++;
rsvbuffcnt--;
}else
{
while (USART_GetITStatus(USART1, USART_IT_TC) == SET) ;
USART_ClearFlag(USART1, USART_IT_TC);USART_ClearFlag(USART1, USART_IT_TXE);USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
}
}
}
void TIM2_IRQHandler(void)
{
if (TIM_GetFlagStatus(TIM2, TIM_IT_Update) == SET)
{
TIM_ClearFlag(TIM2, TIM_IT_Update);USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);TIM_Cmd(TIM2, DISABLE);
TIM_SetCounter(TIM2, 0x0000);USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
}
}

2、DHT11 采集温湿度,并显示在 LCD1602 上

配置好 LCD1602、DHT11:

LCD1602的配置:参考《LCD1602数据手册》的时序图,和《LCD1602液晶完整中文资料》的11条指令

void LCD_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);//LCD1602GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOC, &GPIO_InitStruct);GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOD, &GPIO_InitStruct);while(LCD_ReadStatus() & 0x80){}   LCD_WriteCmd(0x38);   //??
//  LCD_WriteCmd(0x0F);   //???,????,?????
//  LCD_WriteCmd(0x06);   //??????,???????????
//  LCD_WriteCmd(0x14); LCD_WriteCmd(0x0C);LCD_WriteCmd(0x06);LCD_WriteCmd(0x02);delay(1000);LCD_WriteCmd(0x01);   //??
}void LCD_WriteCmd(unsigned char Cmd)
{GPIO_ResetBits(GPIOD, GPIO_Pin_5);  //RS = 0GPIO_ResetBits(GPIOD, GPIO_Pin_6);  //RW = 0//delay(10000);GPIO_SetBits(GPIOD, GPIO_Pin_7);    //EN = 1GPIO_Write(GPIOC, (GPIO_ReadOutputData(GPIOC) & 0xFF00) | Cmd);delay(1000);//GPIOC->ODR = Cmd;GPIO_ResetBits(GPIOD, GPIO_Pin_7);  //EN = 0
}void LCD_WriteData(unsigned char Data)
{GPIO_SetBits(GPIOD, GPIO_Pin_5);    //RS = 1GPIO_ResetBits(GPIOD, GPIO_Pin_6);  //RW = 0//GPIOC->ODR = Data;GPIO_SetBits(GPIOD, GPIO_Pin_7);    //EN = 1GPIO_Write(GPIOC, (GPIO_ReadOutputData(GPIOC) & 0xFF00) | Data);delay(1000);//GPIOC->ODR = Data;GPIO_ResetBits(GPIOD, GPIO_Pin_7);  //EN = 0
}unsigned char LCD_ReadStatus(void)
{GPIO_InitTypeDef GPIO_InitStruct;unsigned char tmp = 0;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOC, &GPIO_InitStruct);GPIO_ResetBits(GPIOD, GPIO_Pin_5);  //RS = 0GPIO_SetBits(GPIOD, GPIO_Pin_6);    //RW = 1GPIO_ResetBits(GPIOD, GPIO_Pin_7);  //EN = 0GPIO_SetBits(GPIOD, GPIO_Pin_7);    //EN = 1delay(1000);tmp = GPIO_ReadInputData(GPIOC) & 0x00FF;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOC, &GPIO_InitStruct);return tmp;
}unsigned char LCD_ReadData(void)
{GPIO_InitTypeDef GPIO_InitStruct;unsigned char tmp = 0;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOC, &GPIO_InitStruct);GPIO_SetBits(GPIOD, GPIO_Pin_5);    //RS = 1GPIO_SetBits(GPIOD, GPIO_Pin_6);    //RW = 1GPIO_ResetBits(GPIOD, GPIO_Pin_7);  //EN = 0GPIO_SetBits(GPIOD, GPIO_Pin_7);    //EN = 1delay(1000);tmp = GPIO_ReadInputData(GPIOC) & 0x00FF;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOC, &GPIO_InitStruct);return tmp;
}void LCD_ShowString(unsigned char *str, unsigned char m, unsigned char n)
{if(m == 1){LCD_WriteCmd(0x80 + n); }if(m == 2){LCD_WriteCmd(0x80 + n + 0x40);  }while(*str != '\0'){LCD_WriteData(*str);str++;}
}

DHT11 的配置:参考《DHT11中文资料及C例程》时序图
*配置函数略去

void DHT11_Read_Data()
{unsigned int i = 0;char humidity[9] = "humidity=";char temputure[10] = "temputure=";char check[] = "Device Not Available\n";char error_data[] = "Error Data\n";unsigned int Data_Buff[5];unsigned char rcvBuff[30];DHT11_Rst();if (DHT11_Check() == 0){while((!DHT11_DQ));while(DHT11_DQ);    for (i = 0; i < 5; i++){Data_Buff[i] = DHT11_Read_Byte();}if ((Data_Buff[0]+Data_Buff[1]+Data_Buff[2]+Data_Buff[3]) == Data_Buff[4]){i = 0;sprintf(rcvBuff, "H: %d  T: %d", Data_Buff[0], Data_Buff[2]);LCD_ShowString(rcvBuff, 1, 0);}else{i = 0;}}else {
//    Usart_Send_String(check,21);
//    LED2 = 0;}
}

然后,在主函数调用这个函数即可显示。

  • sprintf(rcvBuff, “H: %d T: %d”, Data_Buff[0], Data_Buff[2]);
    善于使用 sprintf 函数将别的类型转化

3、用芯片内部的RTC,将时间显示在LCD上

//设置初始时间

int main()
{struct tm tm_ini;LCD_Init();DHT11_Init();tm_ini.tm_year = 2017;tm_ini.tm_mon = 3;tm_ini.tm_mday = 18;tm_ini.tm_hour = 15;tm_ini.tm_min = 34;tm_ini.tm_sec = 0;RTC_Config();   Time_SetCalendarTime(tm_ini);
void show_rtc_lcd(void){struct tm time_my;unsigned char rtc_ymd_buff[20]; unsigned char rtc_hms_buff[20];time_my = Time_GetCalendarTime();time_my.tm_mon += 1;sprintf(rtc_ymd_buff, "%04d-%02d-%02d.", time_my.tm_year, time_my.tm_mon, time_my.tm_mday);sprintf(rtc_hms_buff, "%02d:%02d:%02d.", time_my.tm_hour, time_my.tm_min, time_my.tm_sec);LCD_ShowString(rtc_ymd_buff, 2, 0);LCD_ShowString(rtc_hms_buff, 2, 11);}

4、使用EEPROM保存阈值,并可以读出显示在LCD上

void test(void)
{int i = 0;u8 read[20];int len;th_threvalue th;th_threvalue *thread;u8 *th_point = (u8*)&th;th.hum_threvalue = 50;th.temp_threvalue =50;IIC_Configuration();len = sizeof(th);for (i = 0; i < len; i++){IIC_Byte_Write(*th_point++, START_ADDR + i);SysTick_ms(100);}for (i = 0; i < len; i++){IIC_Byte_Read( &read[i], START_ADDR + i);   }thread = (th_threvalue*)read;sprintf(read, "t:%d h:%d", thread->temp_threvalue, thread->hum_threvalue);LCD_ShowString(read, 2, 0);
}

使用 char* 指向结构体,每次一个字节的读取结构体的内容。

5、通信协议

室内温湿度监控系统通信协议

 通信协议组成
帧头( SHE)+数据部分+校验和(1Byte)+帧尾( SHE)+数据部分+校验和(1 Byte)+帧尾(END)
说明: 校验和为数据部分所有字节内容相加的结果, 如果校验和的数值超过十六进制的 FF,也就是 255. 就要求其补码(取反加 1)作为校验和。
 数据部分格式
数据长度 地址 指令 数据内容
1 Byte 1 Byte 1 Byte n Byte
 数据长度: 数据长度 1 Byte+地址 1 Byte+指令 1 Byte+数据内容 n Byte
 地 址: 设备本地地址
 指令说明:
命令类型 (Bit:7-0)
W 监控平台向某节点设置参数
R 监控平台向某节点读取参数
N 监控平台取消某节点报警功能
Q 监控平台向某节点请求实时数据
E 错误应答

stm32---室内温湿度监控系统相关推荐

  1. 物联网毕业设计-基于stm32的温湿度监控系统

    一.引言 近年来,随着科技的进步,计算机和电子技术在各个领域的应用越来越广泛,人们对温湿度的要求也越来越高.现在用于食品.药品和环境监测的仪器.仪表和计算机等设备越来越多,它们与人们生产.生活的关系越 ...

  2. 室内温湿度监测系统解决方案

    应用背景 我们正处于一个机械化.信息化的时代,各式各样的机械.仪器都需要处在一个合适的环境中才能良好运行,一些实验与生产性工作对环境也有特殊需求,对温湿度等指标进行监管和控制,才能保证生产生活的良好秩 ...

  3. 室内温湿度检测系统解决方案

    我们正处于一个机械化.信息化的时代,各式各样的机械.仪器都需要处在一个合适的环境中才能良好运行,一些实验与生产性工作对环境也有特殊需求,对温湿度等指标进行监管和控制,才能保证生产生活的良好秩序,室内温 ...

  4. 基于stm32、Android和Html的温湿度监控系统的设计

    系列文章目录 第一章ESP8266的java软件仿真测试 第二章ESP8266硬件与软件测试 第三章ESP8266客户端与Java后台服务器联调 第四章ESP8266客户端与JavaWeb服务器联调 ...

  5. stm32的温湿度监控

    @#基于stm32温湿度监控系统 基于stm32温湿度监控系统 本次项目主要用到Qt creator软件,Keil uVision5软件 项目要求 dht11温湿度传感器通过串口收发数据,设置上下限报 ...

  6. 【嵌入式Linux应用开发】温湿度监控系统——绘制温湿度折线图

    1. 概述 ​ 本篇的主要内容是使用SquareLine Studio绘制一个显示温湿度曲线图的表格,将其移植到100ASK STM32MP157开发板上显示,效果图如图所示: 温湿度监控系统应用开发 ...

  7. 环境温湿度监控系统(51+DHT11+1602液晶)

    环境温湿度监控系统(51+DHT11+1602液晶) 使用模块: DHT11 Datasheet:https://www.alldatasheetcn.com/datasheet-pdf/pdf/11 ...

  8. ESP32-CAM高性价比温湿度监控系统

    ESP32-CAM ArduinoIDE开发系列文章目录 第一篇:ESP32-CAM高性价比WIFI图传方案快速入门教程 第二篇:ESP32-CAM第一个无线点灯程序 第三篇:ESP32-CAM智能网 ...

  9. 智慧档案馆之档案库房温湿度监控系统方案

    智慧档案馆之档案库房温湿度监控系统方案 其他档案库房八防.档案库房十防环境监控系统相关:自动化恒温恒湿消毒净化系统.防火防盗系统.漏水视频门禁监控系统.防虫防鼠系统.短信声光报警系统均可做成一个大数据 ...

  10. 6. 毕业设计温湿度监控系统(ESP8266 + DHT11 +OLED 实时上传温湿度数据给公网服务器并在OLED显示屏上显示实时温湿度)

    文章目录 硬件环境 软件环境 1. WiFi联网和HttpPost配置 2. DHT11温湿度读取和OLED显示配置 3. Web服务器配置(用于接收HTTP数据请求) 实验过程 1. ESP8266 ...

最新文章

  1. runtime运行时编程一些相关知识
  2. go语言实现简易ftp客户端
  3. Error: ENOSPC: System limit for number of file watchers reached, watch'所在文件路径'
  4. mysql表的类型_浅谈MySQL表类型
  5. [BZOJ 2424][HAOI2010]订货(费用流)
  6. 单片机中存储器扩展位地址线怎么算_51单片机CPU结构各部件的原理详细分析
  7. 计算机算法刘汉英PDF,操作系统原理(刘汉英)
  8. ArrayList删除的问题
  9. 如何分析android的OOM,与java静态代码分析工具
  10. 你的公司有如下的症状吗?
  11. VMProtect修复导入表的插件
  12. How Google Tests Software (出书,停止更新)
  13. shell---字体颜色
  14. chariot iperf使用_iperf局域网性能工具
  15. 雷电模拟器android文件夹在哪,雷电安卓模拟器共享文件怎么用?电脑文件与模拟器互通图文教程...
  16. 看51CTO新闻的感想(宝兰)
  17. licode erizo pipleline 1 : handlercontext
  18. 同城信息发布小程序开发制作
  19. 流行和声(2)Major6和弦
  20. 华为数通笔记-PPPoE

热门文章

  1. #考研笔记#计算机之多媒体应用
  2. 在线html转wml,HTML_什么是 WML?,   WML(Wireless Markup Language - phpStudy
  3. Javascript语法基础之按钮点击事件
  4. asp web页面介绍
  5. 1个安装包2款游戏?!Cocos《神仙道》黑科技闪瞎眼
  6. 荷花三宝,夏季清热必备
  7. MATLAB中从一个文件中读取指定的行
  8. xlwings不可见地操作excel
  9. 小蚂蚁图片宣传c++记录
  10. LZ4压缩算法实现思路详解