Skocz do zawartości

Jak zatrzymać program po jednokrotnym wykonaniu


Pomocna odpowiedź

Napisano (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 przez Gieneq
Zachęcam do korzystania z bloku kodu programu
(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 przez H1M4W4R1

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
  • 2 lat(a) później...
(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 przez marcinszymon
(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 przez ReniferRudolf
  • Lubię! 1
(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 przez marcinszymon

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++)...

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...