Skocz do zawartości

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


Pomocna odpowiedź

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

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

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

@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
  • Pomogłeś! 1
Link do komentarza
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 do komentarza
Share on other sites

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

@YURYS nie zauważyłem, że odpisałeś - wiadomość trafiła na nową kartę. 

Dobry pomysł z dodatkową zmienną 🙂 

23 godziny temu, YURYS napisał:

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,

Zmienne deklarowane globalnie mają domyślnie wartość 0. Jak sprawdzisz kod źródłowy bibliotek Arduino albo poczytasz dokumentacje to zauważysz że bool i boolean to to samo (boolean jest aliasem boola). Lepiej używać typ bool, bo jest bardziej podstawowy i uniwersalny.

Druga sprawa to jak są zdefiniowane stany true i false? Przez wartosc niezerową i zero. Wiec domyślnie bool zmienna; ma wartość 0 czyli false. True może być nawet 127 - bool jest zapisany na 8 bitach (ale nie pamiętam czy ze znakiem...).

https://www.arduino.cc/reference/en/language/variables/data-types/boolean/

https://www.arduino.cc/reference/en/language/variables/data-types/bool/

https://www.arduino.cc/reference/en/language/variables/constants/constants/

image.thumb.png.353815427f5d41ba2b9e55d7b38c65af.png

Więc nawet warunek w pętli while(123) {} sprawi że będzie kręcić się w nieskończoność 🙂 

  • Lubię! 1
  • Pomogłeś! 1
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.