Go Down

Topic: Ausgang per Uhrzeit/Datum schalten (Read 7633 times) previous topic - next topic

maverick1509

Wieso den Wochentag berechnen, ist zwar schon lange her, aber das RTC Modul liefert doch nach einmaligem Stellen
den Wochentag oder liege ich jetzt völlig daneben.
Ich muss nachschauen, aber ich hab das schon mal genutzt.

Cetax

Hallo maverick 1509,
das RTC liefert unteranderen auch den Wochentag.
Mit dem 4.Byte ( 0x03   Wochentag  ), wenn ich das richtig gelesen habe.


Wieso den Wochentag berechnen, ist zwar schon lange her, aber das RTC Modul liefert doch nach einmaligem Stellen
den Wochentag oder liege ich jetzt völlig daneben.
Ich muss nachschauen, aber ich hab das schon mal genutzt.


Also, sobald das RTC-Modul da ist, fange ich damit an und werde mich dann noch mal melden.
Ich glaube, ich kann es denn besser verstehen und konkretere Fragen stellen.
Danke Euch aber bis jetzt für die tolle Unterstützung und Hilfe.
Danke !
*greatz*

 CeTax

www dot blinkmann dot de

Hallo Cetax,

ich baue sowas gerade für die Bewässerung meiner Gemüsepflanzen auf dem Balkon. Ich habe einen RTC-Chip (DS1307) angeschlossen und die entsprechende Bibliothek (DS1307new) installiert. Man kann aus dem RTC dann mit verschiedenen Befehlen Stunde, Minute und Sekunde auslesen. Das vergleiche ich dann mit der gewünschten Uhrzeit und betätige dann den Ausgang. Sieht dann z. B. so aus:
Code: [Select]

#include <Wire.h>
#include <DS1307new.h>

// Anschluß für Pumpe
int pumppin = 2;

// Uhrzeit für Bewässerung
int pumphour = 19;
int pumpminute = 0;
int pumpsecond = 0;

// Bewässerungszeit in Sekunden
long pumptime = 120;

...

void loop()
{
  RTC.getTime();
  // Start Pumpe
  if (int(RTC.hour) == pumphour && int(RTC.minute) == pumpminute && int(RTC.second) == pumpsecond)
  {
    digitalWrite(pumppin, HIGH);
    timenow = RTC.time2000;
  }
 
  // Stop Pumpe
  if (RTC.time2000 - timenow == pumptime)
  {
    digitalWrite(pumppin, LOW);
  }
  delay(500);
}


Da fehlt natürlich noch das setup den RTC und so. Zum Ausschalten der Pumpe kann man das gleiche wieder machen oder eine Zeitspanne vorgeben wie im Beispiel. Um die Zeitdifferenz zu berechnen bis zum Ausschalten mußt du die Zeit in Sekunden auslesen (RTC.time2000). Wichtig ist, daß die Schleife sicher in jeder Sekunde durchlaufen wird, deshalb habe ich den delay am Schluß kleiner als 1000ms gewählt. Sonst kann es dir passieren, daß die Zeit am Ende der Sekunde 18:59:59 ausgelesen wird und dann erst wieder am Anfang der Sekunde 19:00:01. Dann schaltet er nicht ein, weil die Bedingung in der if-Abfrage nie erfüllt wird.

Das Verfahren ist ein sehr einfaches und funktioniert so, wenn du wenige Schaltereignisse hast (so wie hier 1x täglich ein).

Viele Grüße

Elektrix
My blog about arduino and Linux themes:
http://heliosoph.mit-links.info/

Cetax

Hallo Elektrix,
das ist ja klasse, machst ja ähnliches wie. Ich Bewässere meinen Garten, habe 6 Ventile die an unterschiedlichen Tagen zu unterschiedlichen Zeiten geöffnet und nach einer Vorgegeben Zeit wieder geschlossen werden sollen. Was schon funktioniert ist halt die Öffnung der Ventile für eine bestimmte Laufzeit. Ich übergebe per Web-Interface eine Zeit (z.B. 30min) und wenn die abgelaufen ist, schließt das Ventil wieder automatisch.
Jetzt sollen noch die Wochentage und Uhrzeit mit rein, aber da muss ich noch auf das RTC-Modul warten, kommt hoffentlich morgen   :smiley-mr-green:

Aber erstmal danke für den Sketch-Teil, habe ich schon mal was zum lesen und versuchen zu verstehen.
*greatz*

 CeTax

www dot blinkmann dot de

maverick1509

Hallo Elektrix,
warum arbeitest du nicht mit < und  >
dann brauchst du dir keine Sorgen zu machen, das nicht geschaltet wird.
Und ein delay brauchst du auch nicht,
mit delay arbeitet man nicht :-))
Gruß
Bernward

Razor1990

Naja mein Vorschlag war ja auch nicht zu Ernst gemeint. Aber bei seinen Projekten sollte man immer was lernen. Und sowas in einen Algorithmus zu packen ist ne gute Übung für die grauen Zellen. :)

Hallo maverick1509,

das mit < und > ist ein guter Tipp, danke! Ich würds dann entsprechend mit <= und >= machen, dann schaltet er zur vorgegebenen Zeit oder etwas später, wenn die genaue Sekunde nicht erreicht wird. Den delay habe ich drin, weil der arduino nichts anderes zu tun hat als den Ausgang zu schalten. Deswegen beschäftige ich ihn mit dem delay. Vlt. kann man ihn auch für eine vorgegebene Zeit schlafen legen, aber das weiß ich nicht.

Hallo Cetax,

welches Bewässerungssystem nimmst du denn? Mein Aufbau ist einfacher als deiner, ich habe eine 12V-Tauchpumpe im Regenfass und meine Bewässerung dran. Da ich nur den Balkon habe brauche ich nicht mehrere Stränge, also keine Ventile. Die Tauchpumpe wird vom Arduino über einen Leistungs-MOSFET direkt geschaltet.
Schön, wenn du mit meinem Sketch-Vorschlag was anfangen kannst. Du kannst es entsprechend um die Abfrage des Wochentags erweitern.

Viele Grüße

Elektrix
My blog about arduino and Linux themes:
http://heliosoph.mit-links.info/

Cetax

Moin,
so nu ist die RTC da und ich bin irgendwie zu blöd den Wochentag anzuzeigen  :smiley-red:

Ich habe es so versucht, bekomme aber immer eine 0 angezeigt
  lcd.printIn( itoa( datum[ 3 ], buffer, 10 ) );

Code: [Select]
/****************************************************************************************************
* RTC DS1307 mit LCD-Display
*
*  05.11.2011  Jürgen Mayer, DL8MA
*
*  http://www.amateurfunk.de/dl8ma
*
*  Dieser Beispielcode ist public domain
*
*  Hardware:  Arduino
*             Arduino SD Shield Plus mit DS1307 (www.avrcontrollers.com)
*             LCD-Shield
*/

#include "LCD4Bit_mod.h"
#include "Wire.h"

#define DS1307_I2C_ADDRESS 0x68                          // I2C Adresse

char buffer[20] = "";                                    // Speicherbereich für Datenkonvertierung

LCD4Bit_mod lcd = LCD4Bit_mod(2);                        // LCD-Display

/****************************************************************************************************
* Konvertierung BCD-kodierter Dezimalzahl
*/
byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}

/****************************************************************************************************
* Zeit und Datum aus DS1307 auslesen und konvertieren
*/
void getDateDs1307(int date[])
{
  Wire.beginTransmission(DS1307_I2C_ADDRESS);         // I2C-Kommunikation im Schreibmodus starten
  Wire.send(0x00);                                    // Registerzeiger auf 0 setzen
  Wire.endTransmission();                             // I2C-Kommunikation beenden
  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);            // I2C-Kommunikation im Lesemodus starten

  date[ 0 ] = bcdToDec(Wire.receive() & 0x7f);        // Sekunden
  date[ 1 ] = bcdToDec(Wire.receive());               // Minuten
  date[ 2 ] = bcdToDec(Wire.receive() & 0x3f);        // Stunden
  date[ 3 ] = bcdToDec(Wire.receive());               // Wochentag
  date[ 4 ] = bcdToDec(Wire.receive());               // Tag
  date[ 5 ] = bcdToDec(Wire.receive());               // Monat
  date[ 6 ] = bcdToDec(Wire.receive());               // Jahr
}

/****************************************************************************************************
*/
void setup() {
  Wire.begin();                                      // I2C-Bus einrichten
 
  lcd.init();                                        // LCD-Anzeige initialisieren
  lcd.clear();
  //lcd.printIn( "DS1307 - Uhr" );
}

/****************************************************************************************************
*/
void loop() {

  int datum[ 7 ]; 
 
  getDateDs1307( datum );                            // Datum und Uhrzeit aus DS1307 holen

// Wochentag ausgeben:
lcd.cursorTo(0, 2);
lcd.printIn( itoa( datum[ 3 ], buffer, 10 ) );


  lcd.cursorTo(2, 0);                                // Datum und Uhrzeit in 2. Zeile schreiben

  if( datum[ 4 ] < 10 )
    lcd.printIn( "0" );
  lcd.printIn( itoa( datum[ 4 ], buffer, 10 ) );
    lcd.printIn( "." );
  if( datum[ 5 ] < 10 )
    lcd.printIn( "0" );
  lcd.printIn( itoa( datum[ 5 ], buffer, 10 ) );
    lcd.printIn( "." );
/*
if( datum[ 6 ] < 10 )
  lcd.printIn( "0" );
lcd.printIn( itoa( datum[ 6 ], buffer, 10 ) );
*/
  lcd.printIn( "  " );

  if( datum[ 2 ] < 10 )
    lcd.printIn( "0" );
  lcd.printIn( itoa( datum[ 2 ], buffer, 10 ) );
    lcd.printIn( ":" );
  if( datum[ 1 ] < 10 )
    lcd.printIn( "0" );
  lcd.printIn( itoa( datum[ 1 ], buffer, 10 ) );
    lcd.printIn( ":" );
  if( datum[ 0 ] < 10 )
    lcd.printIn( "0" );
  lcd.printIn( itoa( datum[ 0 ], buffer, 10 ) );
  lcd.printIn( "  " );

  delay(1000);                                    // grobes Sekundenraster für Anzeige
}


Kann jemand helfen ? Ist vieleicht schon zu spät...  :smiley-sleep:
*greatz*

 CeTax

www dot blinkmann dot de

maverick1509

Hallo Cetax,
ich habe in meine Programmen die Library
#include <DS1307.h>
eingebaut.
Wenn man dann ein Array z.B. Daten[7] definiert reicht ein ganz normales
RTC.get(Daten,true); und man hat alle Werte.
So sind z.B Daten[0] die Sekunden und Daten[3] der Wochentag.
Gruß
Bernward

Ballibum

#24
Jun 06, 2012, 07:31 am Last Edit: Jun 06, 2012, 07:33 am by Ballibum Reason: 1
Hi,
sorrie das ich jetzt erst antworte...Was macht meine Terrarienzeitschaltuhr...In erster Linie wirklich nur An und Aus zu bestimmten Zeiten, aber eben 5 Geräte. Zusätzlich habe ich noch eine Sensorgesteuerte An/Aus-Funktion,d.h. wenn die Feuchtigkeit unter einen Schwellenwert sinkt, geht die Beregnung für ein paar Sekunden an (und muss dann eine Stunde aus bleiben).
Sollte während der "An"-Zeit das Terrarium überhitzen, gehen die Heizstrahler aus und wenn die Temperatur wieder im Normalbereich ist gehen die Dinger wieder an.
Also eigentlich ganz Simpel.
Ich habe sonst noch einen Wasserstandssensor, der misst den Wasserstand im Beregnungstank,d.h. vor jeder Beregnung wird geprüft ob der Wasserstand noch aussreichend ist und nur dann wird die Beregnung durchgeführt, damit die Pumpe nicht trocken läuft.
Aktuell bastel ich gerade daran, das ganze über das WLAN auszulesen und gegebenenfalls auch über das Internet eingreifen zu können.
mfg
Balli
p.s. auch ich verwende die DS1307-Lib

Cetax

Hallo allerseits,
so nachdem ich nun 1 Woche kein Internet hatte und mein Job mich voll gebraucht hat,
würde ich nun gern weitermachen...  XD


Hi,
sorrie das ich jetzt erst antworte...

Kein Problem  ;)

Was macht meine Terrarienzeitschaltuhr...In erster Linie wirklich nur An und Aus zu bestimmten Zeiten, aber eben 5 Geräte. Zusätzlich habe ich noch eine Sensorgesteuerte An/Aus-Funktion,d.h. wenn die Feuchtigkeit unter einen Schwellenwert sinkt, geht die Beregnung für ein paar Sekunden an (und muss dann eine Stunde aus bleiben).
Sollte während der "An"-Zeit das Terrarium überhitzen, gehen die Heizstrahler aus und wenn die Temperatur wieder im Normalbereich ist gehen die Dinger wieder an.
Also eigentlich ganz Simpel.
Ich habe sonst noch einen Wasserstandssensor, der misst den Wasserstand im Beregnungstank,d.h. vor jeder Beregnung wird geprüft ob der Wasserstand noch aussreichend ist und nur dann wird die Beregnung durchgeführt, damit die Pumpe nicht trocken läuft.

Das hört sich Suuper an, Feuchtigkeits-Sensor...
Ich glaube, wenn meine Pumpensteuerung fertig ist, kommt das dran.
Das wäre dann Bewässerung in Perfektion  :smiley-mr-green:
*greatz*

 CeTax

www dot blinkmann dot de

Cetax

#26
Jun 15, 2012, 10:48 pm Last Edit: Jun 16, 2012, 10:49 pm by Cetax Reason: 1
Moin,
so nun ist die Hardware verlötet (RTC) und nun soll es mit dem Sketch weitergehen.
Ich habe es hinbekommen, die Uhrzeit zu stellen und ich kann die Uhrzeit, Datum und
den Wochentag mir im SerialMonitor anzeigen lassen. Soweit so gut.

Aber wie bekomme ich es hin, das ich per PHP Script sage:
Öffne Montag um 15 Uhr Ausgang 6 für 15 min ?

Wie ich Ihm sage, das er den Ausgang für 15 min öffnen soll, klappt schon.
Aber ich weiß jetzt nicht wie ich weitermachen soll/muss. Wer kann mir Anhaltspunkte
geben, mit denen ich weiter machen kann ?

Die Sketche findet Ihr hier:
http://dl.dropbox.com/u/80052077/PHP_Ausgang_schalten.ino
http://dl.dropbox.com/u/80052077/RTC_Uhr_Auslesen_incl_WoTag.ino

Vielen Dank für Eure Hilfe.
Falls Ihr noch irgendwelche Infos braucht, sagt bescheid...
*greatz*

 CeTax

www dot blinkmann dot de

Cetax

<- PUSH ->

Keiner einen Hinweis , Tipp , oder fertigen Code ? ;)
*greatz*

 CeTax

www dot blinkmann dot de

mkl0815

Hier mal ein kurzer Denkanstoss:

Was Du ja schon hast ist eine Funktion wo Du per PHP eine Zeit (z.B. 15min) übertragen. Das kannst Du ja problemlos auf zusätzliche Werte erweitern. Also zusätzlich zur Dauer noch den Wochentag, oder ein Datum und eine Uhrzeit oder was auch immer mitschicken. Du musst halt nur den Sketch zum auslesen der Kommandos erweitern.
Diese Werte für die Steuerung merkst Du Dir auf dem Arduino wieder in einem Array. Du merkst Dir also eigentlich den Start-Wert (Zeit) und den End-Wert (Zeit)
Der Trick ist nun folgender. Das Ventil wird nicht sofort geöffnet, sondern jede Sekunde wird geschaut, ob ein Ausgang geschaltet werden muss (Einschalten oder Ausschalten).

Mario.

Cetax

Hi Mario,
schön von Dir zu  hören  :D
Ok, stimmt. Werde mich mal ran machen, habe jetzt wieder ein bischen Zeit.

Und Danke für die Tip's/Hinweise/Anstupser ;-)
*greatz*

 CeTax

www dot blinkmann dot de

Go Up