Arduino上的气象站,从A到Z。第3部分

待续。 上一部分


目录:



中央单元。 软体类


最后,我们进入了任何程序员最困难的部分-用人类的术语描述他在这里所做的事情。


服务器的源代码大约有1300行,包括缩进,但这不应吓到您。 在源文本中提供了详细的注释,在这方面,如果我说我的源描述比您只能找到的其他任何源都更好,我不会误会。 在源代码中的注释中,您将找到用于连接模块的所有引脚以及与外部文档的所有必要链接。 秘诀很简单-我在游戏过程中不断为自己写评论,因此我在编写文档时没有遇到任何困难。


正如我已经写过的,您无需手头所有模块就可以开始。 例如,您可以在没有无线电模块或ESP8266的情况下启动。 BMP180气压传感器也可能丢失。 稍后添加。 的确,在这种情况下,您(可能)必须在草图中单独注释负责与丢失的块进行交互的那些代码部分,但是很可能不需要这样做。 最主要的是,至少已经收集并获得了一些东西,然后继续下去会更有趣。


具体来说,在故事的这一点上,我们还没有组装无窗口(外部)模块,还没有自己的带有数据库的Web服务器,我们还不需要它(但是如果是这样,请立即将其插入,这样您就不必挖掘了):


  • 无线电模块nRF24L01 +
  • WiFi模块ESP8266。

然而,我可能会从ESP8266开始,它是模块编程和操作中最有问题的部分。 原因在于模块本身及其固件的性能差异。


当我为它编写标准的AT固件时,存在许多缺点:


  • 它们仍然潮湿(截至2016年)
  • 我找不到用于使用AT命令控制ESP8266模块的Arduino常规库,我不得不自己“集体农场”。

我没有在单独的库中发布ESP8266的代码,而是只是编写了必要的功能,所以草图花了这么长时间。 此外,我仅实现了所需的功能。 使用AT命令对ESP进行的所有编程都归结为解析字符串和设置命令之间的延迟。


您可以在此处找到并下载服务器(中央模块)server.ino的源代码


接下来,我将ESP8266的firmware/AT23-SDK101-nocloud.bin ,好奇的文档在同一目录中。 通过刷新显示的固件,可以确保我的草图可以按预期使用WiFi。 我没有尝试使用其他AT固件。 事实是,我设法找到了“高级” AT固件,甚至参与了一些创建,这完全适合我们的目的( 这里是esp-link )。 但是,通常情况是,在对当前版本的气象站进行的工作完成之后,所有事情都会发生,因此决定将其保持原样。


因此,从一开始就必须刷新指定的AT固件。 没有什么复杂的,但是也很简单。 ESP8266在网络上的很多地方都介绍了如何执行此操作,以连接和更新固件


由于我的USB-TTL转换器电流不足,并且USB端口不断掉线(这是转弯!),因此我使用“ Arduino作为简单的USB-Serial TTL转换器”方法为固件模块电连接。


由于我在Linux上工作,因此我使用esptool.py进行了esptool.py 。 为了方便固件,我“ nakolhozil”一个带有开关的小型辅助板(此处未描述)。


闪烁后,您需要使用以下命令将端口速度设置为57600(因为对于SoftSerial,115200的端口速度很大并且不能保证稳定的操作)


 AT+UART_DEF=57600,8,1,0,0 

接下来,您需要稍微修改标准的Arduino IDE库,即在arduino/hardware/arduino/avr/libraries/SoftwareSerial/SoftwareSerial.h文件中,将相应的行更改为


 #define _SS_MAX_RX_BUFF 128 // RX buffer size 

在文件arduino/hardware/arduino/avr/cores/arduino/HardwareSerial.h中将相应的行更改为


 #define SERIAL_TX_BUFFER_SIZE 128 #define SERIAL_RX_BUFFER_SIZE 128 

并在文件arduino/hardware/arduino/avr/cores/arduino/USBAPI.h中将相应的行更改为


 #define SERIAL_BUFFER_SIZE 128 

严格来说,这是错误的,因为 在更新Arduino SDK时,这些文件很可能会被覆盖,您将不得不再次重复所有更正。 在科学中,我们必须发明自己的库,该库可以操纵指定的值(如果可能的话),但这并不适合所有人。


一种或另一种方式,初步操作已结束。


现在,我们直接传递到中央单元(服务器) server.ino的代码


在第一行中,您应该更改WiFi点的访问设置


 const String SSID = "..."; const String PASSWORD = "..."; 

Web服务器的工作将在后面详细讨论。


以下是(注释掉)调试定义:


 //#define DEBUG //#define DEBUG_RF //#define DEBUG_ESP //#define DEBUG_LOG_SD 

如果出现问题,您可以随时取消注释,重新编译并重新加载草图,并在控制台中获取更多调试信息,或将其写入SD卡上的文件中。 而且,您只能取消所需的注释。 例如,模块nRF24L01 +? 然后仅取消注释DEBUG_RF等。


接下来是广泛的注释,其中包括引出线,初始化和整个外围设备的详细描述。


在这里您可以更改nRF24L01 +的无线电频道号


 #define RF_CHANNEL 73 

接下来是void setup() ,从那里的详细注释中可以清楚看出。 再然后是void loop() ,尚未考虑用于Web服务器的代码。


填写完草图后,您的中央单元将重新显示并向您显示一些东西,但不是立即,而是10分钟后-值DELAY_LOCAL_SENSOR 。 您当然可以更改它。
显示屏应显示:室温和湿度(来自DHT11传感器的数据)和气压(来自BMP180)。


以下功能负责LCD 16×4上的显示:


 void lcdClearRow(int row) //     ,   void lcdPrintOutdoor(int temperature, int humidity, float voltage) //     ,   void lcdPrintHome(int temperature, int humidity, int pressure) void lcdPrintInfo(char info[LCD_MAX_COLS]) void lcdPrintStatus() void lcdPrintLastSensorTime() 

LCD1604的显示设计如下。


LCD1604显示设计


第一行(顶部)打印一个样式化的图标(步行者),该图标旨在指示街道上的天气(走在街道上,沿着街道走)。 我自己提出了该图标,因此,如果您有一个更好的主意(适合5x8像素),则可以在注释中指定它(作为字节数组)。 您可以在此处练习像素艺术, 用于HD44780 LCD模块的自定义字符生成器 。 在同一行中,将打印窗模块的电压。


第二行打印“房子的天气”和大气压。 房子图标是标准的,每个人都可以理解。


在第三行中, lcdPrintLastSensorTime()打印从最后一次读取传感器(分别是街道和以逗号分隔的住所)开始经过的时间(以秒为单位)。 确保知道气象站不显示昨天的天气非常有用。 实际上,这是调试信息,可以在最终版本中将其删除。


在使用lcdPrintStatus()函数的屏幕的最后第四行中,将打印状态信息,其中


  • s是本地压力传感器
  • e是ESP8266模块
  • 我是WiFi连接
  • w是Web服务器的可用性
  • l-SD卡上的日志文件

在这些常规字母中的每个字母之后,将有一个加号或减号,这表示在相应模块的操作中没有错误或存在问题。


回到选择铁的问题,我将解释选择文本LCD1604显示器而不是图形显示器的优点。 事实是,在大多数情况下,从各个销售商处购买的LCD1604模块在连接方面都是相同且可预测的,并且易于编程。 尽管您可以在图形显示上进行更多的绘制和显示,但对于图形显示却无法说什么。 使用文本显示,几米远的图像的清晰度也再次提高,是的,是的,您可以在图形显示中制作较大的字体,但是可以容纳多少字体?


下一个 填写完草图并确保一切正常后,您可以将Arduino Mega“主板”重新连接至外部电源。 或保持现状,将其连接到计算机的USB,以在调试控制台中查看所有这些优点。


如果没有组装所有的块,则可以注释掉不必要的代码。 尽管,我再说一遍,它应该那样工作,只是在控制台中得到错误消息。 如何解决这个问题?


例如,您尚未购买BMP180大气压传感器。 在server.ino草图中, 我们寻找负责连接相应库的行,在本例中为


 #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BMP085_U.h> 

评论此块。


接下来,在Arduino IDE中,我们开始编译代码(而不是固件),并查看编译器的哪几行。 我们对这些内容发表评论。 我们重复该操作,直到正常收集代码为止,没有错误。 在编辑之前,优良作法是创建草图的副本,以便当所需的传感器从阳光明媚的中国到达时,不要重复执行所有操作。


源代码中提供了所用库的链接。 如果没有这样的链接,则使用标准的Arduino IDE库。


以防万一,我使用的所有库(标准库除外)都存储在库目录中 。 严格来说,这是错误的。 您应该从其官方存储库中下载最新版本的库(具有固定的错误,新功能),但是如果很难找到它们,要么已被删除,要么不支持旧版本,仅在这种情况下,我保存了所有使用的库。


接下来是换能器的组装,因此该零件要短一些以免混淆。

Source: https://habr.com/ru/post/zh-CN425953/


All Articles