#define ADC_DEV_NAME "adc1" /* ADC 设备名称 */ #define ADC_DEV_CHANNEL 5 /* ADC 通道 */ #define ADC_DEV_CHANNEL1 6 /* ADC 通道 */ #define ADC_DEV_CHANNEL2 7 /* ADC 通道 */ #define REFER_VOLTAGE 330 /* 参考电压 3.3V,数据精度乘以100保留2位小数*/ #define CONVERT_BITS (1 << 12) /* 转换位数为12位 */ #include #include #include rt_thread_t Sensor_Thread = RT_NULL; #define THREAD_PRIORITY 25 #define THREAD_STACK_SIZE 4096 #define THREAD_TIMESLICE 5 #define PM25_READ_TIMES 20 #define GPIO_PIN GET_PIN(G, 5) #define LOG_TAG "sensor" #define DBG_LVL DBG_LOG // #define DBG_LVL DBG_INFO #define USE_LOG1 #define USE_LOG2 #define USE_LOG3 // #define USE_LOG4 #define USE_LOG5 // #define USE_LOG6 // #define USE_LOG_D #include "logn.h" float ADC_air; float ADC_PM25; float ADC_pressure; float ADC_Read() { rt_adc_device_t adc_dev; /* ADC 设备句柄 */ rt_uint32_t value, vol; /* 查找设备 */ adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME); /* 使能设备 */ rt_adc_enable(adc_dev, ADC_DEV_CHANNEL); /* 读取采样值 */ value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL); return value; } float ADC1_Read() { rt_adc_device_t adc_dev; /* ADC 设备句柄 */ rt_uint32_t value, vol; /* 查找设备 */ adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME); /* 使能设备 */ rt_adc_enable(adc_dev, ADC_DEV_CHANNEL1); /* 读取采样值 */ value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL1); return value; } float ADC2_Read() { rt_adc_device_t adc_dev; /* ADC 设备句柄 */ rt_uint32_t value, vol; /* 查找设备 */ adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME); /* 使能设备 */ rt_adc_enable(adc_dev, ADC_DEV_CHANNEL2); /* 读取采样值 */ value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL2); return value; } float PM25_GetData(void) { int ADCVal; int dustVal = 0; float Voltage; rt_pin_write(GPIO_PIN, PIN_HIGH);//置1 开启内部LED rt_hw_us_delay(280); ADCVal = ADC1_Read(); rt_hw_us_delay(25); rt_pin_write(GPIO_PIN, PIN_LOW); //置0 关闭内部LED rt_hw_us_delay(9680); //需要脉宽比0.32ms/10ms的PWM信号驱动传感器中的LED Voltage = 3.3f * ADCVal / 4096.f * 2; //获得AO输出口的电压值 dustVal = (0.17*Voltage-0.1)*1000; //乘以1000单位换成ug/m3// if (dustVal < 0) dustVal = 0; //限位// if (dustVal>500) dustVal=500; return dustVal; } /** * @brief 平均值滤波法 * @param 无 * @retval 返回滤波后的数据 */ float Get_PM25_Average_Data(void) { float temp_val=0; float t; for(t=0;t