聚丰项目 > 基于CH32V103R 开发板的室内环境检测
室内环境是我们与我们息息相关,因而对它的了解也就是一件十分必要的事情。并通过数据搭配物联网家居来实时调节我们的生活环境,该作品以CH32V103R为处理核心,通过数字式传感器的配合来获取环境的温度、光照强度、大气压等,除外通过A/D转换器与模拟量传感器的配合可检测土壤湿度等状态,只是所用的传感器存在差异而已,在结构上不存在其他方面的变化。为了便于标记检测的时间点,所用的是片内的RTC计时器。为了体现检测仪器的便携式特点,该作品可利用串口为数据传送的中介,以支持2种形式的应用,即:借助无线透传模块以进行数据的无线传输;通过对数据进行协议的封装,可上传到电脑以实现界面的控件驱动显示,如指针式表盘、刻度计及进度球等显示形式。另外,还可控制MP3语音模块来播报当前的功能处理等。
jf_40123188
分享jf_40123188
团队成员
jf_40123188 工程师
CH32V103R开发板,作为整个系统的主控,其多线程,速度快,在物联网的应用中具有得天独厚的优势。
MG995舵机,用于模拟窗帘的闭合。
esp8266(esp01s),作为wifi模块,主要用于mqtt服务,是物联网不可或缺的一环。
红外传感器,用于感受光照,当检测到光照时,舵机将自动闭合(拉上窗帘)。
dht11,温度湿度传感器,用于获取温度和湿度。
继电器,用于连接220v用电器的开关。
软件部分使用了双线程作为整个系统的架构
第一个线程为整个系统的主要部分,包括了mqtt的连接,订阅,以及处理微信小程序发送的信息。
第二个线程为单片机向微信小程序发送信息的部分,定时获取dht11的温度湿度,并且把这些数据发送到微信小程序端。
数字式传感器
为进行环境检测,所有的数字式传感器为光强传感器BH1750和温度气压传感器BMP085,这2个器件均以I2C接口的方式工作。
这2个传感器所占用的引脚为:
BH1750:
SCK--- PA6
SIN--- PB7
BMP085:
SCL--- PF0
SDA--- PB0
串行通讯
板上可供数据传送的串口为UART1,其引脚功能为:
TX1--- PA4
RX1--- PA3
A/D转换及传感器
板上可直接使用A/D转换的引脚为ADC0所对应的PA5,用它连接外部的模拟量传感器以检测外部环境的状态,如土壤湿度、所含的气体和气味等。
数字式传感器检测
读取光照强度检测值的函数为:
void Get_Sunlight_Value() { int dis_data=0; float temp; char i=0; unsigned int sd; Single_Write_BH1750(0x01); Single_Write_BH1750(0x10); rt_thread_mdelay(180); Multiple_Read_BH1750(); for(i=0;i<3;i++) dis_data=BUF[0]; dis_data=(dis_data <<8)+BUF[1]; temp=(float)dis_data/1.2; sd=temp; OLED_ShowString(0,2,"Sunlight= lx",16); OLED_ShowNum(72,2,sd,5,16); }
读取温度与气压的函数为:
long bmp085ReadTemp(void) { BMP085_Start(); BMP085_Send_Byte(BMP085_SlaveAddress); while(BMP085_Wait_Ack()){} BMP085_Send_Byte(0xF4); while(BMP085_Wait_Ack()){} BMP085_Send_Byte(0x2E); while(BMP085_Wait_Ack()){} BMP085_Stop(); rt_thread_mdelay(10); return (long) Multiple_read(0xF6); } long bmp085ReadPressure(void) { long pressure = 0; BMP085_Start(); BMP085_Send_Byte(BMP085_SlaveAddress); while(BMP085_Wait_Ack()){} BMP085_Send_Byte(0xF4); while(BMP085_Wait_Ack()){} BMP085_Send_Byte(0x34); while(BMP085_Wait_Ack()){} BMP085_Stop(); rt_thread_mdelay(10); pressure = Multiple_read(0xF6); pressure&= 0x0000FFFF; return pressure; }
模拟量采集
实现模拟量采集的程序为:
adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME); if (adc_dev == RT_NULL) { while(1); } else{ ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL); } while(k==2) { value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL); LCD_ShowString(80,12, "value=",RED); LCD_ShowNum(128,12,value,5,RED); vol = value * REFER_VOLTAGE /CONVERT_BITS; LCD_ShowString(80,32, "U = . V",RED); LCD_ShowNum(104,32,vol/10,1,RED); LCD_ShowNum(120,32,vol%10,1,RED); rt_thread_mdelay(800); if(rt_pin_read(S2)==PIN_LOW) k=3; while(rt_pin_read(S2)==PIN_LOW); test_irda(); if(cs==0x0b) k=3; }