• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Przerywanie pętli while
#1
Witam. Pracuje nad kodem który wysyła bezustannie kod podczerwieni az do momentu kiedy będe chciał przerwac jego wysyłanie. Pracuje nad kodem, dodałem tam pętle while lecz nie wiem jak z niej wyjść. mam to połączone z aplikacją blynk i jak kliknę przycisk on to chce aby petla wystartowała a jak off to żeby się zatrzymała. Niestety jak juz wystartuje to zapętla bez końca. nie wiem jak stworzyć warunek który po kliknięciu w przycisk off wyjdzie z pętli. Pozdrawiam jestem bardzo początkujący. Dziękuje za pomoc. Przeszukałem juz chyba cały internet od 3 dni ale niec z tego.. Próbowałem z brake ale to chyba nie o to chodzi

Kod:
#define BLYNK_TEMPLATE_ID "TMPL4KTuG4xNc"
#define BLYNK_TEMPLATE_NAME "traker"
#define BLYNK_AUTH_TOKEN "qxbtKRFgXaoMy5FDr65D4fveKHFI8XuA"
#if defined(ESP8266)
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#else
#include <WiFi.h>
#endif  // ESP8266
#if defined(ESP32)
#include <BlynkSimpleEsp32.h>
#endif  // ESP32
#include <IRremoteESP8266.h>
#include <IRsend.h>
// Pin GPIO ESP8266 używany do sterowania diodą.
const uint16_t kIrLed = 4; 
// Konfiguracja pinu sterującego diodą IR
IRsend irsend(kIrLed);   
char auth[] = "qxbtKRFgXaoMy5FDr65D4fveKHFI8XuA";     // Token autoryzacji Blynk.
char ssid[] = "Wireless-N";     // SSID sieci Wi-Fi.
// Hasło sieci Wi-Fi. Zostaw puste, jeśli sieć jest otwarta.
char pass[] = "";     
void setup() {
irsend.begin();
#if ESP8266
   Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);
#else  // ESP8266
   Serial.begin(115200, SERIAL_8N1);
#endif  // ESP8266
Blynk.begin(auth, ssid, pass);
}
BLYNK_WRITE(V0) {
   if (param.asInt() == 1) {
     Serial.println("starplus");
     irsend.sendNEC(0x80BF49B6);
     delay(1000);     
     irsend.sendNEC(0x80BFE11E);
     delay(1000);
     irsend.sendNEC(0x80BF49B6);
     delay(1000);
   }
   else if (param.asInt()==19) {
     Serial.println("VOLUME-");
     irsend.sendNEC(0x80BF31CE);
   }
   else if (param.asInt()==20) {
     Serial.println("VOLUME+");
     irsend.sendNEC(0x80BFBB44);
   }
   else if (param.asInt()==21) {
     Serial.println("MUTE");
     irsend.sendNEC(0x80BF39C6);
     while (param.asInt()==21)
     Serial.println("MUTE123");
     
           
   }   
}
void loop() {
Blynk.run();
}
 
Odpowiedź
#2
Naucz się używać millis zamiast delay. While się nie nadaje, wystarczy zwykły if(a) else, jak ma wysyłać bo ustawiłeś a=1, to sprawdza czy od poprzedniego wysłania minęło odpowiednio dużo czasu.
Przykład z millis jest w Arduino, idea jest prosta, zamiast zatrzymywać program na 1s po zmianie stanu led program pomija zmianę stanu led od poprzedniej zmiany dopóki nie minie kolejna 1s.
Jeśli chcesz wysyłać sekwencję kodów IR w odstępach 1s, to wystarczy z blynk ustawić zmienna a=1, by zatrzymać wysłać a=0.
Potem w funkcji wysyłania IR użyć switch case.
void loop() {
Blynk.run();
if(minela1s)
{
if (a) obslugaIR();
}
}
Blynk sobie działa online cały czas i sprawdza co tam robisz w aplikacji, a obsługaIR co 1s robi coś z wysyłaniem.

void obslugaIR()
{
static uint8_t zmiennaSterujaca=0;
switch(zmiennaSterujaca)
{
case 0:
Serial.println("starplus");
irsend.sendNEC(0x80BF49B6);
zmiennaSterujaca++;
break;
case 1:
Serial.println("starplus");
irsend.sendNEC(0x80BFE11E);
zmiennaSterujaca++;
break;
case 1:
Serial.println("starplus");
irsend.sendNEC(0x80BF49B6);
zmiennaSterujaca=0;
break;
default:
break;
}
}
I to będzie latało w kółko dopóki z Blynka nie ustawisz innego a. Zmienna static w funkcji zapamięta swój stan do kolejnych wywołań, to może być też problem, jeśli ta sekwencja musi się zakończyć, albo zawsze zacząć od początku, można to jakoś ogarnąć jeśli to ważne. Np. monitorować stan a, jeśli poprzednio był 1, a teraz jest 1, to jest to kontynuacja, ale jeśli poprzednio był 0, a teraz 1, to nowa sekwencja i można wyzerować zmienną sterującą w swich.
Jeśli nic nie zrozumiałeś, to nie szkodzi, trzeba zrobić z każdym nowym elementem programowania dziesiątki przykładowych programów wystukanych własnymi palcami i wtedy to samo wchodzi.
W ten sposób można ładować do loop dziesiątki różnych funkcji, których wywołanie warunkowane jest czasowo, ale żadna nie zakłóca działania innej, no przynajmniej względnie.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości