立创&涂鸦训练营第二期--物联网温湿度传感器
基于涂鸦智能的小温湿度传感器,自动采集当前温湿度数据,并通过STM32 & wifi模块上传至云端,送至APP端显示
主要内容
整体介绍
- 本次工程是一个基于涂鸦智能的温湿度传感器,采用低代码 MCU 方案,SHT20负责采集温湿度,涂鸦物联网模块与STM32F0单片机结合使用,实现温湿度数据的采集和上报,并将数据可视化。
- 传感器可以由两块PCB构成,通过排针排母及四颗固定柱连接,整体尺寸:56mm* 44mm*15mm。下层板包含了传感器所需的各种电路,上层是一块OLED模块。
- 供电上,可以使用3.7V锂电池或者Type-C接口供电,当两者同时接入时,默认采用USB供电,右下角按键用来实现一键开关机功能。
- OLED接口为IIC通信接口,可以在OLED上显示当前的温湿度和其他内容,OLED也可以通过右上方按键控制是否开启显示。
部分电路
-
电源:
-
首先是电源的输入来源:USB接口或者单节锂离子电池(3.7V输入)
两种电源都是最常见的电源来源,为了更好的管理两者,在电源的输入端使用了锂电池和USB自动切换电路,它由一个PMOS管,肖特基二极管和电阻构成,可以做到:
USB和电池同时接入时,切断电池供电
USB断开时,切回到电池供电
原理图连接如下
首先,需要注意的是PMOS管的方向,电池电源的流入方向确实是从D(漏极)→S(源极),它利用了PMOS的体二极管。
- 当只有USB供电时,PMOS关闭,VBUS 经过肖特基二极管后供给后续电路,由于肖特基二极管压降较低,实测大概0.26V,所以VCC得到的电压在4.8V左右。
- 当锂电池单独供电时,R4 将 G(栅极)电压下拉到 0V,PMOS 导通,VBAT 流过MOS后供给后部电路,由于MOS内阻很小,所以只有很小的电压损耗,实测只有0.005V,故 VCC ≈ VBAT 。
- 当两者同时接入时,VBUS 流过 D3 ,VCC 在4.8V左右,而 PMOS 的栅极 电压为VBUS = 5V,PMOS 截止,而且VCC(4.8V) > VBAT ,故电池是被切断的。
- 如果将 PMOS 方向旋转,VBAT 由 S → D ,那么当两者同时接入时,USB 电流会流入锂电池,出现问题。
- 当两者同时接入时,如果突然拔掉USB,由于后续电路有电容会存储一定的电荷,故不会出现整体先断电在上电的情况,而是中途不掉电,直接切换的效果
-
一键开关机电路:借助于开关机电路,可以通过右下方的轻触按键实现一键开关机,长按两秒后开机,开机后再按一下则关机。
原理图如下
- 不使用时,PMOS关闭,不会有电源流入
- 当按下按键时,PMOS 栅极 通过按键下拉到地,PMOS导通,电源流入,整体电路上电,此时,需要在初始化程序中拉高 PWR_ON 引脚电压,三极管导通,MOS栅极拉低,这样,即使松开按键,电路也会一直导通了。
- 需要关机功能,则将 PWR_DOWN 引脚设置为输入检测,当再次按下按键时, PWR_DOWN 引脚检测到低电平,则程序控制 PWR_ON 引脚输出低电平,三极管截止,PMOS再次关断,实现关机功能。
- LDO降压电路:电源流入后,经过一路LDO电路降压到3.3V后供给整个系统使用,为了保护电路,添加了PTC以及两个TVS二极管,整体需求的电流峰值在200mA左右,平均正常工作电流100mA。
- wifi模块:采用涂鸦智能的 WB3S 模块,通过串口和STM32通讯,将 1 脚拉高,焊接 R6 ,R2 悬空即可,为了满足瞬时的大电流需求,可以在VDD端可以多加一个电容。
- STM32系统:本次使用的单片机型号为STM32F030F4P6,M0内核,TSSOP-20封装,小体积,负责处理SHT20传感器的数据,控制OLED显示,通过串口与WB3S通信等,包含了复位,晶振,SWD接口等电路,并充分地使用了它的所有引脚.
- SHT20: 温湿度传感器,IIC通讯,故两个上拉电阻是必须的,为减少PCB本身的干扰,芯片周围挖槽。
- OLED模块:模块电路较为简单,包含一路LDO电路以及必要的阻容元件,使用IIC和STM32通讯,供电电压可使用5V或3.3V。
- 按键:共包含3个侧贴按键,空间占用少而且按压方便,下方SW3控制整体的开关,上方SW1为配网按键,SW2则控制着OLED的显示情况,默认开启,再次按压关闭显示。
- 按键并联一个电容,实现简单的硬件消抖,
程序部分
- 官方文档教程请看文档教程
- 官方视频教程请看MCU SDK 移植
- 这次的程序思路较为清晰,创建F0工程后,按照教程将从涂鸦下载的MCU SDK移植到工程中,然后添加SHT20驱动,OLED驱动,按键程序以及控制开关机的程序。
- STM32 将各个模块初始化后,开机,进入while(1),利用按键触发配网,配网成功后,用SHT20采集数据,并将采集的数据上报,核心的程序为
// SDK函数
wifi_uart_service();
// 温湿度采集
temp=SHT2x_GetTempPoll();//获取SHT20 温度
Humi=SHT2x_GetHumiPoll();//获取SHT20 湿度
// 温湿度上报
mcu_dp_value_update(1,(long)temp*10); //温度数据上报,采集的 float 数据转换为 long;
mcu_dp_value_update(2,(long)Humi); //湿度数据上报,float 转换为 long ;
// 温湿度OLED显示
OLED_WS_DIS(temp,Humi);
注意事项
- 我手中的是micro usb接口,现在的图中已经改为了Type-C接口。
- 板子整体平均电流在100mA,峰值电流在200mA,所以选择LDO时,需要选择最大输出超过300mA的型号。
- 使用锂电池供电时,由于板子本身没有电池管理芯片,所以要选择带有放电保护板的锂电池,而且电池不宜长期使用,当电压不足时,应该及时充电。
- 关于OLED显示模块,使用常见的即可,这里使用的是技新的模块,本来计划做一块和下板相同尺寸的OLED模块,使用1.3寸OLED,但是种种原因,放弃使用。
- 程序上,有几处需要注意的地方,例如,如果使用定时器,要注意串口和定时器的中断优先级,移植SDK时的串口发送函数是用的单字节函数等等,需要留心。
void USART1_SendByte(unsigned char data)//单字节发送函数
{
while((USART1->ISR & USART_FLAG_TXE) != USART_FLAG_TXE);
USART1->TDR = data;
}
实际效果