超声波气象站搭建指南

本文将展示如何基于涂鸦智能平台搭建一个属于自己的超声波气象站!
超声波气象站的测量维度包括:
- 温度测量(dht22)
- 湿度测量(dht22)
- 气压测量(bmp180)
- 风向、风速测量(防水超声波测距模组)
- 紫外线等级测量(cjmcu-guva-s12sd)
- pm2.5测量(gp2y1014au)
也就是六个维度的气象信息的测量!
气象站采用esp32作为主控,使用arduino平台进行开发,开发ide为visual studio code + platform io。
物联网通讯方面使用涂鸦wbr3模组,使用低代码mcu开发形式。控制界面(app)使用涂鸦的客制化面板。
q1: 什么是超声波气象站?
a1: 超声波气象站是利用超声波模组对声速进行测量的一种气象站。由于风速会引起声速的变化:超声波顺风传播时,声速会加快;逆风时风速将减慢;通过测量一组正交的声速矢量,进行合成分析后可以分析出当前的风速、风向信息。
q2: 超声波气象站有什么优点?
a2: 传统的气象站对于风向和风速的测量通常使用风向仪和风速仪,这两种仪器都具有转动的机械结构,体积庞大、寿命较短。使用超声波对风速、风向测量可以压缩气象站体积、提高气象站寿命。
q3: 为什么选择涂鸦平台?
a3: 涂鸦平台的开发比较省事。在mcu低代码开发的方式中,可以通过网页实现对app的设计,而且一些常用的组件也非常精美。
系统框架如何利用超声波对风速进行测量
超声波探头布置如图所示,两组探头互相垂直分布。
- 此时若a组探头间距离s已知,声速c已知,且此时风速为0。则此时超声波的行进速度t为声速,可算出无风时超声波从发射探头移动到接收探头的时间t1=s/c。
- 若此时存在风向为发射探头指向接收探头,风速为1m/s的风,则超声波行进速度变为c+1m/s,同样可以算出该情况下超声波从发射探头移动到接收探头的时间t2=s/(c+1)。
在距离已知、声速已知的情况下,通过获取超声波模块返回的超声波行进时间t2,可以推算出a组探头方向的风速v1=(s / t2) - (s / t1)。同理可推算出b组探头方向的风速v2。
由于a、b组探头垂直分布,故当存在任意方向、任意大小的风时,可通过矢量合成的方法计算出风速和风向。
模块及驱动dht22
dht22使用dht-sensor-library进行驱动,详细方法参考github页面,使用该库需要依赖adafruit unified sensor driver库。
dht dht(dht_pin, dht_type);float h = dht.readhumidity();float t = dht.readtemperature(); if(isnan(h) || isnan(t)){ serial.println(failed to read from dht sensor.); return;} 
此处h获取值为湿度,t获取值为温度。
bmp180
bmp180使用adafruit bmp085 library驱动,同上,需要依赖adafruit brushio库。
adafruit_bmp085 bmp;air_pressure = bmp.readpressure() 
超声波模组
// clears the trigpin conditiondigitalwrite(trig_1, low);delaymicroseconds(2);// sets the trigpin high (active) for 10 microsecondsdigitalwrite(trig_1, high);delaymicroseconds(20);digitalwrite(trig_1, low);// reads the echopin, returns the sound wave travel time in microsecondsduration = pulsein(echo_1, high); 
超声波模组使用脉冲测量获取反射时间,代码如上。后续通过布置探头位置,分析两组超声波模组的反射时间可获得风速、风向信息。
cjmcu-guva-s12sd紫外线模组
该紫外线模组输出为电压模拟量,analogread()函数可以实现紫外线等级的测量。
gp2y1014au pm2.5模组
digitalwrite(dust_in, low);delaymicroseconds(sampling_time);int vomeasured = analogread(dust_out);​delaymicroseconds(delta_time);digitalwrite(dust_in, high);通过给模组的led驱动脚施加脉冲,测量输出脚电压,可以实现对pm2.5的浓度测量。
涂鸦智能接入这次的开发方式为mcu低代码开发,即是利用涂鸦模组进行开发。涂鸦模组负责物联网信息处理,mcu仅需要通过串口控制涂鸦模组进行物联网信息的通讯。
创建产品在进行涂鸦智能的开发时,需要进行产品创建。作为气象站开发,可以选择温湿度传感器。
dp点创建在涂鸦智能中,每个气象数据维度可以被抽象为dp(功能点)。在选择了温湿度传感器这个产品后,涂鸦提供了常用的功能点:
dp id
功能点名称
标识符
数据传输类型
数据类型
功能点属性
1
温度
temp_current
只上报(ro)
数值型(value)
数值范围: -200-600, 间距: 1, 倍数: 1, 单位: ℃
2
湿度
humidity_value
只上报(ro)
数值型(value)
数值范围: 0-100, 间距: 1, 倍数: 0, 单位: %
4
电池电量
battery_percentage
只上报(ro)
数值型(value)
数值范围: 0-100, 间距: 1, 倍数: 0, 单位: %
除了这些标准功能中的dp点之外,因为我们还需要风速、风向这些数据,所以还需要添加自定义的dp点:
dp id
功能点名称
标识符
数据传输类型
数据类型
功能点属性
101
pm2.5浓度
pm25
只上报(ro)
数值型(value)
数值范围: 0-100, 间距: 1, 倍数: 0, 单位:
102
风向角
wind_value
只上报(ro)
数值型(value)
数值范围: 0-364, 间距: 1, 倍数: 1, 单位:
103
风向
wind_direction
只上报(ro)
字符型(string)
104
风速
wind_speed
只上报(ro)
数值型(value)
数值范围: 0-100, 间距: 1, 倍数: 1, 单位:
105
紫外线等级
uv_level
只上报(ro)
数值型(value)
数值范围: 0-10, 间距: 1, 倍数: 0, 单位:
106
气压
pressure
只上报(ro)
数值型(value)
数值范围: 0-1999, 间距: 1, 倍数: 0, 单位: hpa
在功能点中,dp id为该功能点的标识,mcu在控制涂鸦模组进行数据上传时需要用到。
功能点属性中的倍数为0时,mcu上传的数据被识别为上传的数据本身。若倍数为1,则此时若上传数据为50时,该数据将被涂鸦除以10^1,即50会被识别为5。
面板编辑在产品开发的面板选项卡,可以对自己的app面板进行自定义。
我使用的面板类型为:面板类型:studio 面板-个人面板
下面是在手机中的实机效果:
硬件开发在完成了传感器驱动、电源板管理后,需要与涂鸦模组进行通讯,实现信息上报。
在这里我选择的是wbr3 wi-fi & bluetooth 模组。
该模组在初次上电时,可以打开智能生活app实现配网和面板加载,在完成了配网之后就可以进行实时开发了。
// define dp#define temp_pid   1#define humi_pid   2#define battery_pid 4#define pm25_pid       101#define wind_angle_pid 102#define wind_direct_pid 103#define wind_speed_pid 104#define uv_level_pid   105#define pressure_pid   106​// create tuyawifi objecttuyawifi my_device;​// input your device pid hereunsigned char pid[] = {};// select mcu version, 1.0.0 as commonly useunsigned char mcu_ver[] = {1.0.0};​// create an array to restore the datapoint unsigned char dp_array[][2] = { {temp_pid, dp_type_value}, {humi_pid, dp_type_value}, {battery_pid, dp_type_value}, {pm25_pid, dp_type_value}, {wind_angle_pid, dp_type_value}, {wind_direct_pid, dp_type_string}, {wind_speed_pid, dp_type_value}, {uv_level_pid, dp_type_value}, {pressure_pid, dp_type_value},};​unsigned char dp_process(unsigned char dpid,const unsigned char value[], unsigned short length){  /* all dp only report */  return ty_success;}​void dp_update_all(void){  }​void setup(){   ...    my_device.init(pid, mcu_ver); my_device.set_dp_cmd_total(dp_array, 9);    // register call back function my_device.dp_process_func_register(dp_process); my_device.dp_update_all_func_register(dp_update_all);}​void loop() {    // sdk handle my_device.uart_service();    // check the wifi connection if ((my_device.mcu_get_wifi_work_state() == wifi_connected) || (my_device.mcu_get_wifi_work_state() == wifi_conn_cloud)) {    update_sensor();        // report all the data        my_device.mcu_dp_update(temp_pid, temp, 1);        my_device.mcu_dp_update(humi_pid, humi, 1);        my_device.mcu_dp_update(battery_pid, battery_level, 1);        my_device.mcu_dp_update(pm25_pid, pm25, 1);        my_device.mcu_dp_update(wind_angle_pid, wind_angle, 1);        my_device.mcu_dp_update(wind_speed_pid, wind_speed, (sizeof(dp_string_value) / sizeof(dp_string_value[0])));        my_device.mcu_dp_update(wind_speed_pid, wind_speed, 1);        my_device.mcu_dp_update(uv_level_pid, uv_index, 1);        my_device.mcu_dp_update(pressure_pid, air_pressure, 1); } ...mcu工作流程
通孔回流焊工艺在PCB组装中起到的作用
新一代USB 3.0界面保护电路设计方案
揭秘整车环境舱:汽车科技的未来实验室
如何提高自己的编程水平
德州仪器科学委员会院士Larry J. Hornbeck博士荣获奥斯卡奖
超声波气象站搭建指南
Xilinx ZYNQ UltraScale+系列产品介绍
vivoX20和小米MIX2对比评测,全面屏哪个值得买?
高智能土壤养分快速检测仪是什么
用事实说话: USSD速度是否真的能达到固态硬盘级别?
频谱分析仪测试前的准备-安泰频谱仪维修
你了解背景谐波吗?
强强联合 | 2018中国硬件创新大赛+名堂共享空间
SPI接口之间数据传输中故障分析
5W白光LED灯电路设计
百度大脑语音能力引擎每天调用超百亿!
开关三极管的使用和连接 浅谈开关三极管的使用
科学家创造新型太阳能液流电池,可在设备采集和存储可再生能源
基于Zynq的PMSM驱动控制系统设计
Schaevitz传感器原理及应用