14浏览
查看: 14|回复: 3

[项目] 【Arduino 动手做】带三个 Oled 显示屏的 Arduino 气象站

[复制链接]
这是一个非常简单、视觉上有效但也非常有用的设备,可以准确显示三个基本气象参数。

到目前为止,我已经制作了几个显示本地值和互联网数据的气象站,您可以在我的播放列表中查看。

这次,我将向您介绍一种制作非常有趣的桌面气象站的方法,该气象站在三个单独的 Oled 显示器上显示三个基本天气参数的值,即 Atmospheric Pressure、Air Humidity 和 Temperature。这个想法是类似于一个经典的复古气象站,它有三个独立的仪器,每个参数一个。

由于显示器体积小且可读性强,该工作站在任何办公桌上都是一个理想的有用小工具。

在 YouTube 上观看
至于制作方法,这个设备非常简单,适合初学者。
该设备由几个组件组成:
• 背面有一个电源输入连接器、一个开关以及一个 BME280 传感器模块
Arduino Nano 微控制器
• 三个 SSD1306 OLED 显示屏,带 I2C 通信
• 和 TCA9548a 多路复用器模块

事实上,通过制作这个设备,我想展示这种多路复用器的功能。即,Arduino Nano 只有一个 I2C 输入(A4 和 A5),在将 I2C 显示器连接到 Arduino 时,我们仅限于一个屏幕。在特殊情况下,当显示器本身可以选择两个不同的 I2C 地址之一时,我们最多可以连接两个显示器。在这种情况下,当需要更多显示器时,使用这个多路复用器模块是最实用的,它可以将多达 8 个 I2C 设备连接到一个微控制器。

编写代码非常简单,需要指示多路复用器的 I2C 输出编号以及连接到该输出的屏幕上应显示的内容。
现在让我们看看这个设备在实际条件下是如何工作的。
打开设备后,在最初的几秒钟内,将显示的参数会以大写字母显示在每个屏幕上。之后,当前温度、压力和空气湿度的值以两位小数显示。同样,在黄色条上,但这次以小写字母显示,它显示参数和其值显示在相应显示屏上的单位。

如果我们想专门显示我们居住区域的 Atmospheric Pressure 的 Relative 值,我们应该在代码的部分
pressure = bme.seaLevelForAltitude(700.0, bme.readPressure()))/100.0;
放置适当的高度(在我的情况下是 700m)。我还制作了一个代码版本,其中值以较大的数字显示,但没有小数。

最后,一个简短的结论。这是一个非常简单、视觉上有效但也非常有用的设备,只需使用一个廉价的传感器即可准确显示三个基本气象参数。它安装在由 PVC 材料制成的合适塑料外壳中,并涂有彩色自粘墙纸。

【Arduino 动手做】带三个 Oled 显示屏的 Arduino 气象站图2

【Arduino 动手做】带三个 Oled 显示屏的 Arduino 气象站图3

【Arduino 动手做】带三个 Oled 显示屏的 Arduino 气象站图1

【Arduino 动手做】带三个 Oled 显示屏的 Arduino 气象站图4

【Arduino 动手做】带三个 Oled 显示屏的 Arduino 气象站图5

【Arduino 动手做】带三个 Oled 显示屏的 Arduino 气象站图6

【Arduino 动手做】带三个 Oled 显示屏的 Arduino 气象站图7

【Arduino 动手做】带三个 Oled 显示屏的 Arduino 气象站图9

【Arduino 动手做】带三个 Oled 显示屏的 Arduino 气象站图8

驴友花雕  中级技神
 楼主|

发表于 6 小时前

【Arduino 动手做】带三个 Oled 显示屏的 Arduino 气象站,

项目代码

  1. #include <Wire.h>
  2. #include <Adafruit_Sensor.h>
  3. #include <Adafruit_BME280.h>
  4. #include <Adafruit_SSD1306.h>
  5. Adafruit_SSD1306 display(128, 64, &Wire, 4);
  6. Adafruit_BME280 bme;
  7. float temp, hum, pressure;
  8. void TCA9548A(uint8_t bus)
  9. {
  10.   Wire.beginTransmission(0x70);
  11.   Wire.write(1 << bus);
  12.   Wire.endTransmission();
  13. }
  14. void setup()
  15. {
  16.   TCA9548A(1);
  17.   bme.begin(0x76, &Wire);
  18.    
  19.   TCA9548A(2);
  20.   display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  21.   display.clearDisplay();
  22.   display.setTextSize(4);
  23.   display.setTextColor(WHITE);
  24.   display.setCursor(18,20);
  25.   display.println("HUM.");// Print text
  26.   display.display();
  27.   TCA9548A(3);
  28.   display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  29.   display.clearDisplay();
  30.   display.setTextSize(4);
  31.   display.setTextColor(WHITE);
  32.   display.setCursor(10,20);
  33.   display.println("PRES");// Print text
  34.   display.display();
  35.   
  36.   TCA9548A(4);
  37.   display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  38.   display.clearDisplay();
  39.   display.setTextSize(4);
  40.   display.setTextColor(WHITE);
  41.   display.setCursor(10,20);
  42.   display.println("TEMP.");// Print text
  43.   display.display();
  44.   delay(5000);
  45. }
  46. void loop()
  47. {
  48.   TCA9548A(1);
  49.   temp = bme.readTemperature();
  50.   hum = bme.readHumidity();
  51.   pressure = bme.seaLevelForAltitude(700.0, bme.readPressure())/100.0;
  52.   TCA9548A(2);
  53.   display.setTextColor(WHITE); display.clearDisplay();
  54.   display.setTextSize(2); display.setCursor(0,0); display.print("Humidity %");
  55.   display.setTextSize(3); display.setCursor(20,30);
  56.   display.print(hum);
  57.   display.display();
  58.   TCA9548A(3);
  59.   display.setTextColor(WHITE); display.clearDisplay();
  60.   display.setTextSize(2); display.setCursor(5,0); display.print("Press. hPa");
  61.   display.setTextSize(3); display.setCursor(0,30);
  62.   display.print(pressure);
  63.   display.display();
  64.   
  65.   TCA9548A(4);
  66.   display.setTextColor(WHITE); display.clearDisplay();
  67.   display.setTextSize(2); display.setCursor(30,0); display.print("Temp C");
  68.   display.setTextSize(3); display.setCursor(20,30);
  69.   display.print(temp);
  70.   display.display();
  71.   
  72.   delay(1000);
  73. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 6 小时前

【Arduino 动手做】带三个 Oled 显示屏的 Arduino 气象站

包含大号字符的代码

  1. #include <Wire.h>
  2. #include <Adafruit_Sensor.h>
  3. #include <Adafruit_BME280.h>
  4. #include <Adafruit_SSD1306.h>
  5. Adafruit_SSD1306 display(128, 64, &Wire, 4);
  6. Adafruit_BME280 bme;
  7. int temp, hum, pressure;
  8. void TCA9548A(uint8_t bus)
  9. {
  10.   Wire.beginTransmission(0x70);
  11.   Wire.write(1 << bus);
  12.   Wire.endTransmission();
  13. }
  14. void setup()
  15. {
  16.   TCA9548A(1);
  17.   bme.begin(0x76, &Wire);
  18.    
  19.   TCA9548A(2);
  20.   display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  21.   display.clearDisplay();
  22.   display.setTextSize(4);
  23.   display.setTextColor(WHITE);
  24.   display.setCursor(18,20);
  25.   display.println("HUM.");// Print text
  26.   display.display();
  27.   TCA9548A(3);
  28.   display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  29.   display.clearDisplay();
  30.   display.setTextSize(4);
  31.   display.setTextColor(WHITE);
  32.   display.setCursor(10,20);
  33.   display.println("PRES");// Print text
  34.   display.display();
  35.   
  36.   TCA9548A(4);
  37.   display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  38.   display.clearDisplay();
  39.   display.setTextSize(4);
  40.   display.setTextColor(WHITE);
  41.   display.setCursor(10,20);
  42.   display.println("TEMP.");// Print text
  43.   display.display();
  44.   delay(5000);
  45. }
  46. void loop()
  47. {
  48.   TCA9548A(1);
  49.   temp = bme.readTemperature();
  50.   hum = bme.readHumidity();
  51.   pressure = bme.seaLevelForAltitude(700.0, bme.readPressure())/100.0;
  52.   TCA9548A(2);
  53.   display.setTextColor(WHITE); display.clearDisplay();
  54.   display.setTextSize(2); display.setCursor(0,0); display.print("Humidity %");
  55.   display.setTextSize(4); display.setCursor(45,30);
  56.   display.print(hum);
  57.   display.display();
  58.   TCA9548A(3);
  59.   display.setTextColor(WHITE); display.clearDisplay();
  60.   display.setTextSize(2); display.setCursor(5,0); display.print("Press. hPa");
  61.   display.setTextSize(4); display.setCursor(15,30);
  62.   display.print(pressure);
  63.   display.display();
  64.   
  65.   TCA9548A(4);
  66.   display.setTextColor(WHITE); display.clearDisplay();
  67.   display.setTextSize(2); display.setCursor(30,0); display.print("Temp C");
  68.   display.setTextSize(4); display.setCursor(45,30);
  69.   display.print(temp);
  70.   display.display();
  71.   
  72.   delay(1000);
  73. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 6 小时前

【Arduino 动手做】带三个 Oled 显示屏的 Arduino 气象站

【Arduino 动手做】带三个 Oled 显示屏的 Arduino 气象站
项目链接:https://www.hackster.io/mircemk/ ... ee-oled-disp-dc79f1
项目作者:北马其顿 米尔塞姆克(Mirko Pavleski)

项目视频 :https://www.youtube.com/watch?v=UkQjucC2W98
项目代码:https://www.hackster.io/code_files/650048/download
使用大数字:https://www.hackster.io/code_files/650049/download

【Arduino 动手做】带三个 Oled 显示屏的 Arduino 气象站图1

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail