驴友花雕 发表于 2025-6-23 06:57:18

【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 材料制成的合适塑料外壳中,并涂有彩色自粘墙纸。



















驴友花雕 发表于 2025-6-23 07:01:20

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

项目代码

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <Adafruit_SSD1306.h>

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);
}

驴友花雕 发表于 2025-6-23 07:03:19

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

包含大号字符的代码

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <Adafruit_SSD1306.h>

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);
}

驴友花雕 发表于 2025-6-23 07:05:43

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

【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



页: [1]
查看完整版本: 【Arduino 动手做】带三个 Oled 显示屏的 Arduino 气象站