Skocz do zawartości
Komentator

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

Pomocna odpowiedź

Witam,

Mam pytanie. Chciałem połączyć program licznika z programem "przeciwłamaniowym", tak aby wyświetlał liczbę wciśnieć przycisku. Udało sie. Ale gdy chciałem aby program wyswietał wartość wraz z komunikatem: "ilość wcinięć: x" gdzie x wartość licznika, pojawiał sie błąd:

exit status 1
expected primary-expression before ')' token

Zastosowałem zmodyfikowaną formułę z kolejnego zadania tzn.:    

void loop() 
{  
 if(digitalRead(Sensor_1) == LOW)
 { 
  digitalWrite(LedGreen, HIGH); //LED green ON
  digitalWrite(LedRed, LOW); // LED red OFF
  Serial.println("ilosc wcisniec: " +licznik+); //display value 'licznik'
  while (digitalRead(Sensor_1) == LOW) //wait till change
  {
  delay(25);
  }  
  }
  
 else
 {
  digitalWrite(LedGreen, LOW); // LED green OFF
  digitalWrite(LedRed, HIGH); // LED red ON
  licznik = licznik + 1; //add value 1 to 'licznik'

  while(digitalRead(Sensor_1) == HIGH) 
  {
  delay(25);
  } // wait for switch release

}

Bez wartość w " " działa poprwnie. Na czym polega błąd? Jak  

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
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

Udostępnij ten post


Link to post
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ć.

Udostępnij ten post


Link to post
Share on other sites

To też zadziała pod warunkiem, że odebraneDane są typu String.

  • Lubię! 1

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@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

Udostępnij ten post


Link to post
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!

Udostępnij ten post


Link to post
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' ");
  }       
} 

 

 

Udostępnij ten post


Link to post
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 🙂

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
Share on other sites

To faktycznie podpowiedzieć nie była raczej najlepsza 😉 W tym konkretnym przypadku takie rozwiązanie byłoby najlepsze.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

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

Udostępnij ten post


Link to post
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 🙂

Udostępnij ten post


Link to post
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 ; )

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

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

Udostępnij ten post


Link to post
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ę »

×