7 Segment anzeige Aktualisierrate ändern Arduino?
Hallo, ich baue ein Voltmeter mit esc steuerung und als anzeige verwende ich ein 7 Segment Display. Mein Problem ist, dass sich das Display zu schnell aktualisiert, so dass die Zahlen nicht lesbar sind.
Ich möchte das sich die Spannung jede sekunde aktualisiert und das display das ohne flackern anzeigt.
Vielen Dank im Vorraus!!
#include "SevSeg.h" ;
int sum = 0;
unsigned char sample_count = 0;
float voltage = 0.0;
#include <Servo.h>
#define PIN_MOTOR 13
#define PIN_POTI A2
#define NUM_SAMPLES 10
SevSeg sevseg;
Servo servo;
unsigned long startTime, delayTime = 1000;
int val = 0;
void setup()
{
startTime = micros();
servo.attach(PIN_MOTOR);
servo.write(25);
delay(2000);
byte numDigits = 4;
byte digitPins[] = {2, 3, 4, 5};
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 1};
sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins);
}
void loop()
{
sevseg.setNumber(voltage * 1132,2);
sevseg.refreshDisplay();
sevseg.setBrightness(90);
while (sample_count < NUM_SAMPLES) {
sum += analogRead(A0);
sample_count++;
}
voltage = ((float)sum / (float)NUM_SAMPLES * 5.015) / 1024.0;
Serial.print(voltage * 11.132);
Serial.println (" V");
sample_count = 0;
sum = 0;
if ((millis() - startTime) >= delayTime){
val = map(analogRead(PIN_POTI), 0, 676, 30, 110);
servo.write(val);
Serial.println(val);
startTime = micros();
} }
2 Antworten
sevseg.setNumber(voltage * 1132,2);
sevseg.refreshDisplay();
Zwischen diesen beiden oberen Zeilen ein delay(); einbauen.
sevseg.setBrightness(90);
Kann das nicht besser in die void setup, damit es nur einmal ausgeführt wird und nicht wie bisher 50.000 Mal pro Sekunde die Leuchtkraft eingestellt werden muss?
Die helligkeit habe ich nun in das setup gepackt schein auch zu funktionieren.
delay ist bei sowas nicht wirklich geeignet. Dann wird wahrscheinlich zu selten gemessen um einen guten Durchschnitt zu bekommen.
Man könnte die Anzeige aber einfach eine den if-Block machen vergleichbar zu dem unten mit dem Servo. Den dann eben mit einen passenden Interval für jede Sekunde
Delay ist für sowas der falsche Ansatz. Mache das
sevseg.setNumber(voltage * 1132,2);
in einen if-Block mit Intervall von einer Sekunde ähnlich wie du es unten für den Servo machst. Der refresh Befehl darf da aber nicht mit rein. Der muss mit hoher Frequenz aufgerufen werden
hmm... Funktioniert trotzdem nicht, das Display aktualisiert sich wieder so schnell dass man die Messung nicht lesen kann.
Trotzdem danke für deine Antwort.
if ((millis()- startdisplay) >= displaydelay) {
sevseg.setNumber(voltage * 1132,2);
}
Du musst auch
startdisplay = millis();
In dem Block setzten damit es auch funktioniert. Ansonsten wird es wenn nach dem ersten überschreiten des Intervalls wieder in jeder loop-Iteration ausgeführt.
So?
if (startdisplay = millis()>= displaydelay); {
sevseg.setNumber(voltage * 1132,2);
}
Weil es passiert immernoch dasselbe.
Nein so:
if ((millis()- startdisplay) >= displaydelay) {
startdisplay = millis();
sevseg.setNumber(voltage * 1132,2);
}
Hallo,
die Zeile:
sevseg.setBrightness(90);
ab ins Setup .. dieses musst du nur einmal ausführen..wenn er fester wert sein soll..
die zeilen:
sevseg.setNumber(voltage * 1132,2);
sevseg.refreshDisplay();
würde ich in die millis-abfrage verschieben..würde dann nicht den loop unterbrechen und alle 1000ms das display refreshen
Hi, wenn ich ein delay von 1000 eingebe passiert das:
https://youtu.be/bKX9_bWduWQ