Hallo zusammen,
mein mehr als unsauber erstelltes Programm (aber funktionierend meines Monitorlifts soll abgelöst werden von einer, so hoffe ich, durchdachten "State Machine", aka endlicher Automat.
Ich habe mir ein paar Gedanken gemacht, und hoffe die GrundzĂŒge verstanden zu haben.
Aufgrund diverser Informationen glaube ich, dass mein Monitorlift mit folgenden ZustÀnden komplett beschrieben ist:
Wartend, fÀhrt hoch, ist oben, fÀhrt runter, ist unten.
Viele meiner benutzten Variablen sind, denke ich, selbsterklÀrend, dank aussagekrÀftiger Namen.
Was die Endschalter abgeht, so habe ich derer 3. Einen "Vor"-Endschalter, bei dessen erreichen die Motordrehzahl deutlich reduziert werden soll, der eigentliche Endschalter, und ein Not-Endschalter, der, wenn alles richtig implementiert ist, entweder via ISR den Motor stoppt, oder brutal dem Arduino die 5V wegnimmt, und somit auch das SSR fĂŒr den Motor-Trafo, mal sehen.
Anbei mein Quelltest, der im Moment nur aus den Ein/AusgÀngen und viel Pseudo-code besteht.
Dies soll erstmal das "ArbeitsgerĂŒst" werden, und wenn dann keine groben Fehler mehr enthalten sind (in der allgemeinen Struktur), wird StĂŒck fĂŒr StĂŒck richtig programmiert.
Ich bin völlig unerfahren, was endliche Automaten angeht, daher bitte ich euch mal zu gucken, ob die grobe Richtung stimmt.
(Da die digitalen Pins zu wenig sind, habe ich direkt fĂŒr alle Anzeige-LED's analoge Pins genommen)
Besten Dank und GruĂ aus dem Bergischen
Michael
//PSEUDOCODE MonitorLift
const int Notendschalter = 2;
const int Taster_Auf = 4;
const int Taster_Ab = 5;
const int Vorendschalter = 6;
const int Endschalter = 7;
const int Step_Pin = 8; //---------- GrĂŒne Ader ----------
const int Dir_Pin = 9; //---------- Blaue Ader ----------
const int SSR_230V = 10;
const int SSR_48V = 11;
const int Vorendschalter_LED = A1;
const int Endschalter_LED = A2;
const int Referenz_LED = A3;
const int Pos_oben_LED = A4;
const int Pos_unten_LED = A5;
(Da die digitalen Pins zu wenig sind, habe ich direkt fĂŒr alle Anzeige-LED's analoge Pins genommen)
bool Vorendschalter_Status = false;
bool Endschalter_Status = false;
bool Referenz_Status = false;
bool Taster_Auf_Status = false;
bool Taster_Ab_Status = false;
const int eeAddress = 0; //---------- Spricheradresse im EEprom ----------
unsigned int Position = 0; //---------- Speicher fĂŒr die aktuelle Position ----------
unsigned int Position_Oben = 55000; //---------- Hier kommt die obere Position hinein ----------
void Referenzfahrt()
{
//prĂŒfe Zustand (&nicht)Notendschalter (Ăffner), (&)Vorendschalter da ist (SchlieĂer) und (&nicht)Endschalter (Ăffner)
// schnelle oder Schleichfahrt, je nach Vorendschalter bis Endschalter
// setze Referenz_Status auf true
}
enum {Wartend, Faehrt_hoch, Faehrt_runter, Ist_oben, Ist_unten} Monitorlift = Wartend;
void Warten()
{
//Taster_Auf_Status = digitalRead(Taster_Auf);
//Taster_Ab_Status = digitalRead(Taster_Ab);
//Wenn "Taster_Auf, dann Àndere Status Monitorlift = Faehrt_hoch;
//Wenn "Taster_Ab, dann Àndere Status Monitorlift = Faehrt_runter;
}
void Hochfahren()
{
//PrĂŒfe ob bereits oben, wenn ja, Ă€ndere Monitorlift = Ist_oben und Routine verlassen
// PrĂŒfe Wert in EEPROM = 0
// PrĂŒfe ob Referenzfahrt erledigt ist, wenn nicht, Referenzfahrt
// SSR_230V einschalten
// SSR_48V einschalten, 5 sec. warten
// fahre zu Position_Oben
//Ăndere Status auf Monitorlift = Ist_oben;
}
void Oben()
{
//LED obere Pos an
// schreibe Wert in EEPROM
//Ăndere Status auf Monitorlift = Wartend;
}
void Runterfahren()
{
//PrĂŒfe ob bereits unten, wenn ja, Ă€ndere Monitorlift = Ist_unten und Routine verlassen
//PrĂŒfe of Position in EEProm > 0 ist
// PrĂŒfe ob Referenfahrt erledigt wenn nicht, Referenzfahrt machen
// fahre zu Position_unten
//Ăndere Status auf Monitorlift = Ist_unen;
}
void Unten()
{
//LED untere Position an
// schreibe Wert in EEPROM
// SSR_230V ausschalten
// SSR_48V ausschalten
// Ăndere Status auf: Monitorlift = Wartend;
}
void setup()
{
pinMode(Notendschalter , INPUT);
pinMode(Vorendschalter , INPUT);
pinMode(Endschalter , INPUT);
pinMode(Step_Pin , INPUT);
pinMode(Dir_Pin , INPUT);
pinMode(Step_Pin , OUTPUT);
pinMode(Dir_Pin , OUTPUT);
pinMode(SSR_230V , OUTPUT);
pinMode(SSR_48V , OUTPUT);
pinMode(Vorendschalter_LED, OUTPUT);
pinMode(Endschalter_LED , OUTPUT);
pinMode(Referenz_LED , OUTPUT);
}
void loop()
{
switch (Monitorlift)
{
case Wartend:
Warten();
break;
case Faehrt_hoch:
Hochfahren();
break;
case Faehrt_runter:
Runterfahren();
break;
case Ist_oben:
Oben();
break;
case Ist_unten:
Unten();
break;
} //---------- Ende Case ----------
} //---------- Ende Loop ----------