一个简单的 Arduino 气象站的构建过程


先把气象站的 repo 悄咪咪扔在这: A simple Arduino Weather Station

瞎叨叨

一转眼,我那个小 Arduino 气象站(说白了其实就是个温湿度计)也已经运行了两个月了,反正天天在家上网课闲着也是闲着,写一下好了。

最开始我脑抽买来那个 Arduino 的开发套件盒开箱的时候我是崩溃的:

东西都TM认不全我TM玩个锤子啊woc(划掉)然后就扔在宿舍柜子上吃灰了。

然后万万没想到老师给了我一个机会让我去参加蓝桥杯(不说了学校配的那个CT107D我到现在都没怎么碰)

得,被迫重新拾起那本700多页的《C Primer Plus》硬着头皮往下啃。反正都开始啃C了,干脆把开发套件拿出来练手玩吧。

左翻右翻,翻出来个 ESP-8266 ,又翻出来个 DHT-11 ,还翻出来个 1602A LCD 。得,干脆做个能联网的小气象站好了。

理想很丰满,现实很骨感(悲)

ESP-8266 联网一切正常,但是我学艺不精不知道怎么把 DHT-11 的数据通过 ESP-8266 搞局域网广播。拉倒,做个离线的算了。

在网上扒了1个小时之后,我找到了一个十分适合我现有所有材料的气象站项目教程,顺着教程写呀写呀写,终于把 .ino 写完了,编译的时候却疯狂报错:

“我睁大了眼从一行行报错里只看出来五个字,缺少头文件!

1
2
3
#include <dht.h>
#include <LiquidCrystal.h>
//就是这俩头文件

我傻了,一边傻着想“大概是我库没装全吧?”一边打开了 Arduino 库管理器。一通操作猛如虎,所有的能搜到的 DHT-11 支持库都装上了总该不会说缺头文件了吧?事实证明,我错了。

继续报错!甚至连报错的内容都没变!

1
2
3
#include <dht.h>
#include <LiquidCrystal.h>
//还是这俩头文件

死寂,无边的死寂。
算了算了接着找吧。

终于,又3个小时——查了一大堆教程试了一大堆项目之后——我终于找到了最开始找到的那个教程的原始教程!也找到了一直报错的那俩头文件的支持库!
(这件事告诉我们,永远不要相信官方的支持库就一定是全的,比如。。。→ CentOS:您好,您要的上个世纪的包)

就在我高高兴兴跟着原版教程把 LCD 、DHT-11 、电位器啥的用跳线连好之后,通上电,乖乖巧巧坐在那等着 LCD 出数据呢,脑子一抽干脆去查查 DHT-11 的管脚定义好了。不查不知道,一查,翻车了。

TNND原版教程翻车了!

原版教程: DHT-11 的3号数据管脚连 Arduino 的数据口

管脚定义: DHT-11 的2号管脚是数据脚,3号管脚是空置

*注:此处所述 DHT-11 是有4个管脚的那种

感谢我脑子一抽查了管脚定义,不然我可能到现在都做不出来这个气象站(确信)

项目教程

接线教程:
中文 英文(全是语法错误)

项目地址:GitHub


以下是气象站源码,点这里下载那个该死的支持库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <dht.h>
#include <LiquidCrystal.h>

//led blink tutorial!
//Get more tutorials on --> --> -->
//"MIYMAKERS" https://miymakers.wordpress.com/
//上面是原版教程地址

#define dht_dpin A1 //no ; here. Set equal to channel sensor is on
//Arduino 数据口设定
dht DHT;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//1602A 与 Arduino 连接的数据口设定
void setup(){
;lcd.begin(16, 2); //LCD显示屏阵列(<列数>, <行数>);
lcd.print("TEMP HUMIDITY"); //设定第一行显示内容
Serial.begin(57600); //波特率设定
}
void loop(){
lcd.setCursor(0,3); //设定显示内容的起始字位置
DHT.read11(dht_dpin);

//lcd.print(abs(moisture));
//Serial.println(moisture);
lcd.print(round(DHT.temperature));
lcd.print((char)223); //增加了 1602A 对 ° 的显示支持
lcd.print("C "); //第一个数据的单位,此处为温度
lcd.print(round(DHT.humidity));
lcd.print("% "); //第二个数据的单位,此处为湿度
}