Pages: [1] 2   Go Down
Author Topic: RTC statt delay  (Read 1077 times)
0 Members and 1 Guest are viewing this topic.
Germany
Offline Offline
Sr. Member
****
Karma: 1
Posts: 275
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo allerseits,
ich bin auf der suche nach einem Codeschnippsel, der statt delay eine RTC verwendet.
Konkret, ich habe ein Projekt in dem eine RTC verbaut ist.
Immer zu einer bestimmten Uhrzeit wird ein Code ausgeführt, was super klappt.

Nun möchte ich noch einen kleinen Code alle 30 min ausführen lassen und dabei happerts... smiley-red
Ich weiss nicht wie ich statt dem delay(1800000); die RTC benutzen kann ?

Kann mir jemand helfen ? Hoffe ihr versteht was ich meine...
Logged

*greatz*

 CeTax

www dot blinkmann dot de


Germany
Offline Offline
Edison Member
*
Karma: 44
Posts: 2261
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Klingt für mich noch nichteinmal nach der Notwendigkeit, eine RTC zu verwenden. Delays() zu vermeiden gehört hier ja schon zum guten Ton, da wird dann oft das mit der IDE mitgelieferte Beispiel blinkWithoutDelay angeführt. smiley-wink
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Germany
Offline Offline
Sr. Member
****
Karma: 1
Posts: 275
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo sth77,
ok, habe ich schon mal was von gehört... Schau ich mir mal an.
Aber gibt es eine möglichkeit das mit einem RTC zu machen ?
Logged

*greatz*

 CeTax

www dot blinkmann dot de


Austria
Offline Offline
Full Member
***
Karma: 2
Posts: 107
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wenn du eine RTC hast, hast du sicher auch eine Variable für die Minuten oder?
Wenn diese Variable 0 oder 30, ist soll dein Code ausgeführt werden.

Code:
if((min == 0) | (min == 30)){
  // dein Code
}

Grüße,
J3RE
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Definiere eine Variable mit der Minute in welcher Dein Code ausgeführt werden soll. (minute = 20)
Hol Dir in loop() einfach von der RTC immer die Minuten und vergleiche den Wert mit der Variablen.
Wenn RTC.minute == gemerket_minute (z.B. Minute 30), dann führe Deinen Code aus und setze die Variable auf den nächsten Minutenwert.
minute = (minute + 30) % 60
Dann vergleichst Du wieder wie oben den aktuellen Wert mit Deiner Variable.

Was passiert bei der Rechnung?

minute = 20
minute = minute + 30 = 50
minute = minute + 30 = 80 <- falscher Minuten Wert.
minute = (minute + 30) % 60 = 20 <- richtiger Minutenwert.

Das klappt übrigens mit beliebigen Abständen zwischen 1 und 60, nicht aber mit Werten größer als eine Stunde.

Mario.
Logged

Lost in Singapore
Offline Offline
Jr. Member
**
Karma: 3
Posts: 74
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

So in etwa vllt:
Code:
#include <time.h>
#define meinIntervall 60 * 30
.
.
time_t aktuelleZeit;
time_t alteZeit;
.
.
.

aktuelleZeit = now();
if ( aktuelleZeit - alteZeit >= meinIntervall){
alteZeit = aktuelleZeit;
//do something
}

 
Wie man die time Klasse mit dem RTC synchronisiert steht auch dort beschrieben.
Man kann das aber auf so kurzen Intervallen immer noch mit millis() machen.
Logged


Offline Offline
Edison Member
*
Karma: 21
Posts: 1397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
if((min == 0) | (min == 30)){
  // dein Code
}
Bei diesem Code hast Du das Problem, das der Code vermutlich mehrmals in der gleichen Minute abgearbeitet wird, denn loop() benötigt in der Regel weniger als eine Minute zum Durchlauf. Du musst also verhindern, das in der gleichen Minute der Code nochmal ausgeführt wird.
Logged

Lost in Singapore
Offline Offline
Jr. Member
**
Karma: 3
Posts: 74
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Außerdem gibt es eine time_alarm lib. Die arbeitet dann mit einem Callback auf eine Funktion. Die Lib braucht aber jede Menge speicher und ist m.M.n. nicht besonders schnell.
Logged


Germany
Offline Offline
Sr. Member
****
Karma: 1
Posts: 275
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

WOW  smiley-cool
Bin gerade überwältigt... Vielen Dank für die Erklärungen und Hilfen.
Wieder was gelernt  smiley-grin

Aber in der Zeit in der Ihr hier fleißig gepostet habt, habe ich mich an Millis() versucht und etwas brauchbares getippt.

Code:
long previousMillis = 0;       
long Pause = 10000;        // Pause zwischen Ping´s (10000 = 10sek)

void setup()
{
  Serial.begin(9600);
  Serial.println(F("Starte Serial-Monitor"));
}

void loop()
{
unsigned long currentMillis = millis();
unsigned long currentmillis = millis();

if(currentMillis - previousMillis > Pause) {
  previousMillis = currentMillis;
  currentmillis = 0;
  Serial.println(F("Sende Ping .."));
  Serial.println(F("warte 10 Sekunden ..."));
  }
}

Nun habe ich aber gelesen das ja millis irgendwann überläuft (nach 47 Tagen?), wie kann ich das denn verhindern ?

Hallo Mario  smiley-mr-green, dein Vorschlag werde ich mir mal näher ansehen... vielen Dank... Damit wäre ja der miilis Überlauf hinfällig
« Last Edit: March 28, 2013, 06:45:57 am by Cetax » Logged

*greatz*

 CeTax

www dot blinkmann dot de


Germany
Offline Offline
Sr. Member
****
Karma: 1
Posts: 275
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Wenn du eine RTC hast, hast du sicher auch eine Variable für die Minuten oder?
Wenn diese Variable 0 oder 30, ist soll dein Code ausgeführt werden.

Code:
if((min == 0) | (min == 30)){
  // dein Code
}

Ma könnte das vieleicht auch so lösen:
Code:
if((min == 0 && sec == 0) | (min == 30 && sec == 0)){
  // dein Code
}

Oder nicht ?
Logged

*greatz*

 CeTax

www dot blinkmann dot de


Austria
Offline Offline
Full Member
***
Karma: 2
Posts: 107
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
if((min == 0) | (min == 30)){
  // dein Code
}
Bei diesem Code hast Du das Problem, das der Code vermutlich mehrmals in der gleichen Minute abgearbeitet wird, denn loop() benötigt in der Regel weniger als eine Minute zum Durchlauf. Du musst also verhindern, das in der gleichen Minute der Code nochmal ausgeführt wird.

stimmt, habe ich vergessen...smiley

Ma könnte das vieleicht auch so lösen:
Code:
if((min == 0 && sec == 0) | (min == 30 && sec == 0)){
  // dein Code
}

Oder nicht ?

Ja aber nur wenn der Code länger als eine Sekunde benötigt. Der Nachteil zu den anderen Lösungen ist halt, dass man nach dem Einschalten auf die volle/halbe Stunde warten muss.

Grüße,
J3RE

Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20208
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dann wird der Code immernoch mehrmals in der Sekunde ausgefgührt.
Am einfachsten ist die Stunden, Minuten und Sekunden in Sekunden umzurechnen und nur mit eine Variable kontrolieren.  
Benute eine Variable die auf 1 gesetzt wenn das erste mal die Zeit übereinstimmt und 0 gersetzt wird enn sie nicht übereinstimmt.
Die Aktion wird durchgeführt und die Variable auf 1 gesetzt, wenn die Zeit richtig ist, und die Variable 0 ist. So wird die Aktionnur einmal aufgerufen.
Grüße Uwe
Logged

Austria
Offline Offline
Full Member
***
Karma: 2
Posts: 107
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dann wird der Code immernoch mehrmals in der Sekunde ausgefgührt.
Am einfachsten ist die Stunden, Minuten und Sekunden in Sekunden umzurechnen und nur mit eine Variable kontrolieren. 
Benute eine Variable die auf 1 gesetzt wenn das erste mal die Zeit übereinstimmt und 0 gersetzt wird enn sie nicht übereinstimmt.
Die Aktion wird durchgeführt und die Variable auf 1 gesetzt, wenn die Zeit richtig ist, und die Variable 0 ist. So wird die Aktionnur einmal aufgerufen.
oder so:
Code:
if(((min == 0) && (minOld == 30)) | ((min == 30) && (minOld == 0)){
  minOld = min;
  // dein Code
}

Grüße,
J3RE
« Last Edit: March 28, 2013, 07:03:44 am by J3RE » Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20208
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

J3RE Wie machst Du das wenn Du mehr als 2 mal die Stunde was machen willst? smiley-twist
Logged

Austria
Offline Offline
Full Member
***
Karma: 2
Posts: 107
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

J3RE Wie machst Du das wenn Du mehr als 2 mal die Stunde was machen willst? smiley-twist
Dann wird meine Lösung etwas zu kompliziert werden. smiley-wink

Dann ist die Lösung von mkl0815 in Kombination mit deinem Ansatz wahrscheinlich am sinnvollsten. smiley-grin

Grüße,
J3RE
Logged

Pages: [1] 2   Go Up
Jump to: