PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Arduino Unendliche Schleife auf LCD



pro-bot128
01.07.2011, 18:27
Hallo zusammen,
ich habe ein Arduino System für meinen Kühlschrank gebaut, da dieser immer von alleine aufgeht. Ich habe eine Alufolie an der Tür und eine am Kühlschrank befestigt. Daran hab ich Kabel gelötet (eins geht in GND und eins in Pin 2). Zusätzlich ist ein Lautsprecher und ein LCD-Display angeschlossen. Wenn der Kühlschrank geschlossen ist, steht auf dem Display "Geschlossen" und wenn er geöffnet ist, steht dort "Geöffnet". Die Schleife fragt ab, ob der Wert des Schließers NICHT 0 gibt, dann steht auf dem Display "Geöffnet" und wenn der Schließer 0 gibt, steht "Geschlossen". Aber der Wert gibt bei jedem geschlossenen Male NICHT 0 ist (fast immer, da Kühlschrank immer zu ist) ist. Das ist mein Problem: Der Text auf dem Display wird immer neu geschrieben, und das gibt ein Flackern auf dem Display wieder. Das möchte ich verhindern. Das Problem ist, dass ich kein delay dahinter benutzen kann, da sonst die Erkennung des Inputs nicht mehr funktioniert. Gibt es irgendeine Schleife oder sowas was dieses Problem verhindert?

Danke

Skript:


#include "pitches.h"
#include <LiquidCrystal.h>

int kuehlschrank = 2;
int ksvalue;
int LS = 8;

int melody[] = {
NOTE_C4, NOTE_G3};


int noteDurations[] = {
2,2};

byte oe[8] =
{
B01010,
B00000,
B01110,
B10001,
B10001,
B10001,
B01110,
B00000,
};

LiquidCrystal lcd(12,11,10,7,6,5,4);

void setup()
{
lcd.begin(16,4);
lcd.setCursor(0,0);
lcd.print(" KUEHLSCHRANK ");
lcd.setCursor(0,1);
lcd.print("*****************");
lcd.setCursor(0,2);
lcd.print("Akt. Zustand");
lcd.setCursor(0,3);
lcd.print("Geschlossen");
pinMode(kuehlschrank, INPUT);
digitalWrite(kuehlschrank, HIGH);
tone(LS, NOTE_C4, 4);
lcd.createChar(0, oe);
}

void loop()
{
ksvalue = digitalRead(kuehlschrank);
if(ksvalue == !0)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" KUEHLSCHRANK ");
lcd.setCursor(0,1);
lcd.print("*****************");
lcd.setCursor(0,2);
lcd.print("Akt. Zustand:");
lcd.setCursor(0,3);
lcd.print("Ge");
lcd.setCursor(2,3);
lcd.write(0);
lcd.setCursor(3,3);
lcd.print("ffnet!");
bell();
}
else
{
lcd.setCursor(0,0);
lcd.print(" KUEHLSCHRANK ");
lcd.setCursor(0,1);
lcd.print("*****************");
lcd.setCursor(0,2);
lcd.print("Akt. Zustand:");
lcd.setCursor(0,3);
lcd.print("Geschlossen!");
}
}

void bell()
{
for (int thisNote = 0; thisNote < 3; thisNote++)
{


// divided by the note type.
//e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
int noteDuration = 1000/noteDurations[thisNote];
tone(8, melody[thisNote],noteDuration);

// to distinguish the notes, set a minimum time between them.
// the note's duration + 30% seems to work well:
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
// stop the tone playing:
noTone(8);
}
}


MfG pro-bot128

Slein
01.07.2011, 18:43
Derer Möglichkeiten gibt es viele, dies ist eine davon:

while(1) {
while(!digitalRead(kuehlschrank);
/* geschlossen */
while(digitalRead(kuehlschrank);
/* offen */
}

Man könnte auch einen Timer nehmen und z.B. einmal pro Sekunde den Status der Tür abfragen.
Oder ksvalue nach jeder Prüfung merken und nur bei einer Änderung was aufs LCD schreiben.
Oder einen Pin Change Interrupt nehmen.
:)

radbruch
01.07.2011, 18:59
Merke dir den Zustand der Tür und gib nur eine Meldung aus wenn sich der Zustand ändert. Nach der Ausgabe merkst du dir dann wieder den aktuellen Zustand:

zustand=get_tuer();
put_lcd(zustand);
while(1)
{
if(get_tuer() != zustand)
{
zustand=get_tuer();
put_lcd(zustand);
}
}

[Edit]Mal wieder zu langsam ;)

pro-bot128
02.07.2011, 15:55
danke für die Antworten! Jetzt hab ich es hinbekommen.