Hallo Ihr Programmierprofis.
Ich möchte keinen delay verwenden und benutze folgenden Code:
if ((fire == 1)&& (LaserDetectValue < schwellenwert)){
led1State = HIGH;
currentMillis=millis();
}
if (millis() - currentMillis > 500)
led1State =LOW;
digitalWrite(24, led1State);
LED geht an wenn der Schwellenwert erreicht ist, aber sie geht geht nicht mehr aus.
Wo liegt mein Fehler?
Danke für Eure Hilfe
Schau Dir mal die Syntax von "If" an.
Hilf mir bitte auf die Sprünge, selbst wenn ich geschweifte Klammern verwende, ändert sich nichts dran
Hallo,
auch wenn die Formatierung ungünstig ist, liegt der Fehler bestimmt woanders.
Besser formatiert sieht dein Codeschnipsel so aus.
if ((fire == 1) && (LaserDetectValue < schwellenwert)) {
led1State = HIGH;
currentMillis = millis();
}
if (millis() - currentMillis > 500) {
led1State = LOW;
}
digitalWrite(24, led1State);
wenn die LED nicht ausschaltet, laut die Frage, wird die erste if Bedingung weiterhin erfüllt?
Effekt wäre, die LED schaltet permanent ein und aus. Das macht sie so schnell, dass man das nicht sieht.
Wäre jetzt meine Vermutung an Hand des Codeschnipsels.
gonzo6969:
Hilf mir bitte auf die Sprünge, selbst wenn ich geschweifte Klammern verwende, ändert sich nichts dran
Das ist raten.
Zeige uns den kompletten Sketch.
Ihr habt recht, der Schwellenwert wird permanent aktualisiert. Ich benutze ein Nextion Display. Wie muss ich umbauen, dass sobald der Schwellenwert erreicht ist eine Verzögerung eintritt, die LED schaltet, eine Zeilang brennt, und dann ausschaltet und wieder in Bereitschaft geht
//-----------------------------------------------------------------------
// Funktionen Seite Laserlichtschranke
//-----------------------------------------------------------------------
void laser_01_backPopCallback(void *ptr)
{
dbSerialPrintln("laser_01_backPopCallback");
laser_01_status.setText("");
LaserSwitchState =LOW;
led1State = LOW;
lichtschranke.show();
}
void laser_01_startPopCallback(void *ptr)
{
dbSerialPrintln("laser_01_startPopCallback");
laser_01_status.setText("Running");
fire=1;
}
void laser_01_stopPopCallback(void *ptr)
{
dbSerialPrintln("laser_01_stopPopCallback");
laser_01_status.setText("Stop");
memset(buffer, 0, sizeof(buffer)); //Buffer leeren
laser_01_schwellenwert.getText(buffer, sizeof(buffer)); // Text holen
schwellenwert = atoi(buffer); //Text in integer konvertiern
memset(buffer, 0, sizeof(buffer)); //Buffer leeren
laser_01_verzoegerung.getText(buffer, sizeof(buffer)); // Text holen
verzoegerung = atoi(buffer); //Text in integer konvertiern
digitalWrite(LaserSwitch, LaserSwitchState);
if ((!verzoegerung) && (!schwellenwert))
{laser_01_status.setText("Eingabe erforderlich");}
else
{
laser_01_status.setText("Ready");
}
led1State = LOW;
}
....
void loop() {
// put your main code here, to run repeatedly:
// We are going to check the list of touch events we enter previously to
// know if any touch event just happened, and excecute the corresponding instructions:
nexLoop(nex_listen_list); // Check for any touch event
switch (modul) {
//-----------------------------------------------------------------------
// Lasersteuerung
//-----------------------------------------------------------------------
case 1:
//aktuellen Schwellenwert anzeigen
if((long)(millis() - previousMillis1) >= 0) {
previousMillis1 +=1000;
LaserDetectValue = analogRead(LaserDetect); //PIN für Schwellenwert lesen
dbSerialPrintln();
memset(buffer, 0, sizeof(buffer));
laser_01_aktuell.getText(buffer, sizeof(buffer));
memset(buffer, 0, sizeof(buffer));
itoa(LaserDetectValue, buffer, 10);
laser_01_aktuell.setText(buffer);
}
//if (fire==1){ currentMillis=millis();}
if ((fire == 1)&& (LaserDetectValue < schwellenwert)){
led1State = HIGH;
currentMillis=millis();
if (millis() - currentMillis > 500)
{led1State =LOW;}
}
digitalWrite(24, led1State);
digitalWrite(LaserSwitch, LaserSwitchState);
Serial.begin(115200);
break;
....
}
Hallo,
wenn du deine if Bedingung im Griff hast, könnte das kurze leuchten der LED so aussehen
const byte LED13 = 13;
void setup() {
digitalWrite(LED13, LOW);
pinMode(LED13, OUTPUT);
}
void loop() {
flash_LED();
}
void flash_LED ()
{
static unsigned long last_ms = 0;
if (millis()-last_ms > 1800) {
last_ms = millis();
digitalWrite(LED13, HIGH);
}
if (millis()-last_ms > 200){
digitalWrite(LED13, LOW);
}
}
Hallo,
vielleicht noch ein besseres Bsp. für deine Anwendung, der Inhalt der ersten if Bedingung wäre dann bei dir der Einschaltschaltcode, wenn du deine if Bedingung im Griff hast ...
const byte LED13 = 13;
unsigned long last_ms = 0;
bool stateAktivLED = false;
void setup() {
digitalWrite(LED13, LOW);
pinMode(LED13, OUTPUT);
}
void loop() {
if (millis()-last_ms > 1800) {
last_ms = millis();
digitalWrite(LED13, HIGH);
stateAktivLED = true;
}
if (stateAktivLED == true){
flash_LED(last_ms);
}
}
void flash_LED (unsigned long &lastTimeOn)
{
if (millis()-lastTimeOn > 200){
digitalWrite(LED13, LOW);
stateAktivLED = false;
}
}