迷你气象站:踩过的各种坑

朝花夕拾——我打起前世所留电子模块的主意了。好像终于能够 接纳真实的自己之后,内心豁然开朗了,对这种(看似)超简单的编程活儿也不那么反感了——只要不去回想前尘往事。
“迷你气象站”这个主题老早就提上日程了,但从未动手实现;第一个目标定为温湿度计、气压计与数码屏幕的组合。踩了不少坑,下文记录。

result

原料如下:

  • 主控板(Arduino Uno)
  • 温湿度传感器(SHT31)
  • 气压传感器(BMP085、BMP280)
  • 数码屏(MAX7219驱动的八位数码)

一、又双叒超前规划了

在翻寻材料时,无意从角落里发现了个 WiFi 模块;我就岔开思路想,要是用这玩意做成网络时钟,兼顾气象站,岂不美哉?先试试它能不能用。
接入电脑,好像怎么也联络不上;我听说这个模块如果里面是 NodeMCU 固件,就可以做想要的功能,否则必须更换固件。但这模块(ESP-201)既不像正常的“ESP8266 开发板”,也不像专用于联网的板型;最关键是联络不上……扔了扔了。

二、手痒升级bootloader

诶,MiniCore 升级了,要不要刷一个?拿出从未拆封的刷机线动手了……
刷完了,它连灯都不闪一个,对Reset毫无反应……两小时过后,我悟到了:刷机线占据的SPI总线,跟我预先接好的数码屏打架……

三、Arduino只能下载一遍程序

在升级bootloader之时,我翻开《Arduino Cookbook》(2012年原作),结尾部分的“更换bootloader”关于所谓“熔丝位”的密码是lfuse:0xFF hfuse:0xD9 efuse:0xF4
写入时发现efuse老是跳回0xFC,嘛,我杜撰一个0xF8也可以吧?可以,写入了。🤔
之后这板子只响应头一回的上传请求,第二回就爱搭不理的……这不能吧,又得重刷bootloader?翻查类似问题的答案,发现就该按Arduino IDE boards.txt对于Uno的“熔丝位”推荐那样——

1
2
3
uno.bootloader.low_fuses=0xFF
uno.bootloader.high_fuses=0xDE
uno.bootloader.extended_fuses=0xFD

写入就好了。神奇。

四、BMP280好像挂了

根据串口(只为debug)的报告,开机后的准备过程卡在气压计模块上。记得BMP280模块只能接3.3V电源跟联络口(不会降压),但是看别人的实验只需接对电源,联络口直连Uno……我自行模仿未果。可能早就烧了吧?换一个。
BMP085(商品名:GY-65)看样子可以接入5V电源与联络口;很久很久以前,应该也用过一次,反正够用了。

五、电压不足

数码屏怎么动都不亮……量下电压罢:屏幕这端竟然只有0.14V。我手上好些杜邦线折的折、断的断,但都没扔就塞回材料箱。事后对线材做了全面排查🤨

六、数码屏的排列顺序

我以为数码屏最左边是第一位……🙈

七、运算符的优先级

数字的显示好像全乱了。一看发现,从intchar的转换应该放在最后,于是给算式加了一层括号(见下)。

八、从数字转换成字符串

我是想着用itoa()完事了……但这点有个坏处,如果气温是 -0.9℃,那屏幕势必会打出-.9出来;而且要在把字符串推送到屏幕的过程中,硬插个零进去。这道题我不会解。
最后专门写了个“提取某一位数”的段子:

1
2
3
4
5
char takeDigit(int src,uint8_t pos){
int factor[] = {1,10,100,1000,10000};
char ascii=48;
return (char)((src/factor[pos])%factor[1])+ascii;
}

九、气压精度似乎不大够

因为气温要占据半个屏幕(四个数码位),且始终输出,留给气压的位置只有另四个数码位。气压以帕(Pa)计的话可达六位!怎么办呢?
一般而言,应该截取到百帕(hPa)以上,例如 100865 Pa 显示为100.8。但这样不太爽,我希望目睹台风眼或者冷空气路过时,气压的剧烈波动(基本上,最强的台风跟最强的冷空气,相差不超过 100 百帕);于是决定舍弃十万位与万位,就成了08.65。这样很好,基本的精度有了。

十、收获快乐了吗?

没有。我干任何事情,都过分注重于结果,而未能享受过程——只要不是立竿见影的事,我的兴致会逐渐消退,转瞬即逝。此事同理,中间坎坷过多,即便达到预期,也没快乐起来,只觉长舒一口气。

我最大的缺陷莫过于此——对常人而言“简单”的快乐,于我却无法感知,甚至嗤之以鼻。多结识些志同道合的朋友,也许就好了吧?