Skocz do zawartości

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


Pomocna odpowiedź

Udało mi się :DDDDDD

#define zolta 8
#define zielona 9
boolean Bzolta = false;
boolean Bzielona = false;
String dane="";


void setup() {
  Serial.begin(9600);
  pinMode(zolta,OUTPUT);
  pinMode(zielona,OUTPUT);
  digitalWrite(zolta,LOW);
  digitalWrite(zielona,LOW);
  
}

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

    if (dane == "zielona") {
      if (Bzielona == false){
        digitalWrite(zielona,HIGH);
        Bzielona = true;
      }
      else {
        digitalWrite (zielona,LOW);
        Bzielona = false; 
      }
    }
    if (dane == "zolta") {
      if (Bzolta == false) {
        digitalWrite(zolta,HIGH);
        Bzolta = true;
    }
      else {
        digitalWrite(zolta,LOW);
        Bzolta = false;
      }
    }
    if(dane != "zielona" && dane !="zolta")
   {
     Serial.println("co ty mi tu wogole podajesz");
  }
  }
}

Trochę mi to czasu zajęło, ale przynajmniej coś z tego wyciągnąłem 😄 
Dzięki za pomoc 😛

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

19 godzin temu, eLBrychu napisał:

u mnie po wykonaniu tego zadania ,,Interakcja z układem - sterowanie diodami przez UART'' niestety nic nie zadziałało... Może ktoś pomoże? Nawet po skopiowaniu programu od autora nic się nie zmieniło

@eLBrychu a masz na pewno dobrze podłączone LEDy? Program się kompiluje i wgrywa czy masz jakieś błędy w logu?

Link do komentarza
Share on other sites

Witam, podczas ćwiczenia, które polega na interakcji z programem ( Arduino jako sygnalizator), mam jeden problem. Po zastosowaniu pętli while, mój obwód Arduino działa w następujący sposób:

1. Pali się dioda czerwona (bo przycisk jest nie wciśnięty), a na terminalu mam pojedynczy komunikat, czyli wszystko na razie działa dobrze.

2. Wciskam przycisk (zapala się światełko zielone).

3. Puszczam przycisk i zamiast zapalić się światełka czerwonego, to cały czas pali się lampka zielona.

4. Dopiero po paru kliknięciach sytuacja wraca do początkowej.

Moje pytanie brzmi: Czy tak powinno być?

Pozdrawiam 🙂

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

11 godzin temu, Matiyoyo napisał:

Moje pytanie brzmi: Czy tak powinno być?

@Matiyoyo witam na forum 🙂 i zależy. Zależy jaki masz program 😉 Wrzuć go tutaj w znaczniki kodu, dorzuć zdjęcie układu i postaramy się pomóc.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Witam, już wszystko jasne, popełniłem błąd w kodzie. Zamiast tak:  


	  else //Jesli przycisk nie wcisniety
    {
      digitalWrite(diodaZielona, LOW); // wlaczenie diody czerwonej
      digitalWrite(diodaCzerwona, HIGH); // wylaczenie diody zielonej
      Serial.println("Uwaga! Alarm! Okno nie jest zamkniete!");
    
      while (digitalRead(czujnikOkna) == HIGH); 
  
      //Zatrzymujemy się w pustej pętli do ponownego zamknięcia okna
      delay(25); //W pętli wprowadzamy małe opóźnienie 25ms, aby niwelować zakłócenia}}
   }
}

Napisałem tak:


    else //Jesli przycisk nie wcisniety
    {
      digitalWrite(diodaZielona, LOW); // wlaczenie diody czerwonej
      digitalWrite(diodaCzerwona, HIGH); // wylaczenie diody zielonej
      Serial.println("Uwaga! Alarm! Okno nie jest zamkniete!");
    }
    
      while (digitalRead(czujnikOkna) == HIGH);
   {
      //Zatrzymujemy się w pustej pętli do ponownego zamknięcia okna
      delay(25); //W pętli wprowadzamy małe opóźnienie 25ms, aby niwelować zakłócenia}}
   }
}

Pętla powinna być w else, a nie po nim 😄  W tym właśnie szkopuł cały. Dzięki bardzo za pomoc!

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

Chałupniczo, ale jakos działa :P zadanie 2.4
  
 #define zielona 8
#define czerwona 9

String odebraneDane = "";

void setup() {
  Serial.begin(9600); //inicjalizacja połączenia z PC
  pinMode(zielona, OUTPUT);
  pinMode(czerwona, OUTPUT);

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



void loop() {
  if(Serial.available() > 0) { //czy arduino odebralo dane
    odebraneDane = Serial.readStringUntil('\n'); 
    
    
if (odebraneDane == "zielona") { //jesli odebrano slowo zielona
    digitalWrite(zielona, HIGH); // wlacz zielona
    delay(1000);
    digitalWrite(zielona, LOW);
  } else if (odebraneDane == "czerwona") {
    // jesli odebrane slowo to czerwona
  
  }
  
if (odebraneDane == "czerwona") { //jesli odebrano slowo czerwona
  digitalWrite(czerwona, "HIGH"); //wlacz czerwona
  delay(1000);
  digitalWrite(czerwona, LOW);
    } else if (odebraneDane == "zielona") {
    // jesli odebrane slowo to zielona
  
} else { //jesli nie odebrano slowa "zielona" lub "czerwona"
  Serial.println("podano zly kolor"); //wyswietl komunikat
}
}
}

 

Link do komentarza
Share on other sites

@Rafdal fajnie ze próbujesz własnych sil 🙂 Zobacz czy nie da się tego uprościć pozbywając się np. tego fragmentu który nic nie wnosi:

else if (odebraneDane == "czerwona") {
    // jesli odebrane slowo to czerwona
  
  }
  

Możesz dla całości zastosować konstrukcję if - else if - else, albo switch case default 😉 

Edytowano przez Gieneq
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Witam

oto mój kod do zadań 2.4 i.5

#define zielona 2//PRZYPISANIE DO PINU 2 NAZWY "zielona"
#define czerwona 3//PRZYPISANIE DO PINU 3 NAZWY "czerwona"
bool stanz=false;//WPROWADZENIE ZMIENNEJ BOOL ODPOWIEDZIALNEJ ZA STAN DIODY ZIELONEJ DOMYŚLNIE USTALONĄ JAKO FAŁSZ
bool stanc=false;//WPROWADZENIE ZMIENNEJ BOOL ODPOWIEDZIALNEJ ZA STAN DIODY CZERWONEJ DOMYŚLNIE USTALONĄ JAKO FAŁSZ

String informacja="";//ZADEKLAROWANIE PUSTEJ ZMIENNEJ informacja

void setup() {
Serial.begin(9600);//ROZPĘCZĘCIE TRANSMISJI O OKREŚLONEJ PRĘDKOŚCI
pinMode(zielona, OUTPUT);//zielona JEST W TRYBIE WYJŚCIA
pinMode(czerwona, OUTPUT);//czerwona JEST W TRYBIE WYJŚCIA

digitalWrite(zielona, LOW);//WYŁĄCZNIE DIODY CZERWONEJ
digitalWrite(czerwona, LOW);//WYŁĄCZNIE DIODY ZIELONEJ

}

void loop() {
 if(Serial.available()>0)//JEŚLI CIĄG ZNAKÓW KTÓRY DOTARŁ DO ARDUINO JEST WIĘKSZY OD ZERA
 {
  informacja=Serial.readStringUntil('\n');//POBRANIE LINIJKI Z MONITORA INTERFEJSU SZEREGOWEGO
  if(informacja=="zielona")//JEŚLI W INTERFEJSIE PORTU SZEREGOWEGO ZOSTANIE WPISANE SŁOWO "zielona"
  {    
    if(stanz==false)//JEŚLI ZMIENNA BOOL ODPOWIEDZIALNA ZA STAN DIODY ZIELONEJ MA PRZYPISANĄ WARTOŚĆ FAŁSZ
    {
          digitalWrite(zielona, HIGH);//USTAW STAN WYSOKI NA PINIE zielona
          Serial.println("Została załączona dioda zielona");
          stanz=true;//USTAW ZMIENNĄ BOOL ODPOIWEDZIALNĄ ZA STAN DIOODY ZIELONEJ JAKO PRAWDA
          

    }
    else{//JEŚLI ZMIENNA BOOL ODPOWIEDZIALNA ZA STAN ZIELONEJ MA PRZYPISANĄ INNĄ WARTOŚĆ NIŻ PARWDA
      digitalWrite(zielona, LOW);//USTAW STAN NISKI NA PINIE zielona
      Serial.println("Została wyłączona dioda zielona");
      stanz=false;//USTAW ZMIENNĄ BOOL ODPOIWEDZIALNĄ ZA STAN DIOODY ZIELONEJ JAKO FAŁSZ
    }
  } else//JEŚLI W INTERFEJSIE W PORTU SZEREGOWEGO ZOSTANIE WPISANE INNE SŁOWO NIŻ "zieona"
  {
    
  if(informacja=="czerwona")//JEŚLI W INTERFEJSIE PORTU SZEREGOWEGO ZOSTANIE WPISANE SŁOWO "czerwona"
  {
    if(stanc==false)//JEŚLI ZMIENNA BOOL ODPOWIEDZIALNA ZA STAN DIODY CZERWONEJ MA PRZYPISANĄ WARTOŚĆ FAŁSZ
    {
          Serial.println("Została załączona dioda czerwona");
          digitalWrite(czerwona, HIGH);//USTAW STAN WYSOKI NA PINIE czerwona
          stanc=true;//USTAW ZMIENNĄ BOOL ODPOIWEDZIALNĄ ZA STAN DIOODY ZIELONEJ JAKO PRAWDA

    }
    else//JEŚLI ZMIENNA BOOL ODPOWIEDZIALNA ZA STAN ZIELONEJ MA PRZYPISANĄ INNĄ WARTOŚĆ NIŻ PARWDA
    {
      Serial.println("Została wyłączona dioda czerwona");
      digitalWrite(czerwona, LOW);//USTAW STAN NISKI NA PINIE czerwona
      stanc=false;//USTAW ZMIENNĄ BOOL ODPOIWEDZIALNĄ ZA STAN DIOODY ZIELONEJ JAKO FAŁSZ
    }
  }
   else//JEŚLI W INTERFEJSIE W PORTU SZEREGOWEGO ZOSTANIE WPISANE INNE SŁOWO NIŻ "zieona"
   {
    Serial.println("Używana komenda nie jest poprawna, komendy poprawne to zielona i czerwona. UWAGA! kumendy powinny być napisane z małcyh liter ");//KOMUNIKAT POKAZUJĄCY SIĘ JEŻELI NIE ZOSTANĄ WPISANE CIAGI ZNAKÓW TAKIE JAK "zielona" i "czerwona"
  }
  }
 
 

Mam trzy pytania odnośnie kodu powyżej

1.Czemu w instrukcji if przy warunku muszą być dwa znaki równa się, zdawało mi się na podstawie moich doświadczeń z C# i C++, że dwa znaki są dla typów zmiennych które nie są bool dwa, a dla tego typu zmiennych jeden nawias, choć szczerze przyznam że dawno miałem styczność z tymi językami?

2.Jeśli chodzi o funkcję Serial.avaible() to czy dobrze zrozumiałem jej działanie, bo ja rozumiem to tak że sczytuje ciąg znaków który jest w konsoli? 

3.Czytałem poprzednie wpisy na forum i dużo było o nawiasach klamrowych i estetyce na temat ich występowania w kodzie czy mój kod pod tym względem jest poprawny?

Edytowano przez wobyty
Link do komentarza
Share on other sites

17 godzin temu, wobyty napisał:

Czemu w instrukcji if przy warunku muszą być dwa znaki równa się,

@wobyty witam na forum 🙂 

== oznacza przyrównanie, zapytanie czy te zmienne są równie. Jeżeli w C++ robiłeś z jednym znakiem to był to niestety błąd. Jeden znak to operator przypisania i nadaje wartość zmiennej.

17 godzin temu, wobyty napisał:

Jeśli chodzi o funkcję Serial.avaible() to czy dobrze zrozumiałem jej działanie, bo ja rozumiem to tak że sczytuje ciąg znaków który jest w konsoli? 

Funkcja ta sprawdza czy coś jest w buforze, tak by nie trzeba było cały czas odczytywać znaki których nie ma.

17 godzin temu, wobyty napisał:

Czytałem poprzednie wpisy na forum i dużo było o nawiasach klamrowych i estetyce na temat ich występowania w kodzie czy mój kod pod tym względem jest poprawny?

I tak i nie. Najlepiej użyj autoformatowania z IDE Arduino i z głowy. Masz niespójną głębokość wcięć i układ nawiasów otwierających, autoformat to załatwi za ciebie.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Mam jeszcze pytanie odnośnie prędkości transmisji zgodnie z tym co pisze w materiale dodatkowym o UART to standardowe prędkości transmisji to:

  • 2400
  • 4800
  • 9600
  • 14400
  • 19200
  • 28800
  • 38400
  • 57600
  • 76800
  • 115200
  • 230400

W moim przypadku jeśli wstawiłem inną prędkość niż 9600, program nie funkcjonował poprawnie tzn. pojawiały się szlaczki. Czy zależy prędkość transmisji tak żeby program działał poprawnie jest inna dla każdego modelu Arduino, czy w moim kodzie jest coś nie tak?

void setup() {
Serial.begin(115200);//USTAWIENIE NADAWANIE PRZY POMOCY PORTU SZEREGOWEGO I PRĘDKOŚci TRANSMIJJI, KTÓRA POWINNA WYNOŚCIĆ 9600, I MIEŚCI SIĘ W 2% 
Serial.println("JEJ"); //JEDNO RAZOWE WYSŁANIE TEKSTU PRZY POMOCY PORTU SZEREGOWEGO(1.POMYSŁ-->2.EDYTOR PROGRAMU-->3.USB-->4.ARDUINO-->5.PORT SZEREGOWY-->6.USB-->7.KOMPUTER-->8.MONITOR PORTU SZEREGOWEGO) 
}

void loop() {
delay(6000);//OPÓŹNIENIE 6s
Serial.println("Minęło 6 sekund");//WYSŁANIE WIADOMOŚCI TEKSTOWEJ W PĘTLI WIELOKROTNIE PRZY POMOCY PORTU SZEREGOWEGO
}

 

Link do komentarza
Share on other sites

@wobyty transmisja z innymi prędkościami też powinna przebiegać poprawnie. Jednak zmiana w programie wgrywanym na Arduino to nie wszystko. Musisz jeszcze zmienić prędkość w programie, który używasz do komunikacji przez UART na PC.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Prawie wszystko jasne tylko jeszcze jedno pytanie odnośnie prędkości w programie który jest używany do komunikacji w UART na PC są tam prędkości takie jak 300 oraz takie, które są większe niż 115200. Czy służą one do czegoś konkretnego? Podanie ich w programie powoduje nie wyświetlanie napisów w monitorze portu szeregowego, natomiast 300 powoduje wyświetlanie się szlaczków.

 

Link do komentarza
Share on other sites

@wobyty nie, prędkości nie służą do czegoś konkretnego. Nie każda płytka może jednak korzystać ze wszystkich prędkości (wynika to z częstotliwości taktowania układu). W praktyce nie trzeba zbyt dużo o tym myśleć, możesz przyjąć, że na początku zawsze używasz na początku 115200 i będzie dobrze 🙂 Grunt, aby i na PC, i w Arduino ustawiona była ta sama prędkość.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

melduję wykonanie zadania domowego 2.4:

#define zielona 8
#define czerwona 10

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);
    }
    else if (odebraneDane == "czerwona") { //Jeśli odebrano słowo "czerwona"
      digitalWrite(czerwona, HIGH); //To włączamy diodę czerwoną
      delay(1000);
      digitalWrite(czerwona, LOW);
    }
    else { //ani zielona ani czerwona -> zgłoś błąd
      Serial.println("Błąd. Nie znane wejście: "+odebraneDane);
    }
  }

}

i 2.5:

#define zielona 8
#define czerwona 10

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, !digitalRead(zielona)); //To przełączamy diodę zieloną, czytając stan z wyjścia i zaprzeczając "!"
    }
    else if (odebraneDane == "czerwona") { //Jeśli odebrano słowo "czerwona"
      digitalWrite(czerwona, !digitalRead(czerwona)); //To przełączamy diodę czerwoną
    }
    else { //ani zielona ani czerwona -> zgłoś błąd
      Serial.println("Błąd. Nie znane wejście: '"+odebraneDane+"' Znam tylko 'zielona' i 'czerwona'.");
    }
  }
}

ale tu mam pytanie: dlaczego w treści jest:

Cytat

koniecznie użyj dodatkowych zmiennych typu bool, które będą pamiętały aktualny stan diod

bo wydaje mi się, że stan diody można odczytać (czyli odczytać stan wyjścia tak samo jak wejścia). Sprawdziłem i działa:

digitalWrite(zielona, !digitalRead(zielona));

Z punktu widzenia kodu, to wydaje się być najkrótsza możliwość. Ale może coś pomijam.

Intuicyjnie: nie wydaje mi się, bo przecież dodatkową zmienną też trzeba zapisać i odczytać z pamięci.

Może gdzieś w dokumentacji napisane, że odczytywanie stanu wyjścia przez digitalRead ma wady? Może jest kosztowniejsze (więcej cykli procesora)? Może trzeba trzymać stan maszyny w pamięci z jakiś innych powodów?

Czy powinienem unikać takiej konstrukcji?

Edytowano przez pawelmb
kod jako kod a nie jako załączniki
  • Lubię! 1
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.