

Ziel des Projekts
Auf einem OLED sollen Zeit Wetterdaten angezeigt werden. Die Zeit wird mit dem RTC-Modul DS3231 gemessen, die Wetterdaten stellen entweder ein BME280 oder ein BMP280 zur Verfügung


Die Hardware
- ⇒BME280
- ⇒BMP280
- ⇒RTC-Modul DS3231
- ⇒OLED (0,96 Zoll, 1,3 Zoll oder 1,5 Zoll)
Benötigte Bibliotheken




Der Schaltplan
Bei den „großen“ Arduinos können beide I²C-Anschlüsse verwendet werden, beim Nano steht nur ein ⇒I²C-Anschluss zur Verfügung
Das Programm
Erläuterungen
- im Kopf des Programm werden die benötigten Bibliotheken eingebunden und Objekte für das RTC-Modul (RTC_DS3231 rtc;) und den BME280-Sensor (Adafruit_BME280 bme oder Adafruit_BMp280 bmp) erzeugt
die Bibliothek u8g2 wird mit den Treibern der jeweiligen OLEDs initialisiert
es wird der ⇒Page Buffer Mode verwendet, er funktioniert mit allen Mikrocontrollern
außer beim UNO R3 kann auch der ⇒Full Buffer Mode verwendet werden
Du musst den passenden Treiber auswählen. - im setup-Teil werden die Module gestartet
das RTC-Modul verwendet den Zeitpunkt der Kompilierung als aktuellen Zeitstempel
die Bibliothek u8g2 stellt 🔗verschiedene Schriften zur Verfügung, die Schrift u8g2_font_helvB14_tf kann auf den OLEDs mit 0,96 und 1,3 Zoll verwendet werden, auf dem größeren 1,5 Zoll OLED kannst du die Schrift u8g2_font_helvR18_tf benutzen
enableUTF8Print() ist für die Darstellung des Grad-Zeichens erforderlich - im loop Teil ermittelt die Funktion DatenAnzeigen aktuelle Zeit, Temperatur und Luftfeuchtigkeit und stellt die Daten auf dem OLED dar
die Cursorpositionen
Displays mit 128×64 Pixeln:
setCursor(2, 20);
setCursor(2, 40);
setCursor(2, 60);
Display mit 128×128 Pixeln:
setCursor(2, 40);
setCursor(2, 80);
setCursor(2, 120);
BME280
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
#include "RTClib.h" #include "U8g2lib.h" #include "Adafruit_BME280.h" RTC_DS3231 rtc; // Name des BME280 Adafruit_BME280 bme; String Temperatur, Luftfeuchtigkeit; // 0,96 Zoll Page Buffer Mode // U8G2_SSD1306_128X64_NONAME_1_HW_I2C oled(U8G2_R0); // 1,3 Zoll Page Buffer Mode // U8G2_SH1106_128X64_NONAME_1_HW_I2C oled(U8G2_R0); // 1,5 Zoll Page Buffer Mode // U8G2_SH1107_SEEED_128X128_1_HW_I2C oled(U8G2_R0); void setup() { Serial.begin(9600); while (!Serial); delay(1000); if (!rtc.begin()) { Serial.println("RTC nicht verbunden"); Serial.println("Programm wird beendet!"); while (1); } else Serial.println("RTC verbunden!"); // Zeitpunkt der Kompilierung String Zeitpunkt = (F(__DATE__), F(__TIME__)); Serial.println("Zeitpunkt des Kompilierens: " + Zeitpunkt); // Zeit aus dem Zeitpunkt des Kompilierens setzen rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); if (!oled.begin()) { Serial.println("OLED nicht verbunden"); Serial.println("Programm wird beendet!"); while (1); } else Serial.println("OLED verbunden!"); // BME280 starten, bei Misserfolg Meldung anzeigen if (!bme.begin(0x77)) { Serial.println("BME280 nicht verbunden"); Serial.println("Verkabelung und/oder HEX-Adresse prüfen!"); Serial.println("Start mit möglichen HEX-Adressen:"); Serial.println("bme.begin(0x76);"); Serial.println("bme.begin(0x77);"); Serial.println("Programm wird beendet!"); while (1); } else Serial.println("BME280 erfolgreich gestartet!"); // Schriftfarbe oled.setDrawColor(1); // Bildschirm löschen oled.clearDisplay(); oled.setFont(u8g2_font_helvB14_tf); oled.enableUTF8Print(); } void loop() { DatenAnzeigen(); delay(1000); } void DatenAnzeigen() { // aktuelle Zeit holen DateTime aktuell = rtc.now(); // formatiertes char-Array für die Zeit char Zeit[] = "hh:mm"; Temperatur = String(bme.readTemperature(), 1); Temperatur.replace(".", ","); Luftfeuchtigkeit = String(int(bme.readHumidity())); // Page Buffer Mode oled.firstPage(); do { oled.setCursor(2, 20); oled.print(aktuell.toString(Zeit)); oled.setCursor(2, 40); oled.print(Temperatur + "°C"); oled.setCursor(2, 60); oled.print(Luftfeuchtigkeit + "%"); } while (oled.nextPage()); Serial.println("Temperatur: " + Temperatur + "°C"); Serial.println("Luftfeuchtigkeit: " + Luftfeuchtigkeit + "%"); } |
BMP280
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
#include "RTClib.h" #include "U8g2lib.h" #include "Adafruit_BMP280.h" RTC_DS3231 rtc; // Name des BME280 Adafruit_BMP280 bmp; String Temperatur, Luftdruck; // 0,96 Zoll SSD1306 Page Buffer Mode // U8G2_SSD1306_128X64_NONAME_1_HW_I2C oled(U8G2_R0); // 0,96 Zoll SSD1306 Full Buffer Mode // U8G2_SSD1306_128X64_NONAME_F_HW_I2C oled(U8G2_R0); // 1,3 Zoll SH1106 Page Buffer Mode // U8G2_SH1106_128X64_NONAME_1_HW_I2C oled(U8G2_R0); // 1,3 Zoll SH1106 Full Buffer Mode // U8G2_SH1106_128X64_NONAME_F_HW_I2C oled(U8G2_R0); // 1,5 Zoll SH1107 Page Buffer Mode U8G2_SH1107_SEEED_128X128_1_HW_I2C oled(U8G2_R0); // 1,5 Zoll SH1107 Full Buffer Mode // U8G2_SH1107_128X128_1_HW_I2C oled(U8G2_R0); // 1,54 Zoll SSD1309 Page Buffer // U8G2_SSD1309_128X64_NONAME0_1_HW_I2C oled(U8G2_R0); // 1,54 Zoll SSD1309 Full Buffer // U8G2_SSD1309_128X64_NONAME0_F_HW_I2C oled(U8G2_R0); void setup() { Serial.begin(9600); while (!Serial); delay(1000); if (!rtc.begin()) { Serial.println("RTC nicht verbunden"); Serial.println("Programm wird beendet!"); while (1); } else Serial.println("RTC verbunden!"); // Zeitpunkt der Kompilierung String Zeitpunkt = (F(__DATE__), F(__TIME__)); Serial.println("Zeitpunkt des Kompilierens: " + Zeitpunkt); // Zeit aus dem Zeitpunkt des Kompilierens setzen rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); if (!oled.begin()) { Serial.println("OLED nicht verbunden"); Serial.println("Programm wird beendet!"); while (1); } else Serial.println("OLED verbunden!"); // BME280 starten, bei Misserfolg Meldung anzeigen if (!bmp.begin(0x77)) { Serial.println("BMP280 nicht verbunden"); Serial.println("Verkabelung und/oder HEX-Adresse prüfen!"); Serial.println("Start mit möglichen HEX-Adressen:"); Serial.println("bmp.begin(0x76);"); Serial.println("bmp.begin(0x77);"); Serial.println("Programm wird beendet!"); while (1); } else Serial.println("BMP280 erfolgreich gestartet!"); // Schriftfarbe oled.setDrawColor(1); // Bildschirm löschen oled.clearDisplay(); oled.setFont(u8g2_font_helvR18_tf); // Sonderzeichen/Umlaute aktivieren oled.enableUTF8Print(); } void loop() { DatenAnzeigen(); delay(1000); } void DatenAnzeigen() { // aktuelle Zeit holen DateTime aktuell = rtc.now(); // formatiertes char-Array für die Zeit char Zeit[] = "hh:mm"; // in String umwandeln, eine Nachkommastelle Temperatur = String(bmp.readTemperature(), 1); Temperatur.replace(".", ","); // in String umwandeln, keine Nachkommastellen Luftdruck = String(bmp.readPressure() / 100, 0); Luftdruck.replace(".", ","); // Page Buffer Mode oled.firstPage(); do { oled.setCursor(2, 40); oled.print(aktuell.toString(Zeit)); oled.setCursor(2, 80); oled.print(Temperatur + " °C"); oled.setCursor(2, 120); oled.print(Luftdruck + " hPa"); } while (oled.nextPage()); Serial.println("Temperatur: " + Temperatur + "°C"); Serial.println("Luftdruck: " + Luftdruck + " hPa"); } |
Letzte Aktualisierung: