Marcel87:
Hi
Ich geb auf 
ich bekomme das Programm einfach nicht hin das Programm sollte für eine Sirene seihen die auf Knopf druck los geht und nach 3 runden Heuelen wider aus gehen wie Bai der Feuerwehr wen die alarmiert werden
Ist das deutsche Rettungswesen inzwischen so arm dran, dass die Feuerwehren für ihre eigene technische Ausstattung sorgen müssen?
So ganz 100% hast Du den beabsichtigten Ablauf nicht beschrieben, aber ich versuche mal was.
Als Ansatz habe ich eine einfache "State Machine" gewählt, die im Code selbst implementiert ist, d.h. eine zusätzliche Library wird nicht benötigt.
Für die State-Machine habe ich zwei Zustände vorgesehen, für jeden Zustand gibt es eine Funktion:
- void stateWarten(const boolean firstRun)
- void stateAlarm(const boolean firstRun)
Diese beiden Funktionen werden von der State-Machine aufgerufen, und zwar einmal mit dem Parameter "firstRun=true" einmalig, wenn der Status gesetzt wird. Und ansonsten ständig mit dem Parameter "firstRun=false", solange derselbe Status aktiv ist.
Programmlogik für "stateWarten()":
- bei "firstRun" werden alle Relais auf LOW gesetzt und eine Meldung auf Serial ausgegeben
- ansonsten wird auf das Drücken des Tasters gewartet. Beim Drücken ändert sich der Status auf stateAlarm()
Beim Taster bin ich davon ausgegangen, dass dieser zwischen GND und Arduino-Pin angeschlossen wird, ohne einen PullDown-Widerstand in der Schaltung zu verwenden. Daher wird der interne PullUp-Widerstand des Atmega im Programm aktiviert ("pinMode(Taster,INPUT_PULLUP);") und der gedrückte Taster liefert ein LOW.
Programmlogik für "stateAlarm()":
- bei "firstRun" werden die Relais LOW, LOW, HIGH gesetzt und eine Meldung ausgegeben
- ansonsten: nach 12 Sekunden die Relais auf HIGH, HIGH, LOW setzen und
nach 18 Sekunden wieder auf LOW, LOW, HIGH und den Wiederholungszähler um 1 hochzählen
- sobald der Wiederholungszähler 3 erreicht, wieder auf Zustand "stateWarten()" schalten
So ungefähr?
typedef void(*stateFunctionPointer)(const boolean); // type of state function
class StateMachine
{
public:
StateMachine() // constructor StateMachine
{
stateActiveSince=0;
stateFunction=NULL;
};
void setState(stateFunctionPointer newState)
{ // state change
stateActiveSince = millis(); //reset timeout timer
stateFunction=newState;
stateFunction(true);
};
unsigned long stateTime()
{//return ms since current state was set
return millis() - stateActiveSince;
}; //stateTime();
boolean timeout(unsigned long time)
{//returns true if Statetime >= time
return (millis() - stateActiveSince)>=time;
}; //timeout()
void run()
{ //runstate running
stateFunction(false);
}; //run()
private:
stateFunctionPointer stateFunction; //pointer to current state function
unsigned long stateActiveSince;
};
// void idle(boolean firstRun){}; // every state function has a boolean parameter
StateMachine sm;
byte Taster=2;
byte relays[]={10,11,12};
#define NUMRELAYS sizeof(relays)
void setRelays(byte r0, byte r1, byte r2)
{
digitalWrite(relays[0],r0);
digitalWrite(relays[1],r1);
digitalWrite(relays[2],r2);
Serial.print(r0);Serial.print(r1);Serial.println(r2);
}
void stateWarten(const boolean firstRun)
{
if (firstRun)
{
setRelays(LOW, LOW, LOW); // Relaisstatus während der Wartezeit
Serial.println("Warte auf Tastendruck...");
}
else
{
if (digitalRead(Taster)==LOW) sm.setState(stateAlarm);
}
}
void stateAlarm(const boolean firstRun)
{
static unsigned long startZeit;
static byte Wiederholungen;
static byte anfang;
if (firstRun) // Wenn dieser Status neu gesetzt wird
{
startZeit=millis();
Wiederholungen=0;
anfang=true;
setRelays(LOW, LOW, HIGH);
Serial.println("3 Wiederholungen starten jetzt");
}
else // Wenn dieser Status gesetzt ist und wiederholt aufgerufen wird
{
if (anfang && millis()-startZeit>=12000)
{
anfang=false;
setRelays(HIGH, HIGH, LOW);
}
else if (millis()-startZeit>=18000)
{
startZeit=millis();
anfang=true;
setRelays(LOW, LOW, HIGH);
Wiederholungen++;
if (Wiederholungen==3) sm.setState(stateWarten);
else Serial.println("Wiederholung startet");
}
}
}
void setup() {
Serial.begin(9600);
for (int i=0;i<NUMRELAYS;i++) pinMode(relays[i],OUTPUT);
pinMode(Taster,INPUT_PULLUP);
sm.setState(stateWarten);
}
void loop() {
sm.run();
}
Die von Dir zu verwendenden Pins wären in diesen beiden Zeilen einzutragen:
byte Taster=2;
byte relays[]={10,11,12};
Hast Du Solid-State-Relais, die auf "HIGH" schalten?
Oder mechanische Relais, die auf "HIGH" im Ruhezustand sind und auf "LOW" schalten?
Bei mechanischen "Active-LOW" schaltenden Relais müßtest Du auf die korrekte Initialisierung im setup() achten!
Wenn sich an der Programmlogik etwas ändern soll, wären diese beiden Funktionen zu ändern:
- void stateWarten(const boolean firstRun)
- void stateAlarm(const boolean firstRun)
Bei Problemen einfach nachfragen.