基于ESP8266和DHT22的迷你气象站

本文并非第一次发表,仅为旧版本两篇文章的合并恢复。

本来是想发一篇关于Blockchain的文章,因为最近区块链好像很火,但是从网上找来的教程都比较详细,自己动手用Python写一个也不是太难,所以以后有机会再写。

那么今天我们就来玩一些硬核一点的东西,尝试用ESP8266来搭建一个迷你气象站。(萌新之作,大佬们轻喷。)

先放一张成品图镇文章:

准备阶段

笼统地介绍一下ESP8266,你可以把它看作一个带有Wi-Fi功能的开发板,可以通过编程控制链接至引脚的模块。因为它允许开发者很方便地利用微控制器通过海斯命令集使用TCP / IP协议栈连接到Wi-Fi网络,所以在几年前引起了很多人的关注。而且某宝上十几元包邮的价格让他更加诱人。对于我这样的萌新来说,这是非常棒的选择,Arduino的社区以及为ESP8266写了很多现成的很棒的库,因此你根本不会接触到有关寄存器、电平、位运算的概念就可以写一些程序。

在此整个实验之前你需要有以下基础和工具:

  1. ESP8266开发板(我购买的是NodeMCU版本)
  2. 一根Micro-USB数据线
  3. DHT12(强烈建议选择同类替代品,比如DHT22)
  4. 0.96” OLED(可选)
  5. 母对母杜邦线若干
  6. Arduino软件
  7. 注册ThingSpeak账号
  8. 申请OpenWeather的API
  9. 一点点Arduino编程基础(稍微懂点C或者Java之类的语言即可)
  10. 脑子

其实有点后悔选择DHT12,因为它的温度检测范围只有0~50°C,你在选购的时候可以选择其他更好的传感器,DHT12在北京这边的冬天可能就不行了(我怀疑整个板子都不行了哈哈),而且DHT12在一开始出现了一点问题,稍后我会说明。ESP8266板子还是比较常用的,支持IEEE 802.11 b / g / n Wi-Fi,所以我们可以实时把数据上传到互联网上,而供电的话你只需要标准USB供电,接口是Micro-USB。这一套下来大约50软妹币,当然,你可以不选购OLED屏幕,只不过没有显示天气预报的功能而已。

当你一切准备妥当之后,让我们开始吧。

配置Arduino

现在你需要打开Arduino软件,我们需要让它支持ESP8266,请遵循下面的步骤:

  1. 点开文件-首选项-附加开发板管理器网址,输入:http://arduino.esp8266.com/stable/package_esp8266com_index.json,然后重启软件。

  2. 点开工具-开发板-开发板管理器,搜索ESP8266,并安装它。

  3. 点开工具-管理库,请搜索并安装以下包:

    • ThingSpeak
    • Json Streaming Parser
    • ESP8266 Weather Station
    • ESP8266 and ESP32 Oled Driver for SSD1306 display
    • DHT sensor library
      需要注意的是,这些名称就是包的名称,如果有多条搜索结果,请按照我给的名字安装,有的包可能依赖于其他包,Arduino提示的时候一并安装即可。
  4. 点开工具-开发板,选择NodeMCU 1.0那一项。

连接引脚

这一步我们利用母对母杜邦线进行连接,3V3、GND任选板子上的连即可,千万别把这俩接反,否则板子会瞬间升温,甚至损坏(别问我是怎么知道的)。

DHT12:

DHT12 ESP8266
+ 3V3
SDA D4
- GND
SCL GND

OLED:

OLED ESP8266
VCC 3V3
GND GND
SCL D2
SDA D1

这样的话就差不多了,请多次检查,不要连错。

上传程序

我稍后会上传源码到名为ESP8266_MiniWeatherStation的GitHub仓库上,你可以直接下载。

下载完成后用Arduino打开WeatherStation.ino文件,你需要修改以下几个值:

  • 修改WIFI_SSID的值为你的Wi-Fi名称
  • 修改WIFI_PWD的值为你的Wi-Fi密码
  • 修改myChannelNumber的值为你的ThingSpeak频道号码
  • 修改myWriteAPIKey的值为你的ThingSpeak频道Write API Key
  • 修改OPEN_WEATHER_MAP_APP_ID的值为OpenWeather的API Key
  • 修改OPEN_WEATHER_MAP_LOCATION_ID的值为OpenWeather的你所在城市的位置编号

修改完后,连接板子到电脑上,你通常可以在工具-端口的菜单中找到唯一一个COM开头的选项,选择它。如果有多个选项,请在设备管理器中找到正确的端口号。如果没有驱动的话,搜索下载安装即可。

之后直接点击Arduino的上传图标(一个向右的箭头),等待写入完成之后就自动运行了,以后你每次上电都会自动开始运行。当然,你也可以点开工具-串口监视器,选择正确的端口和波特率就可以查看调试输出(这里是115200)。如果你不想继续探索,那么教程就到此结束,你应该可以看到这样的效果:

继续探索

你可以选择其他GPIO引脚进行连接,但是你要注意的是,NodeMCU的板子的引脚编号和你Arduino的引脚编号不是一一对应的,你需要在ESP8266的Arduino文档中查看。比如我们这里连接的是D4,但是由于它对应的是2,所以我们仍然定义:#define DHTPIN 2

你还可以更改上传到ThingSpeak和更新天气预报的频率,只需要修改源码开头的变量即可,我们以秒为单位(后面会用1000L去乘)。

我暂时还没找到怎么连接校园Wi-Fi的方案,直接连接然后POST登录凭证似乎并没有效果T_T。

写在最后

我们还能给这个板子加更多有趣的模块,当然也可以选择更棒、接口更多的板子,在这个过程之中是有无限的乐趣的。你也可以做出属于自己的物联网设备。这篇文章是我从一开始了解ESP8266到做出成品只花了2天的时间写的,虽然可能存在一些错误,欢迎大家指正,但也足以看出对于新手来说Arduino编程的简单和高效。希望读者可以继续探索。

更新

最近把DHT12换成了DHT22,本来DHT12谜之湿度读数已经让我开始怀疑它的准确性了,结果看到网上对这个传感器有很多诟病,于是就买了一个DHT22。经过测试,DHT22的温度和DHT12的温度差值在2℃内,但是湿度可以差到大约50%,这个就很吓人了,DHT12湿度一直显示94%。

程序稍微修改了一下,列个new features:

  • 支持登录校园网(仅限于BUPT)。
  • 右下角本地天气预报温度显示改为实时传感器温湿度动态切换显示。
  • 授时服务器改用阿里云服务器。
  • 默认使用DHT22传感器。
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 许可协议。转载需要标明作者,并以超链接的方式指向原文。
  • Copyrights © 2020 Kevin Li
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~