Ik heb deze mooie houten klok in analoge stijl gebouwd met een Arduino Nano en 1mA ampèremeters. Ik heb hier een idee vandaan. Voor het weergeven van de seconden is een deel van de code toegevoegd. Ook is er een onderdeel toegevoegd dat tijdens het hardlopen de hele schaal van nul tot max doorloopt. waarde voor kalibratiedoeleinden. Afhankelijk van welke ampèremeters we gebruiken, kan de waarde van de 5k-weerstanden verschillen. Omdat alle meters net iets anders zijn, moeten de PWM-waarden worden aangepast op basis van uw ontwerp. U zult enkele waarden moeten wijzigen omdat deze specifiek is ingesteld om met mijn meters te werken.
Code
codeArduino
/* Analoge paneelmeter - ALLEEN klokmodus Instructables Link:http://www.instructables.com/id/Analog-VU-meter-and-Clock-Arduino-Powered/ Credits:bildr - DS1307 RTC-code http://bildr.org/2011/03/ds1307-arduino/ _____________________ De bedrading gaat als volgt:- Rode USB-draad (5v) naar VCC - Zwarte USB-draad naar GND - Knoppen - Links/Omlaag naar Digital 2 (volg arduino-tutorial:http ://arduino.cc/en/uploads/Tutorial/button.png ) - Rechts/Omhoog naar Digitaal 3 - DS1307 RTC - SDA naar Analoog 4 - SCL naar Analoog 5 - Links Analoog Meter naar Digitaal 5 (PWM) - Rechts Analoog Meter naar digitaal 6 (PWM)_seconden Analoge meter naar digitaal 9_(PWM)_____________________ Opmerking:Omdat alle meters iets anders zijn, moeten de PWM-waarden worden aangepast op basis van uw ontwerp. Voel je vrij om mijn code te gebruiken, maar je zult enkele waarden moeten wijzigen omdat deze specifiek is ingesteld om met mijn meters te werken. */#include "Wire.h"#define DS1307_ADDRESS 0x68byte nul =0x00; // tijdelijke oplossing voor probleem #527int downButton =2; // drukknop omlaag om de tijd aan te passen (pin 2) in de knop omhoog =3; // omhoog drukknop om de tijd aan te passen (pin 3) in uren =0; int minuten =0; int seconden =0; int lastMinute =0; int lastSecond =0; int leftMeter =5; // linker meter (uren) is bevestigd aan pin 5int rightMeter =6; // rechter meter (min) is bevestigd aan pin 6int secMeter=9; //secondenmeter (sec) is gekoppeld aan pin 9void setup(){ Wire.begin(); Serieel.begin(9600); // bekijk tijd in seriële monitor pinMode (leftMeter, OUTPUT); // Initialiseer uitgangen en ingangen pinMode (rightMeter, OUTPUT); pinMode (secMeter, UITGANG); digitalWrite (linksmeter, HOOG); // Test meters bij opstarten digitalWrite (rightMeter, HIGH); digitalWrite(secMeter, HOOG); digitalWrite(13, HOOG); vertraging (1000); digitalWrite (linksmeter, LAAG); digitalWrite(rightMeter, LOW); digitalWrite(secMeter, LAAG); digitalWrite(13, LAAG); delay(1000);}void loop(){ printDate(); vertraging (75); // De tijd wijzigen met knoppen if (digitalRead(downButton) ==HIGH){ byte seconde =seconden; // Raak niet in de war:seconde is niet hetzelfde als seconden byte minuut =minuten; // Raak niet in de war:minuut is niet hetzelfde als minuten byte uur =uur; // Raak niet in de war:uur is niet hetzelfde als hoursif (minuten> 0){ --minute; }anders{ minuut =59; if (uren> 0){ -- uur; }else{ uur =23;}} Wire.beginTransmission (DS1307_ADDRESS); Wire.write (nul); // stop Oscillator Wire.write (decToBcd (tweede)); Wire.write(decToBcd(minuut)); Wire.write(decToBcd(uur)); Wire.write (nul); //start Wire.endTransmission ();} if (digitalRead (upButton) ==HOOG) {byte seconde =0; byte minuut =minuten; // Raak niet in de war:minuut is niet hetzelfde als minuten byte uur =uur; // Raak niet in de war:uur is niet hetzelfde als hoursif (minuten <59){ ++minute; }anders{ minuut =0; if (uren <23){ ++ uur; }else{ uur =0;}} Wire.beginTransmission (DS1307_ADDRESS); Wire.write (nul); // stop Oscillator Wire.write (decToBcd (tweede)); Wire.write(decToBcd(minuut)); Wire.write(decToBcd(uur)); Wire.write (nul); //start Wire.endTransmission();} }byte decToBcd(byte val){// Converteer normale decimale getallen naar binair gecodeerde decimale return ((val/10*16) + (val%10));}byte bcdToDec(byte val) {// Converteer binair gecodeerde decimalen naar normale decimale getallen return ((val/16*10) + (val%16));}void printDate(){ // Reset de registeraanwijzer Wire.beginTransmission (DS1307_ADDRESS); Wire.write (nul); Wire.endTransmission(); Wire.requestFrom (DS1307_ADDRESS, 7); seconden =bcdToDec(Wire.read()); minuten =bcdToDec(Wire.read()); uur =bcdToDec(Wire.read() &0b111111); //24 uur tijd // druk de datum af Serial.print (uren); // Verwijder commentaar om de tijd in seriële monitor te bekijken Serial.print(":"); // Serial.println (minuten); // Vergeet niet om 'Serial.begin' in 'void setup' hierboven te verwijderen // Specifieke meterniveaus voor elk uur // U zult deze waarden waarschijnlijk moeten aanpassen.// Speel met de waarden totdat u wat je wilt. if (lastMinute!=minuten){ if (hours ==1 || hours ==13){ analogWrite(leftMeter, 0); // pas het linker (uur) meterniveau aan} if (hours ==2 || hours ==14) {analogeWrite(leftMeter, 29); // pas het linker (uur) meterniveau aan} if (hours ==3 || hours ==15) {analogeWrite(leftMeter, 52); // pas het linker (uur) meterniveau aan} if (hours ==4 || hours ==16) {analogalWrite(leftMeter, 75); // pas het linker (uur) meterniveau aan} if (hours ==5 || hours ==17) {analogeWrite(leftMeter, 98); // pas het linker (uur) meterniveau aan} if (hours ==6 || hours ==18) {analogeWrite(leftMeter, 130); // pas het linker (uur) meterniveau aan} if (hours ==7 || hours ==19) {analogeWrite(leftMeter, 152); // pas het linker (uur) meterniveau aan} if (hours ==8 || hours ==20) {analogeWrite(leftMeter, 172); // pas het linker (uur) meterniveau aan} if (hours ==9 || hours ==21) {analogeWrite(leftMeter, 192); // pas het linker (uur) meterniveau aan} if (hours ==10 || hours ==22) {analogeWrite(leftMeter, 213); // pas het linker (uur) meterniveau aan} if (hours ==11 || hours ==23){ analogWrite (leftMeter, 234); // pas het linker (uur) meterniveau aan} if (hours ==0 || hours ==12) {analogeWrite(leftMeter, 255); // pas het linker (uur) meterniveau aan} if (minuten * 4,75 <255) { // verhoog de PWM-waarde met 4,75 per minuut analogWrite (rightMeter, minuten * 4,75); // Ik moest 4,75 op mijn meter gebruiken om 30 minuten precies recht omhoog te laten wijzen }anders{ // perfect zou 4,25 zijn omdat 4,25 * 60 =255 analogWrite(rightMeter, 255); } lastMinute =minuten; if (seconden * 4,25 <255){ analogWrite (secMeter, seconden * 4,25); }anders{ analogWrite(secMeter, 255); } lastSecond =seconden; }}
Schema's