Skocz do zawartości

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


Pomocna odpowiedź

(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
  • 1 miesiąc później...

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

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

  • 2 tygodnie później...

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");
  
    }
  }
}

 

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

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 😑

(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
  • Pomogłeś! 1
  • 2 tygodnie później...

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

 

(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

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

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?

@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

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