Skocz do zawartości

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


Pomocna odpowiedź

#define green 8
#define red 9

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

void setup() {
  Serial.begin(9600); // Uruchomienie komunikacji
  pinMode(green, OUTPUT); //konfiguracja 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 odczytujemy je do znaku końca linii i zapisz w zmiennej odebraneDane
    odebraneDane = Serial.readStringUntil('n');

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

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

ja mam mianowicie taki kod i działa mi tylko dioda czerwona przy wywołaniu w monitorze szeregowym , czy coś tu jest źle wpisane ?

Link to post
Share on other sites

@Bartroz niezabardzo mogę sobie wyobrazić jak to może wyglądać, mógłbyś wrzucić zdjęcie? Dla testu możesz spróbować inny monitor, np TeraTerm albo Putty z ustawieniami dla "Serial".

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

@Gieneq  Po włączeniu monitoru portu szeregowego z zakładki narzędzia, uruchamia mi okno jednak nie mogę go odpalić. A próba najechania na niego kursorem skutkuje brakiem reakcji, to jakby monitor się uruchamiał i natychmiastowo zawieszał i nie reagował. Na dołączonej grafice najechałem na okno z moniotorem (COM3) jednakże pokazuje od razu mój pulpit.

Bez tytułu.jpg

Link to post
Share on other sites

Cześć,

chciałem pochwalić się działającymi kodami.

Choć zrobiłem zadania i kody rzeczywiście działają, to nie bardzo rozumiem działania boolean, a szczególnie składni (zakładam, że to jeszcze pojawi się na kursie)

boolean cosTam = false

Czy to oznacza, że na wstępie wszystko wyłączamy, a później stan podlega modyfikacjom?

 

Poniżej kod:

 

[code]
//Zadanie 2.4
//Włączanie diody i komunikat o błędzie

#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); //Wylaczamyg diody
  digitalWrite(czerwona, LOW);
}

void loop() {
  if (Serial.available() > 0) { //Czy Arduino odebrało dane
    //Jesli tak, to odczytujemy jes do znaku konca linii i zapisz w zmiennej odebraneDane
    odebraneDane = Serial.readStringUntil('\n');

    if (odebraneDane == "zielona") { //Jesli odebrano slowo "zielona"
      digitalWrite(zielona, HIGH); //To wlaczamy diode zielona
      delay(1000);
      digitalWrite(zielona, LOW);
    } else    if (odebraneDane == "czerwona") { //Jesli odebrano slowo "czerwona"
      digitalWrite(czerwona, HIGH); //To wlaczamy diode czerwona
      delay(1000);
      digitalWrite(czerwona, LOW);
    } else { //Jesli inne slowo
      digitalWrite(czerwona, LOW); //pozostaw czerwoną zgaszoną
      Serial.println("Uwaga! Błędne polecenie!"); //Wyswietla komunikat o bledzie

    }
  }
}
[/code]

oraz

[code]
//Zadanie domowe 2.5
//Przeciwny kolor diody lub komunikat o błędzie

#define zielona 8
#define czerwona 9

String odebraneDane = ""; //Pusty ciąg odebranych danych
boolean stanZielonej = false;
boolean stanCzerwonej = false;

void setup() {
  Serial.begin(9600); //Uruchomienie komunikacji
  pinMode(zielona, OUTPUT); //Konfiguracja wyjść
  pinMode(czerwona, OUTPUT);

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

void loop() {
  if (Serial.available() > 0) { //Czy Arduino odebrało dane
    //Jesli tak, to odczytujemy jes do znaku konca linii i zapisz w zmiennej odebraneDane
    odebraneDane = Serial.readStringUntil('\n');

    if (odebraneDane == "zielona") { //Jesli odebrano slowo "zielona"
      stanZielonej = !stanZielonej; //zmiana stanu diody zielonej na przeciwny
      
    } else if (odebraneDane == "czerwona") { //Jesli odebrano slowo "czerwona"
       stanCzerwonej = !stanCzerwonej;
      
    } else { //Jesli inne slowo
       Serial.println("Uwaga! Błędne polecenie!"); //Wyswietla komunikat o bledzie

    }
    digitalWrite(zielona, stanZielonej);
    digitalWrite(czerwona, stanCzerwonej);
  }
}
[/code]

 

Z programowaniem dopiero zaczynam i pewnie moje pytania są "oczywiste", ale może się czegoś nauczę;)

 

Edytowano przez ebucior
Link to post
Share on other sites
52 minuty temu, ebucior napisał:

nie bardzo rozumiem działania boolean, a szczególnie składni (zakładam, że to jeszcze pojawi się na kursie)

boolean cosTam = false

Czy to oznacza, że na wstępie wszystko wyłączamy, a później stan podlega modyfikacjom?

boolean to typ zmiennej (jak int/char/float/etc) ktory moze przechowywac tylko dwa stany..."false" i " true"... false to to samo co stan niski i "0"...natomiast true to to samo co stan wysoki i "1" 

W twoim przypadku jak najbardziej mozesz modyfikowac te zmienne..nawet musisz zeby kod dzialal tak jak ma dzialac...

Na starcie diody sa zgaszone (czyli false)

  • Pomogłeś! 1
Link to post
Share on other sites

Niestety słabo się trochę przegląda te watki więc nie wiem czy moje pytanie już nie padło (jeśli padło to przepraszam), w zadaniu 2.5 sugerujesz użycie dodatkowej zmiennej ale to chyba nie jest konieczne ? czy może błędem jest używanie do output portów polecenia digitalRead ?

mój kod poniżej

#define zielona 8
#define czerwona 9
 
String odebraneDane = "";
 
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") {
      if (digitalRead(zielona) == LOW){
      digitalWrite(zielona, HIGH);
      }else{
      digitalWrite(zielona, LOW); 
      }
    }
    
    else if (odebraneDane == "czerwona") {
      if (digitalRead(czerwona) == LOW){
      digitalWrite(czerwona, HIGH);
      }else{
      digitalWrite(czerwona, LOW); 
      }
    } else{
      Serial.println("zle dane " +odebraneDane);
    }
  }
}

 

  • Lubię! 1
Link to post
Share on other sites

@jareklmx jest to dobry sposób, a nawet jest lepszy:

digitalWrite(!digitalRead(pin), pin);

Dodatkowa zmienna może się przydać, gdybyś chciał napisać bardziej uniwersalny program gdzie niekoniecznie używasz wyprowadzeń czy LED.

  • Pomogłeś! 1
Link to post
Share on other sites
String odebraneDane = ""; //Pusty ciąg odebranych danych
boolean czyCzerwonaZapalona = false;
boolean czyZielonaZapalona = false;
 
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"
      if(czyZielonaZapalona==false){
        digitalWrite(zielona, HIGH); //To włączamy diodę zieloną
        czyZielonaZapalona=true;
        } else {
           digitalWrite(zielona, LOW); 
           czyZielonaZapalona=false;
          }
    }
    
   else if (odebraneDane == "czerwona") { //Jeśli odebrano słowo "czerwona"
     if(czyCzerwonaZapalona==false){
        digitalWrite(czerwona, HIGH); 
        czyCzerwonaZapalona=true;//To włączamy diodę zieloną
        } else {
           digitalWrite(czerwona, LOW); 
           czyCzerwonaZapalona=false;
          }
    } 
    else {
      Serial.println("Podany zły kolor diody!");
    
      }
  }
}

Jakby ktoś potrzebował kodu z zadaniami domowymi to tak to u mnie wygląda :)

  • Lubię! 1
Link to post
Share on other sites

Witam chciałbym się dowiedzieć się jaka jest różnica w działaniu takiego kodu

if (digitalRead(przycisk == LOW)){

w stosunku do takiego kodu

if (digitalRead(przycisk) == LOW){

 

Link to post
Share on other sites

Druga wersja jest prawidlowa...i tak sie ja powinno zapisywac...digitalRead to nic innego jak funkcja z jednym argumentem krora zwraca true lub false

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

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.