schnelle Steuerung und langsame Displayanzeige?

Hallo zusammen,

ich habe vor für meinen Campingbus ein kleines “Terminal” zu bauen, welches folgende Funktionen bietet:

  • LED Beleuchtung dimmen über PWM (up / down mit Tastern)
  • Anzeige von Bordspannung, Temperatur, Stromstärke und Dimmerwert am Display
  • Schalten eines bistabilen Hochleistungsrelais beim unterschreiten einer Mindestspannung

Den Sketch dazu habe ich bereits geschrieben, jedoch wird alles hintereinander in der loop ausgeführt. Dabei komme ich auf folgendes Dilemma. Entweder wird durch die delays im Programm das Display schön ruhig angezeigt, dafür reagieren die Taster zum dimmen der Beleuchtung viel zu träge, weil diese ja nur einmal pro Durchlauf abgefragt werden, oder ich schraube die delays soweit runter, dass zwar die Taster akzeptabel funktionieren, dafür das Display flackert, bzw die Werte sich so schnell ändern, dass diese nicht mehr ablesbar sind.
Schließlich muss das Display in jedem Durchlauf gelöscht werden.
Wie könnte ich das Problem elegant lösen?

#include <LiquidCrystal.h>
int heller = 8;
int dunkler = 10;
int pwm;
int ledPin = 9;
int mess1 = 0;
int mess2 = 1;
int LM35 = A2;
float SensorValue = 0;
float temperatur = 0;
float temp1;



// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);


void setup() {
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
 
 
  
}

void loop() {
  
  
// PWM LED Dimmer Abschnitt

  if(digitalRead(heller) == HIGH){
    if(pwm <50){
pwm = pwm + 2;
delay(100);
    }
    if(pwm >= 50 && pwm < 205){ 
      pwm = pwm + 50;
delay(100);
  }  
  }

  
if(digitalRead(dunkler) == HIGH){
    if(pwm >=2 && pwm <=50){
    pwm = pwm - 2;
    delay(100);
    }
    if(pwm >=100){
      pwm = pwm - 50;
      delay(100);
    
  }
  }
  
  
  analogWrite(ledPin, pwm);
  
  
  
  
  int mess1 = analogRead(0);
  float Spannung = map(mess1, 0, 1024, 0 , 1475)/100.00;
  
  int mess2 = analogRead(1);
  float Strom = map(mess2, 0, 1024, -300, 300)/10.00;

SensorValue = analogRead(LM35);  
temp1 = (5.0 * analogRead(LM35) * 100.0) / 1024;


  
 delay(200);
  lcd.clear();
  
  lcd.print("U=");
  lcd.print(Spannung);
  lcd.print("V");
  
  lcd.setCursor(8,0);
  lcd.print("I=");
  lcd.print(Strom,1);
  lcd.print("A");
  
  lcd.setCursor(0,1);
  lcd.print(temp1,0);
    
  lcd.setCursor(8,1);
  lcd.print("DIM: ");
  lcd.print(pwm);
  

  
}

Schmeiß die delays() raus und benutze millis(). http://arduino.cc/en/Tutorial/BlinkWithoutDelay

Grüße Uwe

fantauser: Schließlich muss das Display in jedem Durchlauf gelöscht werden.

Das Display muss natürlich nicht in jedem Durchlauf gelöscht werden. Das hatten wir erst gerade gestern hier im Forum, Du kannst alle Daten auch an Ort und Stelle überschreiben: http://arduino.cc/forum/index.php?topic=154543.0

fantauser: Wie könnte ich das Problem elegant lösen?

Die elegante Lösung ist ein komplett anderes Programmdesign, das vollständig ohne Delays auskommt.

Also den Programm-Sketch von Anfang an neu schreiben und "delay" als verbotene Funktion betrachten.

Und die rangestückelte Lösung wäre es, alle langen Delays in kürzere Delays zu zerstückeln, zwischen die dann nochmal Tastaturabfragen dazwischengeschoben werden, so dass schneller auf Tastendrücke reagiert wird.

WOW vielen dank, ich habe das mit den millis() umgesetzt, jetzt wird das Display nur alle 2 Sekunden aktualisiert, was gleichzeitg springende werde vor allem beim Strom unterdrückt. Ich lösche das Display weiterhin komplett, da ein flackern nun nicht mehr auftritt. Die Beleuchtung lässt sich nun unabhängig von der Aktualisierung dimmen. TOLL !!! 8)