Skocz do zawartości
Komentator

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

Pomocna odpowiedź

Kompletnie nie wiem o czym pisz Elvis, ale wiem jedno, miałem rację pisząc, że

String odebraneDane =""

jest nie do końca sensowne.

Pzdr

Udostępnij ten post


Link to post
Share on other sites

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)...

Udostępnij ten post


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

Udostępnij ten post


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

Udostępnij ten post


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




Udostępnij ten post


Link to post
Share on other sites

ciemny, super, dzięki za podzielenie się Twoim rozwiązaniem 🙂 Powodzenia w dalszej nauce!

Udostępnij ten post


Link to post
Share on other sites

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() {}

Udostępnij ten post


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

Udostępnij ten post


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

 }

Udostępnij ten post


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

Udostępnij ten post


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

Udostępnij ten post


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

Udostępnij ten post


Link to post
Share on other sites

D3binski, peter-wawa1, witam na forum 🙂 Powodzenia w dalszej nauce!

  • Lubię! 1

Udostępnij ten post


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

Udostępnij ten post


Link to post
Share on other sites

Po co ta "pusta" pętla?

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ść
Napisz odpowiedź...

×   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...