6. MQ-2气体传感器
芯片参数:
下图显示的是整个产品模块功能示意图,电路结构较为简单,便于大规模普及。
nRF52840气体传感器上面集成了MQ-2气体传感器,可以用来检测工业区和居民小区周围可能泄露的可燃性气体,然后通过串口通信把气体数据传输给nRF52840芯片,然后nRF52840芯片通过蓝牙5.0数据帧把气体数据按照一定的格式广播出去,手机APP或者蓝牙报警设备就可以随时检测到气体数据,并发出报警功能,从而避免更大的安全事故发生。
MQ气体传感器使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。
当传感器所处环境中存在可疑气体时,传感器的电导率随空气中可燃气体浓度的增加而增大。
使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。MQ气体传感器对甲烷的灵敏度高,对丙烷、丁烷也有较好的灵敏度。这种传感器可检测多种可燃性气体,特别是天然气,是一款适合多种营养的低成本传感器。
7. 气体传感器工作模式介绍
由于传感器采用了100MA的纽扣电池供电, NRF 52840作为主控芯片每1S读取5次传感器的数据,通过一定的滤波算法,计算出正确的数据。当52840不采集数据的时候,也自动进入休眠模式,从而达到节省功耗的目的。
正常情况下,52840每5分钟通过串口接收气体传感器的数据,再以广播的形式把数据广播出去,由于要保证手机能扫描到52840的数据,因此广播次数不能随便设,次数设多了,功耗又大了,次数设少了,手机有时又不能扫描到,这与手机开启的扫描占空比有关,还有与扫描通道有关,蓝牙共有3个广播通道,一次只能扫一个,所以存在一定的概率。
经过综合测试,我们决定正常情况下广播次数设为30次,异常情况下,广播次数设为50次。
二、蓝牙协议栈工作流程介绍
1. BLE优势
自从蓝牙4.0BLE诞生以来,以蓝牙为基础的物联网设备开启了爆发式增长,其原因在于BLE具备下面几点优势:
BLE具备相当于WIFI 10分之1的极低功耗,一颗纽扣电池就能维持设备工作很长时间。BLE芯片成本很低,其价格已经做到和MCU相当了,这大大的促进了BLE设备的快速增长。BLE通信和工作稳定性极强,由于蓝牙超强的跳频机制,可以让BLE轻松避开被干扰了的信道,保持高速通信。BLE通信距离远,BLE特别是到了蓝牙5.0时代,通信距离达到了400米,比一般的WIFI距离都远。BLE通信速度有了明显的提升,特别是到了蓝牙5.0时代,通信速度达到了2Mb/s,这个速度可以传输音频信号了。2. BLE启动工作流程顺序如下:启动后进入main函数,首先初始化串口,波特率为9600,用来和MQ-2进行通信。log打印初始化,软件定时器初始化,然后蓝牙协议栈初始化,主要是完成协议相关标签设置,以及RAM初始地址设置,使能协议栈,开启蓝牙观察者模式。GAP角色初始化,里面进行了蓝牙开放连接模式设置,广播器件名设置,然后最小连接间隔设为10MS,最大连接间隔设为50MS,从机延迟设为0,连接超时设为1S。GATT初始化,GATT是传输层,用来传输真正的数据,主要是进行MTU最大传输数据单元的设置,蓝牙4.0是31个字节,而蓝牙5.0可以设置253个字节,大大的提升了数据的吞吐量。服务的初始化,这里添加了串口收发服务,向蓝牙协议栈注册了串口数据接收回调函数。连接参数更新初始化,因为连接参数主机和从机是可以协商的,
比如有大数据量要传输的时候,主机就可以发起参数更新请求,从机根据自己的配置,可以响应或者拒绝主机的更新请求,初始化工作主要做了更新连接参数的相关规则,比如首次更新连接参数时间,第二次更新连接参数时间,最大协商更新连接参数次数。接着是发射功率设置,由于工业区周围环境非常复杂,干扰性很大,干扰会造成距离的大大的降低,所以我们采用了最大的发射功率为8db,空旷地带测试,传输距离可达400M,完全满足大部分客户的使用场景要求。接着是开启低速远距离广播模式,模式设为通用可发现模式。
蓝牙的大部分应用都是以服务的形式提供的,比如心率采集服务,血压采集服务,温湿度采集服务,每个服务都有一个唯一的128位UUID,UUID可以是蓝牙联盟定义的,也可以是芯片厂商定义的,还可以是个人定义的,以来区分服务的内容,以便接收方能正确的解析服务数据。
这点和can2.0B很相似,都是采用协议数据单元PDU。接着是广播初始化,广播模式设为快速广播,广播间隔设为100ms,注册广播超时回调函数,设置物理层的广播速度为1M,蓝牙协议规定,广播速度只能设为1M,但连接后传输速度可以设为2M。
3. 蓝牙建立过程
上图显示的是蓝牙建立连接的过程。
4. 蓝牙协议栈启动过程
上图显示的是蓝牙协议栈启动流程,本次代码工程框架使用的协议栈版本是FLASH_S140_NRF52_7.01_SOFTDEVICE.工程版本使用的是SDK17.0。
三、代码实现
下面开始介绍52840部分关键性的代码
1. 启动流程
芯片启动流程流程如下:
int main(void)
{
bool erase_bonds;
// Initialize.
uart_init();
log_init();
timers_init();
buttons_leds_init(&erase_bonds);
power_management_init();
ble_stack_init();
gap_params_init();
gatt_init();
services_init();
advertising_init();
conn_params_init();
sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_ADV,m_advertising.adv_handle,8);
// Start execution.
// printf("UART started.");
NRF_LOG_INFO("Debug logging for UART over RTT started.");
advertising_start();
nrf_gpio_cfg_input(6,NRF_GPIO_PIN_PULLUP);
// Enter main loop.
for (;;)
{
if(start_adv_flag == 0xa5)
{
start_adv_flag = 0x5a;
(void)sd_ble_gap_adv_stop(m_advertising.adv_handle);
nrf_uart_disable(NRF_UART0);
advertising_init();
advertising_start();
}
if(start_adv_flag == 0x5a)
{
idle_state_handle();
}
else
{
if(nrf_gpio_pin_read(6) == 1)
{
nrf_gpio_cfg_sense_input(6,NRF_GPIO_PIN_PULLUP,NRF_GPIO_PIN_SENSE_LOW);
sd_power_system_off();
}
}
}
}