Arduino Analog Panel Meter Clock
Komponenten und Verbrauchsmaterialien
| | × | 1 | |
| Maxim Integrated DS3231M - ±5 ppm, I2C-Echtzeituhr | | × | 1 | |
| | × | 3 | |
| | × | 3 | |
| | × | 2 | |
| SparkFun Drucktastenschalter 12 mm | | × | 2 | |
Über dieses Projekt
Ich habe diese schön aussehende analoge Holzuhr mit einem Arduino Nano und 1 mA Amperemeter gebaut. Ich habe eine Idee von hier. Zur Anzeige der Sekunden wurde ein Teil des Codes hinzugefügt. Hinzu kommt ein Teil, der beim Laufen die gesamte Skala von Null bis max durchläuft. Wert für Kalibrierzwecke. Je nachdem, welche Amperemeter wir verwenden, kann der Wert der 5k-Widerstände unterschiedlich sein. Da alle Messgeräte leicht unterschiedlich sind, müssen die PWM-Werte basierend auf Ihrem Design angepasst werden. Sie müssen einige Werte ändern, da es speziell mit meinen Messgeräten funktioniert.
Code
codeArduino
/* Analog Panel Meter - Clock ONLY Mode 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/ _____________________ Die Verkabelung geht wie folgt:- USB rotes Kabel (5V) an VCC - USB schwarzes Kabel an GND - Tasten - Links/Unten auf Digital 2 (folgen Sie dem Arduino-Tutorial:http ://arduino.cc/en/uploads/Tutorial/button.png ) - Rechts/Bis zu Digital 3 - DS1307 RTC - SDA zu Analog 4 - SCL zu Analog 5 - Linkes Analogmeter zu Digital 5 (PWM) - Rechts Analog Messgerät zu Digital 6 (PWM)_-Sekunden Analoges Messgerät zu Digital 9_(PWM)_____________________ Hinweis:Da alle Messgeräte leicht unterschiedlich sind, müssen die PWM-Werte an Ihr Design angepasst werden. Fühlen Sie sich frei, meinen Code zu verwenden, aber Sie müssen einige Werte ändern, da er speziell mit meinen Messgeräten funktioniert. */#include "Wire.h"#define DS1307_ADDRESS 0x68byte null =0x00; // Problemumgehung für Problem #527int downButton =2; // Taste nach unten drücken, um die Zeit einzustellen (Pin 2) Int upButton =3; // Drucktaste nach oben zum Einstellen der Zeit (Pin 3)int Stunden =0;int Minuten =0;int Sekunden =0;int lastMinute =0;int lastSecond =0;int leftMeter =5; // linker Meter (Stunden) ist an Pin 5int rightMeter =6 angeschlossen; // rechter Meter (min) ist an Pin 6int secMeter=9 angeschlossen; // Sekundenzähler (Sek.) ist an Pin 9void setup () angeschlossen {Wire.begin (); Serial.begin (9600); // Zeit im seriellen Monitor anzeigen PinMode (leftMeter, OUTPUT); // Ausgänge und Eingänge initialisieren pinMode (rightMeter, OUTPUT); pinMode (secMeter, AUSGANG); digitalWrite (leftMeter, HIGH); // Zähler beim Start testen digitalWrite (rightMeter, HIGH); digitalWrite (secMeter, HIGH); digitalWrite(13, HOCH); Verzögerung (1000); digitalWrite (leftMeter, LOW); digitalWrite (rightMeter, LOW); digitalWrite (secMeter, LOW); digitalWrite(13, LOW); Verzögerung (1000);} ungültige Schleife () { printDate (); Verzögerung (75); // Ändern der Zeit mit Tasten if (digitalRead (downButton) ==HIGH) { Byte Sekunde =Sekunden; // Nicht verwirren:Sekunde ist nicht gleich Sekunde Byte Minute =Minuten; // Nicht verwirren:Minute ist nicht gleich Minuten byte hour =hours; // Nicht verwirren:Stunde ist nicht gleich Stundenif (Minuten> 0){ --minute; }sonst{ Minute =59; if (Stunden> 0){ -- Stunde; }sonst{ Stunde =23;}} Wire.beginTransmission(DS1307_ADDRESS); Wire.write (null); // Oszillator stoppen Wire.write (decToBcd (second)); Wire.write (decToBcd (Minute)); Wire.write (decToBcd (Stunde)); Wire.write (null); // starte Wire.endTransmission ();} if (digitalRead (upButton) ==HIGH) { Byte Sekunde =0; Byte Minute =Minuten; // Nicht verwirren:Minute ist nicht gleich Minuten byte hour =hours; // Nicht verwirren:Stunde ist nicht gleich Stundenif (Minuten <59){ ++Minute; }sonst{ Minute =0; wenn (Stunden <23){ ++ Stunde; }sonst{ Stunde =0;}} Wire.beginTransmission(DS1307_ADDRESS); Wire.write (null); // Oszillator stoppen Wire.write (decToBcd (second)); Wire.write (decToBcd (Minute)); Wire.write (decToBcd (Stunde)); Wire.write (null); //starte Wire.endTransmission();}}byte decToBcd(byte val){// Konvertieren Sie normale Dezimalzahlen in binär codierte Dezimalzahlen ((val/10*16) + (val%10));}byte bcdToDec(byte val) {// Binärcodierte Dezimalzahlen in normale Dezimalzahlen umwandeln return ( (val/16*10) + (val%16) );}void printDate(){ // Zurücksetzen des Registerzeigers Wire.beginTransmission(DS1307_ADDRESS); Wire.write (null); Wire.endTransmission(); Wire.requestFrom(DS1307_ADDRESS, 7); Sekunden =bcdToDec(Wire.read()); Minuten =bcdToDec(Wire.read()); Stunden =bcdToDec(Wire.read() &0b111111); // 24 Stunden Zeit // Drucken Sie das Datum Serial.print (Stunden); // Kommentar aufheben, um die Zeit im seriellen Monitor anzuzeigen Serial.print (":"); // Serial.println (Minuten); // Vergessen Sie nicht, 'Serial.begin' in 'void setup' oben zu entkommentieren // Spezifische Zählerstände für jede Stunde // Sie müssen diese Werte wahrscheinlich anpassen.// Spielen Sie mit den Werten herum, bis Sie was du willst. if (lastMinute !=Minuten){ if (Stunden ==1 || Stunden ==13){ analogWrite (leftMeter, 0); // den linken (Stunden-) Meterpegel einstellen} if (Stunden ==2 || Stunden ==14) {AnalogWrite (leftMeter, 29); // den linken (Stunden-) Meterpegel einstellen} if (Stunden ==3 || Stunden ==15) {AnalogWrite (leftMeter, 52); // den linken (Stunden-) Meterpegel einstellen} if (Stunden ==4 || Stunden ==16) {AnalogWrite (leftMeter, 75); // den linken (Stunden-) Meterpegel einstellen} if (Stunden ==5 || Stunden ==17) {AnalogWrite (leftMeter, 98); // den linken (Stunden-) Meterpegel einstellen} if (Stunden ==6 || Stunden ==18) {AnalogWrite (leftMeter, 130); // den linken (Stunden-) Meterpegel einstellen} if (Stunden ==7 || Stunden ==19) {AnalogWrite (leftMeter, 152); // den linken (Stunden-) Meterpegel einstellen} if (Stunden ==8 || Stunden ==20) {AnalogWrite (leftMeter, 172); // den linken (Stunden-) Meterpegel einstellen} if (Stunden ==9 || Stunden ==21) {AnalogWrite (leftMeter, 192); // den linken (Stunden-) Meterpegel einstellen} if (Stunden ==10 || Stunden ==22) {AnalogWrite (leftMeter, 213); // den linken (Stunden-) Meterpegel einstellen} if (Stunden ==11 || Stunden ==23) {AnalogWrite (leftMeter, 234); // den linken (Stunden-) Meterpegel einstellen} if (Stunden ==0 || Stunden ==12) {AnalogWrite (leftMeter, 255); // Pegel des linken (Stunden-) Meters einstellen} if (Minuten * 4,75 <255) {// PWM-Wert jede Minute um 4,75 erhöhen analogWrite (rightMeter, Minuten * 4,75); // Ich musste 4,75 auf meinem Meter verwenden, um 30 Minuten zu bekommen, um genau gerade nach oben zu zeigen }sonst{ // perfekt wäre 4,25, weil 4,25 * 60 =255 analogWrite(rightMeter, 255); } lastMinute =Minuten; if (Sekunden * 4,25 <255) { AnalogWrite (secMeter, Sekunden * 4,25); }sonst{ analogWrite (secMeter, 255); } lastSecond =Sekunden; }}
Schaltpläne