Skocz do zawartości
Komentator

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

Pomocna odpowiedź

Witam wszystkich na forum.

Wspaniałe podejście do tematu. Proszę tak trzymać dalej!

Moje rozwiązanie zad.2.5:

Widziałem rozwiązania z dodatkowymi zmiennymi i spróbowałem zrobić to samo bez nich. Oto wynik:

#define zielona 9                             // dioda zielona
#define czerwona 8                            // dioda czerwona
 
String odebraneDane = "";                     //Pusty ciąg odebranych danych
 
void setup()                                  // ustawienia
{
  Serial.begin(9600);                         //Uruchomienie komunikacji
  pinMode(zielona, OUTPUT);                   //Konfiguracja wyjść
  pinMode(czerwona, OUTPUT);
  
  digitalWrite(zielona, LOW);                 //Wyłączamy diody
  digitalWrite(czerwona, LOW);
}
 
void loop()                                   //pętla główna programu
{
  if(Serial.available() > 0)                  //Jeśli Arduino odebrało dane
  { 
      odebraneDane = Serial.readStringUntil('\n'); // to odczytujemy je do znaku końca linii i zapisujemy w zmiennej odebraneDane
    if (odebraneDane == "zielona")            //Jeśli odebrano słowo "zielona"
    { 
      if (digitalRead(zielona))                // jeśli włączona
      {
        digitalWrite(zielona, LOW);             //To wyłączamy diodę zieloną
      }
      else                                    // jeśli wyłączona
      {
        digitalWrite(zielona, HIGH);          // to włączamy
      } 
    }
    else
    {                                      // w innym przypadku
      if (odebraneDane == "czerwona")            //Jeśli odebrano słowo "czerwona"
      { 
        if (digitalRead(czerwona))                // jeśli włączona
        {
          digitalWrite(czerwona, LOW);             //To wyłączamy diodę czerwoną
        }
        else                                    // jeśli wyłączona
        {
          digitalWrite(czerwona, HIGH);          // to włączamy
        } 
      }
       else                                      // odbieramy coś innego niż "zielona" lub "czerwona"
        {
          Serial.println("Niepoprawna nazwa!"); //Wyświetl komunikat
        }
    }
  }
}

Czy tak może być?

Udostępnij ten post


Link to post
Share on other sites

piret, pewnie, że może być - dobra robota! 🙂

Udostępnij ten post


Link to post
Share on other sites

Siemanko. Kiedyś zakupiłem sobie układzik USB-to-UART CP2102. Gdybym chciał się nim pobawić i przez niego podpiąć arduino (wiem, że mogę zwykłym kablem USB, ale chciałbym tym spróbować 😉) to w jaki sposób to zrealizować? który pin z którym na arduino połączyć?

Udostępnij ten post


Link to post
Share on other sites

kelu, oczywiście można tak zrobić "dla treningu". W Arduino UNO interfejs ten znajdziesz na pinach nr 0 oraz 1. Powinny być opisane na płytce (TxD, RxD). Musisz połączyć je odpowiednio z przejściówką, czyli: TxD Arduino z RxD przejściówki i analogicznie dla drugiej pary.

Udostępnij ten post


Link to post
Share on other sites

Treker, z ciekawości przetestowałem podłączenie dwóch nadajników do jednego odbiornika (tzn. wbudowanego w Arduino + układ PL2303).

Rozwiązanie częściowo działa, tzn.

- wysyłanie danych z Arduino działa OK

- przesyłanie danych do Arduino działa tylko gdy wysyłam dane przez układ PL2303, brak reakcji na próbę przesyłania danych przez układ wbudowany. Zaprogramowanie Arduino jest niemożliwe ("programmer is not responding").

Udostępnij ten post


Link to post
Share on other sites

Lukaszm, programowanie nie jest takie proste - pozornie to tylko UART, jednak potrzebne są tam jeszcze resety mikrokontrolera w odpowiednich momentach, pewnie to jest głównym problemem. Problem staje się najbardziej widoczny, gdy chce się samodzielnie zbudować Arduino np. na płytce stykowej. Więcej na ten temat można znaleźć w dokumentacji, m.in. tutaj: https://www.arduino.cc/en/Hacking/Bootloader?from=Tutorial.Bootloader

Udostępnij ten post


Link to post
Share on other sites

O 'boolean' musiałem poczytać trochę w sieci - od "Reference" na arduino.cc po youtube - znalazłem kilka przykładów i przełożyłem to na takie coś:

#define green 9 //green jako pin 9
#define red 8 //red jako pin 8

boolean agreen = false; //zmienna logicza
boolean ared = false;

String dane = ""; 

void setup()
{
 Serial.begin(9600); //predkosc przesylu na USB

 pinMode(red, OUTPUT); //piny red i green jako wyjście
 pinMode(green, OUTPUT);

 digitalWrite(red, LOW); //wylaczenie diod
 digitalWrite(green, LOW);
}

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

   if (dane == "red") //jesli wpisane red
   {
     ared = !ared; //negacja parametru red
     digitalWrite(red, ared); //wlacz lub wylacz
     delay(500);
     digitalWrite(green, LOW);
   }
   if (dane == "green") //jesli wpisane green
   {
     agreen = !agreen; //negacja paramertu green
     digitalWrite(green, agreen); //wlacz lub wylacz
     delay(500);
     digitalWrite(red, LOW);
   }
   if (dane != "red" && dane!= "green") //jesli cos innego niz red lub green
   Serial.println("Wpisany bledny kolor - wpisz [red] albo [green]"); //wyswietl komunikat
 }
}

Teraz muszę poczytać coś o 'Serial.readStringUntil', bo oprócz tego, że wiem, że to w kodzie ma być, to średnio to rozumiem. Oczywiście zacznę tu: https://www.arduino.cc/en/Serial/ReadStringUntil

Jak doczytam lecę dalej.

Przy okazji (jak zwykle) wielkie dzięki za lekcję i pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

Witam, czy jest możliwość programowania w IDE użytym w kursie w języku C++ zamaist C?

Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

Witam

Witam wszystkich na forum.

Mój pierwszy post, pierwsze kroki z arduino i C. I jak to z początkującymi pierwsze problemy...

Niestety drugie zadanie coś nie działa. Prosiłbym o sprawdzenie kodu. Wszyscy zrobili z negacją niestety nikt nie zrobił przykładu z tym:

if (stanZielonej == true) { 
 stanZielonej = false; 
} else { 
stanZielonej = true; 
}

oto moje wypociny które nie działają

#define Red 8
#define Yellow 9
String odebraneDane = "";
boolean stanYellow = false;
boolean stanRed=false;

void setup() {
 Serial.begin(9600); //transmisja
 pinMode(Red,OUTPUT);
 pinMode(Yellow,OUTPUT);

 digitalWrite(Red,LOW);
 digitalWrite(Yellow,LOW);

}

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

   if(odebraneDane == "Red"){
     if(stanRed=true){
       stanRed=false;
     }else{
       stanRed=true;
     }
     digitalWrite(Red,stanRed);
   }
   else if(odebraneDane=="Yellow"){
     if(stanYellow=true){
       stanYellow=false; 
     }else{
       stanYellow=true;
     }
     digitalWrite(Yellow,stanYellow);
   }else{
    Serial.println("Nieprawidlowy kolor! Wpisz 'zielona' lub 'czerwona'.");
   }
 }
}

Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

W if-ach używasz = zamiast == więc ma prawo nie działać

Udostępnij ten post


Link to post
Share on other sites
W if-ach używasz = zamiast == więc ma prawo nie działać

Nie bardzo rozumiem..

jeżeli zmieniam wartość zmiennej to jest =

a jeżeli odebrane dane mają się równać Red albo Yellow to musza być ==

Udostępnij ten post


Link to post
Share on other sites

A co robisz tutaj?

if(stanYellow=true){

Udostępnij ten post


Link to post
Share on other sites

stachu789, wsumie nie wiem dlaczego tak jest ale przypuszczam, że to jest tylko dla kompilatora. Po prostu gdy porównujesz "==" to ma się tylko i wyłącznie równać, ale zawsze masz "<=", czy ">="(oczywiście jest też porównanie "<" i ">")Te argumenty używa się w warunkach(if, while, itd...) A "=" służy do wpisania danych do zmiennej.

Udostępnij ten post


Link to post
Share on other sites

Dzieki. Działa;)

Tylko nie dokońca...

Zapalają się i gaszą przy komendach Red Yellow jednak przy innym wyświetla sie komunikat "Nieprawidłowy......." gasną mi obie diody i ponownym wpisaniu komend Red Yellow nie zapalają się.

Dopisałem

    digitalWrite(Red,stanRed);
    digitalWrite(Yellow,stanYellow);

Tylko to nic nie daje...

czy konieczne jest wpisanie takiego kodu


     if(stanYellow==true){
       stanYellow=true; 
     }else{
       stanYellow=false;

lub

stanYellow=stanYellow
digitalWrite(Yellow,stanYellow);

Edit: po poprawieniu kodu nadal nie dziala....

Udostępnij ten post


Link to post
Share on other sites
O 'boolean' musiałem poczytać trochę w sieci - od "Reference" na arduino.cc po youtube

A co dokładnie sprawiło Ci tutaj trudność? Ten typ zmiennej nie różni się wiele od innych. Zwyczajnie zamiast dużych liczb np 0-255, potrafi przechować tylko dwie wartości 1 (prawda) lub 0 (fałsz).

Teraz muszę poczytać coś o 'Serial.readStringUntil', bo oprócz tego, że wiem, że to w kodzie ma być, to średnio to rozumiem.

Arduino nie rozumie, co do niego wysyłamy, więc nie wie też kiedy jest koniec. Stąd mamy taką funkcję jak wyżej, w której informujemy program, że ma odczytywać wszystko, co przychodzi do płytki do momentu napotkania znaku końca linii (mówiąc w skrócie ENTER), który w świecie komputerów sygnalizowany jest przez \n. Równie dobrze mógłbyś wstawić tam jakąś literę, co sprawi, że dane będą odczytywane do momentu napotkania tego konkretnego znaku - polecam testowanie.

Nie bardzo rozumiem..

jeżeli zmieniam wartość zmiennej to jest =

a jeżeli odebrane dane mają się równać Red albo Yellow to musza być ==

Pojedynczy znak równości nie działa wewnątrz warunków, ponieważ w Arduino oznacza przypisanie.

Pisząc "zmienna = 8" nie sprawdzasz jej wartości, tylko w ciemno przypisujesz zmiennej wartość. Natomiast w warunku piszesz "zmienna == 8", co program rozumie, jako "sprawdź czy lewa strona równa się prawej", czyli czy zmienna jest równa 8. Jeśli tak zwróć 1 (PRAWDA), jeśli nie to 0 (FAŁSZ).

Opisz jeszcze raz, w którym miejscu jesteś teraz, to będziemy wyjaśniać 🙂

Udostępnij ten post


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