Hilfe zum Programm, welches eine Uhr steuern soll Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
Autor |
Hilfe zum Programm, welches eine Uhr steuern soll |
|
|
|
|
BID = 906136
Jabo Neu hier
Beiträge: 29 Wohnort: Köln
|
|
Hallo,
ich bin gerade dabei mir eine große DigitalUhr zu basteln.
Ist auch alles soweit fertig, jedoch habe ich noch einige Probleme mit dem Programm.
Ich benutze einen Arduino um die Uhr zu steuern. Klappt auch soweit außer, dass
- beim Drücken des Kopfes um die Stunden bzw Minuten einzustellen,es viel zu schnell geht und man es dann nicht genau einstellen kann
- die Uhr geht am Tag 3 Minuten nach (liegt bestimmt an den ganzen If-Abfragen, die ja auch ''Zeit'' brauchen)
Hab in der Schule etwas Java gelernt jedoch wohl nicht gut genug um die Probleme zu lösen. Hoffe ihr könntet mir ein paar Tipps geben.
Wäre euch sehr dankbar!
Grüße,
Jannis
Hier das Programm (Ich habe den Kopf mal weggelassen) :
void loop() {
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
sek++;
if (sek>=60){
Serial.print("+Minute");
mint++;
sek=0;
}
if (mint>=60){
Serial.print("+Std");
std1++;
mint=0;
}
if (std1>=24){
Serial.print("+Tag");
std1=0;
}
set();
if(on){
digitalWrite(50, LOW); // Die zwei Lampen in der Mitte, die blinken sollen
digitalWrite(51, LOW);
on=false;
}else {
digitalWrite(50, HIGH);
digitalWrite(51, HIGH);
on=true;
}
}
if (digitalRead(52)==HIGH){ // Kopf zum verstellen der Minute
minute();
}
if (digitalRead(53)==HIGH){ // Stundenknopf
stunde();
}
}
void minute(){
mint++;
if (mint>=60){
std1++;
mint=0;
}
if (std1>=24){
std1=0;
}
set();
}
void stunde(){
std1++;
if (std1>=24){
std1=0;
}
set();
}
void set(){
int stddd = std1;
if(stddd>=10)
stddd/=10;
else if(stddd<10)
stddd=0;
set(7,(stddd));
set(0,(std1%10));
int mintt = mint;
if(mintt>=10)
mintt= mintt/10;
else if(mintt<10)
mintt=0;
Serial.println("SET");
Serial.println(mintt);
Serial.println("SET");
set(14,(mintt));
set(21,(mint%10));
}
void set(int x, int zahl){
if(zahl==0){
digitalWrite((1+x), HIGH);
digitalWrite((2+x), HIGH);
digitalWrite((3+x), HIGH);
digitalWrite(( 5+x), LOW);
digitalWrite((4+x), HIGH);
digitalWrite((6+x), HIGH);
digitalWrite((7+x), HIGH);
Serial.println("NULL");
}
else if (zahl==1){
digitalWrite((1+x), LOW);
digitalWrite((2+x), LOW);
digitalWrite((3+x), HIGH);
digitalWrite((5+x), LOW);
digitalWrite((4+x), LOW);
digitalWrite((6+x), LOW);
digitalWrite((7+x), HIGH);
Serial.println("EINS");
}
else if (zahl==2){
digitalWrite((1+x), LOW);
digitalWrite((2+x), HIGH);
digitalWrite((3+x), HIGH);
digitalWrite((5+x), HIGH);
digitalWrite((4+x), HIGH);
digitalWrite((6+x), HIGH);
digitalWrite((7+x), LOW);
}
else if (zahl==3){
digitalWrite((1+x), LOW);
digitalWrite((2+x), HIGH);
digitalWrite((3+x), HIGH);
digitalWrite((5+x), HIGH);
digitalWrite((4+x), LOW);
digitalWrite((6+x), HIGH);
digitalWrite((7+x), HIGH);
}
else if (zahl==4){
digitalWrite((1+x), HIGH);
digitalWrite((2+x), LOW);
digitalWrite((3+x), HIGH);
digitalWrite((5+x), HIGH);
digitalWrite((4+x), LOW);
digitalWrite((6+x), LOW);
digitalWrite((7+x), HIGH);
}
else if (zahl==5){
digitalWrite((1+x), HIGH);
digitalWrite((2+x), HIGH);
digitalWrite((3+x), LOW);
digitalWrite((5+x), HIGH);
digitalWrite((4+x), LOW);
digitalWrite((6+x), HIGH);
digitalWrite((7+x), HIGH);
}
else if (zahl==6){
digitalWrite((1+x), HIGH);
digitalWrite((2+x), HIGH);
digitalWrite((3+x), LOW);
digitalWrite((5+x), HIGH);
digitalWrite((4+x), HIGH);
digitalWrite((6+x), HIGH);
digitalWrite((7+x), HIGH);
}
else if (zahl==7){
digitalWrite((1+x), LOW);
digitalWrite((2+x), HIGH);
digitalWrite((3+x), HIGH);
digitalWrite((5+x), LOW);
digitalWrite((4+x), LOW);
digitalWrite((6+x), LOW);
digitalWrite((7+x), HIGH);
}
else if (zahl==8){
digitalWrite((1+x), HIGH);
digitalWrite((2+x), HIGH);
digitalWrite((3+x), HIGH);
digitalWrite((5+x), HIGH);
digitalWrite((4+x), HIGH);
digitalWrite((6+x), HIGH);
digitalWrite((7+x), HIGH);
}
else if (zahl==9){
digitalWrite((1+x), HIGH);
digitalWrite((2+x), HIGH);
digitalWrite((3+x), HIGH);
digitalWrite((5+x), HIGH);
digitalWrite((4+x), LOW);
digitalWrite((6+x), HIGH);
digitalWrite((7+x), HIGH);
}
}
|
|
BID = 906223
Offroad GTI Urgestein
Beiträge: 12742 Wohnort: Cottbus
|
|
Ich würde mal die Real Time Clock in die Runder werfen wollen.
_________________
Theoretisch gibt es zwischen Theorie und Praxis keinen Unterschied. Praktisch gibt es ihn aber. |
|
BID = 906225
Her Masters Voice Inventar
Avatar auf fremdem Server ! Hochladen oder per Mail an Admin
Beiträge: 5308 Wohnort: irgendwo südlich von Berlin
|
dann werf ich noch einen DCF77 Empfänger dazu...
|
BID = 906234
der mit den kurzen Armen Urgestein
Beiträge: 17434
|
Offtopic :
| so ein Quatsch mit der Auswertung des Zeitzeichensenders DCF77 fällt das stellen der Uhr ja weg. Es reicht wenn der µC sich neu Syncronisiert und das aktuelle vollständige Datenpaket übernimmt. Und wenn schon ein DCF77 Empfänger vorliegt, sollte auch der Takt von da bezogen werden. [ot]
Das Zeitdiagramm des DCF77 ist im Netz verfügbar. |
_________________
Tippfehler sind vom Umtausch ausgeschlossen.
Arbeiten an Verteilern gehören in fachkundige Hände!
Sei Dir immer bewusst, dass von Deiner Arbeit das Leben und die Gesundheit anderer abhängen!
|
BID = 906239
winnman Schreibmaschine
Beiträge: 1628 Wohnort: Salzburg
|
Eingang Impulsauswertung und zusätzlich auswerten nach zB 0,5s.
Innerhalb der 0,5s nur um 1 Verstellen.
Kommen innerhalb der 0,5s mehrere Impulse, die ignorieren.
Steht länger als 0,5 der Eingang an, dann mit selbst generiertem Takt hochzählen.
|
BID = 906270
Jabo Neu hier
Beiträge: 29 Wohnort: Köln
|
Vielen Dank für die Tipps!
Das mit den Knöpfen fürs Verstellen der Zeit hat geklappt - funktioniert
Mit der Zeit bin ich noch nicht wirklich weiter gekommen. Die Uhr nach dem DCF77 Signal zu steuern hört sich super an ist aber für meine Zwecke etwas zu aufwendig.
Das ''Real Time Clock'' Modul habe ich auch schonmal gesehen.
Aber wie genau funktioniert es?
Ich bin leider nicht so gut im Progamieren und habe auch bei Google keine Beispielcodes gefunden, die ich verstehe.
Ist das eher einfach das in mein Programm einzuarbeiten oder würde das bedeuten, dass ich besser ein komplett neues schreiben müsste (habe ziemlich lange für das Jetzige gebraucht :D)
Gibt es vielleicht eine Möglichkeit die Zeitdifferenz, die die ganzen Abfragen brauchen ausrechnen zu lassen? Dann könnte man die zB. nach allen 10 min auf die aktuelle Zeit addieren lassen.
Grüße,
Jannis
|
BID = 906275
Her Masters Voice Inventar
Avatar auf fremdem Server ! Hochladen oder per Mail an Admin
Beiträge: 5308 Wohnort: irgendwo südlich von Berlin
|
mit deiner Methode wirst du nie eine halbwegs genaue Uhr hinbekommen, also freunde dich schonmal damit an was komplett Neues zu schreiben.
|
BID = 906310
Jabo Neu hier
Beiträge: 29 Wohnort: Köln
|
|
BID = 906311
der mit den kurzen Armen Urgestein
Beiträge: 17434
|
Wenn du Wert auf genau Zeit legst sollte auch diese Uhr sich mit dem DCF77 synchronisieren.
Also warum nicht gleich ein DCF77 Modul nehmen ?
_________________
Tippfehler sind vom Umtausch ausgeschlossen.
Arbeiten an Verteilern gehören in fachkundige Hände!
Sei Dir immer bewusst, dass von Deiner Arbeit das Leben und die Gesundheit anderer abhängen!
|
BID = 906312
perl Ehrenmitglied
Beiträge: 11110,1 Wohnort: Rheinbach
|
Zitat :
| Gibt es vielleicht eine Möglichkeit die Zeitdifferenz, die die ganzen Abfragen brauchen ausrechnen zu lassen? |
Bei Verwendung des Hardwaretimers wird das nicht nötig sein, denn der läuft ja unabhängig von deinem Programm im Hintergrund.
Nur solltest du vermeiden an dem Timer herumzudrehen; allein das Auslesen ist erlaubt.
Irgendwann wir es dann einen Überlauf geben, den must du eben programmtechnisch berücksichtigen.
Ein Fehler von in der Größenordnung von etlichen Sekunden, aber weniger als 1 Minute am Tag kann auch auf der Ungenauigkeit des verwendeten Quarzes beruhen. Typischerweise sind die Quarzoszillatoren von Microcontrollern nicht genauer.
Wenn es genauer gehen soll, wird man normalerweise die Quarzfrequenz mit einem einstellbaren Kondensator genau auf die Sollfrequenz "ziehen". Alternativ kann man auch der Software die wahre Quarzfrequenz mitteilen.
Wenn du das DCF-Signal zur Verfügung hast, kannst du ja leicht den Unterschied zwischen der Arduino-Sekunde und der DCF-Sekunde ermitteln.
[ Diese Nachricht wurde geändert von: perl am 19 Nov 2013 23:41 ]
|
BID = 906320
hajos118 Schreibmaschine
Beiträge: 2453 Wohnort: Untermaiselstein
|
Zitat :
perl hat am 19 Nov 2013 23:41 geschrieben :
|
Ein Fehler von in der Größenordnung von etlichen Sekunden, aber weniger als 1 Minute am Tag kann auch auf der Ungenauigkeit des verwendeten Quarzes beruhen. Typischerweise sind die Quarzoszillatoren von Microcontrollern nicht genauer. |
... und tückischerweise auch noch temperaturabhängig...
_________________
Interpunktion und Orthographie dieses Beitrags sind frei erfunden.
Eine Übereinstimmung mit aktuellen oder ehemaligen Regeln wäre rein zufällig und ist nicht beabsichtigt.
Wer einen Fehler findet, darf ihn behalten!
|
BID = 906354
Murray Inventar
Beiträge: 4857
|
|
BID = 906419
winnman Schreibmaschine
Beiträge: 1628 Wohnort: Salzburg
|
Bei DCF77 solltest du doch auch relativ einfach einen Sekunden oder Minutenimpuls erhalten.
Jetzt deine interne Uhr ein bisschen schneller machen und dann erst beim eintreffen des Impulses wider neu starten.
(So arbeiten die Nebenuhren mit Sekundenzeiger einer Zentraluhrenanlage oft).
Du musst halt schauen, dass du nach 59,5 Sekunden mit deinem Kram durch bist. Erst wenn der Minutenimpuls vom DCF77 kommst gehst du in die nächste Runde.
Kommt nach 61s kein Impuls musst du dann auf möglichst genau 60s in deinem Programm kommen.
Das hat nur den Nachteil, dass bei DCF77 Signalausfall danach die Uhren nicht mehr auf die tatsächliche Zeit gestellt werden.
Aber zur vollen Stunden und ich glaub 1x am Tag gibt's da doch noch andere eindeutige Signale mit denen dann nochmal eine Art Reset gemacht werden kann.
|
BID = 906546
der mit den kurzen Armen Urgestein
Beiträge: 17434
|
Spätestens nach 3 Min sollte auch der µC das volle gültige Datenpaket haben. Schließlich werden alle Daten in jeder Minute übertragen. Das Zeitdiagramm und auch der Aufbau der Datenübertragung ist ja wohl sehr gut im Netz beschrieben.
Edit : lediglich der 59 Impuls fehlt ansonsten hast du jede Sekunde einen Impuls und in der Impulslänge stecken die Daten. Also ist da eine Pause von genau 2 s vor dem Minutenimpuls.
Edit2
für Faule
_________________
Tippfehler sind vom Umtausch ausgeschlossen.
Arbeiten an Verteilern gehören in fachkundige Hände!
Sei Dir immer bewusst, dass von Deiner Arbeit das Leben und die Gesundheit anderer abhängen!
[ Diese Nachricht wurde geändert von: der mit den kurzen Armen am 21 Nov 2013 17:54 ]
[ Diese Nachricht wurde geändert von: der mit den kurzen Armen am 21 Nov 2013 18:00 ]
|
BID = 908385
Brizz Stammposter
Beiträge: 386 Wohnort: Rheine
|
Du rechnest :
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
Vielleicht rechnest Du mal so:
while (currenMillis > previousMillis) {
previousMillis = previousMillis + interval;
dann wird Deine Uhr mit der Genauigkeit von currentMillis gehen.
[ Diese Nachricht wurde geändert von: Brizz am 6 Dez 2013 23:06 ]
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 20 Beiträge im Durchschnitt pro Tag heute wurden bisher 12 Beiträge verfasst © x sparkkelsputz Besucher : 182399315 Heute : 6513 Gestern : 7548 Online : 958 25.11.2024 20:35 7 Besucher in den letzten 60 Sekunden alle 8.57 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.0911481380463
|