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

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.