Just nu i M3-nätverket
Gå till innehåll
makke

Arduino - blink without delay - stanna med släckt diod

Rekommendera Poster

Hej!

 

Jag kör ett litet program på en NodeMCU där jag via ESP8266 HelloServer sätter igång och stänger av bl.a. en blinkslinga. Inte den snyggaste lösning troligtvis men den funkar, så när som på att jag vill att det sista som händer när jag stänger av blinken är att den släcker min diod. I dagsläget stannar den perfekt när jag klickar, är dioden släckt så förblir den släck MEN är dioden tänd precis vid klicket så förblir den tänd. Jag har testat åtta olika lösningar jag kunde komma på men ingen funkar. Tänker att det borde finnas någon smidig lösning som jag missar.

 

  // ###################### ESP8266-KOD ########################

const int smokePin = 2;
int smokeState = LOW;
unsigned long previousMillis = 0;      
const long interval = 500;           
int runit = LOW;


  // ###################### ESP8266-KOD ########################



void turnOn(){

runit = HIGH;

}


void turnOff(){

smokeState = LOW;
runit = LOW;

digitalWrite(smokePin, smokeState);

}

void loop(void) {
  server.handleClient();

  // check to see if it's time to blink the LED; that is, if the difference
  // between the current time and last time you blinked the LED is bigger than
  // the interval at which you want to blink the LED.
  unsigned long currentMillis = millis();

  if ((runit == HIGH) && (currentMillis - previousMillis >= interval)) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (smokeState == LOW) {
      smokeState = HIGH;
    } else {
      smokeState = LOW;
    }

    // set the LED with the smokeState of the variable:
    digitalWrite(smokePin, smokeState);


}
}

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Du har ju helt klart en funktion som heter turnOff, men jag kan inte se vart du anropar funktionen någonstans?

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Nä, helt rätt.. Missade att bifoga den delen av koden!

Använder som sagt HelloServer mer eller mindre rakt av.

void setup(void) {
  pinMode(smokePin, OUTPUT);
  pinMode(led, OUTPUT);
  digitalWrite(led, 0);
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  if (MDNS.begin("esp8266")) {
    Serial.println("MDNS responder started");
  }

  server.on("/", handleRoot);

  server.on("/on", turnOn);          //Associate the handler function to the path
  server.on("/off", turnOff);          //Associate the handler function to the path

  server.on("/inline", []() {
    server.send(200, "text/plain", "this works as well");
  });

  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP server started");
}

 

Redigerad av makke

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Vad sägs om att vi provar lägga till en extra koll på om runit är LOW och se om det hjälper. Det hag funderar på är att om din http server är asynkron så finns det en risk att loop har börjat köras och kommit in i din if-sats när turnOff sätter runit till low, vilket jag tycker borde kunna ge detta beteende. Om vi kollar en extra gång på att runit är low och stänger av dioden så skulle det kunna lösa det. Vi skulle till och med kunna avsluta loop funktionen med koll på om runit är low och då göra en digitalWrite och stänga av dioden. 

void loop(void) {
  
  if ((runit == HIGH) && (currentMillis - previousMillis >= interval)) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (smokeState == LOW) {
      smokeState = HIGH;
    } else {
      smokeState = LOW;
    }

	if(runit == LOW) {
		smokeState = LOW;
	}
    // set the LED with the smokeState of the variable:
    digitalWrite(smokePin, smokeState);
  }
}

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

För det första, tack så hemskt mycket för att du tar dig tid att hjälpa mig!!!

 

Dock, hur mycket jag än önskar att detta hjälpte så kvarstår problemet. Blinket kan stanna både med tänd eller släckt diod... 😕 Jag drog det tom så långt att jag gjorde ytterligare en variabel stopit men inte heller den påverkar...

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Skapa ett nytt konto på vårt forum. Det är lätt!

Registrera ett nytt konto

Logga in

Redan medlem? Logga in här.

Logga in nu



×
×
  • Skapa nytt...