Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

7-segments klok met Arduino Nano + DS3231 + LDR

Componenten en benodigdheden

Arduino Nano R3
werkt goed met Arduino Uno of Elegoo Uno
× 1
Adafruit 7-segments rugzak - 1,2" hoge cijfers
- 1.2" Tall Digits in mijn geval (optioneel als je de bundel koopt)
× 1
Adafruit 1.2 4-cijferig 7-segments display met I2C-rugzak - Groen
× 1
Adafruit DS3231
of DS1307 als je dat liever hebt
× 1
Weerstand 100k ohm
× 1
Fotoweerstand
× 1
Broodplank (algemeen)
× 1
Jumperdraden (algemeen)
10-14 stuks
× 1
Knoopcelbatterij CR1220
× 1

Apps en online services

Arduino IDE

Over dit project

Inleiding

In tijden waarin je altijd een klok om je pols hebt, of het nu een horloge om je pols is of een smartphone, is de Arduino Uno/Nano een beetje saai. Je hebt anders met NTP-server gesynchroniseerde apparaten in dit artikel buiten, die constant online zijn via je internetverbinding.

Verhaal

Een van mijn vrienden weigerde om persoonlijke redenen een apparaat met wifi-verbinding in zijn slaapkamer en dus heb ik de Arduino uitgerust met een aparte klok.

Kies het juiste product

Ik was verrast hoeveel verschillende producten zelfs Adafruit beschikbaar had:afhankelijk van de gewenste spanning, maar ook met verschillende precisie! Hier heb ik gekozen voor twee producten:de goedkopere DS1307 en de waarschijnlijk nauwkeuriger DS3231 .

Voor alle duidelijkheid:beide producten kunnen in deze klok gebruikt worden. Let bij het gebruik van de DS1307 op de juiste PIN-toewijzing en de beperking tot de optie temperatuurweergave:opmerking "//" de displayTemp(); functie binnen de lus().

Pas de schets aan

Ik ging op zoek naar een schets en vond iets bij een ander lid. Ik heb deze schets geherstructureerd en aangepast, maar de Tsjechische opmerkingen behouden en Engelse opmerkingen toegevoegd.

De advertentie moest zo groot mogelijk zijn en dus koos ik voor een advertentie met 7 segmenten:ik wilde tenslotte alleen maar de tijd in gedachten hebben.

De volgende positieve verrassing die ik ervaarde tijdens het bekijken van de schetsen:hier biedt de DS3231 de optie om de temperatuur te gebruiken , die de DS1307 - naast zijn onnauwkeurigheid - mist.

Start de klokken

Als je een CR1220 knoopcelbatterij hebt, kun je de korte tutorial van Adafruit over het instellen van de klokken volgen. Samengevat wordt de tijd niet van internet gedownload, maar na verloop van tijd van de lokale pc. De uploadtijdstempel wordt overgedragen naar de timers.

Functies

Daarna heb ik de LED-matrix toegevoegd aan het circuit voor tijd- en temperatuuroutput . De periode voor de verandering van tijd en temperatuur kan via variabelen worden ingesteld.

Met name hoe de aansturing van de individuele - knipperende - puntjes en cijfers op de LED-matrix werkt en wordt aangestuurd, staat goed beschreven in de schets.

Hier verwijs ik naar meer Adafruit-bronnen.

De schets wordt afgerond door de aanpassing zomer-/wintertijd en de helderheid van de LED-matrix afhankelijk van het omgevingslicht ('s Nachts moet het display donkerder zijn dan bij daglicht).

In de video heb je zeker de verandering van tijd en temperatuur opgemerkt. Heb je goed gelet op het punt links op de foto? Dit verandert zijn positie (omhoog of omlaag) afhankelijk van de seconden.

Geef me feedback als je weet hoe je een "ERR" op de LED-matrix kunt geven in geval van een storing van de klok. Op dit moment verschijnt "bEEF":

 // oh nee, geen gegevens! Serial.println ("DS3231 Sensorfout - kan temperatuur niet lezen"); matrix.print(0xBEEF, HEX); // informeer de gebruiker met BEEF matrix.writeDisplay(); vertraging (5000); 

Uitbreiding

Een alarm of alarmtijd is ook nog niet geïntegreerd.

Mogelijk volgt ook een uitbreiding via Bluetooth-module en Blynk.

Update 01.02.2019:

De overstap van het breadboard naar een vaste inzet op een ponskaart is vandaag afgerond. Een paar foto's voor de geïnteresseerden:

U vindt een bijgewerkte code v1.1 in de bijlage, evenals een aangepaste frizing-afbeelding.

Code

  • MyClock v1.0
  • MyClock v1.1
MyClock v1.0C/C++
// MyClock v1.0// Ingo Lohs// Hardware:getest met Arduino Uno en Arduino Nano (ATmega328P [Old Bootloader]) met behulp van Arduino IDE v1.8.8/* Theorie voor de Matrix ht16k33Het gemakkelijkste is om gewoon te bellen print - net zoals je doet met Serialprint(variable,HEX) - dit zal een hexadecimaal getal afdrukken, van 0000 tot FFFFprint(variable,DEC) of print(variable) - dit zal een decimaal geheel getal afdrukken, van 0000 tot 9999Als je meer controle nodig hebt, kunt u writeDigitNum (locatie, nummer) aanroepen - dit zal het nummer (0-9) naar een enkele locatie schrijven. Locatie # 0 is helemaal naar links, locatie # 2 is de dubbele punt, dus u waarschijnlijk Als u het wilt overslaan, is locatie #4 helemaal naar rechts. Om de dubbele punt en decimale punten te regelen, gebruikt u de functie writeDigitRaw (locatie, bitmap). (Merk op dat beide punten van de middelste dubbele punt intern op het scherm met elkaar zijn verbonden , dus het is niet mogelijk om ze afzonderlijk te adresseren.) Specificeer 2 voor de locatie en de bits worden als volgt toegewezen:0x02 - middelste dubbele punt (beide d ots)0x04 - linker dubbele punt - onderste punt0x08 - linker dubbele punt - bovenste punt0x10 - decimaalteken Als u een decimaalteken wilt, roept u writeDigitNum (locatie, getal, waar) aan, dat de komma tekent. Om de dubbele punt te tekenen, gebruikt u drawColon (true of false)Als u volledige controle over de segmenten in alle cijfers wilt, kunt u writeDigitRaw(location,bitmask) aanroepen om een ​​onbewerkt 8-bits masker (zoals opgeslagen in een uint8_t) naar een willekeurige locatie te tekenen. Alle tekenroutines veranderen alleen de weergave geheugen bewaard door de Arduino. Vergeet niet om writeDisplay() aan te roepen na het tekenen om het geheugen via I2C naar de matrix te 'opslaan'. Bron:https://www.mouser.com/ds/2/737/adafruit-led-backpack-932846. pdf*/#include  // Schakel deze regel in bij gebruik van Arduino Uno, Mega, etc.#include #include "Adafruit_LEDBackpack.h"#define DS3231_I2C_ADDRESS 0x68int ldr_sensor =A0; // LDR-fotoweerstand met 100k Ohm naar GND, ander been 5Vint ldr_value =0; // LDR-waarde - var store valueint helderheid_matrix; // LED Matrix helderheid - var store valueint threshold_brightness =400; // Thresholdint blinkrate_value =0; // LED Matrix knippert rateint delay_matrix_time =20; // hoe lang weergavetijd (20 sec) int delay_matrix_temp =2000; // hoe lang display temp (2 sec)int blinky_dot =2; // knippert niets - aan de linkerkant 2 enkele stippenAdafruit_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); Draad.begin(); matrix.begin(0x70);}void loop() { lightBrightness(); // Matrix-Helderheid Justierung matrixBlinkrate(); // Matrix-Blinkrate Justitierung displayTime(); // toon de real-time klokgegevens displayTemp (); // toon de temperatuur }void lightBrightness() {// setBrightness(brighness) - hiermee kunt u de algehele helderheid van het gehele scherm wijzigen. 0 is het minst helder, 15 is het helderst en wordt geïnitialiseerd door het display wanneer u start ldr_value =analogRead(ldr_sensor); Serial.print("LDR:"); Serial.println(ldr_value); if (ldr_value <=threshold_brightness) {// meting van helderheid versus drempel helderheid_matrix =0; // helder bij daglicht } else { helderheid_matrix =15; // 's nachts donker }}void matrixBlinkrate() {// blinkRate(rate) - U kunt het hele scherm laten knipperen. 0 knippert niet. 1, 2 of 3 is voor het knipperen van het display. matrix.blinkRate(blinkrate_value);} void displayTime(){matrix.setBrightness(brightness_matrix); matrix.clear();// hoe lang weergavetijd op matrix in secondenfor (uint16_t i =0; i > Wijziging naar zomertijd - afgelopen zondag in maart om 2 uur if ((dayOfWeek ==7) &&(dayOfMonth>=25)&&(maand ==3) &&(uur ==2)) {// nastavení hodin na 3 hodinu // zet de klok op 3 uur setDS3231time(se,mi,3,we,dm,mo,ye); } // změna času na zimní //>> Wijzig naar wintertijd if ((dayOfWeek ==7) &&(dayOfMonth>=25) &&(maand ==10) &&(uur ==1)&&(jaar !=1 )) { // rok použit jako indikace, že bylo léto // jaar gebruikt als een indicatie dat het zomer was DS3231time(se,mi,ho,we,dm,mo,1); } if ((dayOfWeek ==7) &&(dayOfMonth>=25) &&(maand ==10) &&(hour ==3) &&(year ==1)) { // nastavení hodin op 2 hodinu a příznak na 0 // zet de klok op 2 uur en markeer het jaar op 0 setDS3231time (se,mi,2,we,dm,mo,0); } /* Specificeer 2 voor de locatie en de bits worden als volgt toegewezen:0x02 - middelste dubbele punt (beide punten) 0x04 - linker dubbele punt - onderste punt 0x08 - linker dubbele punt - bovenste punt 0x10 - decimale punt */ /* locatie #2 besturingselementen ook de linker 2 enkele punten zoals deze (=blinky_dot):2 =knippert niets 3 =knippert niets 4 =knippert linksboven (enkele bovenste stip) 5 =knippert linksboven (enkele bovenste stip) 6 =knippert linksboven (enkele bovenste stip) ) + beide dubbele punt midden 7 =knippert linksboven (enkele bovenste stip) + beide dubbele punt midden 8 =knippert linksonder (enkele onderste stip) 9 =knippert linksonder (enkele onderste stip) 10 =knippert linksonder (enkele onderste stip) ) + beide dubbele punt midden 11 =knippert linksonder (enkele onderste stip) + beide dubbele punt midden 12 =knippert beide dubbele punt (beide enkele stippen links) zonder beide dubbele punt midden */ // formaat uren:_0:mm als (uur> 9) { matrix.writeDigitNum(0, (uur/10), false); matrix.writeDigitNum(1, (uur % 10), false); // dit zal het nummer (0-9) naar een enkele locatie schrijven met behulp van modulo https://www.arduino.cc/reference/en/language/structure/arithmetic-operators/modulo/ } else { matrix.writeDigitNum( 1, uur, onwaar); } // matrix.drawColon(true); // beide dubbele punt midden actief:als je de puntjes links niet wilt laten knipperen, kun je de beide dubbele punten hier activeren // geef seconden de kans om stippen op de linker locatie te laten zien als (se <=30) { blinky_dot =10; // knippert linksonder (enkele onderste stip) + beide dubbele punt in het midden } else if (se> 30) { blinky_dot =6; // knippert linksboven (enkele bovenste punt) + beide dubbele punt in het midden } matrix.writeDigitRaw (2, blinky_dot); matrix.writeDigitNum(3, (minuut/10), false); matrix.writeDigitNum(4, (minuut % 10), false); matrix.writeDisplay(); // knipperende dubbele stippen voor een vertraging van een halve seconde (500); matrix.drawColon(false); matrix.writeDisplay(); vertraging (500); }}void displayTemp(){matrix.setBrightness(brightness_matrix); matrix.clear(); bytetemp =get3231Temp(); int abs_temp =abs(temp); // absoluut getal van een waarde matrix.writeDigitNum(1,(abs_temp % 10), false); // positie 1, waarde 9, toon decimaal) if (temp <0) matrix.writeDigitRaw(0,64); if (temp <=-10) matrix.writeDigitRaw(2,12); // en als de temperatuur negatief is, zetten we het minteken op de eerste plaats. if (temp>
=10) matrix.writeDigitNum(0, (abs_temp/10), false); // positie 0, waarde 1, toon decimaal) if (temp <=-10) matrix.writeDigitNum (0, (abs_temp/10), false); // positie 0, waarde 1, toon decimaal) // matrix.writeDigitRaw (2,0x10); // decimale puntmatrix.writeDigitRaw (3,99); // 99 ="°" matrix.writeDigitRaw(4,57); // 57 ="C" matrix.writeDisplay(); // geeft temperatuurwaarden weer op de seriële regel // zobrazí hodnoty teploty na seriove lince Serial.print ("Temperatur in C:"); Serial.println(get3231Temp()); // +/- 3 Grad Celsius // hoe lang weergavetemp op matrix in seconden vertraging (delay_matrix_temp);} ongeldig setDS3231time (byte seconde, byte minuut, byte uur, byte dayOfWeek, byte dayOfMonth, byte maand, byte jaar){ / / stel tijd- en datumgegevens in op DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Draad.schrijven(0); // stel de volgende invoer in om te beginnen bij het secondenregister Wire.write (decToBcd (second)); // stel seconden in Wire.write (decToBcd (minuut)); // minuten instellen Wire.write (decToBcd (uur)); // stel uren in Wire.write (decToBcd (dayOfWeek)); // dag van de week instellen (1 =zondag, 7 =zaterdag) Wire.write (decToBcd (dayOfMonth)); // datum instellen (1 tot 31) Wire.write (decToBcd (maand)); // set maand Wire.write (decToBcd (jaar)); // set jaar (0 tot 99) Wire.endTransmission();}void getDateDs3231(byte *seconde, byte *minuut, byte *uur, byte *dayOfWeek, byte *dayOfMonth, byte *maand, byte *jaar){ Wire. beginTransmission (DS3231_I2C_ADDRESS); Draad.schrijven(0); Wire.endTransmission(); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); *seconde =bcdToDec(Wire.read() &0x7f); *minuut =bcdToDec(Wire.read()); *uur =bcdToDec(Wire.read() &0x3f); *dayOfWeek =bcdToDec(Wire.read()); *dayOfMonth =bcdToDec(Wire.read()); *maand =bcdToDec(Wire.read()); *jaar =bcdToDec(Wire.read());}float get3231Temp(){ byte tMSB, tLSB; vlottertemp3231; Wire.beginTransmission (DS3231_I2C_ADDRESS); Draad.schrijven (0x11); Wire.endTransmission(); Wire.requestFrom (DS3231_I2C_ADDRESS, 2); if (Wire.available()) { tMSB =Wire.read(); // 2's complement int gedeelte tLSB =Wire.read(); // fractie portie temp3231 =(tMSB &B01111111); // doe 2's wiskunde op Tmsb temp3231 +=( (tLSB>> 6) * 0.25 ); // geef alleen om bits 7 &8 return temp3231; } else { // oh nee, geen gegevens! Serial.println ("DS3231 Sensorfout - kan temperatuur niet lezen"); matrix.print(0xBEEF, HEX); // informeer de gebruiker met BEEF matrix.writeDisplay(); vertraging (5000); } }
MyClock v1.1C/C++
Update zomer/wintertijd
// MyClock v1.1// Ingo Lohs// Hardware:getest met Arduino Uno en Arduino Nano (ATmega328P [Old Bootloader]) met behulp van Arduino IDE v1.8.8// Change v1.0> v1.1// dayOfWeek ==1 anstatt 7 abgeändert in displayTime() zur korrekten Ermittlung des Sonntages für die Zeitumstellung/* Theorie voor de Matrix ht16k33Het gemakkelijkst is om gewoon print te bellen - net zoals je doet met Serialprint(variable,HEX) - dit zal een hexadecimaal getal afdrukken, van 0000 tot FFFFprint(variabel,DEC) of print(variabel) - dit zal een decimaal geheel getal afdrukken, van 0000 tot 9999Als u meer controle nodig heeft, kunt u writeDigitNum (locatie, nummer) aanroepen - dit zal het nummer (0-9) naar een enkele locatie schrijven. Locatie #0 is helemaal naar links, locatie #2 is de dubbele punt, dus u wilt het waarschijnlijk overslaan, locatie #4 is helemaal naar rechts. Om de dubbele punt en decimale punten te regelen, gebruikt u de functie writeDigitRaw (locatie, bitmap). (Merk op dat beide punten van de middelste dubbele punt in intern aan het display, dus het is niet mogelijk om ze afzonderlijk te adresseren.) Specificeer 2 voor de locatie en de bits worden als volgt toegewezen:0x02 - middelste dubbele punt (beide punten)0x04 - linker dubbele punt - onderste punt0x08 - linker dubbele punt - bovenste punt0x10 - decimaalteken Als u een decimaalteken wilt, roept u writeDigitNum (locatie, getal, waar) aan, dat het decimaalteken zal schilderen. Om de dubbele punt te tekenen, gebruikt u drawColon (waar of onwaar). kan writeDigitRaw (locatie, bitmasker) aanroepen om een ​​onbewerkt 8-bits masker (zoals opgeslagen in een uint8_t) naar elke locatie te tekenen. Alle tekenroutines veranderen alleen het weergavegeheugen dat door de Arduino wordt bewaard. Vergeet niet om writeDisplay() aan te roepen na het tekenen om het geheugen via I2C naar de matrix te 'opslaan'. Bron:https://www.mouser.com/ds/2/737/adafruit-led-backpack-932846. pdf*/#include  // Schakel deze regel in bij gebruik van Arduino Uno, Mega, etc.#include #include "Adafruit_LEDBackpack.h"#define DS3231_I2C_ADDRESS 0x68int ldr_sensor =A0; // LDR-fotoweerstand met 100k Ohm naar GND, ander been 5Vint ldr_value =0; // LDR-waarde - var store valueint helderheid_matrix; // LED Matrix helderheid - var store valueint threshold_brightness =400; // Thresholdint blinkrate_value =0; // LED Matrix knippert rateint delay_matrix_time =20; // hoe lang weergavetijd (20 sec) int delay_matrix_temp =2000; // hoe lang display temp (2 sec)int blinky_dot =2; // knippert niets - aan de linkerkant 2 enkele stippenAdafruit_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); Draad.begin(); matrix.begin(0x70);}void loop() { lightBrightness(); // Matrix-Helderheid Justierung matrixBlinkrate(); // Matrix-Blinkrate Justitierung displayTime(); // toon de real-time klokgegevens displayTemp (); // toon de temperatuur }void lightBrightness() {// setBrightness(brighness) - hiermee kunt u de algehele helderheid van het gehele scherm wijzigen. 0 is het minst helder, 15 is het helderst en wordt geïnitialiseerd door het display wanneer u start ldr_value =analogRead(ldr_sensor); Serial.print("LDR:"); Serial.println(ldr_value); if (ldr_value <=threshold_brightness) {// meting van helderheid versus drempel helderheid_matrix =0; // helder bij daglicht } else { helderheid_matrix =15; // 's nachts donker }}void matrixBlinkrate() {// blinkRate(rate) - U kunt het hele scherm laten knipperen. 0 knippert niet. 1, 2 of 3 is voor het knipperen van het display. matrix.blinkRate(blinkrate_value);} void displayTime(){matrix.setBrightness(brightness_matrix); matrix.clear();// hoe lang weergavetijd op matrix in secondenfor (uint16_t i =0; i > Wijziging naar zomertijd - afgelopen zondag in maart om 2 uur if ((dayOfWeek ==1) &&(dayOfMonth>=25)&&(maand ==3) &&(uur ==2)) {// nastavení hodin na 3 hodinu // zet de klok op 3 uur setDS3231time(se,mi,3,we,dm,mo,ye); } // změna času na zimní //>> Wijzigen naar wintertijd if ((dayOfWeek ==1) &&(dayOfMonth>=25) &&(maand ==10) &&(uur ==1)&&(jaar !=1 )) { // rok použit jako indikace, že bylo léto // jaar gebruikt als een indicatie dat het zomer was DS3231time(se,mi,ho,we,dm,mo,1); } if ((dayOfWeek ==1) &&(dayOfMonth>=25) &&(month ==10) &&(hour ==3) &&(year ==1)) { // nastavení hodin na 2 hodinu a příznak na 0 // zet de klok op 2 uur en markeer het jaar op 0 setDS3231time (se,mi,2,we,dm,mo,0); } /* Specificeer 2 voor de locatie en de bits worden als volgt toegewezen:0x02 - middelste dubbele punt (beide punten) 0x04 - linker dubbele punt - onderste punt 0x08 - linker dubbele punt - bovenste punt 0x10 - decimale punt */ /* locatie #2 besturingselementen ook de linker 2 enkele punten zoals deze (=blinky_dot):2 =knippert niets 3 =knippert niets 4 =knippert linksboven (enkele bovenste stip) 5 =knippert linksboven (enkele bovenste stip) 6 =knippert linksboven (enkele bovenste stip) ) + beide dubbele punt midden 7 =knippert linksboven (enkele bovenste stip) + beide dubbele punt midden 8 =knippert linksonder (enkele onderste stip) 9 =knippert linksonder (enkele onderste stip) 10 =knippert linksonder (enkele onderste stip) ) + beide dubbele punt midden 11 =knippert linksonder (enkele onderste stip) + beide dubbele punt midden 12 =knippert beide dubbele punt (beide enkele stippen links) zonder beide dubbele punt midden */ // formaat uren:_0:mm als (uur> 9) { matrix.writeDigitNum(0, (uur/10), false); matrix.writeDigitNum(1, (uur % 10), false); // dit zal het nummer (0-9) naar een enkele locatie schrijven met behulp van modulo https://www.arduino.cc/reference/en/language/structure/arithmetic-operators/modulo/ } else { matrix.writeDigitNum( 1, uur, onwaar); } // matrix.drawColon(true); // beide dubbele punt midden actief:als je de puntjes links niet wilt laten knipperen, kun je de beide dubbele punten hier activeren // geef seconden de kans om stippen op de linker locatie te laten zien als (se <=30) { blinky_dot =10; // knippert linksonder (enkele onderste stip) + beide dubbele punt in het midden } else if (se> 30) { blinky_dot =6; // knippert linksboven (enkele bovenste punt) + beide dubbele punt in het midden } matrix.writeDigitRaw (2, blinky_dot); matrix.writeDigitNum(3, (minuut/10), false); matrix.writeDigitNum(4, (minuut % 10), false); matrix.writeDisplay(); // knipperende dubbele stippen voor een vertraging van een halve seconde (500); matrix.drawColon(false); matrix.writeDisplay(); vertraging (500); }}void displayTemp(){matrix.setBrightness(brightness_matrix); matrix.clear(); bytetemp =get3231Temp(); int abs_temp =abs(temp); // absoluut getal van een waarde matrix.writeDigitNum(1,(abs_temp % 10), false); // positie 1, waarde 9, toon decimaal) if (temp <0) matrix.writeDigitRaw(0,64); if (temp <=-10) matrix.writeDigitRaw(2,12); // en als de temperatuur negatief is, zetten we het minteken op de eerste plaats. if (temp>
=10) matrix.writeDigitNum(0, (abs_temp/10), false); // positie 0, waarde 1, toon decimaal) if (temp <=-10) matrix.writeDigitNum (0, (abs_temp/10), false); // positie 0, waarde 1, toon decimaal) // matrix.writeDigitRaw (2,0x10); // decimale puntmatrix.writeDigitRaw (3,99); // 99 ="°" matrix.writeDigitRaw(4,57); // 57 ="C" matrix.writeDisplay(); // geeft temperatuurwaarden weer op de seriële regel // zobrazí hodnoty teploty na seriove lince Serial.print ("Temperatur in C:"); Serial.println(get3231Temp()); // +/- 3 Grad Celsius // hoe lang weergavetemperatuur op matrix in seconden vertraging (delay_matrix_temp);} ongeldig setDS3231time (byte seconde, byte minuut, byte uur, byte dayOfWeek, byte dayOfMonth, byte maand, byte jaar){ / / stel tijd- en datumgegevens in op DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Draad.schrijven(0); // stel de volgende invoer in om te beginnen bij het secondenregister Wire.write (decToBcd (second)); // stel seconden in Wire.write (decToBcd (minuut)); // minuten instellen Wire.write (decToBcd (uur)); // stel uren in Wire.write (decToBcd (dayOfWeek)); // dag van de week instellen (1 =zondag, 7 =zaterdag) Wire.write (decToBcd (dayOfMonth)); // datum instellen (1 tot 31) Wire.write (decToBcd (maand)); // set maand Wire.write (decToBcd (jaar)); // set jaar (0 tot 99) Wire.endTransmission();}void getDateDs3231(byte *seconde, byte *minuut, byte *uur, byte *dayOfWeek, byte *dayOfMonth, byte *maand, byte *jaar){ Wire. beginTransmission (DS3231_I2C_ADDRESS); Draad.schrijven(0); Wire.endTransmission(); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); *seconde =bcdToDec(Wire.read() &0x7f); *minuut =bcdToDec(Wire.read()); *uur =bcdToDec(Wire.read() &0x3f); *dayOfWeek =bcdToDec(Wire.read()); *dayOfMonth =bcdToDec(Wire.read()); *maand =bcdToDec(Wire.read()); *jaar =bcdToDec(Wire.read());}float get3231Temp(){ byte tMSB, tLSB; vlottertemp3231; Wire.beginTransmission (DS3231_I2C_ADDRESS); Draad.schrijven (0x11); Wire.endTransmission(); Wire.requestFrom (DS3231_I2C_ADDRESS, 2); if (Wire.available()) { tMSB =Wire.read(); // 2's complement int gedeelte tLSB =Wire.read(); // fractie portie temp3231 =(tMSB &B01111111); // doe 2's wiskunde op Tmsb temp3231 +=( (tLSB>> 6) * 0.25 ); // geef alleen om bits 7 &8 return temp3231; } else { // oh nee, geen gegevens! Serial.println ("DS3231 Sensorfout - kan temperatuur niet lezen"); matrix.print(0xBEEF, HEX); // informeer de gebruiker met BEEF matrix.writeDisplay(); vertraging (5000); } }
Github
https://github.com/ILohs/MySketches

Schema's

LDR-pad gecorrigeerd

Productieproces

  1. Arduino pov vision-klok
  2. DIY eenvoudigste IV9 Numitron-klok met Arduino
  3. Eenvoudige wandklok met Adafruit 1/4 60 Ring Neopixel
  4. Arduino klok met islamitische gebedstijden
  5. Hoofdklok
  6. Arduino Temp. Monitor en realtimeklok met 3.2-weergave
  7. Arduino Nano:bedien 2 stappenmotoren met joystick
  8. Arduino Apple Watch
  9. 7-segment arrayklok
  10. Handheld geigerteller met Arduino Nano
  11. Eenvoudige wekker met DS1302 RTC