Aufgabenstellung:4 Spannungen an einer analogen Modellbahnanlage in Spur N sollen überwacht werden. Die Messwerte der einzelnen Spannung sollen in einem Bereich (hier zwischen 5.0V und 8.5V) jeweils über LED und LC-Display angezeigt werden.

Software: Die Hardware habe ich hier beschrieben …

Das Programm ist zusätzlich zu den beiden Standardfunktionen setup() und loop(), die jedes Arduino Programm erst einmal hat, mit einer Scann-Funktion und jeweils einer Ausgabe-Funktion für die LEDs und das LC-Display aufgebaut.

In der setup() wird das Display initialisiert, ein kurzer Text auf dem Display ausgegeben und der Pinmode für die DIOs am Ardunio definiert.

lcd.begin(20, 2);
lcd.setCursor(0, 1);
lcd.print("Initialisierung...");

...

pinMode( LED_Ch1, OUTPUT);              // LED Ch1 Port PB1 für A0
pinMode( LED_Ch2, OUTPUT);              // LED Ch2 Port PB0 für A1
pinMode( LED_Ch3, OUTPUT);              // LED Ch3 Port PD7 für A2
pinMode( LED_Ch4, OUTPUT);              // LED Ch4 Port PD6 für A3

In meiner Scann-Funktion scann_channel ( ) wird als Parameter die Kanalnummer übergeben und die Funktion liefert einen Messwert zurück.

int scann_channel ( uint8_t channel ) {
 int val;  // Bereich 0..1023 0x03FF 5V / 1024 = 4,9mV

 if ( channel = 1 ) {
   val = analogRead( A0 );    // read the input pin
 } else if ( channel = 2 ) {
   val = analogRead( A1 );    // read the input pin
 } else if ( channel = 3 ) {
   val = analogRead( A2 );    // read the input pin
 } else if ( channel = 4 ) {
   val = analogRead( A3 );    // read the input pin
 } else {
   //
 }

 return val;
}

Für die Ausgabe an den LEDs habe ich die Funktion update_led() erstellt. Die Funktion bekommt die Kanalnummer und den dazugehörigen Messwert übergeben. Dann wird für jeden Kanal die Schaltschwelle geprüft und der Ausgang zum Kanal entweder HIGH oder LOW gesetzt.

void update_led ( uint8_t channel, uint8_t value ) {

 if ( channel == 1 ) {              // Auswahl Channel == 1
  if (( value >= lower_Level ) && ( value <= upper_Level )) {
    digitalWrite(LED_Ch1, HIGH);  // Bei HIGH ist die LED "grün" an bei LOW "rot"
  } else {
    digitalWrite(LED_Ch1, LOW);   // Bei LOW ist die LED "rot" an bei HIGH "grün"
  }
 } else if ( channel == 2 ) {      // Auswahl Channel == 2
  if (( value >= lower_Level ) && ( value <= upper_Level )) {
    digitalWrite(LED_Ch2, HIGH);  // Bei HIGH ist die LED "grün" an bei LOW "rot"
  } else {
    digitalWrite(LED_Ch2, LOW);   // Bei LOW ist die LED "rot" an bei HIGH "grün"
  }
 } else if ( channel == 3 ) {      // Auswahl Channel == 3
  if (( value >= lower_Level ) && ( value <= upper_Level )) {
    digitalWrite(LED_Ch3, HIGH);  // Bei HIGH ist die LED "grün" an bei LOW "rot"
  } else {
    digitalWrite(LED_Ch3, LOW);   // Bei LOW ist die LED "rot" an bei HIGH "grün"
  }
 } else if ( channel == 4 ) {      // Auswahl Channel == 4
  if (( value >= lower_Level ) && ( value <= upper_Level )) {
    digitalWrite(LED_Ch4, HIGH);  // Bei HIGH ist die LED "grün" an bei LOW "rot"
  } else {
    digitalWrite(LED_Ch4, LOW);   // Bei LOW ist die LED "rot" an bei HIGH "grün"
  }
 } else {
  //
 }

 return;
}

In der loop() Funktion wird dann regelmäßig die Scann-Funktion und die Ausgabefunktionen aufgerufen.

void loop() {
 // Pause
 delay ( warte );

 // Channel 1..4 scannen
 // Display aktualisieren
 // LED aktualisieren
 for ( uint8_t i_loop = 1; i_loop <= 4; i_loop++ ) {
    int value = scann_channel( i_loop );
    update_lcd( i_loop, value );
    update_led( i_loop, value );
 }
}

Das war eigentlich schon alles. Hier ist die ganz Datei “VControl.ino“.

Sorry, the comment form is closed at this time.