Ampelschaltung mit Drehregler

Moin zusammen,

ich hätte mal eine Frage, und bin momentan am herumsuchen, wie man dies am sinnvollsten Lösen kann. Ich möchte für die Modellbahn eine Ampelschaltung bauen, welche Variabel mit einem Drehregler einstellbar ist, so dass ich mit diesem bestimmen kann, wie lange eine Spur Grün geschaltet ist.

Um erst einmal ein Gefühl für das Programmieren mit Arduino zu bekommen, habe ich eine LED am Pin 13 mit GND verbunden, und einen Drehregler angeschlossen. Mit einem einfachen Code lasse ich nun die LED Blinken im Takt des Drehreglers. Dieser geht von 0,0 bis 10230 - Also 0 bis 10,2 Sekunden.

Über die Serielle Schnittstelle lasse ich mir die Zeit ausgeben, um zu sehen, wie viele Sekunden jeweils der Drehregler als Takt angibt.

int eingang= A0;
int LED = 13;

int sensorwert = 0;

int MILISEK = 0;
int SEK = 0;

int i= 10;



void setup()
{
  pinMode (LED, OUTPUT);
  Serial.begin(9600);
}


void blinklicht()
{
  digitalWrite (LED, HIGH);
  delay (sensorwert);
  digitalWrite (LED, LOW);
  delay (sensorwert);
}
 
void loop()
{
  sensorwert =analogRead(eingang)*10;
  SEK = sensorwert / 1000;
  MILISEK = (sensorwert / 10)- (SEK *100);
  Serial.print(SEK);
  Serial.print(",");
  Serial.print(MILISEK);
  Serial.println(" Sekunden");
  blinklicht();
}

Nun findet aber leider die Abfrage der Zeit immer nur einmal pro Loop statt, was zur Folge hat, dass man relativ unschön hier seinen Wert abfragen kann. bei einem Loop von 10 sekunden kann es daher schon mal 20 sekunden dauern, bis man wieder ein neues Ergebnis im Seriellen Monitor lesen kann.

Später möchte ich die Daten auf einem LCD Display ausgeben, dass man unter der Anlage seine zwei Regler hat, und auf dem Display ablesen kann, welche Zeiten welche Spur hat. Nur dazu will ich erst mal selber die Grundlagen dazu verstehen und verinnerlichen, denn letztendlich ist eine Ampelschaltung ja auch nur ein Loop mit bisschen mehr hin und her geblinke einzelner Lichter.

Daher meine Frage an euch, wie ich die Abfrage so gestalten kann, dass ich alle 10 Millisekunden einen Messwert erhalte, der vom Drehregler aus abgefragt wird, und somit komfortabler die Zeitdauer einstellen kann, und nicht wie aktuell mit den Wartezeiten.

Würde mich auf eine schnelle Antwort freuen

Grüße Phillip

Da machst du schon einen grundsätzlichen Fehler.

Die Loop darf keine 10 Sekunden dauern. Das liegt an den delays in deinem Programm.

Diese müssen raus und durch eine Funktion mit millis ersetzt werden.
Sieh dir dazu bitte die Funktion "BlinkWithoutDelays" an.

Damit kannst du, vorausgesetzt, richtig programmiert, einen sehr kurzen Lopp-Durchlauf erreichen.

Sehr geil ... das funktioniert perfekt so weit ... nun kann ich am Drehregler die Zeit einstellen ohne die gesamte schleife abzuwarten :slight_smile: Dann kann ich ja nun tiefer in die Materie einsteigen und die Ampel perfektionieren.

Danke hierfür :slight_smile:

Grisu83:
Sehr geil ... das funktioniert perfekt so weit ... nun kann ich am Drehregler die Zeit einstellen ohne die gesamte schleife abzuwarten :slight_smile: Dann kann ich ja nun tiefer in die Materie einsteigen und die Ampel perfektionieren.

Danke hierfür :slight_smile:

Ja, super. Das ging ja mal schnell. :wink:
Viele haben Probleme das zu verstehen.
Weiterhin viel Erfolg.