Skocz do zawartości

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


Pomocna odpowiedź

SOYER, jeśli nie rozumiesz co napisał Elvis, to raczej warto się zastanowić, czy masz rację 😉 Z wiadomości tamtej wynika, że nie ma praktycznie żadnej różnicy, czy dopiszemy = "";, czy go nie dodamy i wcale nie rozwiązuje to problemu, o który pytał ferb01 (swoją drogą nadal nie wiemy jaki napotkał on dokładnie problem)...

Link do komentarza
Share on other sites

Ok Treker, właśnie o to mi chodziło, że ten dopisek raczej był zbędny, nigdzie nigdzie nie napsałem, że to rozwiazanie jego problemu... Luzik, wiem, że mało wiem, dlatego tu jestem.... 😅 Szczęsliwego Nowego Roku.

Link do komentarza
Share on other sites

Ja zadanie pierwsze i drugie połączyłem razem i zrobiłem tak 😉

#define czerwona 8 // nadaj pinowi 8 nazwe
#define zielona 7  // nadaj pinowi 7 nazwe
boolean zmien = true; // ustaw zmieną stan zmien na prawde
boolean wymiana = true; // ustaw zmieną stan wymiana na prawde
String wczytaj = "";  // ustaw zmiena wczytaj jako pusty ciąg 
void setup() {//wykonaj na początek
 Serial.begin(9600); //połacz się z komputerem 
 Serial.println("Podaj kolor"); // wpisz kolor w monitorze portu szeregowego
 pinMode(czerwona, OUTPUT);// ustaw pin 8 jako wyjście
 pinMode(zielona, OUTPUT);// ustaw pin 7 jako wyjście
 digitalWrite(czerwona, LOW);// wpisz stan niski na pin 8
 digitalWrite(zielona, LOW);// wpisz stan niski na pin 7
}
void czerwon(){// uruchomienie diody czerwonej w dwa stany
     if (zmien == true){ //jesli zmien jest prawdziwa
       Serial.println("wlaczyles czerwona");
       digitalWrite(czerwona, HIGH);// stan właczony
       zmien = false;
     }
     else{
       if(zmien == false){// jesli zmien jest nie prawdziwa

       Serial.println("wylaczyles czerwona");
       digitalWrite(czerwona, LOW);//stan wyłączony
       zmien = true;}

 }
}
 void zielon(){//uruchomienie diody zielonej w dwa stany
       if(wymiana == true){//jesli wymiana jest prawdziwa
       Serial.println("wlaczyles zielona");
       digitalWrite(zielona, HIGH);//stan włączony
       wymiana = false;
     }
     else{
       if(wymiana == false){//jeśli wymiana jest nie prawdziwa
       Serial.println("wylaczyles zielona");
       digitalWrite(zielona, LOW);//stan wyłączony
       wymiana = true;
     }

      }
}

void loop() {//wykonuj wkółko mechanike
 if(Serial.available() > 0 ){//sprawdz czy coś jest w buforze
   wczytaj = Serial.readStringUntil('\n');//jeśli jest wczytaj dane do wczytaj i ustaw w nowej lini
   if((wczytaj == "czerwona")||(wczytaj == "czerwony")){//jeśli wczytaj jest wpisane czerwona lub czerwony
   czerwon();//wykonaj funkcje czerwon
 }
  else{//jeśli nie to
   if((wczytaj == "zielona")||(wczytaj == "zielony")){//jeśli wpisane jest zielona lub zielony
   zielon();// wykonaj funkcje zielon
   }
   else{//jeśli nie jest żadna z nazw wpisana 
     Serial.println("nie ma takiego koloru");//wypisz monitorze portu szeregowego
   }

}
}
} 

właśnie się zastanawiałem jak wy to robicie dzięki już będzie jak trzeba 😉

__________

Komentarz dodany przez: Treker

Kody programów należy umieszczać przez narzędzie KOD (znajdziesz je w edytorze pod ikonką "<>"). Dzięki niemu składania programów jest automatycznie kolorowana, a wtedy wszystkim znacznie łatwiej analizować wklejone programy. Proszę to poprawić - z góry dziękuję za zrozumienie i pomoc przy utrzymaniu porządku na forum.

Link do komentarza
Share on other sites

Mi w końcu też wyszło:

#define zielona 10
#define czerwona 9

String odbiorDanych = ""; // Pusty ciąg znaków
boolean stanZielonej = false;
boolean stanCzerwonej = false;

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

 digitalWrite(zielona, LOW); //Konfigurujemy stan wyjść
 digitalWrite(czerwona, LOW);
}

void loop() {
   if(Serial.available() > 0) { // jeśli Arduino odbiera dane
   odbiorDanych = Serial.readStringUntil('\n'); // to zapisuje ciąg wpisanych znaków do wciśnięcia "enter"

   if (odbiorDanych == "zielona") { // jeśli odebrano słowo "zielona" 
     if (stanZielonej == false) { // i jeśli zielona dioda jest wyłączona
     digitalWrite(zielona, HIGH); // to włącz diodę
     stanZielonej = true; // jej stan teraz to włączony
     } else { //jeśli jest włączona
             digitalWrite(zielona, LOW); // to wyłącz diodę
             stanZielonej = false; // jej stan teraz to wyłączony
            }
   } else {
           if (odbiorDanych == "czerwona") {// jeśli  odbebrano słow "czerwona"
           if(stanCzerwonej == false) { // i jeśli czerwona dioda jest wyłączona
           digitalWrite(czerwona, HIGH); // to włącz diodę
           stanCzerwonej = true; // jej stan teraz to włączony
           } else { // jeśli jest włączona
                  digitalWrite(czerwona, LOW); // to wyłącz diodę
                  stanCzerwonej = false; // jej stan teraz to wyłączony
                  }
           } else {
                  Serial.println("zły kolor diody!!");
           }
           }
    }
}




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

Przy omawianiu zmiennych przydałaby się informacja, że bool/boolean zajmuje 1 bajt pamięci RAM, podczas gdy powinien zajmować 1 bit. Przy małych programach nie robi to różnicy, ale przy dużych różnica jest kolosalna (8 razy więcej zajętej pamięci).

A przy #define powinna być informacja, że zmienia wszystkie pasujące ciągi znaków tj.

#define dioda 8

bool diodaStan;

void setup() {}
void loop() {}

Arduino odczyta jako

bool 8Stan;

void setup() {}
void loop() {}
Link do komentarza
Share on other sites

Skąd pomysł, że zmianna typu bool powinna zajmować jeden bit? Czy poza intuicją istnieje standard, który określałby coś takiego? Druga sprawa to bool wcale nie musi zajmować jednego bajtu. Równie dobrze może mieć rozmiar typu int, czyli np. 4 bajty. I nie jest to nic dziwnego.

Natomiast z tym #define to czysta bzdura, więc niech początkujący zamykają oczy jak to czytają. Oczywiście define tak nie działa, nie zamienia wszystkich wystąpień napisu.

Link do komentarza
Share on other sites

Może to nie zadanie domowe . Ale na podstawie lekcji napisałem program który przyciskami załącza poszczególne diody.

Podpowie mi ktoś teraz jak edytować program aby przy włączeniu diody wyświetlił napis , "Dioda (np. zielona) Włączona/Wyłączona "

#define zolta 11
#define niebieska 8
#define zielona 9
#define czerwona 10
#define przyciskGREEN 2
#define przyciskBLUE 3
#define przyciskYELLOW 5
#define przyciskRED 4

boolean czyZIELONA = false;
boolean czyCZERWONA = false;
boolean czyNIEBIESKA = false;
boolean czyZOLTA = false;
void setup() {
pinMode(zolta,OUTPUT);
pinMode(zielona,OUTPUT);
pinMode(czerwona,OUTPUT);
pinMode(niebieska,OUTPUT);
pinMode(przyciskGREEN,INPUT_PULLUP);
pinMode(przyciskRED,INPUT_PULLUP);
pinMode(przyciskBLUE,INPUT_PULLUP);
pinMode(przyciskYELLOW,INPUT_PULLUP);

digitalWrite(zielona,LOW);
digitalWrite(niebieska,LOW);
digitalWrite(czerwona,LOW);
digitalWrite(zolta,LOW);

}

void loop() {

 if(digitalRead(przyciskGREEN) == LOW)
  { 
   delay(400);
   czyZIELONA = !czyZIELONA;
   digitalWrite(zielona,czyZIELONA);
   } 


 if (digitalRead(przyciskRED) == LOW)
   {
     delay(400);
     czyCZERWONA = !czyCZERWONA;
   digitalWrite(czerwona,czyCZERWONA);
   }
 if (digitalRead(przyciskYELLOW) == LOW)
   {
     delay(400);
     czyZOLTA = !czyZOLTA;
   digitalWrite(zolta,czyZOLTA);
    }
  if (digitalRead(przyciskBLUE) == LOW)
   {
     delay(400);
     czyNIEBIESKA = !czyNIEBIESKA;
   digitalWrite(niebieska,czyNIEBIESKA);
    }

 }
Link do komentarza
Share on other sites

kwiatek170494, witam na forum 🙂 Z czym dokładnie masz problem? Wiesz kiedy dioda zmienia stan, pozostaje w tym miejscu dodać instrukcję wysyłającą komunikat przez UART. W którym miejscu utknąłeś 🙂?

Link do komentarza
Share on other sites

/*
Kurs Arduino #3
Zadanie domowe 2.5
*/

#define LedC 9  //LED czerwony
#define LedZ 8  //Led żółty

bool LedC_czyWlaczony=false; //Zmienna do sprawdzania stanu wyjścia LedC
bool LedZ_czyWlaczony=false; //Zmienna do sprawdzania stanu wyjścia LedZ

String LED;  //Zmienna do zapisywania wyboru koloru LED

void setup() {
   Serial.begin(9600); //Ustawienie transmisji

   pinMode(LedC,OUTPUT);  //Konfiguracja LedC jako wyjście
   pinMode(LedZ,OUTPUT);  //Konfiguracja LedZ jako wyjście

   digitalWrite(LedC,LOW); //LED czerwony wyłączony
   digitalWrite(LedZ,LOW); //LED zółty wyłączony

   Serial.println("Dostępne kolory LED: Zolty, Czerwony");  //Informacja o dostępnych kolorach
}

void loop() {

 if(Serial.available()>0){   //Sprawdzenie czy Arduino odebralo znaki
   LED=Serial.readStringUntil('\n'); //Przypisanie znaków do zmiennej LED

   if(LED=="Zolty"){   //Sprawdzenie czy wybrano kolor żółty
     if(LedZ_czyWlaczony==false){  //Sprawdzenie czy LED żółty jest wyłączony
       digitalWrite(LedZ,HIGH);    //Włącz LED zielony
       LedZ_czyWlaczony=true;      //Zmień wartość zmiennej na prawde (LED włączony)
     }
     else if(LedZ_czyWlaczony==true){  //Sprawdzenie czy LED żółty jest włączony
       digitalWrite(LedZ,LOW);       //Wyłącz LED zielony
       LedZ_czyWlaczony=false;      //Zmień wartość zmiennej na fałsz (LED wyłączony)
     }
   }
   else if(LED=="Czerwony"){       //Sprawdzenie czy wybrano kolor czerwony
     if(LedC_czyWlaczony==false){   //Sprawdzenie czy LED czerwony jest wyłączony
       digitalWrite(LedC,HIGH);     //Włącz LED czerwony
       LedC_czyWlaczony=true;       //Zmień wartość zmiennej na prawde (LED włączony)
     }
     else if(LedC_czyWlaczony==true){  //Sprawdzenie czy LED czerwony jest włączony
       digitalWrite(LedC,LOW);         //Wyłącz LED czerwony
       LedC_czyWlaczony=false;         //Zmień wartość zmiennej na fałsz (LED wyłączony)
     }
   }
   else{                               //Jeżeli podano nieobsługiwany kolor
     Serial.println("\nWybrales nieobslugiwany kolor!");  //Informacja o błędzie
     Serial.println("Obslugiwane kolory: Zolty, Czerwony"); //Informacja o dostępnych kolorach
   }

 }

}
  • Lubię! 1
Link do komentarza
Share on other sites

//zadanie domowe 2.5

bool led1 = false;
bool led2 = false;

#define zielona 10
#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);  

}

void loop() {
 if(Serial.available() > 0) { //Czy Arduino odebrano 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"
   digitalWrite(zielona, led1);
   led1 = !led1; //zmiana stanu na przeciwny

   }

   if (odebraneDane == "czerwona") { //Jeśli odebrano słowo "czerwona"
     digitalWrite(czerwona, led2); 
    led2 = !led2;  //zmiana stanu na przeciwny
   }
   if ((odebraneDane != "zielona") && (odebraneDane != "czerwona")) {
     Serial.println("blad"); //komunikat jażeli slowo inne od czerwona lub zielona
   }
 }
}
  • Lubię! 1
Link do komentarza
Share on other sites

Witam i pozdrawiam szanowne grono arduinowców.

Mam problem z Pana kodem:

void setup(){

Serial.begin(9600); //Uruchamiamy transmisję

pinMode(8, OUTPUT); //Wyjście diody czerwonej

pinMode(9, OUTPUT); //Wyjście diody zielonej

pinMode(10, INPUT_PULLUP); //Przycisk

digitalWrite(8, LOW); //Wyłączenie obu diod

digitalWrite(9, LOW);

}

void loop() {

if (digitalRead(10) == LOW) { //Jeśli przycisk jest wciśnięty

digitalWrite(9, HIGH); //Włączenie diody zielonej

digitalWrite(8, LOW); //Wyłączenie diody czerwonej

} else { //Jeśli przycisk nie jest wciśnięty

digitalWrite(9, LOW); //Wyłączenie diody zielonej

digitalWrite(8, HIGH); //Włączenie diody czerwonej

Serial.println("Uwaga! Alarm! Okno nie jest zamkniete!");

while (digitalRead(10) == HIGH) {

//Zatrzymujemy się w pustej pętli do ponownego zamknięcia okna

delay(25); //W pętli wprowadzamy małe opóźnienie 25ms, aby niwelować zakłócenia

}

}

}

Próbowałem, choć kod wygląda dobrze nie wiem czemu czerwona dioda się nie świeci (gdy okno teoretycznie jest otwarte). Czy ja coś sknociłem?

Proszę o pomoc. Pozdrawiam.

Link do komentarza
Share on other sites

Po co ta "pusta" pętla?

Cześć.

Domniemam, że po to, żeby program nie latał w kółko i sterował IO tylko cyklicznie co 0,025 sprawdzał status położenia przycisku. Zresztą przykład przeklejony jota w jote ze strony kursu (podstawowy kurs arduino forbot rozdział 3 ). I nadal nie wiem czemu czerwona dioda się nie zapala. Pokusiłem się nawet od dodanie i wykorzystanie komend (Serial.println i delay) w kulku miejscach, żeby dokładnie sprawdzić czy program dociera w te miejsca w programie i dziwne ale w kroku w którym powinien zmienić stan na czerwonej diodzie nic się nie dzieje. Czy ktoś może to dla mnie odczarować? Gdzie strzeliłem błąd? Pozdrawiam.

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.