聚丰项目 > 基于CH32V103R 开发板的室内环境检测

基于CH32V103R 开发板的室内环境检测

室内环境是我们与我们息息相关,因而对它的了解也就是一件十分必要的事情。并通过数据搭配物联网家居来实时调节我们的生活环境,该作品以CH32V103R为处理核心,通过数字式传感器的配合来获取环境的温度、光照强度、大气压等,除外通过A/D转换器与模拟量传感器的配合可检测土壤湿度等状态,只是所用的传感器存在差异而已,在结构上不存在其他方面的变化。为了便于标记检测的时间点,所用的是片内的RTC计时器。为了体现检测仪器的便携式特点,该作品可利用串口为数据传送的中介,以支持2种形式的应用,即:借助无线透传模块以进行数据的无线传输;通过对数据进行协议的封装,可上传到电脑以实现界面的控件驱动显示,如指针式表盘、刻度计及进度球等显示形式。另外,还可控制MP3语音模块来播报当前的功能处理等。

jf_40123188 jf_40123188

分享
0 喜欢这个项目
团队介绍

jf_40123188 jf_40123188

团队成员

jf_40123188 工程师

分享
项目简介
室内环境是我们与我们息息相关,因而对它的了解也就是一件十分必要的事情。并通过数据搭配物联网家居来实时调节我们的生活环境,该作品以CH32V103R为处理核心,通过数字式传感器的配合来获取环境的温度、光照强度、大气压等,除外通过A/D转换器与模拟量传感器的配合可检测土壤湿度等状态,只是所用的传感器存在差异而已,在结构上不存在其他方面的变化。为了便于标记检测的时间点,所用的是片内的RTC计时器。为了体现检测仪器的便携式特点,该作品可利用串口为数据传送的中介,以支持2种形式的应用,即:借助无线透传模块以进行数据的无线传输;通过对数据进行协议的封装,可上传到电脑以实现界面的控件驱动显示,如指针式表盘、刻度计及进度球等显示形式。另外,还可控制MP3语音模块来播报当前的功能处理等。
硬件说明
  1. CH32V103R开发板,作为整个系统的主控,其多线程,速度快,在物联网的应用中具有得天独厚的优势。

  2. MG995舵机,用于模拟窗帘的闭合。

  3. esp8266(esp01s),作为wifi模块,主要用于mqtt服务,是物联网不可或缺的一环。

  4. 红外传感器,用于感受光照,当检测到光照时,舵机将自动闭合(拉上窗帘)。

  5. dht11,温度湿度传感器,用于获取温度和湿度。

  6. 继电器,用于连接220v用电器的开关。

IMG_1439.JPG

软件说明

软件部分使用了双线程作为整个系统的架构

第一个线程为整个系统的主要部分,包括了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;

    }



演示效果

  pYYBAGGeNmWATf_HAABkpcjvBBg495.png

评论区(0 )