Skocz do zawartości

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


Pomocna odpowiedź

Zadanie 2.5 w moim wykonaniu:

 

#define GREEN_LED_PIN 9
#define RED_LED_PIN 8

String ledSwitch = "";
bool isTurnedOn = false;

void setup() {
  Serial.begin(9600);

  pinMode(GREEN_LED_PIN, OUTPUT);
  pinMode(RED_LED_PIN, OUTPUT);

  digitalWrite(GREEN_LED_PIN, LOW);
  digitalWrite(RED_LED_PIN, LOW);
}

void loop() {
  if (Serial.available() > 0){
    ledSwitch = Serial.readStringUntil('\n');
  

  if (ledSwitch == "RED"){
    if(isTurnedOn){
      digitalWrite(RED_LED_PIN, LOW);
      Serial.println("Wyłączono czerwoną diodę");
      isTurnedOn = false;
    }else{
      digitalWrite(RED_LED_PIN, HIGH);
      Serial.println("Włączono czerwoną diodę");
      isTurnedOn = true;
    }

    
  }else if(ledSwitch == "GREEN"){
    if (isTurnedOn){
      digitalWrite(GREEN_LED_PIN, LOW);
      Serial.println("Włączono zieloną diodę");
      isTurnedOn = false;
    }else{
      digitalWrite(GREEN_LED_PIN, HIGH);
      Serial.println("Wyłączono zieloną diodę");
      isTurnedOn = true;
    }
    
  }else{
    Serial.println("Wybierz prawidłową diodę. RED albo GREEN");
  }

  };

}

 

  • Lubię! 1
  • 1 miesiąc później...
  • 2 tygodnie później...

 

Moje wykonanie zadania 2.5:

#define diodaCzerwona 8
#define diodaNiebieska 9

boolean czerwonaStatus = false;
boolean niebieskaStatus = false;

void setup() {
  Serial.begin(9600);

  pinMode(diodaCzerwona, OUTPUT);
  pinMode(diodaNiebieska, OUTPUT);

  diodaCzerwonaOff();
  diodaNiebieskaOff();

}

void diodaCzerwonaOn() {
  digitalWrite(diodaCzerwona, HIGH);
  czerwonaStatus = true;
}

void diodaNiebieskaOn() {
  digitalWrite(diodaNiebieska, HIGH);
  niebieskaStatus = true;
}

void diodaCzerwonaOff() {
  digitalWrite(diodaCzerwona, LOW);
  czerwonaStatus = false;
}

void diodaNiebieskaOff() {
  digitalWrite(diodaNiebieska, LOW);
  niebieskaStatus = false;
}

void loop() {

String kolor = "";

  if (Serial.available() > 0) { //pszyszło polecenie
    kolor = Serial.readStringUntil('\n'); //otrzymane polecenie przypisz do zmiennej kolor
      

    if (kolor == "niebieska") { //obsłuż diodę niebieską
      if ( niebieskaStatus == true ) { //jeżeli dioda jest włączona to wywołaj funkcję wyłączenia
        diodaNiebieskaOff(); //wywołanie funkcji zgaszenia diody i ustawienia jej statusu na false
      }
      else if (niebieskaStatus == false) { //jeżeli dioda jest wyłączona to wywołaj funkcję włączenia
        diodaNiebieskaOn(); //wywołanie funkcji włączenia diody i ustawienia jej statusu na true
      }
    }
    else if (kolor == "czerwona") { //obsłuż diodę czerwoną
      if (czerwonaStatus == true) { //jeżeli dioda jest włączona to wywołaj funkcję wyłączenia
        diodaCzerwonaOff(); //wywołanie funkcji zgaszenia diody i ustawienia jej statusu na false
      }
      else if (czerwonaStatus == false) {//jeżeli dioda jest wyłączona to wywołaj funkcję włączenia
        diodaCzerwonaOn(); //wywołanie funkcji włączenia diody i ustawienia jej statusu na true
      } 
    }
    else { //niepoprawny wybór
      Serial.println("Możesz wpisać: niebieska lub czerwona");
    }
  }
}
  • Lubię! 1
  • 3 tygodnie później...
(edytowany)

Moje wzbogacone o trzecią diodę zadanie domowe *2.5 oraz 2.4 . Takie tam 2 w 1😀

#define Z 8 //Zielona
#define C 9 //Czerwona
#define N 7 //Niebieska

boolean SZ = 0; //Stan Zielonej
boolean SC = 0; //Stan Czerwonej
boolean SN = 0; //Stan Niebieskiej

String kolor = " ";

void setup() {
Serial.begin(9600);
pinMode(Z, OUTPUT);
pinMode(C, OUTPUT);
pinMode(N, OUTPUT);
digitalWrite(Z, LOW);
digitalWrite(C, LOW);
digitalWrite(N, LOW);
}

void loop() {
  if (Serial.available() > 0) {
      kolor = Serial.readStringUntil ('\n');
      if (kolor == "Z") {
        SZ = !SZ;
        digitalWrite(Z, SZ);
      }
          else if (kolor == "C") {
            SC = !SC;
            digitalWrite(C, SC);
          }
            else if (kolor == "N") {
              SN =! SN;
              digitalWrite(N, SN);
            }
              else{
                Serial.println("Nie ma takiego koloru");
              }
  }  
}

Mógłby mi ktoś wytłumaczyć, dlaczego zmiana z: else if (kolor == "C") na: if (kolor == "C") , sprawia, że po wpisaniu do terminalu 'Z', program zapala diodę zieloną (tak jak należy) lecz przy tym wyświetla komunikat 'Nie ma takiego koloru' , natomiast przy zapalaniu czerwonej i niebieskiej diody, nie ma wiadomości o 'Nie ma takiego koloru' ? Czemu 'nadmiar' instrukcji if jedna pod drugą, powoduje coś takiego? Czy jest na to jakieś inne rozwiązanie niż poprawić 'nadmiarowego 'if' na else if (kolor == "C")'😅?

Pozdrawiam☺️

Edytowano przez Mordel
Zapomniałem dodać, iż w tym kodzie odrobiłem 2 zadania domowe :)

@Mordel jeśli warunki są "połączone" za pomocą else to zostanie wykonany kod dla pierwszego napotkanego warunku, który jest spełniony. Jeśli umieścisz w kodzie kilka niezależnych warunków, bez połączenia ich za pomocą else, to będą one sprawdzane niezależnie, jeden po drugim. Dlatego brak else sprawia, że drugi warunek sprawdzany jest niezależnie od pierwszego.

  • 2 miesiące później...
(edytowany)
bool zmienDiode = true;
void setup() {
  pinMode(8, OUTPUT);
  Serial.begin(9600);
  digitalWrite(8, LOW);
  Serial.println("Napisz: zmienDiode");
}

void loop() {
  if (Serial.available() > 0) {
    String dioda = Serial.readStringUntil('\n');
    if (dioda == "zmienDiode") {
      if (zmienDiode == true) {
        digitalWrite(8, HIGH);
      } else {
        digitalWrite(8, LOW);
      }
      zmienDiode = !zmienDiode; // zmienia wartosc true na false i false na true
    }
  }
}

 

Edytowano przez Elorn
  • Lubię! 1
  • 4 miesiące później...

Zadanie 2.4

 

Mój kod

#define diodaczerwona 8
#define diodazielona 9
#define przycisk 10

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

void setup(){
  Serial.begin(9600); //Ustawienie prędkości transmisji
  Serial.println("Witaj w SYSTEMIE"); //Jednorazowe wysłanie tekstu

  pinMode(diodaczerwona, OUTPUT); //wyjscie diody czerwonej
  pinMode(diodazielona, OUTPUT); //wyjscie diody zielonej
  pinMode(przycisk, INPUT_PULLUP); //wyjscie przycisku

  digitalWrite(diodaczerwona, LOW); //wylaczenie diody
  digitalWrite(diodazielona, LOW); //wylaczenie diody
}

void loop() {

  if(Serial.available() > 0) {// czy dane zostaly odebrane
  odebraneDane = Serial.readStringUntil('\n'); //odczytaj do konca linijki


  if (odebraneDane == "zielona") {
    Serial.println("Włączam zielona");
    digitalWrite(diodazielona, HIGH);
    delay(1000);
    digitalWrite(diodazielona, LOW);
  }


  if (odebraneDane == "czerwona") {
    Serial.println("Włączam czerwoną");
    digitalWrite(diodaczerwona, HIGH);
    delay(1000);
    digitalWrite(diodaczerwona, LOW);

 
  }

  else {
    Serial.println("Nieznany kolor");
  }

  }
}
  

Zrobiłem żeby oprócz świecenia diody system wysyłał informacje Włączam zielona lub włączam czerwona. 

Niestety o ile w przy czerwonej jest ok pali sie dioda + informacja Włączam czerwonej o tyle przy zielonej za każdym razem zapala sie zielona ale system wysyła informacje "włączam zieloną" i od razu następną linijke "Nieznany kolor"
Załącznik. 

Jak to poprawić??

Zrzut ekranu 2025-01-11 135047.png

@PanMajster program działa prawidłowo, jak napiszesz zielona to się ona zapala, 

Następnie sprawdza czy jest to czerwona ... nie bo to była Zielona wiec jak warunek dla czerwonej nie jest spełniony to 'nieznany kolor' 

Pomyśl nad tym 'else' 

@Santiago

void loop() {

  if(Serial.available() > 0) {// czy dane zostaly odebrane
  odebraneDane = Serial.readStringUntil('\n'); //odczytaj do konca linijki


  if (odebraneDane == "zielona") {
    Serial.println("Włączam zielona");
    digitalWrite(diodazielona, HIGH);
    delay(1000);
    digitalWrite(diodazielona, LOW);
  }


 else if (odebraneDane == "czerwona") {
    Serial.println("Włączam czerwoną");
    digitalWrite(diodaczerwona, HIGH);
    delay(1000);
    digitalWrite(diodaczerwona, LOW);
  }
  else {
    Serial.println("Nieznany kolor");
  }
odebraneDane = "";
  }
}

Poszperałem w Internecie i takie coś skleciłem. Działa więc chyba jest ok 🙂

 

Ide myśleć nad zadaniem 2.5.

 

Dzięki

@Santiago Właśnie skończyłem.

Niestety z głowy sie nie udało tez musiałem zaczerpnąć wiedzy z internetu 🙂

 

#define diodaczerwona 8
#define diodazielona 9
#define przycisk 10

String odebraneDane = ""; // pusty ciag odebranych danych
bool czerwona = false;
bool zielona = false;

void setup(){
  Serial.begin(9600); //Ustawienie prędkości transmisji
  Serial.println("Witaj w SYSTEMIE"); //Jednorazowe wysłanie tekstu

  pinMode(diodaczerwona, OUTPUT); //wyjscie diody czerwonej
  pinMode(diodazielona, OUTPUT); //wyjscie diody zielonej
  pinMode(przycisk, INPUT_PULLUP); //wyjscie przycisku

  digitalWrite(diodaczerwona, LOW); //wylaczenie diody
  digitalWrite(diodazielona, LOW); //wylaczenie diody
}

void loop() {

  if(Serial.available() > 0) {// czy dane zostaly odebrane
  odebraneDane = Serial.readStringUntil('\n'); //odczytaj do konca linijki


  if (odebraneDane == "zielona") {
    zielona = !zielona;
    Serial.println("Włączam/wyłączam zielona");
    
  }

 else if (odebraneDane == "czerwona") {
   czerwona = !czerwona;
    Serial.println("Włączam/wyłączam czerwoną");
    
 }
  else {
    Serial.println("Nieznany kolor");
  }
odebraneDane = "";
  digitalWrite(diodaczerwona, czerwona);
  digitalWrite(diodazielona, zielona);
  }
}
  

 

Co myślisz???

  • 2 miesiące później...

Witam

Ja dopiero zaczynam z programowaniem ale niestety napotkałem na nieoczekiwany problem.

Czy komuś z was też nie chce wypisywać alarmów w przykładzie z czujnikiem otwarcia okna nawet gdy przekopiuję do arduino IDE

 

Jeśli ktoś też miał taki problem i zna rozwiązanie to był bym wdzięczny za pomoc 🙂

 

Dnia 11.03.2025 o 20:33, czyzyku napisał:

Czy komuś z was też nie chce wypisywać alarmów w przykładzie z czujnikiem otwarcia okna nawet gdy przekopiuję do arduino IDE

Jeśli chcesz przesyłać informacje do komputera to czujnik nie może być podłączony do pinów nr 0 i 1, bo są to piny wykorzystywane do komunikacji z komputerem - zakładam, że to może być właśnie Twój przypadek 🙂 

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ę »
×
×
  • Utwórz nowe...