So kompiliert der Code schon mal.
Man kann die Uhrzeit einstellen und die Relais mit den Tastern (Achtung andere Pinnummern) kurz einschalten.
Ob die "Weckfunktion" läuft musst du selbst testen.
Außerdem werden jetzt die Taster auf LOW abgefragt, die müssen also nach GND schalten.
Es gab ein paar syntaktische Fehler (falsche Klammern, Strichpunkte etc).
const int Relais1 = 12;
const int Relais2 = 11;
const int taster = 6;
const int taster2 = 7;
int tasterstatus = 0; //Das Wort „tasterstatus" steht jetzt zunächst für den Wert 0. Später wird unter dieser Variable gespeichert, ob der Taster gedrückt ist oder nicht.
int tasterstatus1 = 0;
#include <Wire.h>
//#include <RtcDateTime.h> // wird anscheinend nicht gebraucht
//#include <RtcDS1307.h> // detto
//#include <RtcDS3231.h> // detto
//#include <RtcTemperature.h> // detto
//#include <RtcUtility.h> // detto
#define EIN HIGH
#define AUS LOW
#define RTC_I2C_ADDRESS 0x68 // 0x68 für DS1307 u. DS3231
struct timerRelais1_t {
byte pin;
byte dauer;
int timer1;
};
struct timerRelais2_t {
byte pin;
byte dauer;
int timer2;
};
// Hier den Kurzzeittimer definieren
timerRelais1_t timerRelais1={Relais1, 30, 1202}; // Timer an seinem Pin für 30 Sekunden um 0830 und 2000 ??
void relaisTimer1NachZeit(int thishour, int thisminute) {
int thisTime= thishour*100+thisminute;
if (thisTime==timerRelais1.timer1) {
Serial.println("Timer Start");
digitalWrite(timerRelais1.pin,EIN);
delay(timerRelais1.dauer*1000L);
digitalWrite(timerRelais1.pin,AUS);
Serial.println("Timer Stopp");
}
}
timerRelais2_t timerRelais2={Relais2, 30, 1203};
void relaisTimer2NachZeit(int thishour, int thisminute) {
int thisTime= thishour*100+thisminute;
if (thisTime==timerRelais2.timer2)
{
Serial.println("Timer Start");
digitalWrite(timerRelais2.pin,EIN);
delay(timerRelais2.dauer*1000L);
digitalWrite(timerRelais2.pin,AUS);
Serial.println("Timer Stopp");
}
}
// Schaltet Zeitschaltuhr ein und aus und setzt Ausgang entsprechend
void relaisSchaltenNachZeit(int thishour, int thisminute) {
boolean state;
// Aus aktueller Zeit e. Schaltzeit bilden
int thisTime= thishour*100+thisminute;
}
int jahre,monate,tage,stunden,minuten,sekunden; // wochentag bleibt unberücksichtigt
// aktuelle Zeit aus RTC auslesen
void rtcReadTime(int &jahre, int &monate, int &tage, int &stunden, int &minuten, int &sekunden) {
Wire.beginTransmission(RTC_I2C_ADDRESS); // Reset the register pointer
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(RTC_I2C_ADDRESS, 7);
// A few of these need masks because certain bits are control bits
sekunden = bcdToDec(Wire.read() & 0x7f);
minuten = bcdToDec(Wire.read());
stunden = bcdToDec(Wire.read() & 0x3f); // Need to change this if 12 hour am/pm
/*wochentag = */bcdToDec(Wire.read());
tage = bcdToDec(Wire.read());
monate = bcdToDec(Wire.read());
jahre = bcdToDec(Wire.read())+2000;
}
// aktuelle Zeit in der RTC speichern
void rtcWriteTime(int jahre, int monate, int tage, int stunden, int minuten, int sekunden) {
Wire.beginTransmission(RTC_I2C_ADDRESS);
Wire.write(0);
Wire.write(decToBcd(sekunden)); // 0 to bit 7 starts the clock
Wire.write(decToBcd(minuten));
Wire.write(decToBcd(stunden)) // If you want 12 hour am/pm you need to set bit 6 (also need to change readDateDs1307)
Wire.write(decToBcd(0)); // Wochentag unberücksichtigt
Wire.write(decToBcd(tage));
Wire.write(decToBcd(monate));
Wire.write(decToBcd(jahre-2000));
Wire.endTransmission();
}
// Convert decimal number to binary coded decimal. Hilfsfunktion f RTC
byte decToBcd(byte val) {
return ( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to decimal number. Hilfsfunktion f RTC
byte bcdToDec(byte val) {
return ( (val/16*10) + (val%16) );
}
// input: pointer to a char array
// returns an integer number from the string (positive numbers only!)
// num=1, returns 1st number from the string and so on
int getIntFromString (char *stringWithInt, byte num) {
char *tail;
while (num>0)
{
num--;
while ((!isdigit (*stringWithInt))&&(*stringWithInt!=0)) stringWithInt++; // skip non-digits
tail=stringWithInt;
while ((isdigit(*tail))&&(*tail!=0)) tail++; // find digits
if (num>0) stringWithInt=tail; // new search string is the string after that number
}
return(strtol(stringWithInt, &tail, 10));
}
void behandleSerielleBefehle() {
char linebuf[30];
byte counter;
if (Serial.available()) {
delay(100); // Warte a Eintreffen aller Zeichen
memset(linebuf,0,sizeof(linebuf)); // Zeilenpuffer löschen
counter=0;
while (Serial.available()) {
linebuf[counter]=Serial.read(); // Zeichen in Zeilenpuffer einf
if (counter<sizeof(linebuf)-1) counter++;
}
// Ab hier ist die Zeile eingelesen
if (strstr(linebuf,"set")==linebuf) { // Prüfe auf Befehl set
// Zahlen im String auslesen
tage=getIntFromString (linebuf,1);
monate=getIntFromString (linebuf,2);
jahre=getIntFromString (linebuf,3);
stunden=getIntFromString (linebuf,4);
minuten=getIntFromString (linebuf,5);
sekunden=getIntFromString (linebuf,6);
}
else {
Serial.println("Befehl unbekannt.");
return;
}
// Plausibilitätsprüfung d Werte:
if (jahre<2000 || monate<1 || monate>12 || tage<1 || tage>31 || (stunden+minuten)==0) {
Serial.println(linebuf);
Serial.println("\r\nFehlerhafte Angabe im 'set' Befehl");
Serial.println("\r\nBeispiel:");
Serial.println("set 28.08.2013 10:54\r\n");
return;
}
rtcWriteTime(jahre, monate, tage, stunden, minuten, sekunden);
Serial.println("Zeit, Datum auf neue Werte gesetzt.");
}
}
void setup() {
pinMode(Relais1, OUTPUT);
pinMode(Relais2, OUTPUT);
pinMode(taster, INPUT_PULLUP);
pinMode(taster2, INPUT_PULLUP);
Wire.begin(); // initialisiert die Wire-Library
Serial.begin(9600);
while (!Serial); // wait for serial, needed for Leonardo only
Serial.println("\r\nZeitschaltuhr- und Kurzzeittimer-Demo");
Serial.println("Coded by Jurs for German Arduino Forum");
Serial.println("Jede Minute wird die aktuelle Zeit im Seriellen Monitor angezeigt");
Serial.println("Ebenso alle Ein- und Ausschaltungen und die Kurzzeittimer-Aktion");
Serial.println();
Serial.println("Zeit mit einem 'set' Befehl im Serial Monitor neu setzen.");
Serial.println("\r\nBeispiel:");
Serial.println("set 28.08.2013 10:54\r\n");
digitalWrite(timerRelais2.pin,AUS);
pinMode(timerRelais2.pin,OUTPUT);
digitalWrite(timerRelais1.pin,AUS);
pinMode(timerRelais1.pin,OUTPUT);
}
void loop() {
tasterstatus=digitalRead(taster);
tasterstatus1=digitalRead(taster2);
//Verarbeitung: Wenn der taster gedrücktist (Das Spannungssignal ist niedrig)
if (tasterstatus == LOW) {
digitalWrite(Relais1, HIGH);
delay (1000);
digitalWrite(Relais1, LOW);
}
if (tasterstatus1 == LOW) {
digitalWrite(Relais2, HIGH);
delay (1000); // war 10000
digitalWrite(Relais2, LOW);
}
else { //...ansonsten...
digitalWrite(Relais1, LOW);
digitalWrite(Relais2, LOW);
}
// void"Teil2"() ===================================
char buffer[30];
static unsigned long lastMillis;
static int lastMinute;
int stunden, minuten, sekunden, dummy;
if (millis()-lastMillis>1000) { // nur einmal pro Sekunde
lastMillis=millis();
rtcReadTime(dummy, dummy, dummy, stunden, minuten, sekunden);
if (minuten!=lastMinute) { // die aktuelle Minute hat gewechselt
lastMinute=minuten;
snprintf(buffer,sizeof(buffer),"%02d:%02d Uhr",stunden,minuten);
Serial.println(buffer);
relaisSchaltenNachZeit(stunden,minuten);
relaisTimer1NachZeit(stunden,minuten);
relaisTimer2NachZeit(stunden,minuten);
}
}
behandleSerielleBefehle();
}
Schaut nach zusammenkopiertem Code aus wo das Verständnis nicht zu 100% da ist, was jede Anweisung macht. Das ist eben zu Beginn so (war und ist bei mir genauso) und nicht zuletzt ist das auch ein Teil des Erfolgskonzeptes der Arduino-Gemeinde.
Ziel sollte aber sein, dass man doch so einigermaßen versteht was da so abläuft, sonst sind Änderungen und Anpassungen schwierig und man muss immer nachfragen. 