找回密码
 立即注册
搜索
查看: 475|回复: 8

【教程】低成本自建微型自动站

[复制链接]

1

主题

3

回帖

118

积分

热带低压

积分
118
发表于 2024-12-31 23:36 | 显示全部楼层 |阅读模式
本帖最后由 cnloong 于 2025-1-27 16:35 编辑


第一部分 简略介绍及前期准备


先上成品图




基于ESP32和micro python的微型自动站项目简介
做得比较简陋,(风速计就简单固定了一下扛不住大风的,不过电线可以延长,实际安装时可使用螺丝固定安装)
目前监测的要素为温湿压+风速共4要素(风向一般看附近自动站就好),数据精度高(气压测量分辨率最高可达0.9帕斯卡,温湿度均可精确到小数点后两位,风速是标准精度0.1m/s)
后续可能会新增光照、雨量、卫星定位等模块
全套(不含服务器)的成本200左右,加上光照和标准雨量筒成本500左右
采集部分使用接线盒完全避免了雨水影响,可以太阳能发电(最高15W)
数据收集上传均由ESP32单片机完成,服务器负责处理数据,数据上传、收集间隔可自定义,数据上传到位于广州的服务器,目前上传间隔严格保持在30秒一次,各要素采集1秒1次。

数据展示


跟1km外的国家站数据对比


自己捏一个自动站还是比较费时间的,相关嵌入式开发、PCB设计、锡焊等知识和技能跟我们目前专业比较契合,所以也是跟兴趣结合起来了,如果单纯想要建站就自己买一个一体式的就好,我所做的只不过是在发展兴趣之余学习相关知识。

一、ESP32环境搭建
使用器材:一台电脑、一块ESP-WROOM-32单片机、一条合适的数据线(不是充电线!)


可参考:https://www.bilibili.com/video/BV1G34y1E7tE 进行配置(后面的视频也可以学学,熟悉一下操作)
注意:我当前使用的ESP32 芯片为CP2102,有一些芯片是CH340,操作上可能会有点差别。
PS:最近又买了CH340的做了下比较,烧录程序啥的操作没什么差异,不过不知道为何CH340收到软重启指令后会拒绝访问,CP2102无此问题。
(2025.1.24修改)

配置步骤:
1.将ESP32与电脑连接,打开Thonny配置解释器。



2.选择解释器和端口
在打开配置解释器窗口之后,按图示选项根据实际情况选择端口,成功后点击右下角“安装或更新 MicroPython”选项。

注意:在打开配置解释器窗口时若找不到设备(UART Bridge COM X之类的),请检查驱动是否正确安装(相关程序可参考上面视频链接),以及使用的是否数据线。

3.烧录MicroPython固件

确认相关选项符合当前设备后,点击安装,等待2分钟左右即可完成。
完成后点击软件上方的”STOP“键即可完成ESP32的初始化,在左侧文件栏可以看见有boot.py出现,至此即为固件成功烧录。

如果没有出现文件栏,可以在上方工具栏找到”视图“,勾选文件就能看到了。
这样就算搭建好环境了,可以试试写个程序连一下自家WIFI测试一下。

二、程序烧录
1.要让ESP32运行程序,就要把程序放到里面,此过程称为“烧录”。

在配置完解释器之后,界面如图所示,将在左侧文件栏的“MicroPython设备”里出现一个boot.py

boot.py是用来初始化的ESP32的,所以不建议在里面写主要的程序以及死循环等。
下面代码为连接WIFI所使用的初始化代码:
boot.py
  1. import network
  2. import time
  3. from machine import Pin, I2C, UART

  4. # 创建STA模式的WiFi对象 STA模式指该设备要连接其他WIFI 另一个模式叫AP,可以理解成手机热点
  5. wlan = network.WLAN(network.STA_IF)  
  6. wlan.active(False)
  7. wlan.active(True) # 防止软重启时报错
  8. led = Pin(2, Pin.OUT)
  9. # 要尝试连接的WiFi列表
  10. wifi_list = [
  11.     ('AAAA', '12345678'),  # WiFi名称和密码
  12.     ('BBBB', '1145141919810'),
  13.     ('CCCC', '')  # 开放的WIFI,没有密码
  14. ]

  15. # 尝试连接每个WiFi网络
  16. for ssid, password in wifi_list:
  17.     print(f'正在连接{ssid}')  # 打印正在尝试连接的WiFi名称
  18.     try:
  19.         wlan.connect(ssid, password)  # 尝试连接到指定的WiFi
  20.     except:
  21.         pass
  22.     for _ in range(3):  # 最多尝试连接3次
  23.         if wlan.isconnected():  # 检查是否已连接
  24.             print(f'已连接{ssid}')
  25.             # print(wlan.ifconfig())  # 可选打印网络调试信息(IP)
  26.             break
  27.         time.sleep(1)
  28.     else:
  29.         print(f'尝试连接{ssid}失败')

  30.     # 指示灯:连接成功常亮2秒
  31.     if wlan.isconnected():
  32.         led.on()
  33.         time.sleep(2)
  34.         led.off()
  35.         break
  36. else:
  37.     print('列表中的WIFI均无法连接。')
  38.     for _ in range(5):  # 快速闪烁LED灯5次
  39.         led.on()
  40.         time.sleep(0.2)
  41.         led.off()
  42. #     machine.reset()  # 可选重启
复制代码
复制到Thonny后,根据自己要连接的的WiFi账号密码更改代码,完成后按F5即可保存并运行,若在控制台看到成功且LED亮起2秒即正常。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

1

主题

3

回帖

118

积分

热带低压

积分
118
 楼主| 发表于 2025-1-3 22:13 | 显示全部楼层
本帖最后由 cnloong 于 2025-2-3 14:22 编辑

第二部分 各类传感器的介绍和使用
一、RS485型设备
概述:
    RS485总线是一种电气标准,主要用于远距离及高速的串行通信。一条总线上可以连接多个设备。RS485总线为半双工工作方式,即在通信过程中,同一时刻只能有一个设备发送数据。其网络拓扑一般采用终端匹配的总线型结构,不支持环形或星型网络。    RS485总线的工作原理主要基于差分信号传输技术。在发送端,数据信号被转换为差分信号,通过两根差分线(A线和B线)进行传输。
    RS485总线的通讯距离可以达到1200米,但在实际应用中,通常实际的稳定通讯距离往往达不到1200米(怎么想都不会拉条一公里长的电线连接仪器吧,都够绕标准观测场10圈了)。
    RS485总线采用两线制接线方式,这种接线方式为总线式拓扑结构,在同一总线上一般最多可以挂接32个结点。
    ESP32不能与RS485设备直接通信,二者要通信需要将RS485信号转换为TTL,两种信号的电气特性和通信协议均不同,如果直接把RS485的线连在单片机上是无法获取数据的,甚至可能导致单片机损毁,这是因为RS485高电平表示为两线压差+2~+6V,低电平表示为-2~-6V。信号转换可以利用TTL转RS485模块完成。(参考电路及模块实体图如下)


自建站使用RS485的设备为:风速计、360°风向计、翻斗式雨量筒。
如果想在电脑上调试设备或者修改RS485设备参数(如地址、波特率),需要购买USB转RS485的模块(如下图)。


附测试用软件:


RS485线路连接:
在上面的概述中,提到了RS485的特性,即可以同时连接多个设备,下面的示意图即为ESP32与多个RS485设备的接线图。
如果想要在电脑上调试,接线也是大同小异,A接A,B接B就好。



1.风速计
(1)基本参数:高160mm,三风杯转动半径91mm,量程0-70m/s,精度0.1m/s,启动风速0.1m/s,10-30V直流供电,误差0.2+0.03V(V=风速),塑料外壳。实际外观参数以实物为准。
(2)数据读取:
    步骤:发送问询帧→等待设备返回数据→接收数据→读取处理数据


    ①发送问询帧
   
问询帧结构如上。

其中CRC校验码计算可以访问(外链)CRC计算网站
此处使用上面图中参数为例,算出0A 84,由于低位在前,故先发送84,再发送0A。

    ②接收应答帧

    ③处理数据
上述步骤可以使用如下代码实现:
  1. from machine import UART
  2. import time
  3. # UART初始化,选择UART2,因为UART0和UART1通常用于系统调试或与其他功能冲突
  4. uart= UART(2, baudrate=4800, bits=8, parity=None, rx=22,tx=23, stop=1, timeout=100)
  5. # 配置了波特率为4800,数据位数为8位,无校验位,接收引脚22,发送引脚23,停止位1位,超时时间100ms。
  6. # 引脚号根据自己所连接的实际线路更改,GPIO12不建议使用,否则可能出现单片机无法启动
  7. barray = bytearray([0x01,0x03,0x00,0x00,0x00,0x01,0x84,0x0A])  # 问询帧

  8. while True:
  9.     uart.write(barray)
  10.     time.sleep(1)
  11.     if(uart.any()):
  12.       u2by=uart.read()  # 返回的是应答帧的内容
  13.       data_fs=u2by
  14.       print(data_fs)
  15.       fs10 = int.from_bytes(data_fs[3:5],'big')  # 风速数据位于第4-5字节处
  16.       fs=fs10/10   # 实际值的10倍,要除以10
  17.       print(fs,"m/s")
复制代码
如果成功运行,可以在Shell看到相关数据,同时485转TTL模块的TX\RX对应LED灯都会闪烁。

此时风速计的数据就读取成功了。


2.风向仪

  风向仪的数据读取与风速计相似,假设其地址为02,问询帧结构相同,即为0x02, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x38。注意此处数据长度应取2,否则可能出现错误数据。
可使用如下代码调试。
  1. from machine import UART
  2. import time
  3. uart= UART(2, baudrate=9600, bits=8, parity=None, rx=22,tx=23, stop=1, timeout=100)
  4. barray = bytearray([0x02, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x38])
  5. uart.write(barray)
  6. time.sleep(0.2)
  7. if(uart.any()):
  8.   dat=uart.read()  # 答应帧
  9.   print(dat.hex())
复制代码
打印结果为:0203040cc001464a3d
其中第6-7字节为风向数据,146(HEX)=326(DEC),即风向为326°.
  1. #转换为十进制度数
  2. dat = uart.read()
  3. windd = int.from_bytes(dat[5:7], 'big')
复制代码
此时风向仪的数据就读取成功了。
其他类型的RS485风向仪(如8方向、16方向)的数据读取大同小异,具体参考仪器手册或说明书。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

10

主题

360

回帖

971

积分

热带风暴

积分
971
发表于 2025-1-5 15:54 | 显示全部楼层
前排支持
我这边自建自动站的时候本来也是想要采用ESP32+MicroPython方案的,但是嵌入式这块不熟(捂脸)最后用了香橙派+Python方案
期待楼主成品

6

主题

45

回帖

313

积分

热带低压

积分
313
QQ
发表于 2025-1-11 20:58 | 显示全部楼层
期待楼主的大作能够呈现!
气象流转,心随风云变幻

1

主题

3

回帖

118

积分

热带低压

积分
118
 楼主| 发表于 2025-1-27 21:21 | 显示全部楼层
预留1

1

主题

3

回帖

118

积分

热带低压

积分
118
 楼主| 发表于 2025-1-27 21:22 | 显示全部楼层
预留2

1

主题

54

回帖

451

积分

热带低压-GW

积分
451
发表于 2025-1-27 21:26 | 显示全部楼层
前排支持

2

主题

226

回帖

851

积分

热带风暴

积分
851
发表于 2025-1-27 22:22 | 显示全部楼层
前排支持,期待楼主大作!
算是半个数据党吧

26

主题

3270

回帖

4480

积分

台风

上海地区气象爱好者

积分
4480
发表于 2025-1-27 23:23 | 显示全部楼层
这是要人手一座自动站的节奏啊(doge)

支持!!!
破阵子·五月二十日望洋兴叹
学前聊观数值,全球各洋多旋。去年今日玛娃生,巅峰顶超撼风迷。曾想八六八。
而今极阔西太,惟有云团孱弱。风切遍洋皆死路,黑潮暖水何朝用?静待主风季。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|TY_Board论坛

GMT+8, 2025-2-6 03:09 , Processed in 0.044446 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表