Skocz do zawartości

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


Pomocna odpowiedź

19 godzin temu, AcziYT napisał:

Jak się ustawi w terminalu inny baud niż w kodzie zaczną się pojawiać znaki %�4 itp.

Tak i warto to zapamiętać, bo częstym błędem wielu osób jest właśnie ustawienie złej prędkości co później powoduje błędne komunikaty. Jeśli w terminalu widoczne są różne dziwne znaki i takie "krzaczki" to warto zawsze sprawdzić właśnie poprawne ustawienie prędkości.

19 godzin temu, AcziYT napisał:

Jak się podłączy port 1 (TX) do jednej diody i port 2 (RX) do drugiej widać że port 1 (TX) jest mocniejszy ponieważ bardziej świeci dioda.

Nie, nie - tutaj nie ma mocniejszego/słabszego wyprowadzenia. Wszystko zależy od tego jak podłączyłeś te diody. Należy pamiętać, że jedno wyprowadzenie działa jako wejście, a drugie jako wyjście.

Link do komentarza
Share on other sites

19 godzin temu, AcziYT napisał:

widać że port 1 (TX) jest mocniejszy

Błędna teoria. Nie ma czegoś takiego ja "mocniejszy / słabszy port". Poza tym linie Tx (Rx) to nie porty, a jedynie pojedyncze (1 bitowe) wyjścia wewnętrznego rejestru uC.

Link do komentarza
Share on other sites

@Michal2010 witam na forum 🙂 Zacznę od pytania - czy wykonywałeś już ćwiczenia z kursu w praktyce, czy na razie przyswajasz całość tylko w teorii? Daj znać, czy wykorzystywałeś już jakieś zmienne w praktyce (a jeśli tak, to jakiego typu).

Link do komentarza
Share on other sites

@Michal2010 jeśli korzystałeś ze zmiennych to już na pewno wiesz, że są to takie szufladki, w których przechowywane są różna informacja. Typ zmiennej określa jaki rodzaj informacji może zostać zapisany w danej zmiennej np. całkowita liczba dodatnia, całkowita liczba dodatnia lub ujemna, napis itd. Dlatego właśnie tekst przechowywany jest w zmiennych string, a liczby jako int.

Problem tylko jest taki, że tych wartości nie da się bezpośrednio porównać, bo z punktu widzenia komputera są zupełnie różne. Dlatego konieczne jest tzw. konwertowanie zmiennych. Jeśli chcesz, aby np. liczba zapisana w zmiennej string przestała być dla komputera tekstem i miała stać się liczbą to musisz przekonwertować string do int. Służą do tego specjalne funkcje, które łatwo znajdziesz w Internecie - wystarczy podać typy zmiennych oraz dopisać konwersja. Przykładowo do zamiany string na int przyda się taka funkcja: https://docs.arduino.cc/built-in-examples/strings/StringToInt

Nie była ona opisana w kursie (to jedyny taki przypadek), właśnie, aby zachęcić czytelników do samodzielnego poszukiwania rozwiązań. W poprzednich komentarzach znajdziesz setki rozwiązań od innych osób 🙂

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

Zaciekawiło mnie.

Przy zadaniu Interakcja z układem - sterowanie 2ma diodami przez UART można kolejkować kolejność wyświetlania diod. Szybko napisać czerwona, zielona czerwona i one po kolei później będą się wyświetlać. (Zwłaszcza to widać jak przedluzymy czas swiecenia).

Gdzieś można by się było wczytać dlatego tak jest?

Link do komentarza
Share on other sites

@Tomek3007 witam na forum 🙂 Dane wysyłane do Arduino trzymane są w buforze, a program później kolejno odczytuje następne linie tekstu, które zostały wysłane. Bez takiego buforowania danych w wielu przypadkach programy nie działałyby poprawnie, bo układ nie nadążałby odbierać przesłanych danych. Dlatego samo odbieranie odbywa się w tle, a w programie odczytujemy to, co jest już w buforze.

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

#define zielona 2
#define druga 5
String dane="";
boolean a=false;
boolean b=false;
void setup() {
  Serial.begin(9600);
  pinMode(zielona,OUTPUT);
  pinMode(druga,OUTPUT);
  digitalWrite(zielona,LOW);
  digitalWrite(druga,LOW);
}
void loop(){
  if(Serial.available()>0){
dane=Serial.readStringUntil('\n');
  }
  if(dane=="zielona"&&a==false){
    digitalWrite(zielona,HIGH);
    a=true;
    dane="";
  }
  if(dane=="żółta"&&b==false){
    digitalWrite(druga,HIGH);
    b=true;
    dane="";
  }
  if(dane=="zielona"&&a==true){
    digitalWrite(zielona,LOW);
    a=false;
    dane="";
  }
  if(dane=="żółta"&&b==true){
    digitalWrite(druga,LOW);
    b=false;
    dane="";
  }}

Zrobiłem, choć musiałem się nagłowić i sprawdzić jak pisać więcej niż jeden warunek w if-ie. Swoją drogą to trochę dziwne, że nie pojawiła się o tym nigdzie informacja na początku. Próbowałem też kasować dane "ogólnie" ale coś mi się waliło. A przy poprzednim zadaniu użyłem != do if-a

Link do komentarza
Share on other sites

@LewySierpowy możesz też te cztery warunki od ledow wrzucić w if' od odczytu...tak z rególy się robi żeby nie powtarzać czynności które nie muszą być powtarzane...do tego możesz użyć negacji przy zmianie stanu ledow..i już potrzebne są tylko dwa warunki...

digitalWrite(zielona, !stanzielona);

I czyszczenie bufora zrobić tylko raz przed wyjściem z if'a od odczytu...

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

Ciekawy kurs. Skorzystałem z ustawień diod pod sygnalizację świetlną i z kolei zrobiłem z ten sposób że gdy wpiszemy cokolwiek innego niż zielony czy czerwony to zaświeci się żółty led 😉 Zadanie nie jest wymagające a może ktoś skorzysta jako pomysł na dodatkowe zadanie do zrobienia 🙂 

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

#define zielona 12
#define czerwona 13

String odebraneDane = "";
int licznikZielony = 0;
int licznikCzerwony = 0;

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

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

void loop() {
  if (Serial.available() > 0) {
    odebraneDane = Serial.readStringUntil('\n');
    
    if (odebraneDane == "zielona") {
      licznikZielony++;
      // Sprawdzenie czy licznik zielonej diody jest podzielny przez 2 (czy jest liczbą parzystą czy nieparzystą)
      if (licznikZielony % 2 != 0) {
        digitalWrite(zielona, HIGH);
      } else {
        digitalWrite(zielona, LOW);
      } 
    } else if (odebraneDane == "czerwona") {
      licznikCzerwony++;
      // Sprawdzenie czy licznik czerwonej diody jest podzielny przez 2 (czy jest liczbą parzystą czy nieparzystą)
      if(licznikCzerwony % 2 != 0) {
        digitalWrite(czerwona, HIGH);
      } else {
        digitalWrite(czerwona, LOW);
      }     
    } else {
      Serial.println("Nierozpoznana komenda. Wpisz \"czerwona\" lub \"zielona\"");
    }
  }
}

Moje rozwiązanie zadania z gwiazdką 😉

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

Bardzo interesujący kurs! Trochę musiałem się posłużyć forum oraz dokumentacją Arduino, aby bardziej zrozumieć zmienne boolean, no i w końcu się udało!

2.5:

#define zielona 9
#define czerwona 8

String odebraneDane = ""; //Pusty ciag odebranych danych

boolean stanZielonej = false;
boolean stanCzerwonej = false;

void setup() {
  Serial.begin(9600); //Inicjalizacja polaczenia z PC
  pinMode(zielona, OUTPUT); //Konfiguracja wyjsc
  pinMode(czerwona, OUTPUT);

  digitalWrite(zielona, LOW); //Wylaczamy diody
  digitalWrite(czerwona, LOW);
}

void loop() {
  if(Serial.available() > 0) { //Czy Arduino odebralo dane
    //Jesli tak to odczytaj je do znaku konca linii i zapisz w zmiennej
    odebraneDane = Serial.readStringUntil('\n'); 

    if (odebraneDane == "zielona") { //Jeśli odebrano slowo "zielona"
      stanZielonej = !stanZielonej;

    } 
    
     else if (odebraneDane == "czerwona") { //Jesli odebrano slowo czerwona
      stanCzerwonej = !stanCzerwonej;
    } 

    else {
      Serial.println("Nieprawidlowa komenda");

    }
  }

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

}

 

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

@justkapix witam na forum 🙂 Cieszę się, że poświęciłeś czas, aby samodzielnie odszukać informacji - to ważne podczas nauki programowania. Jeśli coś nie będzie dla Ciebie jeszcze jasne to śmiało pytaj na forum.

Link do komentarza
Share on other sites

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

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.