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

2025-06-221519
AI 快速预览详细 收起
这个项目介绍了一种使用Arduino Nano和三个SSD1306 OLED显示屏制作桌面气象站的方法。设备由几个组件组成,包括BME280传感器模块、TCA9548a多路复用器模块等。通过编写简单的代码,可以在每个屏幕上显示大气压力、空气湿度和温度。该项目适合初学者,安装简单,视觉效果出色。
这是一个非常简单、视觉上有效但也非常有用的设备,可以准确显示三个基本气象参数。

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

这次,我将向您介绍一种制作非常有趣的桌面气象站的方法,该气象站在三个单独的 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

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(3)
驴友花雕
驴友花雕
作者
【Arduino 动手做】带三个 Oled 显示屏的 Arduino 气象站
项目链接:https://www.hackster.io/mircemk/classic-style-arduino-weather-station-with-three-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

驴友花雕
驴友花雕
作者
包含大号字符的代码
[code]#include
#include
#include
#include
Adafruit_SSD1306 display(128, 64, &Wire, 4);
Adafruit_BME280 bme;
int temp, hum, pressure;
void TCA9548A(uint8_t bus)
{
Wire.beginTransmission(0x70);
Wire.write(1 << bus);
Wire.endTransmission();
}
void setup()
{
TCA9548A(1);
bme.begin(0x76, &Wire);
TCA9548A(2);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(4);
display.setTextColor(WHITE);
display.setCursor(18,20);
display.println("HUM.");// Print text
display.display();
TCA9548A(3);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(4);
display.setTextColor(WHITE);
display.setCursor(10,20);
display.println("PRES");// Print text
display.display();
TCA9548A(4);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(4);
display.setTextColor(WHITE);
display.setCursor(10,20);
display.println("TEMP.");// Print text
display.display();
delay(5000);
}
void loop()
{
TCA9548A(1);
temp = bme.readTemperature();
hum = bme.readHumidity();
pressure = bme.seaLevelForAltitude(700.0, bme.readPressure())/100.0;
TCA9548A(2);
display.setTextColor(WHITE); display.clearDisplay();
display.setTextSize(2); display.setCursor(0,0); display.print("Humidity %");
display.setTextSize(4); display.setCursor(45,30);
display.print(hum);
display.display();
TCA9548A(3);
display.setTextColor(WHITE); display.clearDisplay();
display.setTextSize(2); display.setCursor(5,0); display.print("Press. hPa");
display.setTextSize(4); display.setCursor(15,30);
display.print(pressure);
display.display();
TCA9548A(4);
display.setTextColor(WHITE); display.clearDisplay();
display.setTextSize(2); display.setCursor(30,0); display.print("Temp C");
display.setTextSize(4); display.setCursor(45,30);
display.print(temp);
display.display();
delay(1000);
}[/code]
驴友花雕
驴友花雕
作者
项目代码
[code]#include
#include
#include
#include
Adafruit_SSD1306 display(128, 64, &Wire, 4);
Adafruit_BME280 bme;
float temp, hum, pressure;
void TCA9548A(uint8_t bus)
{
Wire.beginTransmission(0x70);
Wire.write(1 << bus);
Wire.endTransmission();
}
void setup()
{
TCA9548A(1);
bme.begin(0x76, &Wire);
TCA9548A(2);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(4);
display.setTextColor(WHITE);
display.setCursor(18,20);
display.println("HUM.");// Print text
display.display();
TCA9548A(3);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(4);
display.setTextColor(WHITE);
display.setCursor(10,20);
display.println("PRES");// Print text
display.display();
TCA9548A(4);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(4);
display.setTextColor(WHITE);
display.setCursor(10,20);
display.println("TEMP.");// Print text
display.display();
delay(5000);
}
void loop()
{
TCA9548A(1);
temp = bme.readTemperature();
hum = bme.readHumidity();
pressure = bme.seaLevelForAltitude(700.0, bme.readPressure())/100.0;
TCA9548A(2);
display.setTextColor(WHITE); display.clearDisplay();
display.setTextSize(2); display.setCursor(0,0); display.print("Humidity %");
display.setTextSize(3); display.setCursor(20,30);
display.print(hum);
display.display();
TCA9548A(3);
display.setTextColor(WHITE); display.clearDisplay();
display.setTextSize(2); display.setCursor(5,0); display.print("Press. hPa");
display.setTextSize(3); display.setCursor(0,30);
display.print(pressure);
display.display();
TCA9548A(4);
display.setTextColor(WHITE); display.clearDisplay();
display.setTextSize(2); display.setCursor(30,0); display.print("Temp C");
display.setTextSize(3); display.setCursor(20,30);
display.print(temp);
display.display();
delay(1000);
}[/code]
- 没有更多了 -