Skocz do zawartości

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


Pomocna odpowiedź

14 godzin temu, BRY napisał:

Serial.println("ilosc wcisniec: " +licznik+); //display value 'licznik'

Bo do stałej tekstowej próbujesz dodać zmienną innego typu i masz niedokończone wyrażenie arytmetyczne licznik+.

Spróbuj tak: Serial.println("ilosc wcisniec: " +String(licznik)); //display value 'licznik'

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

Dziękuje. Działa! Zasugerowałem sie kodem z kolejnego przykładu :

 Serial.println("Witaj " + odebraneDane + "!"); //Wyświetl komunikat

Ale teraz już wiem jak to wykorzystać.

Link do komentarza
Share on other sites

Witam. Czy taki kod do zadania 2.4 będzie odpowiedni?

Mimo tego ze wszystko działa prawidłowo mam, wrażenie ze zbyt łatwo poszło.

Nie do końca rozumiem jeszcze działanie reszty, wiec zrobiłem na podstawie tego, co już (chyba) zrozumiałem 😉

Nigdy nie miałem styczności z programowaniem i pewnie jest bałagan w kodzie (pomijam kilka nieudanych podejść do tematu, z których nic nie zostało w głowie.

p.s: Bardzo ładne i przejrzyste poradniki, mimo kilku podejść nie mogłem zrozumieć pewnych rzeczy korzystając z innych stron niedotyczących arduino.

Jak można cos zrobić na żywo to jednak pomaga ( co chwile kusi, by robić jakieś zmiany i dodatki...tego zadania tez robiłem kilka wersji dla siebie...więcej świecidełek, miganie przy zlej komendzie plus buzzer, bo bardzo kusił żeby go użyć itp.)

#define zielona 8   
#define czerwona 9
#define niebieska 3

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

  void setup() {
  Serial.begin(9600); // uruchamiamy komunikacje
  pinMode(zielona, OUTPUT); //Konfiguracja wyjsc
  pinMode(czerwona, OUTPUT);
  pinMode(niebieska, OUTPUT);
  

  digitalWrite(zielona, LOW); //wyłaczamy diody na starcie programu
  digitalWrite(czerwona, LOW);
  digitalWrite(niebieska, LOW);
  }

void loop() {
  if (Serial.available() > 0) { // czy Andruino odebrało dane
    //jesli tak odczyt do konca lini i zapis w zmiennej odebraneDane
    odebraneDane = Serial.readStringUntil('\n');

    if (odebraneDane == "zielona") {      //jesli odebrano słowo "zielona"
      digitalWrite(zielona, HIGH);        //właczamy zielona
      Serial.println("zapalono zielona"); //wyswietla komunikat w terminalu o zapaleniu zielonej
      delay(1000);                        //czekamy sekunde po właczeniu diody
      digitalWrite(zielona, LOW);         //wyłaczamy diode zeby sie nie swieciła czały czas
    }

    if (odebraneDane == "czerwona") {     //jesli odebrane słowo to "czerwona"
      digitalWrite(czerwona, HIGH);       //zapalam czerwona
      Serial.println("zapalono czerwona");//wyswietla komunikat w terminalu o zapaleniu czerwonej
      delay(1000);                        //czekamy sekunde
      digitalWrite(czerwona, LOW);        // wylaczamy czerwona

    }
    if (odebraneDane == "niebieska") {     //jesli odebrane dane to słowo "niebieska"
      digitalWrite(niebieska, HIGH);       //włacza niebieska
      Serial.println("zapalono niebieska");//komunikat o zapaleniu niebieskiej
      delay(1000);
      digitalWrite(niebieska, LOW);
     
    }
    
    if (odebraneDane != "czerwona" && odebraneDane != "zielona" && odebraneDane != "niebieska") {
      Serial.println("Zla komenda , wpisz 'czerwona' , 'zielona'  lub 'niebieska' ");
        
    }
  }
}

 

  • Lubię! 1
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

@MichalWitJak na początkującego jest zupełnie ok, co nie znaczy, że nie można napisać jeszcze lepiej. Kontynuuj, a gdy skończysz cały kurs, myślę, mam taką nadzieję,  że będziesz wiedział co i jak poprawić. 

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

@MichalWit, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.

6 godzin temu, MichalWit napisał:

Nigdy nie miałem styczności z programowaniem i pewnie jest bałagan w kodzie (pomijam kilka nieudanych podejść do tematu, z których nic nie zostało w głowie.

Nie masz się czego wstydzić, program bardzo ładny 🙂 Cieszę się, że poradniki są pomocne - powodzenia w dalszej nauce!

Link do komentarza
Share on other sites

Dziękuje za poprzednia odpowiedź.

Zadanie 2.5

Tego zadania również robiłem kilka wersji, podpytałem nawet siostrzeńca który uczy się na informatyka co i jak poprawić....udało się fajnie skrócić wcześniejszy kod 😉

Problem pojawia się, gdy chce skrócić kod i tak zamiast:

if (odebraneDane != "red" && odebraneDane!= "blu")   
      Serial.println("Zla komenda , wpisz 'red' , 'blu' ");
  }

chciałem wstawić :

np tak :

else { Serial.println("Zla komenda , wpisz 'red' , 'blu' "); 

}  

Po wpisaniu tego "red" działa (zapala i gasi)...po wpisaniu "blu" działa, lecz z automatu od razu wywala komunikat o złej komendzie.

Dodam jeszcze, że jak zamienię miejscami kod odpowiadający za red i blu to jest odwrotnie.

Ogólnie nie do końca wiedziałem jak to zrobić z "boolami "...ale pomogły mi wasze komentarze i zrozumiałem jak to działa.

Wiem jak działa ostatni pusty else, ale jak widać... u mnie to nie działa.

Najważniejsze pytanie, dlaczego tak się dzieje ? Pół dnia się z tym meczę  (niby pasuje do tego co wyczytałem  ale nie do końca działa ) 🙂

//zadanie 2.5
#define red 8                 
#define blu 9

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

boolean czer = "";
boolean nieb = "";
void setup() {
  
  Serial.begin(9600);       //uruchomienie komunikacji
  pinMode(red, OUTPUT);     //konfiguracja wyjsc
  pinMode(blu, OUTPUT);  

  digitalWrite(red ,LOW);   // wyłaczenie diod na starcie
  digitalWrite(blu ,LOW);

  czer = false;             // ustawienie na start na false
  nieb = false;
}

void loop() {
  if (Serial.available() > 0) {       //czy andruino odebrało jakies dane
  //jesli odebralo to odczyt do konca lini i zapisuje w zmiennej odebraneDane
  odebraneDane = Serial.readStringUntil('\n'); 

  if (odebraneDane == "blu" ) {       // spr czy wpisano blu
    if (nieb == false) {              // jesli jest na false 
      digitalWrite(blu, HIGH );       //to zapalamy
      nieb = true;                    //zmieniamy na true skoro chwile temu zapalilismy  
    }else {                             
      digitalWrite(blu, LOW);         //jesli jest prfzeciwnie to gasimy gada
      nieb = false;                   //i ustawiamy gadzine na false
    }
  }
  if (odebraneDane == "red") {        //jesli wpisano słowo red to leci dalej jak wyzej
    if(czer == false ){               // jesli red jest na false 
      digitalWrite(red, HIGH);        //zapalamy czerwonke
      czer = true;                    // i ustawiamy na true zeby tak zostało w pamieci(jesli moge to tak nazwac)
    }else {
      digitalWrite(red, LOW);         // jesli jest inaczej to ja gasimy 
      czer = false;                   // i ustawiamy wartosc na false
    }
  }
if (odebraneDane != "red" && odebraneDane!= "blu")       // jesli odebrane dane sa inne wyswietli komunikat
      Serial.println("Zla komenda , wpisz 'red' , 'blu' ");
  }       
} 

 

 

Link do komentarza
Share on other sites

1 godzinę temu, MichalWit napisał:

Po wpisaniu tego "red" działa (zapala i gasi)...po wpisaniu "blu" działa, lecz z automatu od razu wywala komunikat o złej komendzie.

Dodam jeszcze, że jak zamienię miejscami kod odpowiadający za red i blu to jest odwrotnie.

Jeśli dobrze rozumiem, to tworzysz dwa osobne warunki (w tym jeden z else), czyli masz coś takiego:

if (odebraneDane == "blu" ) {  

}

if (odebraneDane == "red" ) {  

} else {
  Serial.println("Zla komenda , wpisz 'red' , 'blu' ");
}

To są dwa niezależne warunki. Najpierw jest sprawdzany pierwszy, a później drugi. Jeśli chcesz, aby całość działała jako jeden duży warunek to powinieneś pójść w takim kierunku:

if (odebraneDane == "blu" ) {  

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

} else {
  Serial.println("Zla komenda , wpisz 'red' , 'blu' ");
}

Zastanów się na spokojnie jaka jest różnica i przetestuj układ w praktyce to łatwiej zrozumiesz 🙂

Link do komentarza
Share on other sites

 W ten sposób zaczynalem ale dostałem zła podpowiedź żeby tak nie robić 🙂Dlatego w 2 miejscu zmieniłem " else if" na if ... bo podobno tak miało być lepiej.  

W wolnej chwili  przetestuje i sprawdzę różnice 🙂

Dzięki.Pozdrawiam

Link do komentarza
Share on other sites

Cześć. Tak analizuję poprzednie rozwiązania zadania 2.5 i zainteresowało poniższe rozwiązanie:

Dnia 22.05.2015 o 09:14, igor napisał:

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ć?

Po co są tutaj wrzucone kody:

boolean stanCzerwonej = false;
boolean stanZielonej = false;

Czemu to miało służyć? i czy nie można było tego zrobić po prostu tak?

 

//

#define zielona 8
#define czerwona 9

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

 
void setup() {
  Serial.begin(9600);//uruchomienie komunikacji
  pinMode(zielona, OUTPUT);//włączenie diód
  pinMode(czerwona, OUTPUT);

  digitalWrite(zielona, LOW);//wyłączamy diody
  digitalWrite(czerwona, LOW);
}
 
void loop() {
  if(Serial.available()>0){ //czy arduino odebrało dane
    // jesli tak, to odczytaj je do znaku końca linii i zapisz w zmiennej odebraneDane
    odebraneDane = Serial.readStringUntil('\n'); 

    if (odebraneDane == "zielona"){//jesli odebrano słowo zielona
      digitalWrite(zielona, HIGH);//to włączamy diodę zieloną
      delay(1000);
      digitalWrite(zielona, LOW);
      
      
    }

    if (odebraneDane == "czerwona"){//jeśli odebrano słowo czerwona
      digitalWrite(czerwona, HIGH);
      delay(1000);
      digitalWrite(czerwona,LOW);
      
    }  
      
       if (odebraneDane!= "czerwona" && odebraneDane != "zielona") {
     Serial.println("Nieprawidlowy kolor! Wpisz 'zielona' lub 'czerwona'.");
    }
  }
}

 

Edytowano przez Rekawek199
literówka
Link do komentarza
Share on other sites

@Rekawek199, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.
3 godziny temu, Rekawek199 napisał:

Czemu to miało służyć?

W zmiennych tych trzymany jest aktualny stan każdej diody (informacja o tym czy dioda świeci, czy nie). Dzięki temu program jest czytelniejszy i można łatwo negować stan diod. Wklejony przez Ciebie program działa inaczej. Zapalasz diodę tylko na sekundę i ją gasisz. Program, który cytujesz włącza diodę do momentu, aż nie przyjdzie druga komenda, która będzie oznaczała, że dioda ma zostać wyłączona. To dwie różne wersje podobnego programu. Najlepiej przetestuj oba kody w praktyce to zobaczysz różnicę w działaniu 🙂

Link do komentarza
Share on other sites

Cześć !

Mam takie pytanie, ponieważ dopiero co zaczynam z Arduino. Czy jak wgram na płytkę jakiś program to czy będę musiał go jakoś wyłączyć jak będę chciał wgrać inny program? Chodzi mi przede wszystkim o dokładanie układów peryferyjnych. Nie zepsuje mi Arduino gdy będę montować inny układ? I czy istnieje możliwość przerwania np. nieskończonej pętli która wypisuje co 5 sekund napis "witaj w Forbocie".

Dziękuję za pomoc.

Pozdrawiam ; )

Link do komentarza
Share on other sites

Hej, w sumie też zaczynam (chwilowo przerwałem kurs z powodu budowy stacji lutowniczej na arduino- wiec tak trochę z D... strony zaczynam ), ale tak:
1. Wgrywanie nowego kodu robisz bez usuwania starego.

2. Możesz zatrzymać pętle np. przyciskiem i po kliknięciu leci dalej...ewentualnie zaraz z początku kursu było jak włączyć diodę (uruchamiasz ja w void setup-wtedy to co tam jest wykona się tylko raz ).

Jeśli się mylę proszę mnie poprawić 😉

 

 

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

@Ronaldo71888 otrzymałeś już odpowiedź od @MichalWit, ale dla pewności:

11 godzin temu, Ronaldo71888 napisał:

Mam takie pytanie, ponieważ dopiero co zaczynam z Arduino. Czy jak wgram na płytkę jakiś program to czy będę musiał go jakoś wyłączyć jak będę chciał wgrać inny program? Chodzi mi przede wszystkim o dokładanie układów peryferyjnych

Programu nie musisz wyłączać ani usuwać, można od razu wgrywać nowy. Najlepiej jednak wszelkie połączenia elektroniczne wykonywać, gdy Arduino jest wyłączone 🙂

11 godzin temu, Ronaldo71888 napisał:

I czy istnieje możliwość przerwania np. nieskończonej pętli która wypisuje co 5 sekund napis "witaj w Forbocie".

Tak, ale najlepiej w tym celu napisać własną pętlę, która będzie wewnątrz tej głównej, prawdziwiej pętli nieskończonej (to jeden z wariantów).

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.