Forum: Mikrocontroller und Digitale Elektronik I2C Display flackert


von H.M Murdock (Gast)


Lesenswert?

Hallo zusammen,

ich bin – wie viele vll. hier – neu in Sachen Arduino Programmierung. 
Habe aber in div. anderen programmiertechnischen Sachen Erfahrung (SPS, 
VBA, kleine C++ Kenntnisse).
Bitte verzeiht mir also meine evtl. dumme Frage.
Mein Sketch sieht folgendermaßen aus und soll(te) eingentlich 
folgendermaßen ablaufen:
1.  Sobald das Raspi bereit ist, kommt ein Eingang auf dem Arduino an
2.  Ein Schrittmotor wird freigegeben und startet eine Referenzfaht 
solange bis er auf den Referenzschalter fährt
3.  Dann wird die „Fahrfreigabe“ weggenommen und über den 
Ultraschall-sensor soll geprüft werden ob ein Glas unter/vor dem Sensor 
steht.
Mein Problem ist, dass das Display zwischen dem Schritt 2 und 3 
permanent flackert  so als könnte es sich nicht entscheiden was 
angezeigt werden soll.
Der Sketch zeigt aktuell die letzte Variante. In den If-Bedingungen habe 
ich die „Distance“ schon selbst aufgenommen, hat aber auch nicht 
fuktioniert. Nun probierte ich es mit einer Art Merker, aber leider 
wieder ohne Erfolg.

Für Eure Unterstützung wäre ich dankbar – und ja wie ihr den 
Programmcode entnehmen könnt geht es um eine Cocktailmaschine 
1
/* Schrittkette
2
  // Variable "step" wird als Zustandsmerker verwendet
3
  // Zustände: 0 = Raspi noch nicht bereit (Eingang 3 auf µC noch nicht high)
4
  //           1 = Raspi bereit --> Referenzfahrt Motor
5
  //           2 = Raspi bereit, refpoint Maschine --> Warte auf Glas
6
             3 = Glas unter Dosiereinheit + Bestellung --> Bestellung wird zubereitet
7
*/
8
9
10
//##################################################################
11
12
#define trigger 9
13
#define echo 8
14
#define LED 2
15
#define pi_ready 3
16
#define teller_enable 12
17
#define clk_teller 5
18
#define refpoint_teller 7
19
20
//#################################################################
21
//Variablen
22
int step = 0;                           //Statusmerker
23
int ready = 0;                          //Merker für Automatikmodus
24
int  glada = 0;                          //Glas Da Merker
25
float time = 0, distance = 0;          //Variable zur Abstands-Messung
26
int pwm = 0;                           //PWM-Wert (0....255)
27
28
//###############################################################
29
30
//Bibliotheken einbinden
31
#include <LiquidCrystal_I2C.h>
32
33
34
LiquidCrystal_I2C lcd(0x27, 20, 4);
35
36
37
//#################################################################
38
39
void setup()
40
{
41
  lcd.init();
42
  Serial.begin(9600);
43
44
  pinMode(trigger, OUTPUT);
45
  pinMode(echo, INPUT);
46
  pinMode(LED, OUTPUT);
47
  pinMode(pi_ready, INPUT);
48
  pinMode(teller_enable, OUTPUT);
49
  pinMode(clk_teller, OUTPUT);
50
  pinMode(refpoint_teller, INPUT);
51
52
}
53
//####################################################################
54
55
56
void loop()
57
{
58
  measure_distance();
59
60
  if (digitalRead(pi_ready) == HIGH && (digitalRead(refpoint_teller) == LOW))        //Eingang Raspi bereit
61
  {
62
    step = 1;
63
    lcd_update();
64
    digitalWrite(teller_enable, HIGH);                                           //Antrieb für Flaschenteller freigeben
65
  }
66
67
  else {
68
    digitalWrite(teller_enable, LOW);
69
    step = 0;
70
    lcd_update();
71
  }
72
73
  if (digitalRead(pi_ready) == HIGH && (digitalRead(refpoint_teller) == HIGH ))      //Referenz Flaschenteller erreicht
74
  { digitalWrite(teller_enable, LOW);
75
    step = 2;
76
    ready = 1;
77
    lcd_update();
78
  }
79
80
  if (digitalRead(pi_ready) == HIGH && (digitalRead(refpoint_teller) == HIGH && (ready == 1))) {
81
    step = 3;
82
    lcd_update();
83
  }
84
85
  if (distance < 10)
86
  {
87
    digitalWrite(LED, HIGH);                //Eingang Glas da
88
  }
89
90
91
  Serial.print("Entfernung:  ");
92
  Serial.print(distance);
93
  Serial.print("     Schritt:  ");
94
  Serial.println(step);
95
96
}
97
98
99
100
//#############################################################
101
102
void measure_distance()                   //Ultraschall-Abstands-Messung
103
{
104
  lcd_update();
105
  digitalWrite(trigger, LOW);
106
  delayMicroseconds(2);
107
  digitalWrite(trigger, HIGH);
108
  delayMicroseconds(10);
109
  digitalWrite(trigger, LOW);
110
  delayMicroseconds(2);
111
  time = pulseIn(echo, HIGH);
112
113
  distance = time * 340 / 20000;
114
}
115
116
//############################################################
117
118
void lcd_update()                       //div Statis im LCD anzeigen lassen
119
{
120
  switch (step) {
121
    case 0:                             //Raspi noch nicht bereit
122
      lcd.backlight();
123
      lcd.setCursor(0, 0);
124
      lcd.print(" >> Warte auf Raspi");
125
      lcd.setCursor(0, 1);
126
      lcd.print("    Raspi bereit");
127
      lcd.setCursor(0, 2);
128
      lcd.print("    Referenzfahrt  ");
129
      lcd.setCursor(0, 3);
130
      lcd.print("    Warte auf Glas  ");
131
      break;
132
133
    case 1:                             //Raspi bereit, Referenzfahrt Flaschenteller
134
      lcd.backlight();
135
      lcd.setCursor(0, 0);
136
      lcd.print("    Warte auf Raspi");
137
      lcd.setCursor(0, 1);
138
      lcd.print(" >> Raspi bereit");
139
      lcd.setCursor(0, 2);
140
      lcd.print(" >> Referenzfahrt  ");
141
      lcd.setCursor(0, 3);
142
      lcd.print("    Warte auf Glas");
143
      break;
144
145
    case 2:                               //Referenzpunkt erreicht, warte auf Glas
146
      lcd.backlight();
147
      lcd.setCursor(0, 0);
148
      lcd.print("    Warte auf Raspi");
149
      lcd.setCursor(0, 1);
150
      lcd.print(" >> Raspi bereit");
151
      lcd.setCursor(0, 2);
152
      lcd.print(" >> Referenzfahrt  ");
153
      lcd.setCursor(0, 3);
154
      lcd.print("    Warte auf Glas  ");
155
      break;
156
157
    case 3:                               //Glas da, Bestellung kann entgegengenommen werden
158
      lcd.backlight();
159
      lcd.setCursor(0, 0);
160
      lcd.print("    Warte auf Raspi   ");
161
      lcd.setCursor(0, 1);
162
      lcd.print("    Raspi bereit     ");
163
      lcd.setCursor(0, 2);
164
      lcd.print("    Warte auf Glas     ");
165
      lcd.setCursor(0, 1);
166
      lcd.print(" >> Glas da        ");
167
      break;
168
169
    default:
170
      lcd.backlight();
171
      lcd.setCursor(0, 0);
172
      lcd.print(" >>Initialisierung");
173
      break;
174
175
  }
176
}

von Martin O. (ossi-2)


Lesenswert?

Es sieht für mich so aus, als würdest Du das LC-Display immer 
aktualisieren.
Das kann Flimmern verursachen. Also LC-Display immer nur 1x 
aktualisieren wenn sich was geändert hat.

von H.M Murdock (Gast)


Lesenswert?

Hallo Martin,

vielen Dank für die schnelle Antwort.

Aus diesem Grund habe ich die Funktion lcd_update geschrieben um nur 
dann zu aktualisieren wenn sich in den IF-Bedingungen was geändert hat.

oder wie kann ich das sonst nur 1x aktualisieren?

Danke schon mal im Voraus.

Gruß
Murdock

von Martin O. (ossi-2)


Lesenswert?

Ich glaube Du rufst lcd_update mehrfach auf, selbst wenn sich nichts 
geändert hat.

Du könntest Dir in lcd_update merken, mit welchem Wert von step der 
letzte Aufruf erfolgte, und die Aktualisierung nur machen, wenn ein 
neuer Wert von step kommt.

von H.M Murdock (Gast)


Lesenswert?

Hallo Martin,

habe jetzt den Fehler gefunden :-) manchmal wird man richtig blind wenn 
man solange vor dem Bildschirm sitzt..

der Fehler lag bzw. begann in der 2.IF-Bedingung... Wenn diese erfüllt 
ist, wird die Variable "ready" auf 1 gesetzt und somit ist die 2. und 3. 
if-Bedingung "wahr" somit ist es logisch, dass er nicht weiß was er 
anzeigen soll/darf und muss :-)

vielen Dank für die schnelle Hilfe...

Da muss ich mir noch was anderes einfallen lassen :-)

Gruß und schönen Abend noch

Murdock

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.