STM32
直播中

发生的方式

8年用户 1229经验值
擅长:处理器/DSP
私信 关注
[问答]

空气检测质点的整体架构是由哪些部分组成的

空气检测质点的整体架构是由哪些部分组成的?

回帖(1)

傅筹更

2021-12-14 13:46:34
空气检测质点

  整体架构

  数据采集

  温湿度模块(型号:DHT11)

  实物图
  原理图

  
  

  

  传输协议(串行接口,单线双向)

  DATA引脚和微处理器之间采用单总线数据格式,每次通讯时间为4ms左右,完整的数据传输为40bit,高位先出。具体如下:
  [tr]数据含义[/tr]
温度高8位串口发送的第一个数据
温度高8位串口发送的第二个数据(默认00)
湿度高8位串口发送的第三个数据
湿度高8位串口发送的第四个数据(默认00)
校验8位串口发送的第五个数据
代码实现

dht11.h                                                                                         头文件
void dht11_gpio_input(void);                                        输入初始化
void dht11_gpio_output(void);                                    输出初始化
u16 dht11_scan(void);                                                        扫描
u16 dht11_read_bit(void);                                                位读取
u16 dht11_read_byte(void);                                                字节读取
u16 dht11_read_data(u8 buffer[4]);                                读取温度和湿度


main.c                                                                                        在主函数中
if (dht11_read_data(buffer) == 0)                                如果获取到40位数据后
{
        hum = buffer[0] + buffer[1] / 10.0;                        得到湿度值
        temp = buffer[2] + buffer[3] / 10.0;                得到温度值
}
printf("温湿度模块t 温度 = %.2ft        湿度: %.2f                rn", temp, hum);


气压模块(型号BMP180)

  实物图

  原理图

  
  

  

  传输协议(I2C)

  BMP180工作流程图如下:

  

  

I2C时序图如下:

  

  

  代码实现

BMP180.h                                                                                                                 头
BMP180.h                                                                                                                 头文件
void BMP_Init(void);                                                                                        初始化
uint8_t BMP_ReadOneByte(uint8_t ReadAddr);                                                读一个8位的数据
void BMP_WriteOneByte(uint8_t WriteAddr,uint8_t DataToWrite);        读一个字节数据
short BMP_ReadTwoByte(uint8_t ReadAddr);                                                读一个16位的数据
void BMP_ReadCalibrationData(void);                                                                获取计算参数
long BMP_Read_UT(void);                                                                                        读取温度值
long BMP_Read_UP(void);                                                                                        读取气压值
void BMP_UncompemstatedToTrue(void);                                        修正刚才获取的数据,并且计算海拔


main.c                                                                                        在主函数中
BMP_Init();                                                                                初始化
BMP_ReadCalibrationData();                                                读取值
ID = BMP_ReadOneByte(0xd0);                                                读数据
BMP_UncompemstatedToTrue();                                                修正数据
printf("气压模块t 温度 = %d.%dCt   压强 = %ldPat  高度 = %.5fmrn",bmp180.Temp/10,bmp180.Temp%10,bmp180.p,bmp180.altitude);       

PM2.5模块(型号:GP2Y1014AU)

  实物图

  原理图

  
  

  

  传输协议(ADC,检测电压)

  
  

  

  代码实现


adc.h
float GetGP2Y(void);                                                 获得ADC的值
void Adc_Init(void);                                                初始化ADC
u16  Get_Adc(u8 ch);                                                 获得ADC的值
u16 Get_GP2Y_Average(u8 times);                                获得电压较稳定值


main.c                                                                                在主函数中
Adc_Init();                                                                        adc初始化Get_GP2Y_Average(20)
printf("PM2.5模块t        浓度 = %drn",Get_GP2Y_Average(20));


甲醛模块(型号:MS1100)

  实物图
  原理图

  
  

  

  传输协议(ADC,电压检测)

  
  

  

  代码实现


adc_dma.h                                                                                                         头文件
void ADC_DMA_Init(void);                                                                        初始化定义
float ADC_DMA_GET_MQ135(void);                                                                定义电压值


main.c                                                                                        在主函数中
ADC_DMA_Init();                                                                        初始化
printf("¼×È©Ä£¿ét        ¼×È© = %4.2frn", ADC_DMA_GET_MQ135());       


数据收集

  stm32f103c8t6

  实物图

  
  

  

  原理图

  
  

  

  工程结构

  
  

  

  数据发送

  LORA模块(型号:ATK-LORA-01)

  实物图
  原理图

  
  

  

  传输协议(串口连接,AT指令)

  [tr]AT指令返回值[/tr]

ATOK
AT+UARTOK
AT+WLRATE=23,2OK
AT+TPOWER=3OK
AT+TMODE=0OK
AT+WLTIME=0OK
AT+CWMODE=0OK
AT+ADDR=FF,FFOK
代码实现

lora.h
u8 Lora_Init(void);                                初始化


while ( 1 )
    {
                                LED_C15_ON();                     配置mod0引脚
        delay_ms( 300 );
        if (Lora_Init())
        {
                                                uart2_init(115200);
            printf( "Lora Configuration Successful!rn" );
                                                LED_C15_OFF();
            break;
        }
        else
        {
            printf( "Lora Configuration fail!rn" );
        }
    }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分