6.4 OpenHarmony的ADC使用(读取酒精传感器数据)
这一小节使用一个采集酒精传感器数据的例子来说明如何在运行鸿蒙系统的W800开发板上使用ADC功能。示例代码可在Gitee仓库下载:https://gitee.com/nicholas3388/ohos-examples
我们使用的酒精传感器是非常低成本的MQ3传感器模块,只需要5元左右,实物图如下图所示:

该传感器原理如下:MQ-3 气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中存在酒精蒸气时,传感器的电导率随空气中酒精蒸气浓度的增加而增大。使用简单的电路即可 将电导率的变化转换为与该气体浓度相对应的输出信号 。
该传感器模块有4个引脚:
- +5V:接5V供电
- -5V:接地
- DO输出:输出TTL数字量,0.1或5V(低、高电平)
- AO输出:输出0.1~0.3V模拟信号,电压值(无酒精污染情况时),最高输出4V左右
传感器上电后需要预热20秒左右,内部有电热丝,预热后才能准确测

试数值。所以使用时传感器会有微热。
我们的例子中将PB6设置为输入模式,上升沿下降沿都触发IO中断,并接到MQ3的DO输出,当传感器检测到酒精浓度超标时DO会输出低电平,PB6的中断处理程序中检测到下降沿后让PB8输出低电平使得蓝色LED灯亮。PA1接模块的模拟信号输出AO,即信号输入W800的ADC的第一个通道,
void UserMain(void)
{
printf("\n user task \n");
tls_os_task_create(&taskHandle, "adcThr",
adc_task_start,
(void *)0,
(void *)NULL,
ADC_TASK_START_STK_SIZE * sizeof(u32), /* 任务栈的大小 */
5,
0);
//设置io中断,检测传感器do输出
printf("config pin input\n");
tls_gpio_cfg(WM_IO_PB_06, WM_GPIO_DIR_INPUT, WM_GPIO_ATTR_FLOATING);
tls_gpio_isr_register(WM_IO_PB_06, gpio_isr_callback, NULL);
tls_gpio_irq_enable(WM_IO_PB_06, WM_GPIO_IRQ_TRIG_FALLING_EDGE); //下降沿触发
printf("\nuser main task complete\n");
}
ADC检测任务
static int adc_input_voltage_demo(u8 chan)
{
int voltage =0;
if (chan <= 1)
{
wm_adc_config(chan);
} else {
return 0;
}
voltage = adc_get_inputVolt(chan);
if (voltage < 0) {
voltage = 0 - voltage;
printf("chan:%d, -%d(mV) or -%d.%03d(V)\r\n", chan, voltage, voltage/1000, voltage%1000);
} else {
printf("chan:%d, %d(mV) or %d.%03d(V)\r\n", chan, voltage, voltage/1000, voltage%1000);
}
return 0;
}