#include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); unsigned long terminAlt = 0, terminNeu = 0; int ZustandAlt = LOW ; int ZustandNeu = LOW ; float f = 0; float highscore = 0.0; void setup() { lcd.begin(16, 2); lcd.print("Freq: "); pinMode(A3, INPUT); Serial.begin(9600); } void loop() { ZustandNeu = digitalRead(A3); if (ZustandNeu == HIGH && ZustandAlt == LOW) { terminNeu = micros(); if (terminNeu > terminAlt) { unsigned long T = terminNeu - terminAlt; f = 1000000.0 / T; lcd.setCursor(7, 0); lcd.print(" "); lcd.setCursor(7, 0); lcd.print(f); } terminAlt = terminNeu; } ZustandAlt = ZustandNeu; } hi ich bin neu hier hab seit kurzen einen Arduino nano bekommen und hab mich eine bisschen damit beschäftigt kann mir jmd hier weiter helfen mein lcd display flackert immer wenn ich an meinem ANEMOMETER VANE PROBE rein puste
:
Verschoben durch Moderator
Spannend ist allein schon, dass du einen Zustand hast, der anscheinden High (1) oder Low (0) sein kann und ihm einen analogen Wert zwischen 0 und 1023 zuweist.
David H. schrieb: > lcd.setCursor(7, 0); > lcd.print(" "); > > lcd.setCursor(7, 0); > lcd.print(f); Es flackert, wenn Du Zeichen erst löschst und dann wieder beschreibst. Besser einfach überschreiben und das löschen weglassen. Hinten allenfalls noch mit Leerzeichen auffüllen, damit nichts altes stehenbleibt, falls die Zahl mal kürzer wird.
:
Bearbeitet durch User
Sebastian R. schrieb: > Spannend ist allein schon, dass du einen Zustand hast, der > anscheinden > High (1) oder Low (0) sein kann und ihm einen analogen Wert zwischen 0 > und 1023 zuweist. Ah. Sorry. DigitalRead. Ich habe AnalogRead gelesen gehabt. Mea Culpa
Das flackert weil du ja zuerst mal mit Leerzeichen das Feld überschreibst und dann erst nochmal mit Text. Der Funktionsaufruf print() updatet das Display sofort. Du wirst dich wohl ein wenig mit Text-Operationen auseinander setzen müssen um die Zeile erstmal vor zu bereiten, und dann mit nur einem Aufruf zu printen. EDIT: Zu spät ;) Und stimmt, es spielt ja keine Rolle ob die Zeile samt Leerzeichen mal kürzer oder mal länger wird, Hauptsache die Leerzeichen überschreiben die Zahlen vom letzten Mal.
:
Bearbeitet durch User
David H. schrieb:
Find ich gut, dass sich nun schon 12 jährige mit Software beschäftigen.
Kein Witz.
David H. schrieb: > mein lcd display flackert immer wenn ich an meinem ANEMOMETER VANE PROBE > rein puste Wenn du die Vorschläge der Vorposter umsetzt wird das Flackern wegsein, aber wohl selten ein lesbarer Wert am Display stehen(bleiben) Du könntest das Aktualisieren der Anzeige auf wenige Hertz beschränken?! Und dann den (Mittel)wert über die Periode anzeigen. Und den Maximalwert (der letzten 10sec?)- nachdem du eine highscore im Code hast?
Am einfachsten ist es, f auf (long) zu casten und dann sprintf zu verwenden: // Speicherplatz für String reservieren // Achtung: Ein Byte für abschließende \0 char textToDisplay[8]; // Zahl in formatierten String wandeln sprintf(textToDisplay, "%8lu", (unsigned long)(f)); // und ausgeben lcd.setCursor(7, 0); lcd.print(textToDisplay); Gruß Hermann
Ich würde nach jeder Ausgabe einen delay(500) einbauen, damit zwischen zwei Ausgaben genug Zeit für die Darstellung und das Ablesen reserviert ist.
an alle DANKE für die Hilfe! hab es geschafft #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); unsigned long terminAlt = 0, terminNeu = 0, terminAusgabe = 0; int ZustandAlt = LOW ; int ZustandNeu = LOW ; float f = 0; void setup() { lcd.begin(16, 2); lcd.print("Freq: "); pinMode(A3, INPUT); Serial.begin(9600); } void loop() { ZustandNeu = digitalRead(A3); if (ZustandNeu == HIGH && ZustandAlt == LOW) { terminNeu = micros(); if (terminNeu > terminAlt) { unsigned long T = terminNeu - terminAlt; f = 1000000.0 / T; } terminAlt = terminNeu; } ZustandAlt = ZustandNeu; if (millis() >= terminAusgabe) { terminAusgabe += 250; lcd.setCursor(7, 0); lcd.print(" "); lcd.setCursor(7, 0); lcd.print(f); } }
:
Bearbeitet durch User
Zum Abschluss noch der obligatorische Hinweis auf das Textformat. Hilft den Helfenden beim helfen... (Wie, steht über dem Texteingabefeld unter Formatierung )
1 | #include <LiquidCrystal.h> |
2 | LiquidCrystal lcd(12, 11, 5, 4, 3, 2); |
3 | |
4 | unsigned long terminAlt = 0, terminNeu = 0, terminAusgabe = 0; |
5 | int ZustandAlt = LOW ; |
6 | int ZustandNeu = LOW ; |
7 | float f = 0; |
8 | |
9 | |
10 | void setup() { |
11 | lcd.begin(16, 2); |
12 | lcd.print("Freq: "); |
13 | pinMode(A3, INPUT); |
14 | Serial.begin(9600); |
15 | }
|
16 | |
17 | void loop() { |
18 | ZustandNeu = digitalRead(A3); |
19 | if (ZustandNeu == HIGH && ZustandAlt == LOW) { |
20 | terminNeu = micros(); |
21 | if (terminNeu > terminAlt) { |
22 | unsigned long T = terminNeu - terminAlt; |
23 | f = 1000000.0 / T; |
24 | }
|
25 | terminAlt = terminNeu; |
26 | }
|
27 | ZustandAlt = ZustandNeu; |
28 | |
29 | if (millis() >= terminAusgabe) { |
30 | terminAusgabe += 250; |
31 | lcd.setCursor(7, 0); |
32 | lcd.print(" "); |
33 | |
34 | lcd.setCursor(7, 0); |
35 | lcd.print(f); |
36 | }
|
37 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.