Skocz do zawartości
Komentator

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

Pomocna odpowiedź

Nie wiem jak to się stało że nikt tego jeszcze nie wyłapał ale w przykładzie do lekcji 4 o Arduino - najpierw ustawimy pin 8 na wyjście, potem zmieniamy stan pinu 2

Dzięki, poprawione 🙂

Po załadowani tego kodu na Arduino jak wepnę styk do A5 a drugą stronę nie podepnę niczego

Jak nie podłączasz drugiej strony do niczego, to zbierasz śmieci z powietrza, więc na zrzucie ekranu wszystko jest dobrze 🙂 Podłącz przez potencjometr, w roli dzielnika napięcia i wtedy sprawdź.

Udostępnij ten post


Link to post
Share on other sites

Zadanie domowe nr 2.4

Dodałem coś takiego, pod funkcją [odebrane_dane = Serial.readStringUntil('\n');]

if(odebrane_dane !="ZIELONA" and odebrane_dane !="CZERWONA")

{

Serial.println("Zly kolor");

}

DZIAŁA! 😃

__________

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

Pablo, pamiętaj o wcięciach w kodzie, zamiast "and" radziłbym jednak pisać "&&" lub w ostateczności "AND". Przy bardziej złożonych warunkach taki zapis sprawi, że wszystko będzie bardziej czytelne.

Udostępnij ten post


Link to post
Share on other sites

Zadanie domowe nr 2.5

#define zielona 8
#define czerwona 9

String odebraneDane = "";
boolean czyZielona = false;
boolean czyCzerwona = false;

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

 digitalWrite(zielona, LOW);
 digitalWrite(czerwona, LOW);
}

void loop() {
 if (Serial.available() > 0) { // Czy Arduino odebralo dane
   odebraneDane = Serial.readStringUntil('\n'); // jesli tak do odczytal do znaku konca linii

   if (odebraneDane == "zielona") {
     czyZielona = !czyZielona;
     digitalWrite(zielona, czyZielona);
   } else if (odebraneDane == "czerwona") {
     czyCzerwona = !czyCzerwona;
      digitalWrite(czerwona, czyCzerwona);
   } else {
     Serial.println("Blad danych wejsciowych");
   }
 }
}

Pięknie działa! 🙂

Udostępnij ten post


Link to post
Share on other sites

koba94, pamiętaj, że warto dodawać więcej komentarzy. Gdy wrócisz do swojego programu za miesiąc, albo dwa, nie będzie on dla Ciebie tak jasny, jak teraz 🙂

Udostępnij ten post


Link to post
Share on other sites

Moje rozwiązanie 2.4 🙂

void loop() 
{
 while(Serial.available()>0) 
 {
   odebrane_dane=Serial.readStringUntil('\n');
   if(odebrane_dane=="zielona")
   {
     digitalWrite(zielona, HIGH);
     delay(1000);
     digitalWrite(zielona, LOW);
     break;
   }

   if(odebrane_dane=="czerwona")
   {
     digitalWrite(czerwona, HIGH);
     delay(1000);
     digitalWrite(czerwona, LOW);
     break;
   }
   Serial.println(odebrane_dane+" nie jest kolorem z zakresu: zielona, czerwona.");

 }


}

Pozdrawiam 😃

Udostępnij ten post


Link to post
Share on other sites

Witam

To mój pierwszy post na forum więc chciałbym wszystkich serdecznie przywitać!

Trafiłem tutaj poprzez kursy elektroniki a potem Arduino. Materiały świetnie i przystępnie napisane, nie zniechęcają i nie przytłaczają co jest bardzo ważne. Chyba dobrze że trafiłem na nie dość późno, bo nie muszę wyczekiwać kolejnych części kursu 🙂. Nie dotyczy to kursu lutowania, ale myślę ze mogę z tym żyć mając tyle innych rzeczy do ogarnięcia.

Mam już swoje lata jednak wychodzę z założenia że na naukę nigdy nie jest za późno.

Problemem jest to ze startuję od całkowitego zera, nawet nie bardzo mam gdzie podpytac czy doradzić sie w kwestii programowania. Dlatego liczę że tutaj na forum uzyskam pomoc i z góry przepraszam za "głupie pytania" choć podobno takich nie ma 🙂

Do rzeczy:

Napisałem kod do zadania 2.5 z gwiazdką,(korzystałem z już podanych) kod działa ale chciałem to również zrobić tak jak radzi

Trekker czyli za pomocą warunków. No i nie chce działać, nie wiem dlaczego.

Kiedy napisze "zielona" w monitorze pojawia się:

zielonaOn=0 i tylko tyle, nie zapala diody.

Czerwona działa normalnie, ale tu kod jest inaczej napisany.

Podpowie ktoś co zrobiłem źle?

      #define zielona 8
#define czerwona 9


String odebraneDane = "";  //pusty ciąg znaków
boolean zielonaOn = false;  //logika zielonej
boolean czerwonaOn = false;  //logika czerwonej

void setup() {
 pinMode(zielona, OUTPUT);  //konfiguracja pinów
 pinMode(czerwona, OUTPUT);

Serial.begin(9600);           //start transmisji

 digitalWrite(zielona, LOW);    //wyłączenie diod
 digitalWrite(czerwona, LOW);
}
void loop() 
{      
   if(Serial.available() > 0 ) {           //jeśli wykryto wpis...
   odebraneDane = Serial.readStringUntil ('\n'); //przeczytaj izapisz do ozdbraneDane

     if(odebraneDane == "zielona") {  //jeśli wpisano zielona
       delay(100);                    // czekaj 100ms
         if(zielonaOn == false) {     //jeśli logika zielonej=fałsz
         zielonaOn == true;           //zamien na "prawda"
         } else{                      // jeśli logika zielonej=prawda
          zielonaOn == false;         // zamień na fałsz
          }

       digitalWrite(zielona, zielonaOn); // zapal zieloną
       delay(100);
       Serial.print("zielonaOn = ");     //wyświetl stan
       Serial.println(zielonaOn);

      }    else if (odebraneDane == "czerwona") {  //jesli wpisano czerwona
                                                // analogicznie jak w poprzednim przypadku
         delay(100);
         czerwonaOn = !czerwonaOn;
         digitalWrite(czerwona, czerwonaOn);
         delay(100);
         Serial.print("czerwonaOn = ");
         Serial.println(czerwonaOn);
            }else{                                  // jeśli wpisano cokolwiek innego

         Serial.println("Niepoprawne polecenie!");  //wyświetl komunikat
         }

    }





}

Udostępnij ten post


Link to post
Share on other sites

mechanik, witam na forum 🙂 Dzięki za miłe słowa i zachęcam do nauki - nigdy nie jest zbyt późno.

Na początku zwróć uwagę na poniższy fragment swojego programu:

          if(zielonaOn == false) {     //jeśli logika zielonej=fałsz 
         zielonaOn == true;           //zamien na "prawda" 
         } else{                      // jeśli logika zielonej=prawda 
          zielonaOn == false;         // zamień na fałsz 
         } 

Zastanów się, czym jest operacja przypisania, a czym porównania - a szczególnie jak dokładnie używa się znaków równości w Arduino.

Udostępnij ten post


Link to post
Share on other sites

Zatem wszystko dla mnie już jest jasne 😉. Dziękuję za szybka odpowiedz.

Oczywiście pojedynczy znak równości to przypisanie, podwójny sprawdzenie wartości.

Wszystko teraz działa jak należy, wiedziałem, że problem leży w tych trzech linijkach. Próbowałem wymyślić je sam, jednak nie działało i znalazłem Twoją podpowiedz na forum, przepisałem i uznałem je za równie prawidłowe jak polecenia void setup i void loop 🙂. Niestety jest tam ten sam błąd.

Dziękuję jeszcze raz!

PS. nikt wczesniej nie korzystał i nie wyłapał literówki?

Udostępnij ten post


Link to post
Share on other sites
PS. nikt wczesniej nie korzystał i nie wyłapał literówki?

mechanik, możesz wskazać gdzieś dokładnie są te błędy? Nie mogę ich zlokalizować.

Udostępnij ten post


Link to post
Share on other sites
Może być?

Jasne! Bardzo fajne rozwiązanie. Dla niewtajemniczonych dodam tylko, że zapis:

 stanZielonej = !stanZielonej; 

Neguje (zmienia na przeciwną) wartość zmiennej stanZielonej.

Jednak nawet bez tego zapisu można poradzić sobie z zadaniem podobnie i rozbić to na warunek:

if (stanZielonej == true) {
 stanZielonej == false;
} else {
stanZielonej == true;
}

Sugerowała się tym kodem.

Udostępnij ten post


Link to post
Share on other sites

mechanik, wielkie dzięki - już poprawiłem te głupotę 🙂

Udostępnij ten post


Link to post
Share on other sites

Witam

Oto moje rozwiązanie zadania 2.4. Jest już kilka podanych więc troszkę się "pobawiłem" celem nabrania wprawy zanim przejdę do kolejnego etapu kursu. Nie jest idealnie ponieważ trzeba chwilkę poczekać, aż program wyjdzie z pętli ale działa 🙂

#define zielona 8
#define czerwona 9

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

void setup() {
 Serial.begin(9600); //start komunikacji

 pinMode(zielona, OUTPUT); //ustawienie wyjść
 pinMode(czerwona, OUTPUT);

 digitalWrite(zielona, LOW); //Wyłączamy diody
 digitalWrite(czerwona, LOW);
}

void loop() {


 while (Serial.available() == 0){   //pętla napisu początkowego

  Serial.print("Wybierz kolor");
 delay(1000);
 Serial.print(".");
 delay(1000);
 Serial.print(".");
 delay(1000);
 Serial.println(".");
 delay(5000);
  }

    if(Serial.available() > 0) {       //czy odebrano dane

   odebraneDane = Serial.readStringUntil('\n'); //jesli tak zapisz do odebraneDane

          if (odebraneDane == "zielony") { // jesli wpisano zielony
           Serial.println("zapalam zielona!"); //Wyślij komunikat
     digitalWrite(zielona, HIGH); //załącz  diodę zieloną
     delay(1000);                  // czekaj
     digitalWrite(zielona, LOW);   // wyłącz zieloną

          }

              if (odebraneDane == "czerwony") { //Jeśli wpisano czerwony
               Serial.println("zapalam czerwona!");
     digitalWrite(czerwona, HIGH); //To włączamy diodę czerwoną
     delay(1000);
     digitalWrite(czerwona, LOW); 

              }
                   if(odebraneDane != "zielony" && odebraneDane != "czerwony"){ //komunikaty błędnie wpisanego koloru
     Serial.println("nieobslugiwany kolor");
     delay(500);
     Serial.println("obslugiwane kolory to:");
     delay(500);
     Serial.println("'zielony' lub 'czerwony'");
                  }
     }
}

Udostępnij ten post


Link to post
Share on other sites

mechanik, trochę kuleje momentami formatowanie, ale jeśli program działa, to nie będę się już tak czepiał 🙂 Powodzenia przy wykonywaniu dalszych zadań!

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!

Gość
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...