Skocz do zawartości

Kurs #3 własna wersja programu


Dantey

Pomocna odpowiedź

Hej, zacząłem w tym tygodniu bawić się arduino kursu na forbocie. Z programowaniem do czynienia miałem na studiach (mechatronika), jakiś rok w C/C++. W tytułowej części kursu chciałem napisać program na arduino, który oprócz wybrania koloru zielony/czerwony, pierw również spyta ile razy dioda ma mignąć, a kolejno przejdzie do wyboru.

Mój sposób wygląda tak:

#define Gr 8
#define Rd 7
String dane = "";
int how = 0;

void setup() {
  Serial.begin(9600);
  pinMode(Gr, OUTPUT);
  pinMode(Rd, OUTPUT);
  digitalWrite(Gr, LOW);
  digitalWrite(Rd, LOW);
  Serial.setTimeout(100);
}

void loop() {
  if (Serial.available() > 0)
  {
    how = Serial.parseInt();
    Serial.print("Dioda zaswieci sie ");
    Serial.print(how);
    Serial.print(" razy\n");
  }
  if (Serial.available() > 0 && how > 0)
  {
    dane = Serial.readStringUntil('\n');
    Serial.print("\n");

    if (dane == "zielona")
    {
      Serial.print("Dioda zielona\n");
      for (int i = 0; i < how; i++)
      {
        digitalWrite(Gr, HIGH);
        delay(500);
        digitalWrite(Gr, LOW);
        delay(500);
      }
      
    }
    else
    {
      if (dane == "czerwona")
      {
        Serial.print("Dioda czerwona\n");
        for (int i = 0; i < how; i++)
        {
          digitalWrite(Rd, HIGH);
          delay(500);
          digitalWrite(Rd, LOW);
          delay(500);
        }
        
      }
    }
  }
}

Na tyle ile umiałem zastosować umiejętności z C. Program działa, raz nie(znalazłem później czemu). Ogólnie wygląda to tak przy uruchamianiu:

ss1.thumb.jpg.64a126b840777c32eddcde279d252cdf.jpg

ss2.thumb.jpg.39af6675aeb2f909054624d8e1303b3b.jpg

ss3.thumb.jpg.3c22ff68f04cb584d225328811e9b3b8.jpg

Napisałem ten post, w poszukiwaniu rozwiązania i w czasie pisania wpadłem na pomysł, że wystarczy dodać do kodu po pętli for linijkę how =0;  i w pierwszym warunku zrobić: if (Serial.available() > 0 && how == 0). To teraz moje pytanie z poszukiwania rozwiązania, zmienia się w "dlaczego tak?". Rozumiem, że to coś ma związek z stack/heap lub coś takiego. Niestety moja wiedza w tym zakresie jest bardzo uboga, a bardzo chciałbym to zmienić. Oglądałem o tym jak działa stack, ale nie wiem jak to się odbywa w praktyce 🙂  

Edytowano przez Dantey
Link do komentarza
Share on other sites

@Dantey witam na forum 🙂 Zacznij od sprawdzenia czy Twój problem nie wynika z tego, że ustawiłeś w terminalu, że po danych ma być wysyłana "nowa linia" - przetestuj działanie kodu przy innych ustawieniach (z rozwijanego menu).

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

@Dantey możesz sobie to rozpisać używając struktury np:

struct pin {
  uint32_t timestamp = 0;
  uint16_t interval;
  uint8_t count = 0;
  bool state = LOW;
} d2, d3, d4, d5, d6, d7;

piny dobierz takie jakie będą ci pasować. Do przechwytywania danych możesz użyć serialEvent (jak przeszukasz zasoby forbota to też znajdziesz przykłady).

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

(edytowany)

@slon mógłbyś rozwinąć dokładnie sposób użycia tej struktury? Ze strukturami miałem mało do czynienia, tyle że po prostu wiem jak działają. Teraz kwestia czy chodzi Ci że program da sie zapisać całość strukturą, czy strukturą rozpisać problem o który pytam? 🙂 

 

Edytowano przez Dantey
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

Co do przykładu użycia to możesz to przetestować na tym kodzie 

struct pin {
 uint32_t timestamp;
 uint16_t interval;
 uint8_t count;
 bool state;
}d2,d3,d4,d5,d6,d7,*pd;

 uint8_t run= 0xfc;

void pinSetup(struct pin *pd, uint32_t timestamp, uint16_t interval, uint8_t count, bool state );

void setup() {

 Serial.begin(9600);
  for (int i=2; i<=7; i++) pinMode(i,OUTPUT);

    pinSetup(&d7,millis(),100,2,LOW);
    pinSetup(&d3,millis(),1000,0,LOW);
    pinSetup(&d4,millis(),2000,0,LOW);
    pinSetup(&d5,millis(),3000,0,LOW);
    pinSetup(&d6,millis(),4000,0,HIGH);
    pinSetup(&d2,millis(),5000,0,LOW);

}

void loop() {
   

    pd=&d7;
    if (millis() > pd->timestamp + pd->interval){
    pd->timestamp= millis();
        if((run & 0x04) && (pd->count)) {
    digitalWrite(7 , pd->state = !pd->state);
    --pd->count;
    }
    pd=&d3;
    if (millis() > pd->timestamp + pd->interval){
    pd->timestamp= millis();
        if(run & 0x08) {
    digitalWrite(3,pd->state = !pd->state);
    }
}
    pd=&d4;
    if (millis() > pd->timestamp + pd->interval){
    pd->timestamp= millis();
        if(run & 0x10) {
    digitalWrite(4,pd->state = !pd->state);
    d7.count = 2;
    }
}
    pd=&d5;
    if (millis() > pd->timestamp + pd->interval){
    pd->timestamp= millis();
        if(run & 0x20) {
    digitalWrite(5,pd->state = !pd->state);
    }
}
    pd=&d6;
    if (millis() > pd->timestamp + pd->interval){
    pd->timestamp= millis();
        if(run & 0x40) {
    digitalWrite(6,pd->state = !pd->state);
    }
}
    pd=&d2;
    if (millis() > pd->timestamp + pd->interval){
    pd->timestamp= millis();
        if(run & 0x80) {
    digitalWrite(2,pd->state = !pd->state);
    }
}
}

}

void serialEvent() {
  while (Serial.available()) {
     run = Serial.read();
}
}

void pinSetup(struct pin *pd, uint32_t timestamp, uint16_t interval, uint8_t count, bool state ) {
	pd->timestamp= timestamp;
	pd-> interval= interval;
	pd->count= count;
	pd->state=state;
}

 

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

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

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.