Wojtek65 Napisano Kwiecień 1, 2021 Udostępnij Napisano Kwiecień 1, 2021 (edytowany) Witajcie Napisałem taki program int diodaW = 13; void setup() { pinMode(diodaW, OUTPUT); Serial.begin(9600); } void loop() { digitalWrite(diodaW, HIGH); if (Serial.available() > 0) { char dane = Serial.read(); if (dane == 'R') { digitalWrite(diodaW, LOW); delay(7000); } } } Chciałbym go zatrzymać po jednokrotnym przebiegu dla stanu diody - digitalWrite(diodaW, LOW). Domyślam się, że powinienem wpisać gdzieś w void loop return 0; Mam pytanie w którym miejscu należy wpisać return 0 i dlaczego akurat w tym? za pomoc z góry dzięki Edytowano Kwiecień 1, 2021 przez Gieneq Zachęcam do korzystania z bloku kodu programu Cytuj Link do komentarza Share on other sites More sharing options...
H1M4W4R1 Kwiecień 1, 2021 Udostępnij Kwiecień 1, 2021 (edytowany) W żadnym - loop wykonuje się ciągle 😉 Musisz przenieść kod z loop() do setup(). Konkretniej Arduino generuje taki kod: int main() { setup(); while(1) { loop(); } } Dlatego najlepsza opcja, by nie wykonywało się w koło to przeniesienie do setup 😉 EDIT: albo dodanie na końcu nieskończonej pętli Edytowano Kwiecień 1, 2021 przez H1M4W4R1 Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Kwiecień 1, 2021 Udostępnij Kwiecień 1, 2021 Funkcja loop() jest w Arduino wywoływana w nieskończonej pętli, jak tylko się skończy, to jest wołana ponownie, więc return tutaj nic nie da. Jak chcesz zatrzymać program, to po prostu zrób nieskończoną pętlę, która nic nie robi, na przykład for (;;) {}; 1 Cytuj Link do komentarza Share on other sites More sharing options...
Wojtek65 Kwiecień 1, 2021 Autor tematu Udostępnij Kwiecień 1, 2021 Podziękował za pomoc 1 Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
marcinszymon Lipiec 29, 2023 Udostępnij Lipiec 29, 2023 (edytowany) Witam. Mam podobny problem. Mianowicie pomimo prób wstawienia pętli która nic nie robi nadal pętla która ma się wykonać raz wykonuje się bez końca. Ma ktoś jakiś pomysł jak przerobić program żeby pętla po odbiorze konkretnych danych (w tym wypadku cyfry 1) z nadajnika wykonywała się raz z możliwością ponownego uruchomienia? Program działa poprawnie do momentu zakończenia pętli. Mianowicie po uruchomieniu czeka na sygnał i po otrzymaniu mruga diodą niestety bez końca. Program wygląda następująco: #include <SPI.h> #include <LoRa.h> volatile int stan = 0; String data = ""; void setup() { pinMode(6, OUTPUT); Serial.begin(9600); while (!Serial) ; Serial.println("lampka 1"); if (!LoRa.begin(443E6)) { Serial.println("Starting LoRa failed!"); while (1); } } void loop() { int packetSize = LoRa.parsePacket(); if (packetSize) { Serial.print(""); while (LoRa.available()) { data = LoRa.readString(); delay(50); } Serial.println(data); LoRa.packetRssi(); } while (data == "1") { for (int i = 0; i < 1; i++) { digitalWrite(6, HIGH); delay(200); digitalWrite(6, LOW); delay(300); } } while (LoRa.available()) { Serial.println((char)LoRa.read()); } } Edit: program nie działa w ogóle po przeniesieniu z loop do setup Edytowano Lipiec 29, 2023 przez marcinszymon Cytuj Link do komentarza Share on other sites More sharing options...
ReniferRudolf Lipiec 31, 2023 Udostępnij Lipiec 31, 2023 (edytowany) Hmm, pomyślmy logicznie 🤔. Jeżeli przez "pętle, która nic nie robi", rozumiesz pętlę nieskończoną: Dnia 29.07.2023 o 03:51, marcinszymon napisał: while (!Serial) ; to umieszczenie takiego kodu gdziekolwiek w programie spowoduje, że Twój program "zawiśnie" w tym miejscu na wieki wieków. W tym przypadku przebieg programu zatrzymał się na zawsze w funkcji setup(). W Twoim programie widzę na pierwszy rzut oka drugą pętlę nieskończoną, co tłumaczy, dlaczego po odbiorze znaku program miga diodą (w nieskończoność oczywiście 😛) : Dnia 29.07.2023 o 03:51, marcinszymon napisał: while (data == "1") { for (int i = 0; i < 1; i++) { digitalWrite(6, HIGH); delay(200); digitalWrite(6, LOW); delay(300); } } Proponuję Ci w tym miejscu rozważyć, czym różni się instrukcja while() od instrukcji if() - i zastosować tę drugą, aby po odbiorze znaku i zamruganiu diodami program wyszedł z funkcji loop() (która zostanie przez bibliotekę Arduino zawołana ponownie...). https://www.arduino.cc/reference/en/ Edytowano Lipiec 31, 2023 przez ReniferRudolf 1 Cytuj Link do komentarza Share on other sites More sharing options...
marcinszymon Lipiec 31, 2023 Udostępnij Lipiec 31, 2023 (edytowany) Witam. No to z rzeczy które zrobiłem to wywaliłem funkcję while o której pisał @ReniferRudolf oraz starałem się zastosować funkcję przerywań ale podczas kompilacji otrzymuję błąd: Cytat Compilation error: 'gaszenie' was not declared in this scope jest to dziwne bo w innym programie mam zastosowaną funkcję przerywań i działa. Nie mam pojęcia dlaczego tym razem otrzymuję błąd kompilacji. Oczywiście ponownie wklejam cały kod w celu weryfikacji gdzie popełniam błąd. #include <SPI.h> #include <LoRa.h> void setup() { volatile int stan = 0; String data = ""; pinMode(6, OUTPUT); pinMode(2, INPUT_PULLUP); Serial.begin(9600); attachInterrupt(digitalPinToInterrupt(2), gaszenie, LOW); Serial.println("lampka 1"); if (!LoRa.begin(443E6)) { Serial.println("Starting LoRa failed!"); while (1); } } void loop() { int packetSize = LoRa.parsePacket(); if (packetSize) { Serial.print(""); while (LoRa.available()) { data = LoRa.readString(); delay(50); } Serial.println(data); LoRa.packetRssi(); } if ((data == "1") && (digitalRead(2) == LOW)) { digitalWrite(6, HIGH); delay(200); digitalWrite(6, LOW); } } } void gaszenie() { digitalWrite(6,LOW) } while (LoRa.available()) { Serial.println((char)LoRa.read()); } } Edytowano Lipiec 31, 2023 przez marcinszymon Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Lipiec 31, 2023 Udostępnij Lipiec 31, 2023 Bo funkcja "gaszenie" powinna być poza ciałem funkcji loop. Zasugerowałbym zapoznanie się ze składnią języka którego używasz (czyli C++)... Cytuj Link do komentarza Share on other sites More sharing options...
marcinszymon Lipiec 31, 2023 Udostępnij Lipiec 31, 2023 Masz całkowitą rację 🤦 gapa ze mnie 🤦 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!