Skocz do zawartości
Komentator

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

Pomocna odpowiedź

Witam

Od niedawna jestem szczęśliwym posiadaczem arduino UNO i zapoznaje sie z lekcjami tutaj zawartymi. Musze powiedzieć że jestem zachwycony tymi lekcjami i mam nadzieję że bedzie ich więcej w przyszłości.

Poniżej zadania domowe

zadanie domowe 2.4

#define zielona 8          //deklaracja pinów
#define czerwona 7
#define zolta 6

String dane = "";

void setup() {
 Serial.begin(9600);     //port komunikacji
 Serial.println("Wpisz kolor diody");  //tekst wysietlany przy starcie
 pinMode(zielona, OUTPUT);      //ustawienie typów pinów
 pinMode(czerwona, OUTPUT);
 pinMode(zolta, OUTPUT);

 digitalWrite(zielona, LOW);      //ustawienie stanów napinach
 digitalWrite(czerwona, LOW);
 digitalWrite(zolta, LOW);

}

void loop() {
 if(Serial.available() > 0) {          //zapisanie wartosci odebrnych danych do pamieci
 dane = Serial.readStringUntil('\n');

 if (dane == "zielona") {            //zapalenie wybranej diody po wyslaniu tekstu koloru
   digitalWrite(zielona, HIGH);
   delay(3000);
   digitalWrite(zielona, LOW);
 }

 if (dane == "czerwona") {
   digitalWrite(czerwona, HIGH);
   delay(3000);
   digitalWrite(czerwona, LOW);
 }
 if (dane == "zolta") {
   digitalWrite(zolta, HIGH);
   delay(3000);
   digitalWrite(zolta, LOW);
 }
 else {        //wyswietlenie bledu jezeli podany byl kolor ktorego nie ma
   Serial.println("Blad!. Wprowadzona nazwa jest nieobslugiwana");
   Serial.println("Nazwy obslugiwane: 'czerwona' 'zielona' 'zolta'");
 }
 }

}

zadanie domowe 2.5

#define zielona 7
#define czerwona 8
String odebraneDane = "";
boolean ziel = "";
boolean czer = "";


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

   ziel = false;
   czer = false;

   digitalWrite(zielona, LOW);
   digitalWrite(czerwona, LOW);
}
void loop() {
   if (Serial.available() > 0) {
       odebraneDane = Serial.readStringUntil('\n');
   }
   if (odebraneDane == "zielona" and ziel == false) {

           digitalWrite(zielona, HIGH);
           ziel = true;
           Serial.println("zielona ON");
           odebraneDane = "0";

       }
       else if (odebraneDane == "zielona") {
           digitalWrite(zielona, LOW);
           ziel = false;
           Serial.println("zielona OFF");
           odebraneDane = "0";
      }
   if (odebraneDane == "czerwona" and czer == false) {

           digitalWrite(czerwona, HIGH);
           czer = true;
           Serial.println("czerwona ON");
           odebraneDane = "0";

       }
       else if (odebraneDane == "czerwona") {
           digitalWrite(czerwona, LOW);
           czer = false;
           Serial.println("czerwona OFF");
           odebraneDane = "0";
      }


   delay(500);
}

Udostępnij ten post


Link to post
Share on other sites

tomek_321, witam na forum 🙂 Dzięki za miłe słowa - tak trwają prace nad kolejnymi lekcjami oraz innymi kursami! Pamiętaj o komentarzach, w drugim przypadku ich zabrakło. Jest to bardzo ważny element każdego programu.

Udostępnij ten post


Link to post
Share on other sites

Witam serdecznie.

Z góry przepraszam jak temat był gdzieś poruszany ale nawet nie mam pojęcia jak szukać.

Mianowicie chodzi mi o komunikację między dwoma układami poprzez UART.

Chciałem aby pierwszy układ wysyłał dwie zmienne do funkcji analogWrite() znajdującej się w drugim układzie.

Czy ma ktoś pomysł jak zrobić to w prosty i przejrzysty sposób? Prosiłbym o choć by jaką wskazówkę.

Z góry dziękuję oraz Pozdrawiam 🙂

Udostępnij ten post


Link to post
Share on other sites

unmarked, w czym konkretnie masz problem? Połączyłeś już dwa Arduino ze sobą i komunikujesz się przez UART?

Udostępnij ten post


Link to post
Share on other sites

Treker, tak dokładnie mówiąc to dwa układy ATmega328. Komunikacja jak najbardziej działa, problem w tym że nie potrafię rozdzielić danych które odbieram w postaci stringu na dwie zmienne.

Po prostu moja wiedza jest tu zbyt mała, możliwe że jest na to jakiś prosty sposób a ja źle szukam 🙂

Udostępnij ten post


Link to post
Share on other sites

unmarked, najwygodniej będzie budować jakaś ramkę danych, w której część będzie pozwala na zidentyfikowanie przesłanych w niej danych. Poszukaj trochę na ten temat, znajdziesz na Arduino sporo tematów parsowania takich danych. Jak będziesz miał jakiś problem, to załóż osobny temat, bo zagadnienie to wykracza już poza zagadnienie kursu 🙂

Udostępnij ten post


Link to post
Share on other sites

Panowie. jestem początkującym w Arduino i jak dotąd wszystko mi ładnie szło.. ale na zadaniu z rozpoznawaniu stringów moja płytka cos głupieje..

Wklejam oryginalny kod , ledy mam połączone jak trzeba ( zresztą próbowałem już je przeadresować) ale bez dobrego wyniku 🙁

efekt jest taki ze arduino nie interpretuje ciagu znaku. tj tak jakby żadnego słowa nie rozpoznawał.

to co wysyłam na pewno trafia bo wpisałem linie odesłania stringu i go zwraca

ktoś ma jakiś pomysł ?

[ Dodano: 19-03-2016, 12:58 ]

napisałem na szybko takie coś

String odebraneDane = "";

void setup() {
 // put your setup code here, to run once:
Serial.begin(9600); //Ustawienie prędkości transmisji
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
}

void loop() {
 // put your main code here, to run repeatedly:


 if(Serial.available() > 0) { //Czy Arduino odebrano dane
   odebraneDane = Serial.readStringUntil('\n'); //Jeśli tak, to odczytaj je do znaku końca linii i zapisz w zmiennej odebraneDane
   Serial.println("Wpisales " + odebraneDane + "!"); //Wyświetl komunikat

  if(odebraneDane == "on"){
   digitalWrite(8,HIGH);
   Serial.println("LED ON");
  }
  else{
   digitalWrite(9,HIGH);
   delay(300);
   digitalWrite(9,LOW);
  }

 }}

efekt jest taki że Ardu zwraca co napisałem. zapala leda 9 na 300ms , ale a chiny nie rozpoznaje on

co jest nie tak ?

__________

Komentarz dodany przez: Treker

Kod programu, dla lepszej czytelności, należy umieszczać w tagach .

Proszę to poprawić.

Udostępnij ten post


Link to post
Share on other sites

vqsoft, wybacz późną odpowiedź, ale wcześniej sprawa mi umknęła. Nie mogę odtworzyć u siebie tego problemu. Uruchomiłem program z Twojej wiadomości, efekt:

Więc chyba wszystko jest poprawnie, prawda?

Udostępnij ten post


Link to post
Share on other sites

Zrobiłem to najprościej jak umiałem. Ale mam 2 pytania:

1. dlaczego między słowem jakie ma wyświetlić a odebranymi danymi, program nie robi przerwy?

2. Jak mam ustawić konsole programu, by stała się czytelna, a nie takie "mikro" literki? Dodam że używam rozdzielczości 4K.

Udostępnij ten post


Link to post
Share on other sites
Ja zrobiłem tak:
#define zielona 8
#define czerwona 9

String odebraneDane = "";
boolean stanCzerwonej = false;
boolean stanZielonej = false;

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") {
     stanZielonej = !stanZielonej;
   }

   if (odebraneDane == "czerwona") {
     stanCzerwonej = !stanCzerwonej;
   }

   if (odebraneDane != "czerwona" && odebraneDane != "zielona") {
     Serial.println("Nieprawidlowy kolor! Wpisz 'zielona' lub 'czerwona'.");
   }

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

}

Może być?

Witam wszystkich tu na forum. Od dwóch tygodni studiuję , uczę się elektroniki cyfrowej. Jeśli chodzi o zadanie nr. 2.4 to zrobiłem to tak:

#define zielona 8
#define czerwona 9

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 odebrano dane
   //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej odebraneDane
   odebraneDane = Serial.readStringUntil('\n'); 



   if (odebraneDane == "czerwona")//Jeśli odebrano słowo "czerwona"
   { 
     digitalWrite(czerwona, HIGH); //To włączamy diodę czerwoną
     delay(1000);
     digitalWrite(czerwona,LOW);
   }

     else if (odebraneDane == "zielona")
     {
     digitalWrite(zielona,HIGH); 
     delay(1000);
     digitalWrite(zielona,LOW);
   }


   else
   {

     Serial.println("Wpisales nie poprawny kolor!");
   }
 }
}

A jeśli chodzi o zadanie trudniejsze 2.5* to niestety sam nie dałem rady, tylko podpatrzyłem jak inni to zrobili... I tu mam pytanie jedne dotyczące tego zadania:

W c++ wartość true to 1, wartość false to 0;

W tym zadaniu mam:

#define zielona 8 
#define czerwona 9 

String odebraneDane = ""; //pusty ciąg odebranych danych 

boolean ZielonaOn = false; //zmienna logiczna, czy czerwona (8) ON 1
boolean CzerwonaOn = false; //zmienna logiczna, czy zielona (9) ON 1

//boolean ZielonaOn = true; //zmienna logiczna, czy czerwona (8) OFF 0
//boolean CzerwonaOn = true; //zmienna logiczna, czy zielona (9) OFF 0


void setup() { 
 Serial.begin(9600); //Ustawienie prędkości transmisji ilość baudów 
 //Inicjalizacja połączenia z PC 
 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 odebrano dane
   //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej odebraneDane
   odebraneDane = Serial.readStringUntil('\n'); 

   if (odebraneDane == "zielona") {//jezeli wpisane zielona
     delay(1000);
     ZielonaOn = !ZielonaOn;  //negacja wartosci ZielonaOn
     digitalWrite(zielona,ZielonaOn); //wlaczamy lub wylaczamy diode zielone
     delay(1000);
     Serial.println("Zielona ON"); //ZielonaOn
     Serial.println(ZielonaOn);   // 1 lub 0 
    }

    else if(odebraneDane == "czerwona") {
     delay(100);
     CzerwonaOn = !CzerwonaOn; //negacja CzerwoanaOn Operator ! neguje wartość logiczną, a więc gdy argument ma wartość true to zwraca false, a gdy false to zwraca true.
     digitalWrite(czerwona,CzerwonaOn);//wlaczamy lub wylaczamy
     delay(100);
     Serial.println("CzerwonaOn");
     Serial.println(CzerwonaOn);
    }

    else{
     Serial.println("Wprowadzona nazwa jest zla!!!.");
     Serial.println("Obslugiwane kolory to: zielona lub czerwona ");
    }

}
}
boolean ZielonaOn = false; //zmienna logiczna, czy czerwona (8) ON 1

boolean CzerwonaOn = false; //zmienna logiczna, czy zielona (9) ON 1

Dlaczego pokazuje mi wartość 1 ?, jak powinna mi pokazywać wartość 0(bo jest false)

Jak dam wartosć "true" zamiast "false" to pokazuje mi wartość 0?

Chodzi pewnie o to ze ta wartość została znegocjowana w programie?

 ZielonaOn = !ZielonaOn; 

Pozdrawiam serdecznie.

Udostępnij ten post


Link to post
Share on other sites
1. dlaczego między słowem jakie ma wyświetlić a odebranymi danymi, program nie robi przerwy?

Po prostu nie wyświetlasz "spacji" w odpowiednim miejscu. Arduino samo z siebie nie wie, czy i gdzie ma to zrobić.

2. Jak mam ustawić konsole programu, by stała się czytelna, a nie takie "mikro" literki? Dodam że używam rozdzielczości 4K.

Sprawdź w Plik > Preferencja. Jest tam opcja od zmiany rozmiaru czcionki.

piotrino, witam na Forbocie 🙂

Dlaczego pokazuje mi wartość 1 ?, jak powinna mi pokazywać wartość 0(bo jest false)

Jak dam wartosć "true" zamiast "false" to pokazuje mi wartość 0?

Jest tak jak piszesz, to wina negacji. Dodaj w programie testowo wyświetlanie zawartości tych zmiennych przed i po negacji, tak abyś nie miał już żadnych wątpliwości 🙂

Udostępnij ten post


Link to post
Share on other sites

Dziele się swoją pracą z pracy domowej

Zadanie domowe nr 2.3

Przerób powyższy program w taki sposób, aby w przypadku błędnego koloru wysyłał odpowiedni komunikat przez terminal. Swoim rozwiązaniem podziel się w komentarzu!

#define green 8
#define red 9

String recivedData = ""; //Pusty ciąg odebranych danych 

void setup(){
 Serial.begin(9600); //Uruchomienie komunikacji
 pinMode(green, OUTPUT); //Konfigurajca wyjść 
 pinMode(red, OUTPUT);

 digitalWrite(green, LOW);//Wyłączamy diody
 digitalWrite(red, LOW);
}
void loop() {
if(Serial.available() >0) {//Czy Arduino odebrało dane
 //Jeśli tak to odczytaj je do końca lini i zapisz w zmiennej recivedData
 recivedData = Serial.readStringUntil('\n');

 if (recivedData == "green") {//Jeśli odebrano słowo "green"
   digitalWrite(green, HIGH);//To włącz diodę zielonę
   delay(1000);
   digitalWrite(green, LOW);
   }

 else if (recivedData == "red"){ //Jeśli odebrano słowo "red"
   digitalWrite(red, HIGH); //To włącz diodę czerwoną 
   delay(1000);
   digitalWrite(red, LOW);
   }
   else { //W przeciwnym wypadku
     Serial.println ("You wrote wrong color! Write again.");
   }
   }
}

[ Dodano: 23-05-2016, 17:35 ]

Witam, jestem nowy na forum, wczoraj wrzuciłem jedną pracę domową dzisiaj wrzucam drugą

Zadanie domowe nr 2.5*

Zadanie trudniejsze, z gwiazdką . Napisz program, który po wysłaniu koloru diody zmieni jej stan na przeciwny. Jeśli dioda jest włączona, to zostanie wyłączona i na odwrót. Podpowiedź: koniecznie użyj dodatkowych zmiennych typu bool, które będą pamiętały aktualny stan diod.

#define green 8
#define red 9

String recivedData = ""; //Pusty ciąg odebranych danych 

boolean greenON = false; //Zmienna logiczna, czy pin 8 ON 1
boolean redON = false; //Zmienna logiczna, czy pin 9 ON 1

void setup(){
 Serial.begin(9600); //Uruchomienie komunikacji
 pinMode(green, OUTPUT); //Konfigurajca wyjść 
 pinMode(red, OUTPUT);

 digitalWrite(green, LOW);//Wyłączamy diody
 digitalWrite(red, LOW);
}
void loop() {
if(Serial.available() >0) {//Czy Arduino odebrało dane
 //Jeśli tak to odczytaj je do końca lini i zapisz w zmiennej recivedData
 recivedData = Serial.readStringUntil('\n');

 if (recivedData == "green") {//Jeśli odebrano słowo "green"
   delay(1000);
   greenON = !greenON; //negacja sygnału
   digitalWrite(green, greenON);//To włącz diodę zielonę
   delay(1000);
   Serial.println("Green ON");
   delay(10);
   Serial.println(greenON); //ZielonaON
       }

 else if (recivedData == "red"){ //Jeśli odebrano słowo "red"
   delay(1000);
   redON = !redON; //negacja sygnału 
   digitalWrite(red, redON); //To włącz diodę czerwoną 
   delay(1000);
   Serial.println("Red ON"); //CzerwonaON
   delay(10);
   Serial.println(redON); //1 lub 0
   }
   else { //W przeciwnym wypadku
     Serial.println ("You wrote wrong word. You can only write colours. Write again.");
   }
   }
}

Udostępnij ten post


Link to post
Share on other sites

grappa, witam na forum - fajnie, że działasz z kolejnymi zadaniami domowymi 🙂 Moja uwaga praktyczna, co do formatowania, zamiast:

    } 

 else if (recivedData == "red"){ 

Lepiej pisać:

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

Kod będzie wtedy czytelniejszy i trudniej będzie go zepsuć podczas rozbudowy 🙂

Udostępnij ten post


Link to post
Share on other sites

Witam

Oto mój kod do zadania 2.5, dodatkowo po wpisaniu złej komendy poinformuje nas o tym komunikat

String odebraneDane = "" ;//Pusty ciąg do odbioru danych
bool zmiennaz;//zmienna zapamiętująca stan diody zilonej
bool zmiennac;//zmienna zapamiętująca stan diody czerwonej
#define zielona 8//ustalenie że pin 8 będzie nazywany zielona
#define czerwona 9//ustalenie że pin 9 będzie nazywany czerwona
void setup() {
 Serial.begin(9600);//zainicjowanie wymiany danych z komputerem
 pinMode(zielona, OUTPUT);//piny diod wyjściowe
 pinMode(czerwona, OUTPUT);
 digitalWrite(zielona, LOW);//zgaszenie diod
 digitalWrite(czerwona, LOW);
 zmiennaz = true;//ustawienie zmiennych jako prawda
 zmiennac = true;
}

void loop() {
 if (Serial.available() > 0) {//czy arduino odebrało dane? 
   odebraneDane = Serial.readStringUntil('\n');//jeśli tak to przeczytaj całą linię
   if (odebraneDane == "zielona") {//jeśli napisane zostało "zielona"
if(zmiennaz == false){//jeśli zmienna ma wartość fałsz
 digitalWrite(zielona,LOW);//zgaś diodę zieloną
 zmiennaz = true;//zmień wartość zmiennej na prawda
}
else{//lub 
 if(zmiennaz == true){//jeśli zmienna ma wartość prawda
   digitalWrite(zielona,HIGH);//zapal zieloną diodę
   zmiennaz = false;//zmień wartość zmiennej na fałsz
 }
}
   }
   else{
     if(odebraneDane != "czerwona"){
       Serial.println("bledna komenda");
     }
   }
   if (odebraneDane == "czerwona") {//jeśli napisane zostało "czerwona"
if(zmiennac == false){//jeśli zmienna ma wartość fałsz
 digitalWrite(czerwona,LOW);//zgaś diodę czrerwoną
 zmiennac = true;//zmień wartość zmiennej na prawda
}
else{//lub
 if(zmiennac == true){//jeśli zmienna ma wartość prawda
   digitalWrite(czerwona,HIGH);//zapal czerwoną diodę
   zmiennac = false;//zmień wartość zmiennej na fałsz
 }
}
   }
   else{
     if(odebraneDane != "zielona"){
       Serial.println("bledna komenda");
     }
   }
 }
}

Udostępnij ten post


Link to post
Share on other sites

Pox98, fajnie, że starasz się iść dalej! Zerknij na moją poradę umieszczoną post wyżej - takie formatowanie poprawi czytelność.

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