Skocz do zawartości

Jak zatrzymać program po jednokrotnym wykonaniu


Wojtek65

Pomocna odpowiedź

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 przez Gieneq
Zachęcam do korzystania z bloku kodu programu
Link do komentarza
Share on other sites

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 przez H1M4W4R1
Link do komentarza
Share on other sites

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 (;;) {};

  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

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

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 przez marcinszymon
Link do komentarza
Share on other sites

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 przez ReniferRudolf
  • Lubię! 1
Link do komentarza
Share on other sites

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 przez marcinszymon
Link do komentarza
Share on other sites

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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.