Skocz do zawartości

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


Pomocna odpowiedź

Nie wiedziałem jak sobie poradzić ze zmienną boolean więc zrobiłem zadanie na inny sposób i działa

#define red 5  
#define blue 6
#define green 7  //przypisanie diod
#define button 4  //przypisanie przycisku

String kolor = "";  //wprowaniedze zmiennej String
void setup() {

  pinMode(red,OUTPUT);  
  pinMode(blue,OUTPUT);
  pinMode(green,OUTPUT);  //diody na wyjscie

  digitalWrite(red,LOW);
  digitalWrite(blue,LOW);
  digitalWrite(green,LOW);  //WYLACZAMY DIODY

  Serial.begin(9600); //ustawienie predkosci transmisji
  Serial.println("która dioda ma zostać zmieniona?"); //pytamy o cel
}

void loop() {

  if(Serial.available()>0){  //jesli odebrane dane sa wieksze od 0
    kolor = Serial.readStringUntil('\n');  //przypisz odebrane dane zmiennej kolor 

   if(kolor == "red"){
    if(digitalRead(red)==HIGH){
      digitalWrite(red,LOW);
    }else{
      digitalWrite(red,HIGH);
    }
   }else{
    if(kolor=="blue"){
      if(digitalRead(blue)==HIGH){
        digitalWrite(blue,LOW);
      }else{
        digitalWrite(blue,HIGH);
      }
    }else{
      if(kolor=="green"){
        if(digitalRead(green)==HIGH){
          digitalWrite(green,LOW);
        }else{
          digitalWrite(green,HIGH);
        }
      }else{
        Serial.println("zła komenda");
      }
    }
   }
    


  }
}

 

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

#define zielona 9
#define czerwona 8
String odebraneDane = "";
boolean zielonaLow = true;
boolean czerwonaLow = true;
void setup() {
  Serial.begin(9600); // uruchomienie komunikacji
  pinMode(zielona, OUTPUT);
  pinMode(czerwona, OUTPUT);

  digitalWrite(zielona, LOW);
  digitalWrite(czerwona, LOW);



}

void loop() {
  if (Serial.available() > 0) { // czy Arduino odebrało dane
    odebraneDane = Serial.readStringUntil ('\n');
    // Serial.println("Witaj " + odebraneDane + "!");
    if (odebraneDane == "zielona" && zielonaLow == true) {

      digitalWrite(zielona, HIGH);
      zielonaLow = false;
      
    } else  if (odebraneDane == "zielona" && zielonaLow == false) {
      digitalWrite(zielona, LOW);
      zielonaLow = true;
      
    } else    if (odebraneDane == "czerwona" && zielonaLow == true) {
      digitalWrite(czerwona, HIGH);
      czerwonaLow = false;

    } else    if (odebraneDane == "czerwona" && zielonaLow == false) {
      digitalWrite(czerwona, LOW);
      czerwonaLow = true;

    } else {
      Serial.println("Błędny kolor");
    }

  }
}

Czy w dalszej części kursu jest poruszany temat innych IDE niż ten od Arduino?

Ja do tej pory próbowałem dwóch(PlaftormIO w Atomie, oraz Eclipse), w tym pierwszym miałem cały czas problemy z kompilacja. Natomiast w Eclipsie miałem problem z terminalem i wprowadzaniem danych. 

1. Terminal nie pokazywał  tekstu w momencie gdy go pisałem.

2. Terminal przyjmował dane zaraz po tym jak przestałem pisać, zanim nacisnąłem enter.

Fajnie by było jak by wątek o różnych IDE był poruszony 🙂

 

Jak zwykle bardzo ciekawa lekcja!. Chociaż powiem szczerze, że nie wiem czy udało by mi się wykonać zadanie 2.5 bez szukania przykładów zastosowania boolean, gdyby nie to, że jakiś czas temu uczyłem się troszkę Javy :P. 

Ps. W opisie zadania 2.5 jest napisane " Podpowiedź: koniecznie użyj dodatkowych zmiennych typu bool, które będą pamiętały aktualny stan diod."

Ten "bool" to zamierzony ?:)

 

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

@wariatdrogowy witam na forum 🙂 Tak, w taki sposób też można to rozwiązać. Warto jednak popróbować wersji ze zmiennymi typu boolean - to nic strasznego 😉

@Rakragul jeśli chodzi o inne IDE to opisywaliśmy właśnie to, które już znasz: PlatformIO – alternatywne środowisko dla Arduino IDE. Jeśli masz problemy z terminalem, to możesz też testowo sprawdzić innego programy tego typu: 4 alternatywy dla monitora portu szeregowego Arduino.

6 godzin temu, Rakragul napisał:

Ten "bool" to zamierzony ?:)

Tak, bo to jedno i to samo 😉 Cytując z dokumentacji Arduino: boolean is a non-standard type alias for bool defined by Arduino. It’s recommended to instead use the standard type bool, which is identical.

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

2.5 

Troszkę myslałem ponieważ chciałem wykonać to na 2 if'ach oraz else i nie chciało mi wyjść i ciągle był komunikat o wybranym złym kolorze to poszukałem i po skorzystaniu z instrukcji if else działa bardzo ładnie. Kod poniżej:

#define green 8
#define red 9
#define yellow 10

String odebraneDane = ""; //Pusty ciąg odebranych danych
 
void setup() {
  Serial.begin(9600); //Uruchomienie komunikacji
  pinMode(green , OUTPUT); //Konfiguracja wyjść
  pinMode(red , OUTPUT);
  pinMode(yellow, OUTPUT);
  
  digitalWrite(green, LOW); //Wyłączamy diody
  digitalWrite(red, LOW);
  digitalWrite(yellow, 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 == "green") { //Jeśli odebrano słowo "zielona"
      digitalWrite(green, HIGH); //To włączamy diodę zieloną
      delay(1000);
      digitalWrite(green, LOW); 
    }
    else if (odebraneDane == "yellow") {
      digitalWrite(yellow, HIGH);
      delay(1000);
      digitalWrite(yellow, LOW);
    }
    else if (odebraneDane == "red") { //Jeśli odebrano słowo "czerwona"
      digitalWrite(red, HIGH); //To włączamy diodę czerwoną
      delay(1000);  //turn off led after 1 sec
      digitalWrite(red, LOW); 
    }
 
     else 
   Serial.println("You can choose only green, red and yellow");
    
   }
   
  }


 

Link do komentarza
Share on other sites

@Kuba2053 witam na forum 🙂 Jeśli działa to super! Polecam tylko poświęcić jeszcze chwilę na dopracowanie formatowania kodu. Zerknij na ten fragment:

    }
 
     else 
   Serial.println("You can choose only green, red and yellow");
    
   }
   
  }

Trochę ciężko połapać się do czego właściwie jest ten else 😉

Ogólnie, zamiast takiej konstrukcji:

    }
    else if (odebraneDane == "red") { 

bezpieczniej byłoby pisać tak:

    } else if (odebraneDane == "red") { 

Wtedy minimalizujesz szansę "wstrzelenia" jakiegoś kodu między nawias i słowo kluczowe else 😉

Link do komentarza
Share on other sites

@Treker nie przesadzaj - jest to jeden z dopuszczalnych styli formatowania kodu.

Niestety - stary dobry "indent" niespecjalnie sobie radzi z C++, ale warto się z nim zapoznać (a przynajmniej przepuścić swój kod w C przez indenta i zobaczyć, co mu wyjdzie przy różnych standardowych ustawieniach).

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

Oczywiście,  jest to dopuszczalny format, ale w kursach trzymałem się zaproponowanego standardu i patrząc na ogół kodu, mam jednak wrażenie, że to przejście do nowej linii to przypadek, a nie świadome stosowanie innej konwencji 😉

Link do komentarza
Share on other sites

Tak rozumiem, robiłem kilka razy bo nie chciało wyjść, póżniej zastosowałem 3 diody i pomimo że było (teoretycznie) wszystko tak jak teraz to wyskakiwał błąd więc napisałem jeszcze raz i działało 😄  wiem że warto się trzymać ogólnoprzyjętych zasad ale jak poprawiałem to kolejny raz to już z lenistwa nie korygowałem tego a wiadomo najlepiej sprawdzić jak działa w praktyce 😄

 

Jeżeli chodzi o zdanie z wykorzystaniem algebry boolea to można to zrobić przy użyciu bramki AND ale czy jest możliwośc aby wykorzystać w kodzie zmienną np. "logika"

if (odebraneDane == "green") { //Jeśli odebrano słowo "green"          digitalWrite(green, logika); }

czy jest szansa zrobić to tym sposobem żeby po wpisaniu słowa green zmienna logika zmieniała swoją wartośc z 1 na 0, 0 na 1?

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

Hej mam pytanie. Może mi ktoś pomóc? Nie wiem jak zastosować funkcje boolen. Rozumiem inne zmienne i wiem, że boolen przechowuje true albo false ale nie wiem w jaki sposób można to stosować. Ogólnie to utknąłem na zadaniu domowym 4.5 z części 4 i nie mogę ruszyć dalej. Patrzyłem w komentarze i rozwiązania innych a większość używała właśnie tej zmiennej. Jakie jest najprostsze rozwiązanie tego zadania?

Chwilowo zacząłem robić tak ale to są najprostsze rzeczy z tego zadania (niektóre rzeczy mogą być złe):

#define czerwona 2
#define zolta 3
#define zielona 4
int pot = 0;
int fot = 0;
int proby = 0;
int blad = 0;
String liczba = "";

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, INPUT_PULLUP);
pinMode(7, INPUT_PULLUP);
proby +3;
}

void loop() {

  pot = analogRead(A4);
  fot = analogRead(A5);
if(digitalRead(5) == HIGH){
  Serial.println("BOT: Hej. ustaw potencjometr na dowolną wartość i kliknij przycisk obok.");
  while(digitalRead(5) == HIGH) {}
  delay(50);
}
  else if(digitalRead(7) == HIGH){
Serial.println("BOT: Teraz podaj liczbe z zakresu od 1 do 1023.");
  delay(1000);
Serial.println("BOT: Jak myslisz?");
  delay(1000);
Serial.println("BOT: Podaj mądrze!");\
  delay(1000);
Serial.println("BOT: Musi zgadzać się z odczytema ADC. Morzesz pomylić się o +/- 50");
  delay(1000);
Serial.println("BOT: Masz trzy próby");
  delay(50);
  while(Serial.available() > 0){
 liczba = Serial.readStringUntil('\n');
 Serial.println("TY:" + liczba);
 
}
  }
  
  
}

 

Link do komentarza
Share on other sites

@Dami12250, witam na forum 🙂 Pamiętaj proszę, aby kody programów umieszczać za pomocą odpowiedniej opcji w edytorze. Dzięki temu kod programu jest automatycznie kolorowany i można go łatwiej analizować (tym razem poprawiłem to za Ciebie).

14 godzin temu, Dami12250 napisał:

Nie wiem jak zastosować funkcje boolen. Rozumiem inne zmienne i wiem, że boolen przechowuje true albo false ale nie wiem w jaki sposób można to stosować.

Dla formalności: boolean/bool to typ zmiennej, a nie funkcja. Wiem, że na początku może się to mylić, ale warto trzymać się poprawnego nazewnictwa. Jest dokładnie tak jak napisałeś. Zmienne tego typu mogą przyjmować (w uproszczeniu) tylko 2 wartości true (1) lub false (0). Czego dokładnie nie rozumiesz? Co sprawia, że są one dla Ciebie trudniejsze w wykorzystaniu od innych zmiennych?

Przy okazji:

proby +3;

Czy tutaj czegoś Ci nie zabrakło? 😉

Link do komentarza
Share on other sites

Witam

Wystąpił problem z programem z ćwiczenia "Sterowanie diodami przez UART"  Po wklejeniu (wcześniej wpisałem oczywiście)  program nie działa. Dodałem do sekcji

setup mignięcie diodami 

 digitalWrite(zielona, HIGH);
  delay(1000);
  digitalWrite(zielona,LOW);       //Wyłączamy diody
    digitalWrite(czerwona, HIGH);
  delay(1000);
  digitalWrite(czerwona,LOW);

by mieć pewność, że wszystko dobrze podłączone i wgrane. Diody migają na powitanie i dalej nic.

Włączam monitor portu szeregowego, wpisuję zielona i nic. Zamykam monitor i błyska zielona po tym czerwona. Włączam monitor wpisuję czerwona i nic. Wyłączam monitor i błyska zielona po niej czerwona. Wersja Arduino 1.8.10. 

Czy można prosić o pomoc?

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.