Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

7-Segment-Uhr mit Arduino Nano + DS3231 + LDR

Komponenten und Verbrauchsmaterialien

Arduino Nano R3
funktioniert gut mit Arduino Uno oder Elegoo Uno
× 1
Adafruit 7-Segment Rucksack - 1,2" hohe Ziffern
- 1,2" hohe Ziffern in meinem Fall (optional, wenn Sie das Bundle kaufen)
× 1
Adafruit 1.2 4-stellige 7-Segment-Anzeige mit I2C-Rucksack - Grün
× 1
Adafruit DS3231
oder DS1307, wenn Sie es vorziehen
× 1
Widerstand 100k Ohm
× 1
Fotowiderstand
× 1
Breadboard (generisch)
× 1
Jumper (generisch)
10-14 Stück
× 1
Knopfzellenbatterie CR1220
× 1

Apps und Onlinedienste

Arduino-IDE

Über dieses Projekt

Einführung

In Zeiten, in denen Sie immer eine Uhr am Handgelenk haben, sei es eine Uhr am Handgelenk oder ein Smartphone, ist das Arduino Uno/Nano etwas langweilig. Sie haben ansonsten NTP-Server synchronisierte Geräte in diesem Artikel außerhalb, die über Ihre Internetverbindung ständig online sind.

Geschichte

Einer meiner Freunde lehnte aus persönlichen Gründen ein Gerät mit WiFi-Anschluss in seinem Schlafzimmer ab und so habe ich den Arduino mit einer separaten Uhr ausgestattet.

Wählen Sie das richtige Produkt

Ich war überrascht, wie viele verschiedene Produkte selbst Adafruit zur Verfügung hatte:je nach gewünschter Spannung, sowie mit unterschiedlicher Präzision! Hier habe ich mich für zwei Produkte entschieden:das günstigere DS1307 und das wahrscheinlich genauere DS3231 .

Um es klar zu sagen:Beide Produkte können in dieser Uhr verwendet werden. Achten Sie bei der Nutzung des DS1307 auf die richtige PIN-Belegung und die Einschränkung auf die Temperaturanzeigemöglichkeit:Anmerkung "//" das displayTemp(); Funktion innerhalb der Schleife().

Passen Sie die Skizze an

Ich habe nach einer Skizze gesucht und bei einem anderen Mitglied etwas gefunden. Ich habe diese Skizze umstrukturiert und angepasst, aber die tschechischen Kommentare beibehalten und englische Anmerkungen hinzugefügt.

Die Anzeige sollte möglichst groß sein und so habe ich mich für eine 7-Segment-Anzeige entschieden:Schließlich wollte ich nur die Zeit im Blick haben.

Die nächste positive Überraschung erlebte ich beim Durchsehen der Skizzen:Hier bietet der DS3231 die Option zur Nutzung der Temperatur , die dem DS1307 - neben seiner Ungenauigkeit - fehlt.

Init the Clocks

Wenn Sie eine CR1220-Knopfzellenbatterie haben, können Sie dem kurzen Tutorial von Adafruit zum Einrichten der Uhren folgen. Zusammenfassend wird die Uhrzeit nicht aus dem Internet heruntergeladen, sondern im Laufe der Zeit vom lokalen PC. Der Upload-Zeitstempel wird an die Timer übertragen.

Funktionen

Danach habe ich der Schaltung die LED-Matrix für Zeit- und Temperaturausgabe hinzugefügt . Der Zeitraum für die Zeit- und Temperaturänderung kann über Variablen eingestellt werden.

Insbesondere wie die Ansteuerung der einzelnen - blinkenden - Punkte und Ziffern auf der LED-Matrix funktioniert und angesteuert wird, ist in der Skizze gut beschrieben.

Hier verweise ich auf weitere Adafruit-Quellen.

Abgerundet wird die Skizze durch die Anpassung der Sommer-/Winterzeit und die Helligkeit der LED-Matrix in Abhängigkeit vom Umgebungslicht (Nachts sollte das Display dunkler sein als bei Tageslicht).

Im Video haben Sie sicherlich die Änderung von Zeit und Temperatur bemerkt. Hast du auf den Punkt links im Bild geachtet? Dieser ändert seine Position (nach oben oder unten) in Abhängigkeit von den Sekunden.

Geben Sie mir Feedback, wenn Sie wissen, wie man bei Ausfall der Uhr ein "ERR" auf der LED-Matrix ausgibt. Im Moment erscheint "bEEF":

 // oh nein, keine Daten! Serial.println ( "DS3231 Sensorfehler - Temperatur kann nicht gelesen werden"); matrix.print (0xBEEF, HEX); // den Benutzer mit BEEF informieren matrix.writeDisplay(); Verzögerung(5000); 

Erweiterung

Ein Wecker bzw. Weckzeit ist ebenfalls noch nicht integriert.

Eventuell gelingt auch eine Erweiterung per Bluetooth-Modul und Blynk.

Update 01.02.2019:

Der Transfer vom Steckbrett zu einer Dauerwette auf einer Lochkarte ist heute abgeschlossen. Ein paar Bilder für Interessierte:

Im Anhang finden Sie einen aktualisierten Code v1.1 sowie ein angepasstes Frisierbild.

Code

  • MyClock v1.0
  • MyClock v1.1
MyClock v1.0C/C++
// MyClock v1.0// Ingo Lohs// Hardware:getestet mit Arduino Uno und Arduino Nano (ATmega328P [Old Bootloader]) unter Verwendung von Arduino IDE v1.8.8/* Theorie für die Matrix ht16k33Am einfachsten ist es, einfach anzurufen print - genau wie bei Serialprint(variable,HEX) - dies druckt eine hexadezimale Zahl von 0000 bis FFFFprint(variable,DEC) oder print(variable) - dies druckt eine dezimale Ganzzahl von 0000 bis 9999Wenn Sie Wenn Sie mehr Kontrolle benötigen, können Sie writeDigitNum(location, number) aufrufen - dies wird die Nummer (0-9) an einen einzelnen Standort schreiben. Standort #0 ist ganz links, Standort #2 sind die Doppelpunkte, also Sie wahrscheinlich Wenn Sie es überspringen möchten, befindet sich Position 4 ganz rechts. Um den Doppelpunkt und die Dezimalpunkte zu steuern, verwenden Sie die Funktion writeDigitRaw (Position, Bitmap). (Beachten Sie, dass beide Punkte des mittleren Doppelpunkts intern mit dem Display verbunden sind , daher ist eine separate Adressierung nicht möglich.) Geben Sie 2 für die Position an und die Bits werden wie folgt abgebildet:0x02 - Doppelpunkt in der Mitte (beide d ots)0x04 - linker Doppelpunkt - unterer Punkt0x08 - linker Doppelpunkt - oberer Punkt0x10 - DezimalpunktWenn Sie einen Dezimalpunkt wünschen, rufen Sie writeDigitNum(location, number, true) auf, der den Dezimalpunkt zeichnet. Um den Doppelpunkt zu zeichnen, verwenden Sie drawColon(true or false)Wenn Sie die vollständige Kontrolle über die Segmente in allen Ziffern haben möchten, können Sie writeDigitRaw(location,bitmask) aufrufen, um eine rohe 8-Bit-Maske (wie in einem uint8_t gespeichert) an eine beliebige Position zu zeichnen. Alle Zeichenroutinen ändern nur die Anzeige Speicher vom Arduino gehalten. Vergessen Sie nicht, nach dem Zeichnen writeDisplay() aufzurufen, um den Speicher über I2C in die Matrix zu „speichern“. Quelle:https://www.mouser.com/ds/2/737/adafruit-led-backpack-932846. pdf*/#include  // Aktivieren Sie diese Zeile, wenn Sie Arduino Uno, Mega usw. verwenden.#include #include "Adafruit_LEDBackpack.h"#define DS3231_I2C_ADDRESS 0x68int ldr_sensor =A0; // LDR-Fotowiderstand mit 100k Ohm zu GND, anderer Schenkel 5Vint ldr_value =0; // LDR-Wert - var Wert speichernint bright_matrix; // LED-Matrix-Helligkeit - var Wert speichernint threshold_brightness =400; // Schwellenwert blinkrate_value =0; // LED-Matrix blinkt rateint delay_matrix_time =20; // wie lange Anzeigezeit (20 Sek.)int delay_matrix_temp =2000; // wie lange Anzeigetemperatur (2 Sek.)int blinky_dot =2; // blinkt nichts - auf der linken Seite 2 einzelne PunkteAdafruit_7segment matrix =Adafruit_7segment();byte decToBcd(byte val){return ( (val/10*16) + (val%10) );}byte bcdToDec(byte val){ return ((val/16*10) + (val%16));}void setup() { Serial.begin (9600); Wire.begin(); matrix.begin(0x70);}void loop() { lightBrightness(); // Matrix-Helligkeitsjustierung matrixBlinkrate(); // Mattrix-Blinkrate Jusitierung displayTime(); // die Echtzeituhrdaten anzeigen displayTemp (); // Temperatur anzeigen }void lightBrightness() {// setBrightness(brighness) - Damit können Sie die Gesamthelligkeit des gesamten Displays ändern. 0 ist am wenigsten hell, 15 ist am hellsten und wird vom Display beim Starten initialisiert ldr_value =analogRead(ldr_sensor); Serial.print("LDR:"); Serial.println (ldr_value); if (ldr_value <=threshold_brightness) {// Messung der Helligkeit vs Threshold bright_matrix =0; // hell bei Tageslicht} else { Brightness_matrix =15; // nachts dunkel }}void matrixBlinkrate () {// blinkRate (rate) - Sie können das gesamte Display blinken lassen. 0 blinkt nicht. 1, 2 oder 3 ist für das Blinken der Anzeige. matrix.blinkRate(blinkrate_value);} void displayTime(){matrix.setBrightness(brightness_matrix); matrix.clear(); // wie lange Anzeigezeit auf der Matrix in Sekundenfor (uint16_t i =0; i > Umstellung auf Sommerzeit - letzter Sonntag im März um 2 Uhr if ((dayOfWeek ==7) &&(dayOfMonth>=25)&&(month ==3) &&(Stunde ==2)) { // nastavení hodin na 3 hodinu // die Uhr auf 3 Stunden stellen setDS3231time(se,mi,3,we,dm,mo,ye); } // změna času na zimní //>> Wechsel auf Winterzeit if ((dayOfWeek ==7) &&(dayOfMonth>=25) &&(Monat ==10) &&(Stunde ==1)&&(Jahr !=1 )) { // rok použit jako indikace, že bylo léto // Jahr als Hinweis auf Sommer setDS3231time(se,mi,ho,we,dm,mo,1); } if ((dayOfWeek ==7) &&(dayOfMonth>=25) &&(Monat ==10) &&(Stunde ==3) &&(Jahr ==1)) { // nastavení hodin na 2 hodinu a příznak na 0 // Uhr auf 2 Stunden einstellen und Jahr auf 0 setzen setDS3231time (se,mi,2,we,dm,mo,0); } /* Geben Sie 2 für die Position an und die Bits werden wie folgt zugeordnet:0x02 - mittlerer Doppelpunkt (beide Punkte) 0x04 - linker Doppelpunkt - unterer Punkt 0x08 - linker Doppelpunkt - oberer Punkt 0x10 - Dezimalpunkt */ /* Steuerelemente für Position #2 auch die linken 2 einzelne Punkte wie folgt (=blinky_dot):2 =blinkt nichts 3 =blinkt nichts 4 =blinkt oben links (einzelner oberer Punkt) 5 =blinkt oben links (einzelner oberer Punkt) 6 =blinkt oben links (einzelner oberer Punkt) ) + beide Doppelpunkte in der Mitte 7 =blinkt oben links (einzelner oberer Punkt) + beide Doppelpunkte in der Mitte 8 =blinkt unten links (einzelner unterer Punkt) 9 =blinkt unten links (einzelner unterer Punkt) 10 =blinkt unten links (einzelner unterer Punkt .) ) + beide Doppelpunkte in der Mitte 11 =blinkt unten links (einzelner unterer Punkt) + beide Doppelpunkte in der Mitte 12 =beide blinken Doppelpunkt (beide einzelne Punkte links) ohne beide Doppelpunkte in der Mitte */ // Format Stunden:_0:mm if (Stunde> 9) { Matrix.writeDigitNum (0, (Stunde / 10), falsch); matrix.writeDigitNum(1, (Stunde % 10), false); // dies wird die Zahl (0-9) an einen einzelnen Ort schreiben, indem Modulo verwendet wird https://www.arduino.cc/reference/en/language/structure/arithmetic-operators/modulo/} else { matrix.writeDigitNum( 1, Stunde, falsch); } // Matrix.drawColon(true); // beide Doppelpunkte in der Mitte aktiv:Falls Sie die Punkte links nicht blinken möchten, können Sie die beiden Doppelpunkte hier aktivieren // Sekunden eine Chance geben, an der linken Position Punkte anzuzeigen if (se <=30) { blinky_dot =10; // blinkt unten links (einzelner unterer Punkt) + beide Doppelpunkte in der Mitte} else if (se> 30) {blinky_dot =6; // blinkt oben links (einzelner oberer Punkt) + beide Doppelpunkte in der Mitte} matrix.writeDigitRaw(2, blinky_dot); matrix.writeDigitNum(3, (Minute / 10), falsch); matrix.writeDigitNum(4, (Minute % 10), false); matrix.writeDisplay(); // blinkende Doppelpunkte für halbe Sekunden Verzögerung (500); matrix.drawColon(false); matrix.writeDisplay(); Verzögerung (500); }}void displayTemp () {matrix.setBrightness (brightness_matrix); Matrix.clear(); Byte-Temp =get3231Temp(); int abs_temp =abs(temp); // absolute Zahl eines Wertes matrix.writeDigitNum(1,(abs_temp % 10), false); // Position 1, Wert 9, Dezimalanzeige anzeigen) if (temp <0) matrix.writeDigitRaw(0,64); if (temp <=-10) matrix.writeDigitRaw(2,12); // und wenn die Temperatur negativ ist, tragen wir das Minuszeichen an die erste Stelle. if (temp>
=10) matrix.writeDigitNum(0, (abs_temp/10), false); // Position 0, Wert 1, Dezimalzahl anzeigen) if (temp <=-10) matrix.writeDigitNum(0, (abs_temp/10), false); // Position 0, Wert 1, Dezimal anzeigen) // matrix.writeDigitRaw(2,0x10); // Dezimalpunktmatrix.writeDigitRaw(3,99); // 99 ="°" matrix.writeDigitRaw(4,57); // 57 ="C" matrix.writeDisplay(); // zeigt Temperaturwerte auf der seriellen Leitung an // zobrazí hodnoty teploty na seriove lince Serial.print ( "Temperatur in C:"); Serial.println (get3231Temp()); // +/- 3 Grad Celsius // wie lange Anzeigetemperatur auf Matrix in Sekunden delay(delay_matrix_temp);}void setDS3231time(Byte Sekunde, Byte Minute, Byte Stunde, Byte DayOfWeek, Byte DayOfMonth, Byte Monat, Byte Jahr){/ / Zeit- und Datumsdaten auf DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS) einstellen; Wire.write(0); // nächsten Eingang setzen, um beim Sekundenregister zu beginnen Wire.write (decToBcd (second)); // Sekunden setzen Wire.write (decToBcd (Minute)); // Minuten einstellen Wire.write (decToBcd (hour)); // Stunden setzen Wire.write (decToBcd (dayOfWeek)); // Wochentag einstellen (1=Sonntag, 7=Samstag) Wire.write(decToBcd(dayOfMonth)); // Datum einstellen (1 bis 31) Wire.write (decToBcd (Monat)); // Monat setzen Wire.write (decToBcd (Jahr)); // set year (0 bis 99) Wire.endTransmission();}void getDateDs3231(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year){ Wire. beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); *zweite =bcdToDec(Wire.read() &0x7f); *Minute =bcdToDec(Wire.read()); *Stunde =bcdToDec(Wire.read() &0x3f); *dayOfWeek =bcdToDec(Wire.read()); *dayOfMonth =bcdToDec(Wire.read()); *Monat =bcdToDec(Wire.read()); *Jahr =bcdToDec(Wire.read());}float get3231Temp(){ byte tMSB, tLSB; Schwimmertemp3231; Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write (0x11); Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 2); if (Wire.available()) {tMSB =Wire.read(); // 2er Komplement int Teil tLSB =Wire.read(); // Fraktionsanteil temp3231 =(tMSB &B01111111); // mach 2 auf Tmsb temp3231 +=( (tLSB>> 6) * 0.25 ); // Kümmere dich nur um die Bits 7 &8 return temp3231; } else { // oh nein, keine Daten! Serial.println ( "DS3231 Sensorfehler - Temperatur kann nicht gelesen werden"); matrix.print (0xBEEF, HEX); // den Benutzer mit BEEF informieren matrix.writeDisplay(); Verzögerung (5000); } }
MyClock v1.1C/C++
Update Summer/Winter-Time
// MyClock v1.1// Ingo Lohs// Hardware:getestet mit Arduino Uno und Arduino Nano (ATmega328P [Old Bootloader]) mit Arduino IDE v1.8.8// Change v1.0> v1.1// dayOfWeek ==1 statt 7 abgeändert in displayTime() zur korrekten Ermittlung des Sonntages für die Zeitumstellung/* Theory for the Matrix ht16k33Am einfachsten rufen Sie einfach print auf - genau wie bei Serialprint(variable,HEX) - dies druckt eine hexadezimale Zahl von 0000 bis FFFFprint(variable,DEC) oder print(variable) - dies druckt eine dezimale ganze Zahl von 0000 bis 9999Wenn Sie mehr Kontrolle benötigen, können Sie writeDigitNum(location, number) aufrufen. - Dadurch wird die Zahl (0-9) an einen einzelnen Ort geschrieben. Ort # 0 ist ganz links, Ort 2 ist der Doppelpunkt, also möchten Sie ihn wahrscheinlich überspringen, Ort 4 ist ganz nach rechts. Um den Doppelpunkt und die Dezimalpunkte zu steuern, verwenden Sie die Funktion writeDigitRaw(location, bitmap). (Beachten Sie, dass beide Punkte des mittleren Doppelpunkts miteinander verbunden sind Sie sind nicht separat ansprechbar.) Geben Sie 2 für die Position an und die Bits werden wie folgt abgebildet:0x02 - mittlerer Doppelpunkt (beide Punkte)0x04 - linker Doppelpunkt - unterer Punkt0x08 - linker Doppelpunkt - oberer Punkt0x10 - DezimalpunktWenn Sie einen Dezimalpunkt haben möchten, rufen Sie writeDigitNum(location, number, true) auf, wodurch der Dezimalpunkt gezeichnet wird. Um den Doppelpunkt zu zeichnen, verwenden Sie drawColon(true oder false).Wenn Sie die vollständige Kontrolle über die Segmente in allen Ziffern haben möchten, kann writeDigitRaw(location,bitmask) aufrufen, um eine rohe 8-Bit-Maske (wie in einem uint8_t gespeichert) an einen beliebigen Ort zu zeichnen. Alle Zeichenroutinen ändern nur den Anzeigespeicher, der vom Arduino gehalten wird. Vergessen Sie nicht, nach dem Zeichnen writeDisplay() aufzurufen, um den Speicher über I2C in die Matrix zu „speichern“. Quelle:https://www.mouser.com/ds/2/737/adafruit-led-backpack-932846. pdf*/#include  // Aktivieren Sie diese Zeile, wenn Sie Arduino Uno, Mega usw. verwenden.#include #include "Adafruit_LEDBackpack.h"#define DS3231_I2C_ADDRESS 0x68int ldr_sensor =A0; // LDR-Fotowiderstand mit 100k Ohm zu GND, anderer Schenkel 5Vint ldr_value =0; // LDR-Wert - var Wert speichernint bright_matrix; // LED-Matrix-Helligkeit - var Wert speichernint threshold_brightness =400; // Schwellenwert blinkrate_value =0; // LED-Matrix blinkt rateint delay_matrix_time =20; // wie lange Anzeigezeit (20 Sek.)int delay_matrix_temp =2000; // wie lange Anzeigetemperatur (2 Sek.)int blinky_dot =2; // blinkt nichts - auf der linken Seite 2 einzelne PunkteAdafruit_7segment matrix =Adafruit_7segment();byte decToBcd(byte val){return ( (val/10*16) + (val%10) );}byte bcdToDec(byte val){ return ((val/16*10) + (val%16));}void setup() { Serial.begin (9600); Wire.begin(); matrix.begin(0x70);}void loop() { lightBrightness(); // Matrix-Helligkeitsjustierung matrixBlinkrate(); // Mattrix-Blinkrate Jusitierung displayTime(); // die Echtzeituhrdaten anzeigen displayTemp (); // Temperatur anzeigen }void lightBrightness() {// setBrightness(brighness) - Damit können Sie die Gesamthelligkeit des gesamten Displays ändern. 0 ist am wenigsten hell, 15 ist am hellsten und wird vom Display beim Starten initialisiert ldr_value =analogRead(ldr_sensor); Serial.print("LDR:"); Serial.println (ldr_value); if (ldr_value <=threshold_brightness) {// Messung der Helligkeit vs Threshold bright_matrix =0; // hell bei Tageslicht} else { Brightness_matrix =15; // nachts dunkel }}void matrixBlinkrate () {// blinkRate (rate) - Sie können das gesamte Display blinken lassen. 0 blinkt nicht. 1, 2 oder 3 ist für das Blinken der Anzeige. matrix.blinkRate(blinkrate_value);} void displayTime(){matrix.setBrightness(brightness_matrix); matrix.clear(); // wie lange Anzeigezeit auf der Matrix in Sekundenfor (uint16_t i =0; i > Umstellung auf Sommerzeit - letzter Sonntag im März um 2 Uhr if ((dayOfWeek ==1) &&(dayOfMonth>=25)&&(month ==3) &&(Stunde ==2)) { // nastavení hodin na 3 hodinu // die Uhr auf 3 Stunden stellen setDS3231time(se,mi,3,we,dm,mo,ye); } // změna času na zimní //>> Wechsel auf Winterzeit if ((dayOfWeek ==1) &&(dayOfMonth>=25) &&(Monat ==10) &&(Stunde ==1)&&(Jahr !=1 )) { // rok použit jako indikace, že bylo léto // Jahr als Hinweis auf Sommer setDS3231time(se,mi,ho,we,dm,mo,1); } if ((dayOfWeek ==1) &&(dayOfMonth>=25) &&(Monat ==10) &&(Stunde ==3) &&(Jahr ==1)) { // nastavení hodin na 2 hodinu a příznak na 0 // Uhr auf 2 Stunden einstellen und Jahr auf 0 setzen setDS3231time (se,mi,2,we,dm,mo,0); } /* Geben Sie 2 für die Position an und die Bits werden wie folgt zugeordnet:0x02 - mittlerer Doppelpunkt (beide Punkte) 0x04 - linker Doppelpunkt - unterer Punkt 0x08 - linker Doppelpunkt - oberer Punkt 0x10 - Dezimalpunkt */ /* Steuerelemente für Position #2 auch die linken 2 einzelne Punkte wie folgt (=blinky_dot):2 =blinkt nichts 3 =blinkt nichts 4 =blinkt oben links (einzelner oberer Punkt) 5 =blinkt oben links (einzelner oberer Punkt) 6 =blinkt oben links (einzelner oberer Punkt) ) + beide Doppelpunkte in der Mitte 7 =blinkt oben links (einzelner oberer Punkt) + beide Doppelpunkte in der Mitte 8 =blinkt unten links (einzelner unterer Punkt) 9 =blinkt unten links (einzelner unterer Punkt) 10 =blinkt unten links (einzelner unterer Punkt .) ) + beide Doppelpunkte in der Mitte 11 =blinkt unten links (einzelner unterer Punkt) + beide Doppelpunkte in der Mitte 12 =beide blinken Doppelpunkt (beide einzelne Punkte links) ohne beide Doppelpunkte in der Mitte */ // Format Stunden:_0:mm if (Stunde> 9) { Matrix.writeDigitNum (0, (Stunde / 10), falsch); matrix.writeDigitNum(1, (Stunde % 10), false); // dies wird die Zahl (0-9) an einen einzelnen Ort schreiben, indem Modulo verwendet wird https://www.arduino.cc/reference/en/language/structure/arithmetic-operators/modulo/} else { matrix.writeDigitNum( 1, Stunde, falsch); } // Matrix.drawColon(true); // beide Doppelpunkte in der Mitte aktiv:Falls Sie die Punkte links nicht blinken möchten, können Sie die beiden Doppelpunkte hier aktivieren // Sekunden eine Chance geben, an der linken Position Punkte anzuzeigen if (se <=30) { blinky_dot =10; // blinkt unten links (einzelner unterer Punkt) + beide Doppelpunkte in der Mitte} else if (se> 30) {blinky_dot =6; // blinkt oben links (einzelner oberer Punkt) + beide Doppelpunkte in der Mitte} matrix.writeDigitRaw(2, blinky_dot); matrix.writeDigitNum(3, (Minute / 10), falsch); matrix.writeDigitNum(4, (Minute % 10), false); matrix.writeDisplay(); // blinkende Doppelpunkte für halbe Sekunden Verzögerung (500); matrix.drawColon(false); matrix.writeDisplay(); Verzögerung (500); }}void displayTemp () {matrix.setBrightness (brightness_matrix); Matrix.clear(); Byte-Temp =get3231Temp(); int abs_temp =abs(temp); // absolute Zahl eines Wertes matrix.writeDigitNum(1,(abs_temp % 10), false); // Position 1, Wert 9, Dezimalanzeige anzeigen) if (temp <0) matrix.writeDigitRaw(0,64); if (temp <=-10) matrix.writeDigitRaw(2,12); // und wenn die Temperatur negativ ist, tragen wir das Minuszeichen an die erste Stelle. if (temp>
=10) matrix.writeDigitNum(0, (abs_temp/10), false); // Position 0, Wert 1, Dezimalzahl anzeigen) if (temp <=-10) matrix.writeDigitNum(0, (abs_temp/10), false); // Position 0, Wert 1, Dezimal anzeigen) // matrix.writeDigitRaw(2,0x10); // Dezimalpunktmatrix.writeDigitRaw(3,99); // 99 ="°" matrix.writeDigitRaw(4,57); // 57 ="C" matrix.writeDisplay(); // zeigt Temperaturwerte auf der seriellen Leitung an // zobrazí hodnoty teploty na seriove lince Serial.print ( "Temperatur in C:"); Serial.println (get3231Temp()); // +/- 3 Grad Celsius // wie lange Anzeigetemperatur auf Matrix in Sekunden delay(delay_matrix_temp);}void setDS3231time(Byte Sekunde, Byte Minute, Byte Stunde, Byte DayOfWeek, Byte DayOfMonth, Byte Monat, Byte Jahr){/ / Zeit- und Datumsdaten auf DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS) einstellen; Wire.write(0); // nächsten Eingang setzen, um beim Sekundenregister zu beginnen Wire.write (decToBcd (second)); // Sekunden setzen Wire.write (decToBcd (Minute)); // Minuten einstellen Wire.write (decToBcd (hour)); // Stunden setzen Wire.write (decToBcd (dayOfWeek)); // Wochentag einstellen (1=Sonntag, 7=Samstag) Wire.write(decToBcd(dayOfMonth)); // Datum einstellen (1 bis 31) Wire.write (decToBcd (Monat)); // Monat setzen Wire.write (decToBcd (Jahr)); // set year (0 bis 99) Wire.endTransmission();}void getDateDs3231(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year){ Wire. beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); *zweite =bcdToDec(Wire.read() &0x7f); *Minute =bcdToDec(Wire.read()); *Stunde =bcdToDec(Wire.read() &0x3f); *dayOfWeek =bcdToDec(Wire.read()); *dayOfMonth =bcdToDec(Wire.read()); *Monat =bcdToDec(Wire.read()); *Jahr =bcdToDec(Wire.read());}float get3231Temp(){ byte tMSB, tLSB; Schwimmertemp3231; Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write (0x11); Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 2); if (Wire.available()) {tMSB =Wire.read(); // 2er Komplement int Teil tLSB =Wire.read(); // Fraktionsanteil temp3231 =(tMSB &B01111111); // mach 2 auf Tmsb temp3231 +=( (tLSB>> 6) * 0.25 ); // Kümmere dich nur um die Bits 7 &8 return temp3231; } else { // oh nein, keine Daten! Serial.println ( "DS3231 Sensorfehler - Temperatur kann nicht gelesen werden"); matrix.print (0xBEEF, HEX); // den Benutzer mit BEEF informieren matrix.writeDisplay(); Verzögerung (5000); } }
Github
https://github.com/ILohs/MySketches

Schaltpläne

LDR-Pfad korrigiert

Herstellungsprozess

  1. Arduino-Pov-Vision-Uhr
  2. DIY einfachste IV9 Numitron-Uhr mit Arduino
  3. Einfache Wanduhr mit Adafruit 1/4 60 Ring Neopixel
  4. Arduino-Uhr mit islamischen Gebetszeiten
  5. Hauptuhr
  6. Arduino-Temp. Monitor und Echtzeituhr mit 3.2 Display
  7. Arduino Nano:Steuerung von 2 Schrittmotoren mit Joystick
  8. Arduino Apple Watch
  9. 7-Segment-Array-Uhr
  10. Einfacher Wecker mit DS1302 RTC