
Ziele des Projekts
- Informationen zum QWIIC-Anschluss und den dazugehörigen Steckern
- die Uhrzeit wird mit einem RTC-Modul ermittelt, die aktuelle Uhrzeit wird aus dem Zeitpunkt der Kompilierung des Programms bestimmt.
Dadurch wird die Uhr immer ein wenig nachgehen. Diese Ungenauigkeit kann vielleicht verschmerzt werden, weil ohnehin nur Stunden und Minuten angezeigt werden. - Anzeige der Uhrzeit auf einer Adafruit RGB-Matrix
zunächst wird die Stunde und zwei Sekunden später die Minuten angezeigt - Anzeige von Temperatur und Luftfeuchtigkeit jeweils für fünf Sekunden


QWIIC
QWIIC ist ein von Sparkfun entwickelter 4-poliger JST-Stecker mit dazugehöriger Buchse. Der QWIIC-Anschluss wird von verschiedenen Herstellern als zusätzlicher I²C-Anschluss verbaut.



Die direkte Verbindung wird mit einem Kabel mit zwei QWIIC-Steckern hergestellt. Steht auf dem Mikrocontroller kein solcher Stecker zu Verfügung, kann der der ⇒Standard-I²C-Anschluss verwendet werden.
Allerdings ist dazu eine Änderung im Programm notwendig. Die Änderung ist im Programm dokumentiert.
Der rote Stecker muss zwingend mit 3,3V verbunden werden.

Benötigte Bauteile
Jedes Bauteil verfügt über zwei Anschlüsse. So ist es möglich mehrere Bauteile hintereinander anzuschließen.

Die RGB-Matrix verfügt über 117 einzeln adressierbare RGB-LEDs in 13 Spalten und 9 Reihen.

RTC-Modul

Das Modul PCF8523 hat eine Ungenauigkeit von +/- 2 Sekunden am Tag.

Benötigte Bibliotheken



Beispielprogramm RGB-Matrix
|
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 |
#include "Adafruit_IS31FL3741.h" Adafruit_IS31FL3741_QT matrix; int Spalten = 8, Zeilen = 12; #define Zufallsfarbe matrix.Color(random(1, 255), random(1, 255), random(1, 255)) void setup() { Serial.begin(9600); while (!Serial); delay(1000); randomSeed(analogRead(0)); // Zeitpunkt der Kompilierung String Zeitpunkt = (F(__DATE__), F(__TIME__)); Serial.println("Zeitpunkt des Kompilierens: " + Zeitpunkt); // Matrix starten -Wire1 -> QWIIC if (!matrix.begin(IS3741_ADDR_DEFAULT, &Wire1)) { Serial.println("Matrix nicht verbunden"); Serial.println("Programm wird beendet!"); while (1); } else Serial.println("Matrix verbunden!"); matrix.fill(0); // Matrix aktivieren matrix.enable(true); matrix.setRotation(0); // Leuchtstärke (0-255) matrix.setLEDscaling(50); matrix.setGlobalCurrent(50); } void loop() { GrafikAnzeigen(); delay(2000); matrix.fill(0); } void GrafikAnzeigen() { for (int i = 0; i < 150; i++) { // Zufallsposition der Pixel int PositionY = random(0, Spalten); int PositionX = random(0, Zeilen); // zufällige Farbe, maximale Sättigung, zufällige Helligkeit matrix.drawPixel(PositionX, PositionY, matrix.ColorHSV(65535 * random(0, 100) / 100, 255, random(255))); delay(20); } matrix.fill(0); for (int i = 1;i < 5; i++) { matrix.drawCircle(Zeilen / 2, Spalten /2, i, matrix.ColorHSV(65535 * random(0, 100) / 100, 255, 255)); delay(50); } delay(2000); } |
Die Programme
Zeit anzeigen
|
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 |
#include "RTClib.h" #include "Adafruit_IS31FL3741.h" RTC_PCF8523 rtc; Adafruit_IS31FL3741_QT matrix; // Farben #define SCHWARZ 0x0000 #define WEISS 0xFFFF #define BLAU 0x001F #define ROT 0xF800 #define GRUEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define GELB 0xFFE0 #define BRAUN 0x9A60 #define GRAU 0x7BEF #define GRUENGELB 0xB7E0 #define DUNKELCYAN 0x03EF #define ORANGE 0xFDA0 #define PINK 0xFE19 #define BORDEAUX 0xA000 #define HELLBLAU 0x867D #define VIOLETT 0x915C #define SILBER 0xC618 #define GOLD 0xFEA0 void setup() { Serial.begin(9600); while (!Serial); delay(1000); // RTC mit Standard I²C // if (!rtc.begin(&Wire)) // RTC starten Wire1 -> QWIIC if (!rtc.begin(&Wire1)) { Serial.println("RTC konnte nicht gestartet werden!"); 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__))); rtc.start(); // Matrix starten mit Standard I²C // if (!matrix.begin(IS3741_ADDR_DEFAULT, &Wire)) // Matrix starten -Wire1 -> QWIIC if (!matrix.begin(IS3741_ADDR_DEFAULT, &Wire1)) { Serial.println("Matrix nicht verbunden"); Serial.println("Programm wird beendet!"); while (1); } else Serial.println("Matrix verbunden!"); matrix.fill(0); // Matrix aktivieren matrix.enable(true); matrix.setRotation(0); // Leuchtstärke (0-255) matrix.setLEDscaling(50); matrix.setGlobalCurrent(50); } void loop() { DatenAnzeigen(); } void DatenAnzeigen() { // aktuelle Zeit holen DateTime aktuell = rtc.now(); // formatiertes char-Array für die Zeit char Zeit[] = "hh:mm:ss"; // Stunden aus Zeit extrahieren String Stunden = String(aktuell.toString(Zeit)); Stunden = Stunden.substring(0, 2); // Minuten aus Zeit extrahieren String Minuten = String(aktuell.toString(Zeit)); Minuten = Minuten.substring(3, 5); Serial.println(aktuell.toString(Zeit)); // Stunde aanzeigen matrix.setCursor(0, 2); matrix.setTextColor(BLAU, 0); for (int i = 0; i < Stunden.length(); i++) { matrix.print(Stunden[i]); } delay(2000); // Minute anzeigen matrix.setCursor(0, 2); matrix.setTextColor(GELB, 0); for (int i = 0; i < Minuten.length(); i++) { matrix.print(Minuten[i]); // write the letter } delay(2000); } |
Temperatur anzeigen
Zusätzlich benötigte Bibliothek:

|
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 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
#include "Adafruit_BME280.h" #include "Adafruit_IS31FL3741.h" Adafruit_IS31FL3741_QT matrix; TwoWire *i2c = &Wire1; #define MeeresHoehe (1013.25) String Temperatur; String Luftfeuchtigkeit; String ungefaehreHoehe; String Luftdruck; String TemperaturGerundet; String LuftfeuchtigkeitGerundet; // Name des BME280 Adafruit_BME280 bme; // Farben #define SCHWARZ 0x0000 #define WEISS 0xFFFF #define BLAU 0x001F #define ROT 0xF800 #define GRUEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define GELB 0xFFE0 #define BRAUN 0x9A60 #define GRAU 0x7BEF #define GRUENGELB 0xB7E0 #define DUNKELCYAN 0x03EF #define ORANGE 0xFDA0 #define PINK 0xFE19 #define BORDEAUX 0xA000 #define HELLBLAU 0x867D #define VIOLETT 0x915C #define SILBER 0xC618 #define GOLD 0xFEA0 void setup() { Serial.begin(9600); while (!Serial); delay(1000); if (!matrix.begin(IS3741_ADDR_DEFAULT, i2c)) { Serial.println("Matrix nicht verbunden"); Serial.println("Programm wird beendet!"); while (1); } else Serial.println("Matrix verbunden!"); matrix.fill(0); // Matrix aktivieren matrix.enable(true); matrix.setRotation(0); // Leuchtstärke (0-255) matrix.setLEDscaling(50); matrix.setGlobalCurrent(50); // BME280 starten, bei Misserfolg Meldung anzeigen if (!bme.begin(0x77, &Wire1)) { 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!"); } void loop() { /* Daten erfassen die Daten liegen als Zahlen im Format float vor für die weitere Verarbeitung werden sie direkt in eine String umgewandelt für die Anzeige auf der RGB-Matrix auf Ganzzahl gerundet */ Temperatur = String(bme.readTemperature(), 1); TemperaturGerundet = String(int(bme.readTemperature())); Luftfeuchtigkeit = String(bme.readHumidity()); LuftfeuchtigkeitGerundet = String(int(bme.readHumidity())); ungefaehreHoehe = String(bme.readAltitude(MeeresHoehe)); Luftdruck = String(bme.readPressure() / 100.0); // float verwendet den . als Dezimaltrennzeichen // . mit replace durch , ersetzen Temperatur.replace(".", ","); Luftdruck.replace(".", ","); Luftfeuchtigkeit.replace(".", ","); ungefaehreHoehe.replace(".", ","); DatenAnzeigen(); } void DatenAnzeigen() { // Daten im Serieller Monitor anzeigen Serial.print("Temperatur: "); Serial.println(Temperatur + " °C"); Serial.print("Luftdruck: "); Serial.println(Luftdruck + " hPa"); Serial.print("Luftfeuchtigkeit: "); Serial.println(Luftfeuchtigkeit + " %"); Serial.print("ungefähre Höhe: "); Serial.println(ungefaehreHoehe + " m"); Serial.println("--------------------------"); // %-LEDs löschen matrix.drawPixel(11, 0, SCHWARZ); matrix.drawPixel(10, 1, SCHWARZ); matrix.drawPixel(9, 0, SCHWARZ); matrix.drawPixel(12, 1, SCHWARZ); matrix.setCursor(0, 2); matrix.setTextColor(BLAU, 0); for (int i = 0; i < Temperatur.length(); i++) { matrix.print(TemperaturGerundet[i]); } // Kreis als %-Zeichen matrix.drawCircle(11, 1, 1,ROT); delay(5000); matrix.drawCircle(11, 1, 1,SCHWARZ); matrix.drawPixel(11, 0, BLAU); matrix.drawPixel(10, 1, BLAU); matrix.drawPixel(9, 0, GELB); matrix.drawPixel(12, 1, GELB); matrix.setCursor(0, 2); matrix.setTextColor(ROT, 0); for (int i = 0; i < 2; i++) { matrix.print(LuftfeuchtigkeitGerundet[i]); } delay(5000); } |
Quellen
Letzte Aktualisierung: