Hallo,
ich arbeite an einem Projekt, welches die digitalen Ausgänge meines Arduino Mega 2560 per Uhrzeit schaltet. Ich habe den Sketch so weit umgesetzt, vielleicht aber nicht ganz so elegant gelöst.
Es werden mit den Ausgängen per Optokoppler Relais angesteuert, die dann die einzelnen Steckdosen einer Steckdosenleiste und Dosierpumpen ein-und ausschalten.
Ich habe so etwas schon einmal für meinen Aquaristik-Computer gebaut und diese schon seit 1 1/2 Jahre ohne Probleme im Einsatz.
Das Problem sind nicht die Steckdosenleisten, sondern die Dosierpumpen der Dosieranlage.
Um eine bestimmte Flüssigkeitsmenge dosieren zu können, benötige ich eine Laufzeit im Sekundenbereich. Die Pumpen geben z.B. bei einer Laufzeit von 5 Sekunden eine Flüssigkeitsmenge von ca. 5ml ab.
Leider sind die Ein- und Ausschaltzeiten im Minutenbereich begrenzt. Ich kann also nur z.B. eine Steckdose um 10:30 Uhr ein- und um 18:15 Uhr wieder ausschalten. Ich brauche aber für die Dosierpumpen eine Ein- und Ausschaltzeit wie z.B. (10:30:00 Uhr ein+10:30:05 aus), so dass mit der Laufzeit von 5 Sekunden ab 10:30 Uhr eine Flüssigkeitsmenge von 5ml abgegeben wird.
Ich versuche seit ca. einer Woche, allabendlich eine Lösung zu finden und komme einfach nicht weiter.
Vielleicht hat jemand eine Idee oder so etwas ähnliches schon mal gelöst.
Anbei der Sketch:
#include "Wire.h"
#define DS1307_ADDRESS 0x68 // Die I2C-Adresse
#include <RTClib.h>
//Beleuchtung---------------
const int LEDst = 37; //LED-Stripe weiß
const int LEDrgb = 39; //LED-Stripe RGB
//Mini-USB-Ausgang 1 ---------------
const int MUA1 = 53; //Strömungspumpe 1
const int MUA2 = 52; //Strömungspumpe 2
const int MUA3 = 51; //Heizung
const int MUA4 = 50; //Abschäumer
//Mini-USB-Ausgang 2 ---------------
const int MUA5 = 49; //Licht Technikbecken
const int MUA6 = 48; //Licht Kranzbeleuchtung
const int MUA7 = 47; //Pumpe für Hydor Flo Kreisel
const int MUA8 = 38; //Frei
//Mini-USB-Ausgang 3 ---------------
const int DA1 = 40; //Dosieranlage 1
const int DA2 = 41; //Dosieranlage 2
const int DA3 = 42; //Dosieranlage 3
const int DA4 = 43; //Dosieranlage 4
const unsigned long HOUR = 60 * 60;
const unsigned long MINUTE = 60;
const unsigned long SECOND = 60;.
RTC_DS1307 RTC;
DateTime now;
const char LOGFORMAT[] = "%02u.%02u.%04u %02u:%02u:%02u";
char RTCpuffer[16]; // der Wert des RTCpuffer muss gross genug sein, dass alle Zeichen reinpassen!!
void setup()
{
pinMode(LEDrgb, OUTPUT);
pinMode(LEDst, OUTPUT);
pinMode(MUA1, OUTPUT);
pinMode(MUA2, OUTPUT);
pinMode(MUA3, OUTPUT);
pinMode(MUA4, OUTPUT);
pinMode(MUA5, OUTPUT);
pinMode(MUA6, OUTPUT);
pinMode(MUA7, OUTPUT);
pinMode(MUA8, OUTPUT);
pinMode(DA1, OUTPUT);
pinMode(DA2, OUTPUT);
pinMode(DA3, OUTPUT);
pinMode(DA4, OUTPUT);
Serial.begin(9600); //Einschalter Übertragung zum Serial-Monitor
Wire.begin();
RTC.begin();
}
byte bcdToDec(byte val) {
// Konvertieren des binär Code zu Dezimalzahlen
return ( (val/16*10) + (val%16) );
}
void loop()
{
now=RTC.now();
///// Bekommt die Zeit vom RTC in RTCHour, RTCMinute, RTCSecond
// Stellt den Register Pointer auf 0 (Sekunden)
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write((byte)0);
Wire.endTransmission();
// Liest Sekunde, Minute und Stunde aus
Wire.requestFrom(DS1307_ADDRESS, 3);
int RTCSecond = bcdToDec(Wire.read());
int RTCMinute = bcdToDec(Wire.read());
int RTCHour = bcdToDec(Wire.read() & 0b111111); //24 Stunden Zeit
// Schreibt die Zeit zum LCD XX: XX: XX
if(RTCHour < 10) {
Serial.print("0");
}
Serial.print(RTCHour);
Serial.print(":");
if(RTCMinute < 10) {
Serial.print("0");
}
Serial.print(RTCMinute);
Serial.print(":");
if(RTCSecond < 10) {
Serial.print("0");
}
Serial.print(RTCSecond);
Serial.print("_UHR");
unsigned long time = RTCHour * HOUR + RTCMinute * MINUTE + RTCSecond ; // Zeit in Sekunden
Serial.println(RTCpuffer);
//----------------------------------------BELEUCHTUNG---------------------------------------
// Schaltzeiten-----------------
if (time >= 10*HOUR+30*MINUTE)//Schaltet die LED-Stripe weiß ein
digitalWrite(LEDst, HIGH);
if (time >= 21*HOUR+30*MINUTE)//Schaltet die LED-Stripe weiß aus
digitalWrite(LEDst, LOW);
if (time >= 10*HOUR+15*MINUTE)//Schaltet die LED-Stripe RGB ein
digitalWrite(LEDrgb, HIGH);
if (time >= 23*HOUR+00*MINUTE)//Schaltet die LED-Stripe RGB aus
digitalWrite(LEDrgb, LOW);
}
Danke schon mal.
Gruß Jens