Hallo,
Ich bin immer noch dabei, meine Lichtsteuerung der Modellbahn umzusetzen.
Die Steuerung erfolgt über ein in C# erstelltes Programm zum Master-Arduino.
Mithilfe eines RS485-Bussystems werden weitere Slave-Arduinos angesteuert.
Siehe hier.
Das Ein- /Auschalten funktioniert auch schon soweit.
Da es recht unrealistisch aussieht, wenn überall die Beleuchtung gleichzeitig angeht, dachte ich daran, die jeweiligen Slaves etwas mehr machen zu lassen, als nur zu schalten.
So soll nach dem Schaltbefehl (z.B. Tag -> Dämmerung) nach und nach die entsprechende Beleuchtung angehen z.B. erste Straßenzüge, manche Hausbeleuchtungen (werden über Attinys gesteuert), etc.
Mein Problem an der Sache ist, wie ich das am besten umsetzen soll.
LEDs nach Einschaltbefehl blinken lassen ist kein Problem. Wie aber kann ich LEDs nach Einschaltbefehl verzögert einschalten.
Z.B. Einschaltbefehl -> Haus 1 -> 20s warten -> Haus 2 -> 10s warten -> Straßenlaternen an, ...
Mir ist klar, dass sich das ganze (auch um die RS485 Kommunikation nicht zu blockieren) nur mit millis lösen lässt. Aber momentan stehe ich trotz viel Recherche und herumprobieren etwas auf dem Schlauch.
Vielleicht habt ihr einen Tipp für mich?
Vielen Dank schonmal im Voraus!
Im Anhang mein Test-Sketch.
Edit: Direkt eingefügt.
/* Beispiel-Sketch zum Testen der Lichtsteuerung
* Zum steuern wird der serielle Monitor verwendet.
* Gibt man dort z.B. "1" ein, wird die Funktion "Dämmerung Ein" aktiviert, usw.
*/
int Daten[3] = {0, 0, 0};
const byte LED_PIN7 = 7;
const byte LED_PIN8 = 8;
const byte LED_PIN9 = 9;
const byte LED_PIN10 = 10;
const byte LED_PIN11 = 11;
const byte LED_PIN12 = 12;
// Die Blink-Class ist nicht von mir, funktioniert aber (als einzige) ohne Probleme.
class Blink {
private:
unsigned long prevtime;
unsigned int zyklus;
unsigned int an;
public:
Blink(unsigned int _an, unsigned int _zyklus) {
zyklus = _zyklus;
an = _an;
}
boolean currentState () {
// sollte häufig aufgerufen werden, damit der jeweils aktuelle Zustand zurückgeliefert wird
if (millis() - prevtime >= zyklus) {
prevtime = millis();
}
if (millis() - prevtime < an) return true;
else return false;
}
};
Blink mittel(1000, 2000); // blinkt mit 1 Hz
void setup() {
Serial.begin(9600);
pinMode(LED_PIN7, OUTPUT);
pinMode(LED_PIN8, OUTPUT);
pinMode(LED_PIN9, OUTPUT);
pinMode(LED_PIN10, OUTPUT);
pinMode(LED_PIN11, OUTPUT);
pinMode(LED_PIN12, OUTPUT);
}
void loop() {
if (Serial.available() > 0) {
for (int i = 0; i < 1; i++) {
Daten[i] = Daten[i + 1];
}
Daten[1] = Serial.read();
}
if (Daten[0] == '1')
{
daemmerung_ein();
//Serial.println("Tag Ein");
}
if ((Daten[0] == '0'))
{
daemmerung_aus();
//Serial.println("Tag Aus");
}
}
// Ab hier erfolgt die Ablaufsteuerung der einzelnen "Tageszeiten"
void daemmerung_ein()
{
digitalWrite (LED_PIN12, HIGH);
// hier würde ich LEDs nach und nach dazuschalten
digitalWrite (LED_PIN9, HIGH);
digitalWrite(LED_PIN10, mittel.currentState() );
}
void daemmerung_aus()
{
digitalWrite (LED_PIN12, LOW);
// hier würde ich LEDs nach und nach wieder abschalten
digitalWrite (LED_PIN9, LOW);
digitalWrite(LED_PIN10, LOW);
}
Moba-Lichttest.ino (2.04 KB)