Hallo Leute,
ich arbeite gerade an einem neuen Projekt und möchte bereits von Anfang an
möglichst auf die Delay-Funktion verzichten um das Programm nicht zu stoppen.
Ich bin zwar noch relativ frisch was das Thema Arduino angeht,
doch ich denke die Funktionsweise der millis-Auswertung habe ich durchaus verstanden.
Ziel bei dem Projekt soll es sein, eine 7-Segment-Anzeige anzusteuern und Ziffern anzuzeigen.
Über einen Transistor wird die Helligkeit geregelt, welcher an den gemeinsamen Kathoden angeschlossen ist.
Das ganze funktioniert auch wie vorgesehen, jedenfalls solange ich nicht auf "millis" zugreife.
Ich habe eine kleine Startanimation erstellt, welche noch durch "delay" verzögert wird,
währenddessen funktioniert die Dimmung noch tadellos,
direkt danach nutze ich nur noch millis zur Verzögerung, was dann sofort dazu führt,
dass die Dimmung nicht mehr arbeitet und in voller Helligkeit angezeigt wird. (255)
Ich habe testweise die millis-Funktion mal auskommentiert und per delay verzögert,
dann ist das Problem behoben und die vorgesehene Dimmung bleibt erhalten.
Weiterhin habe ich auch schon den Pin für die Ansteuerung des Transistors geändert,
um von ADC2 auf ADC1 zu wechseln, das hat aber auch nichts gebracht, gleiches Ergebnis.
Ich verwende für das Projekt einen ESP32, der Transistor hängt an GPIO4 und wurde testweise auf GPIO33 verlegt ohne Änderung.
Kann mir vielleicht jemand sagen warum das so ist und wie ich es umgehen kann?
Hier zumindest ein wenig Code der Interessant sein könnte......
// ------- Variablendimensionierung ------------------
bool neuStart = true; // System neu gestartet? (Startanimation)
const int startanimationVerzoegerung = 300; // Wie schnell soll die Startanimation angezeigt werden?
int unsigned long messTimer_Start = 0; // enthält die millis-Werte zu Beginn der Messung
const int messIntervall = 1000; // Auswertung des Gangsignals alle XX Millisekunden
const int helligkeitTag = 255; // Helligkeit des Display bei Tag
const int helligkeitNacht = 10; // Helligkeit des Display bei Nacht
// --- Pinbelegung 7-Segment-Anzeige---
int segment_a = 23; // Pins als Variablen angelegt (Ganzzahlen)
int segment_b = 22;
int segment_c = 21;
int segment_d = 19;
int segment_e = 18;
int segment_f = 17;
int segment_g = 16;
int segment_dot = 32;
int dimmer = 4; // Transistor für Helligkeitsregelung
//########### Setup ############
void setup() {
Serial.begin(9600); // Seriellen Monitor starten
// ------- Pins konfigurieren ---------------
pinMode(segment_a, OUTPUT);
pinMode(segment_b, OUTPUT);
pinMode(segment_c, OUTPUT);
pinMode(segment_d, OUTPUT);
pinMode(segment_e, OUTPUT);
pinMode(segment_f, OUTPUT);
pinMode(segment_g, OUTPUT);
pinMode(segment_dot, OUTPUT);
pinMode(dimmer, OUTPUT);
}
//########## Beginn Hauptschleife ###########
void loop() {
analogWrite(dimmer,helligkeitNacht); // Helligkeit für Display festlegen
// -------------- Systemneustart ------------
if (neuStart == true) { // Wenn System neu gestartet wurde
neustartAnimation(); // Startanimation durchführen
neuStart = false; // Neustart wurde abgeschlossen
}
if (millis() - messTimer_Start >= messIntervall) {
// Ansteuerung des Displays........
messTimer_Start = millis(); // neuen Startwert für Verzögerung setzen
}