使用 Arduino Nano 的迷你气象站
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要的工具和机器
| ||||
| ||||
| ||||
|
应用和在线服务
| ||||
|
关于这个项目
简介
实时捕获物理数据总是令人着迷。在这个项目中,您不仅能够捕捉天气预测的三个基本物理参数,即。温度、湿度和大气压力,而且还能在液晶屏上显示实时数据。
说明及工作原理
该项目中使用的两个传感器是 BMP-280 和 DHT-11。前者感应温度和大气压力,而后者感应相对湿度。 DHT-11 可以通过使用 BME-280(它也可以测量湿度)而不是 BMP-280 来完成,但如果考虑到成本,那么使用这里使用的传感器组合对于 DIY 来说更经济项目。还应该注意的是,虽然 DHT-11 能够感测温度和湿度,但它仅用于湿度感测,因为它的温度感测分辨率为 +/-2°,而 BMP-280 的温度感测分辨率为 +/-.5°。该项目的核心是 Arduino NANO 开发板。在这里,NANO 板也因其实惠的价格而被选择而不是大众首选的 UNO。 1.44” ST7735系列TFT液晶屏用作我们项目的显示器。此处避免使用更大的屏幕,以免 Arduino NANO 过载。
电路与编程
尽可能方便地提供了电路图和框图的组合,以帮助制造商了解组件的物理配置和连接。还提供了组件引脚输出表,使事情变得更容易。通过图表和表格,您会注意到 Arduino NANO 上 ICSP 接头的 5V 和 GND 引脚已用于为组件供电以及板载电源和接地引脚。这样做是为了消除任何会使系统体积庞大的额外电源。
谈到编程,在第一部分中包含了一系列库,以保持编程简短。除了显而易见的,Wire.h 和 SPI.h 库也值得一提,因为 Wire.h 是允许 Arduino 与 I2C/TWI 设备(如 BMP-280 和 ST7735 LCD 和 SPI.h)通信的库提供与ST7735 LCD 的串行外设接口。在第二部分中,初始化传感器并设置 LCD 的布局、字体颜色等,以根据我们的喜好显示数据。在我们编程的最后部分,获取并显示传感器的输出,每次读数之间有一个方便的延迟,以保持稳定。
构建和测试
在原型中,组件保持模块化并使用跳线而不是焊接进行连接。这不仅使故障排除和维修变得容易,而且使组装过程变得轻松。设备外壳经过定制 3D 打印,非常适合组件。外壳设有适当的通风装置,以便将传感器暴露于被测量并散发系统产生的热量,否则这些热量会干扰传感元件。该设备通过相同类型的 AUSB 到用于对 Arduino 进行编程的 B 型迷你 USB 供电。该原型已经在室内进行了几个小时的拉伸测试,使用 PC USB 端口和 5V 智能手机充电器作为电源。考虑到生产成本和开发时间,与在线气象数据相比,结果相当准确。
结论
总之,可以说这个项目非常经济,至少可以说是有用的,最重要的是,有一个小巧轻便的气象站可以放在口袋里,很有趣。
要购买电子零件,请从 UTSOURCE 订购
参考书目
· Google.com
· Arduino.cc
·Mytectutor.com
图> 图> 图>
代码
- 代码
代码C/C++
这是项目的相关草图,评论声明将解释工作原理#include//include Serial Peripheral Interface library#include //include Two Wire Interface library#include // 包含 Adafruit 图形库#include // 包含 Adafruit ST7735 TFT 库#include // 包含 Adafruit BMP280 传感器库#include "DHT.h" //include DHTXX 传感器library#define DHTPIN 2 //DHT11 数据引脚连接到 arduino 引脚 D2#define DHTTYPE DHT11 //指定使用的 DHT 传感器的类型#define TFT_RST 8 // TFT RST 引脚连接到 arduino 引脚 D8#define TFT_CS 10 // TFT CS pin连接arduino pin D9#define TFT_DC 9 // TFT DC pin连接arduino pin D10//初始化ST7735 SERIES TFT libraryAdafruit_ST7735 tft =Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); //定义设备I2C地址:0x76或0x77(0x77是库默认地址)#define BMP280_I2C_ADDRESS 0x76 Adafruit_BMP280 bmp280; // 初始化 Adafruit BMP280 库DHT dht(DHTPIN, DHTTYPE); // 初始化 DHT 传感器 void setup(void){ dht.begin(); // 同步 DHT 传感器 tft.initR(INITR_144GREENTAB); // 初始化一个ST7735S芯片,黑色tab tft.fillScreen(ST77XX_BLACK); // 设置黑色背景 tft.drawFastHLine(0, 15 , tft.width(), ST77XX_CYAN);// 在 (0, 15) 位置绘制水平分隔线 tft.setTextColor(ST77XX_CYAN, ST77XX_BLACK); // 将文本颜色设置为白色和黑色背景 tft.setTextSize(1); // 将文本大小设置为 1 //tft.setCursor(4, 0); // 将光标移动到位置 (4, 0) 像素 //tft.print("ARDUINO + ST7735 TFT"); tft.setCursor(25, 5); // 将光标移动到位置 (25, 5) 像素 tft.print("WEATHER BUDDY"); // 初始化 BMP280 传感器 if( bmp280.begin(BMP280_I2C_ADDRESS) ==0 ) { // 连接错误或设备地址错误! tft.setTextColor(ST77XX_RED, ST77XX_CYAN); // 将文本颜色设置为红色和黑色背景 tft.setTextSize(2); // 将文本大小设置为 2 tft.setCursor(5, 76); // 将光标移动到位置 (5, 76) 像素 tft.print("Connection"); tft.setCursor(35, 100); // 将光标移动到位置 (35, 100) 像素 tft.print("Error");同时(1); // 留在这里 } tft.drawFastHLine(0, 55, tft.width(), ST77XX_CYAN); // 在位置 (0, 55)pixel 绘制水平分隔线 tft.drawFastHLine(0, 95, tft.width(), ST77XX_CYAN); // 在位置 (0, 195)pixel 绘制水平分隔线 tft.setTextColor(ST77XX_RED, ST77XX_BLACK); // 将文本颜色设置为红色和黑色背景 tft.setCursor(30, 20); // 将光标移动到位置 (30, 20) 像素 tft.print("TEMPERATURE "); // 设置第一部分的标题 tft.setTextColor(ST77XX_CYAN, ST77XX_BLACK); // 将文本颜色设置为青色和黑色背景 tft.setCursor(40, 60); // 将光标移动到位置 (40, 60) 像素 tft.print("HUMIDITY "); // 设置第二部分的标题 tft.setTextColor(ST77XX_GREEN, ST7735_BLACK); // 将文本颜色设置为绿色和黑色背景 tft.setCursor(40, 100); // 将光标移动到位置 (40, 100) 像素 tft.print("PRESSURE "); // 设置第三部分的标题 tft.setTextSize(2); // 将文本大小设置为 2 } // main loopvoid loop() { char _buffer[8]; // 从 BMP280 传感器读取温度、湿度和压力 float temp =bmp280.readTemperature(); // 以°C 为单位获取温度 float hum =dht.readHumidity(); // 以 rH% 为单位获取湿度 float pres =bmp280.readPressure(); // 以 hPa 为单位获取压力 // 打印温度(以°C 为单位) if(temp <0) // 如果温度 <0 sprintf( _buffer, "-%02u.%02u", (int)abs(temp), (int )(abs(temp) * 100) % 100 ); else // 如果温度>=0 sprintf( _buffer, " %02u.%02u", (int)temp, (int)(temp * 100) % 100 );// 设置近似值 tft.setTextColor(ST77XX_YELLOW, ST77XX_BLACK ); // 将文本颜色设置为黄色和黑色背景 tft.setCursor(11, 34); // 将光标移动到位置 (11,34) 像素 tft.print(_buffer); // 从 BMP-280 传感器打印温度 tft.drawCircle(89, 34, 2, ST77XX_YELLOW); // 打印度数符号 ( ° )(如果使用 * 可以省略) tft.setCursor(95, 34); // 将光标移动到位置 (95,34) 像素 tft.print("C"); // 打印摄氏符号 // 2:打印湿度 (%) sprintf( _buffer, "%02u ", (int)(hum)); // 设置近似值 tft.setTextColor(ST77XX_MAGENTA, ST77XX_BLACK); // 将文本颜色设置为洋红色和黑色背景 tft.setCursor(45, 74); // 将光标移动到位置 (45,74) 像素 tft.print(_buffer); // 从 DHT-11 传感器打印湿度 tft.setCursor(75, 74); // 将光标移动到位置 (75,74) 像素 tft.print("%"); // 打印百分比符号 // 3:打印压力(以 hPa 为单位) sprintf( _buffer, "%04u.%02u", (int)(pres/100), (int)((uint32_t)pres % 100) ); // 设置近似值 tft.setTextColor(ST77XX_ORANGE, ST77XX_BLACK); // 将文本颜色设置为橙色和黑色背景 tft.setCursor(3, 112); // 将光标移动到位置 (3,112)pixel tft.print(_buffer); // 从 BMP-280 打印大气压力 tft.setCursor(91, 112); // 将光标移动到位置 (91,112)pixel tft.print("hPa"); // 打印大气压力单位为百帕延迟(1000); // 等待 1 秒再获取下一个传感器读数 }
定制零件和外壳
这是我使用的 3D 打印部件的 STL 文件示意图
您只需要遵循所示的接线即可。制造工艺