Skocz do zawartości

Kurs Arduino - #3 - UART (komunikacja z PC), zmienne


Pomocna odpowiedź

@takedown witam na forum 🙂 

To dobrze że zabrałeś się za zadanie z gwiazdką. Faktycznie jest ono trudniejsze. 

Ta wskazówka o dodatkowej zmiennej jest niezbędna, ale może spróbuj przy pomocy jednego warunku "czy czerwona" przełączać zmienną stanu. Tu podpowiedź, zmienną boolowską możesz przełączać np w ten sposób:

logika = !logika

Ale możesz zrobić to jeszcze sprytniej i zamiast boola użyć zmiennej int. Stan HIGH i LOW to tak naprawde 1 i 0 typu całkowitego. Zatem możesz użyć taki bajer i bezpośrednio wpisać to do digitalWrite:

int logika = 0; //inaczej LOW
if....
  logika ^= 1; //operacja XOR do przełączania 0 i 1
digitalWrite(pin, logika);

Ten drugi zapis może wyglądać strasznie ale jest bardzo pomocny.

Link to post
Share on other sites
(edytowany)

Gieneq : bardzo ci dziękuje właśnie nie za bardzo wiedziałem jak mogę przełączać zmienna bool. Oraz bardzo dziękuje za powitanie 🙂

Edytowano przez takedown
  • Lubię! 1
Link to post
Share on other sites

Witam, jestem nowy w świecie programowania, i główkowałem się trochę czasu nad "zadaniem z gwiazdką", końcowo udało mi się napisać program, który wykonuje zadanie o którym była mowa w poleceniu. Przechodząc do meritum, mimo to, że cały program działa świetnie (wykonuje polecenie z zadania, przynajmniej w taki sposób jaki zrozumiałem dane zadanie) jestem trochę zmieszany, ponieważ czuje, że mój program jest bardzo krótki i obawiam się, że zrobiłem coś nie w ten sposób jaki miałem zrobić. Dlatego chciałem zapytać się kogoś doświadczonego czy mój program jest napisany zgodnie z zamysłem zadania. Cały kod przesyłam poniżej

Pozdrawiam i miłego dnia.

 

#define czerwona 9

bool standiody = false ;

String Dane = "";
void setup() {
  Serial.begin(9600);
  pinMode(czerwona, OUTPUT);
  
  

}

void loop() {
  if(Serial.available() > 0) {
  Dane = Serial.readStringUntil('\n');
  standiody = !standiody; 
  }
  if (standiody == true){
    digitalWrite(czerwona, standiody);
  } else{
    digitalWrite(czerwona, standiody);
    
  
  }
} 

 

program.png

Link to post
Share on other sites

@nugglet witam na forum 🙂 Twój program działa i jest poprawny, ale działa dla jednej diody - spróbuj rozbudować go w taki sposób, abyś mógł sterować dwiema diodami (wpisując ich kolor do terminala).

Link to post
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

Tak naprawdę Twój program jest już gotowy, czytasz dane z terminala na stringa "Dane" ale tego stringa nigdzie nie wykorzystujesz. Postaraj się porównać ten string innym np.  if (dane == "red") {....}  i to wykorzystać.

https://www.arduino.cc/en/Tutorial/BuiltInExamples/StringComparisonOperators

Link to post
Share on other sites

Hejka, narazie udało mi się rozwiązać dodatkowe zadanie z komunikatem o błędnym kolorze. Dość długo nie wychodziło poprzez nieznajomość niektórych operatorów, posiłkowałem się troche forum, ale koniec konców wyszło jak zakładałem czyli dość prosto.

#define zielona 8
#define czerwona 9
 
String odebraneDane = ""; //Pusty ciąg odebranych danych
 
void setup() {
  Serial.begin(9600); //Uruchomienie komunikacji
  pinMode(zielona, OUTPUT); //Konfiguracja wyjść
  pinMode(czerwona, OUTPUT);
  
  digitalWrite(zielona, LOW); //Wyłączamy diody
  digitalWrite(czerwona, LOW);
}
 
void loop() {
  if(Serial.available() > 0) { //Czy Arduino odebrało dane
    //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej odebraneDane
    odebraneDane = Serial.readStringUntil('\n'); 
    
    if (odebraneDane == "zielona") { //Jeśli odebrano słowo "zielona"
      digitalWrite(zielona, HIGH); //To włączamy diodę zieloną
      delay(1000);
      digitalWrite(zielona, LOW); 
          }
    
    if (odebraneDane == "czerwona") { //Jeśli odebrano słowo "czerwona"
      digitalWrite(czerwona, HIGH); //To włączamy diodę czerwoną
      delay(1000);
      digitalWrite(czerwona, LOW); 
    }else{
      if (odebraneDane != "czerwona" and odebraneDane != "zielona")
      Serial.println("zly kolor");
  
    }
  }
}

 

Link to post
Share on other sites

@Krawi92 super tak trzymaj 🙂 

Tylko uwaga, if-esle działa nie tak jakbyś chciał. Else tyczy się tylko jednego warunku i żeby objąć wszystkie warunki to pierwszy warunek ma konstrukcję "if" kolejne "if else" a kończący to dopiero "else".

Link to post
Share on other sites

Jeszcze nie bardzo to rozumiem ale ok 😅 ogólnie muszę trochę zwolnić z kursem i zatrzymać się przy instrukcjach i pętlach bo nie do końca ogarniam ich użycie, głównie pętli 😑

Link to post
Share on other sites
(edytowany)

@Krawi92 konstrukcja jest taka:

int liczba = 5;

if(liczba == 3)
  //czyli liczba jest 3
else if(liczba == 2)
  //czyli liczba nie jest 3, ale jest 2
else
  //aha czyli liczba nie jest ani 3 ani 2

Jeżeli byś zrobił warunek bez "else if", to logika byłaby taka:

int liczba = 5;

if(liczba == 3)
  //czyli liczba jest 3
  
//tu kończy się blok warunkowy, nic nie wnosi do kolejnego
  
if(liczba == 2)
  //czyli liczba jest 2
else
  //aha czyli liczba nie jest 2 (ale o 3 nic nie wspominamy, bo jest to w innym bloku warunkowym)

 

Edytowano przez Gieneq
Link to post
Share on other sites

obraz.thumb.png.61ca9e3ae7ac17502dd0a3d32535512a.pngdo czego służy zaznaczone na obrazku wyłączenie diod? Zauważyłem, że one sa wyłączone z automatu - nie tylko w tym programie ale również we wszystkich innych programach w których wyłączamy diody w funkcji "void" z dyrektywą "setup".

Pozdrawiam

 

Link to post
Share on other sites
(edytowany)

Witam.Piszemy warunek if ("W wypadku kiedy dane będą dostępne (będzie ich więcej niż 0) - rozpoczyna się ich zapisywanie do zmiennej odebraneDane") i jeśli on zostanie spełniony to następnie powinno się dziać to co w nawiasie klamrowym zapiszemy, czemu więc gdy wysyłam, ale nic nie napisze to mimo wszystko program mi odpisuje?

obraz.png

 

Czemu w tymobraz.thumb.png.9db4198194a8773cd7ed11b5ee9f1a7f.png programie po spełnieniu warunku dioda mi mruga w tak długo jak długo warunek jest spełniony,

a w tym obraz.thumb.png.816a2d69cd53445c6e094d6ee204933c.png programie dioda mignie raz i koniec? Pozdrawiam.

 

 

 

Edytowano przez YURYS
Link to post
Share on other sites

@YURYS to tak:

Dnia 26.06.2021 o 19:10, YURYS napisał:

do czego służy zaznaczone na obrazku wyłączenie diod?

Faktycznie da się to pominąć, podobnie jak można pominąć pinMode(x, INPUT). Wszystkie wejścia są domyślnie w takim stanie, a pisze się to dla poprawy czytelności kodu. W bloku setup szybkość wykonania kodu nie ma znaczenia, a i za dużo pamięci to nie zużywa.

17 godzin temu, YURYS napisał:

programie dioda mignie raz i koniec?

Bo są inne zagnieżdżenia. W pierwszym masz tylko pętlę i warunek. Warunek się kończy i od razu wraca do samego siebie. W drugim masz jeszcze coś z Seriala który jest spełniony dużo rzadziej i program często pomija zawartość tego warunku.

  • Lubię! 1
Link to post
Share on other sites
Dnia 28.06.2021 o 08:16, Gieneq napisał:

@YURYS to tak:

 

Bo są inne zagnieżdżenia. W pierwszym masz tylko pętlę i warunek. Warunek się kończy i od razu wraca do samego siebie. W drugim masz jeszcze coś z Seriala który jest spełniony dużo rzadziej i program często pomija zawartość tego warunku.

W takim razie co zrobić, by w tym programie żeby dioda mi mrugała?

Link to post
Share on other sites
Dnia 22.05.2015 o 09:14, igor napisał:

Ja zrobiłem tak:

[..]

Może być?

Pytanko:

Zrobiłem tak:


#define zielona 8
#define czerwona 9

String odebraneDane;
bool stanCzerwonej;
bool stanZielonej; 

void setup() {
 Serial.begin(9600); 
 pinMode(zielona, OUTPUT);
 pinMode(czerwona, OUTPUT);
}

void loop() {
 if(Serial.available() > 0) { 
   odebraneDane = Serial.readStringUntil('\n'); 

   if (odebraneDane == "zielona") { //jeśłi wpisaliśmy 'zielona' 
     stanZielonej = !stanZielonej; //zmień stan zmiennej boolean
     //'stanZielonej' na przeciwny
   }

   if (odebraneDane == "czerwona") { //jeśli wpisaliśmy 'czerwona'
     stanCzerwonej = !stanCzerwonej;//zmień stan zmiennej boolean
   } //'stanCzerwonej' na przeciwny

   if (odebraneDane != "czerwona" and odebraneDane != "zielona") {
     Serial.println("Nieprawidlowy kolor! Wpisz 'zielona' lub 'czerwona'.");
   }//jesli zmienna String 'odebraneDane' ni równa się ani 'czerwona' ani 
   //'zielona' to wyślij tekst: "Nieprawidlowy kolor! Wpisz 'zielona' 
   //lub 'czerwona'."

   digitalWrite(zielona, stanZielonej);
   digitalWrite(czerwona, stanCzerwonej);
 }

}

i się zastanawiam nad działaniem zmiennej bool, jak i boolean, czy one automatycznie ustawiają się na początek na stan logiczny 0 czyli 0V, a potem zamieniają się między stanami logicznymi 0 i 1, co powoduje włączanie i wyłączanie diody?

Link to post
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.