PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD Flackert



Stephan90
15.12.2016, 00:32
Hallo,
Ich bin gerade dabei ein Programm zu erstellen bei dem eine Heizung je nach Temperatur ein bzw. ausgeschalten werden soll. Die soll Temperatur kann über Taster eingestellt werden.
Auf einem LCD Display wird die Soll und Ist Temperatur angezeigt . Das Programm funktionier soweit auch (Ausgänge per LED simuliert), allerdings habe ich das Problem das die Temperatur werte im Display leicht flackern (nur die Grad Angabe, der Text "Soll Temp:" und "Ist Temp" wird ohne Flackern angezeigt). Ich habe gelesen das man diese werte nur aktualisieren soll wenn sie sich auch ändern, daher kann das Flackern kommen. Ist das richtig? Wenn ja weis ich aber nicht so richtig wie ich das im Programm umsetzen soll.
Danke im voraus


#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

float sensor = 0;
int celsius = 0;
int soll_temp = 30;
int einschalt_temp = 0;
int abschalt_temp = 0;
int taster_temp_hoch = 2;
int taster_temp_runter = 3;
int heizung = 4; //LED rot
int lueftung = 5; //LED grün
unsigned long previousMillis = 0;
unsigned long interval = 1000;
unsigned long previousMillis2 = 0;
unsigned long interval2 = 1000;

void setup()
{
lcd.begin(16, 2);
pinMode(taster_temp_hoch, INPUT_PULLUP);
pinMode(taster_temp_runter, INPUT_PULLUP);
pinMode(heizung, OUTPUT);
pinMode(lueftung, OUTPUT);
}

void temp_einstellung()
{
if(digitalRead(taster_temp_hoch) == LOW)
{
if(millis()-previousMillis > interval)
{
previousMillis = millis();
soll_temp++;
}
}
if(digitalRead(taster_temp_runter) == LOW)
{
if(millis()-previousMillis > interval)
{
previousMillis = millis();
soll_temp--;
}
}
}

void temp_regelung()
{
if(celsius > abschalt_temp)
{
digitalWrite(heizung, LOW);
}
else if(celsius < soll_temp)
{
digitalWrite(heizung, HIGH);
}
}

void LCD_ausgabe()
{
lcd.setCursor(0, 0);
lcd.print("Soll Temp: C");
lcd.setCursor(11, 0);
lcd.print(soll_temp);
lcd.setCursor(0, 1);
lcd.print("Ist Temp: C");
lcd.setCursor(10, 1);
lcd.print(celsius);
}

void loop()
{
digitalWrite(lueftung, HIGH);

sensor = analogRead(0);
celsius = (580.0-sensor)/10;

abschalt_temp = soll_temp + 2;

temp_einstellung();
temp_regelung();
LCD_ausgabe();
}

BMS
15.12.2016, 05:24
Hallo,
an deiner Stelle würde ich einfach eine kleine Verzögerung in die LOOP programmieren (z.B. 50-100ms).
Spricht etwas dagegen?
Grüße, Bernhard

Sisor
15.12.2016, 06:49
In LCD_ausgabe() schreibst du erst Leerzeichen, um sie dann sofort mit Temperaturwerten zu überschreiben -> Flackern. Versuchs mal mit printf (http://playground.arduino.cc/Main/Printf).

Hubert.G
15.12.2016, 08:37
Du verwendest doch millis(); Warum verwendest du das nicht auch um nur alle 500msec etwas auf das LCD zu geben.

oberallgeier
15.12.2016, 08:56
.. das Problem das die Temperatur werte im Display leicht flackern ..Die üblichen LCD-Routinen haben relativ lange Wartezeiten bei der Ausgabe der einzelnen Befehlen ans LCD. Wenn man da eine schnelle Schleife zum Anzeigen/Ausgeben von Werten hat, dann ist dieses Flackern nicht unüblich. Aber Deine Sensor+Celsius-Berechnung enthält ja Gleitkommaoperationen, deren Ablauf die Ausgabe verlängert (ich kenne aber keine arduino-Bibliothek, weder für FP noch für LCD). Die Vorschläge von Bernhard und Hubert.G sehe ich als erfolgversprechend an.
Zuletzt: Ich habe eine Schaltung aus "meiner Frühzeit" mit einem zweizeiligen, beleuchteten LCD direkt mit dem Controller an/hinter einem LDO-Spannungswandler (2950) - da flackern die Ausgaben immer, weil der mit dem Strom für die LCD-Beleuchtung und eine Messoperation durch Bestromung von Bauteilen wohl am oberen Ende der Spezifikation oder darüber ausgelastet ist.

Peter(TOO)
15.12.2016, 16:27
void LCD_ausgabe()
{
static int last_Celsius = -1000;
static int last_soll_temp = -1000;

if (last_soll_temp != soll_temp)
{
last_soll_temp = soll_temp;

lcd.setCursor(0, 0);
lcd.print("Soll Temp: C");
lcd.setCursor(11, 0);
lcd.print(soll_temp);

}
if (last_celsius != celsius)
{
last_celsius = celsius;

lcd.setCursor(0, 1);
lcd.print("Ist Temp: C");
lcd.setCursor(10, 1);
lcd.print(celsius);
}
}

Stephan90
15.12.2016, 21:21
Sehr gut, vielen dank für eure Tipps.

Eine frage noch gibt es ein buch welches man für den einstieg empfehlen kann?

Danke