Skocz do zawartości

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


Pomocna odpowiedź

14 godzin temu, merinum napisał:

bo sprawa wygląda tak, że tych powtórzeń będzie około 15, w sumie to pytałem raczej w kwestii tego by zaoszczędzić pamięci płytki, ale w sumie jeśli to wyjdzie na to samo to nie ma tematu

To robisz funkcję która pobiera dane z tablicy, lub jej określonego obszaru. Tablica może być w FLASU lub EEPROM.

Link do komentarza
Share on other sites

2.4

#define zielona 9
#define czerwona 8
 
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); //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"
      digitalWrite(zielona, HIGH); //To włączamy diodę zieloną
      delay(1000);
      digitalWrite(zielona, LOW); 
    }
    
    if (odebraneDane == "czerwona") { //Jeśli odebrano słowo "czerwona"
      digitalWrite(czerwona, HIGH); //To włączamy diodę czerwoną
      delay(1000);
      digitalWrite(czerwona, LOW); 
   
    }
    else {Serial.println("zły kolor");}
     }
}

 

Edytowano przez kuba1642e1111
Link do komentarza
Share on other sites

witam udało mi sie zrobic zadanie z gwiazdka

#define zielona 8
#define czerwona 9

String odebraneDane = "";

bool dane1 = false;
bool dane2 = false;

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"){
      digitalWrite(zielona, !dane1);
      dane1=!dane1;
      }
    if (odebraneDane == "czerwona"){
      digitalWrite(czerwona, !dane2);
      dane2=!dane2;
      }
    }
}

tutaj kod jagby ktos chciał podejrzec 

jestem tez ciekaw czy dobrze zastosowałem tutaj ta funkcje bool

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

14 godzin temu, solowkidamian napisał:

witam udało mi sie zrobic zadanie z gwiazdka


#define zielona 8
#define czerwona 9

String odebraneDane = "";

bool dane1 = false;
bool dane2 = false;

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"){
      digitalWrite(zielona, !dane1);
      dane1=!dane1;
      }
    if (odebraneDane == "czerwona"){
      digitalWrite(czerwona, !dane2);
      dane2=!dane2;
      }
    }
}

tutaj kod jagby ktos chciał podejrzec 

jestem tez ciekaw czy dobrze zastosowałem tutaj ta funkcje bool

Chyba dobrze zastosowałes bool.

Dobrze jest znać wiele wariantów zastosowan danej funkcji języka.

Zastosowan może być jeszcze więcej.

Ja lubię poćwiczyć sobie czasem jakieś alternatywy, traktuje to jak zabawę.

 

  • Lubię! 2
Link do komentarza
Share on other sites

7 godzin temu, farmaceuta napisał:

@solowkidamian dobrze wszystko z tym że nie musisz dwa razy stosować negacji, bo po każdym spełnionym warunku zmieniasz stan bool...

własnie w tym rzecz ze trzeba bo gdy jest tylko jedna bool i załacze np dide zielona to nie załacze od razu diody czerwonej bo bool jest ustawiony na true czyli jego pzreciwienstwem jest falsz wiec nie zalaczy drugiej diody

Edytowano przez solowkidamian
Link do komentarza
Share on other sites

@solowkidamian chyba trochę źle się zrozumieliśmy...mi chodzi o to że nie musisz robić dwa razy negacji tej samej zmiennej... można tak 

if (odebraneDane == "zielona"){
     dane1=!dane1;
     digitalWrite(zielona, dane1);
      }
    if (odebraneDane == "czerwona"){
     dane2=!dane2;
     digitalWrite(czerwona, dane2);
      }

czyli na starcie masz np. false i ledy są zgaszone

  • Pomogłeś! 1
Link do komentarza
Share on other sites

26 minut temu, solowkidamian napisał:

@farmaceuta a  okej teraz rozumiem, faktycznie mogłem tak zrobic

ale to nie jest aż taka różnica w prędkości wykonywania programu... chociaż czasem w przyszłości takie "podwójne" negowanie może spowodować że trudniej bedzie to zlokalizować i będzie błąd...ale to tak tylko na marginesie mówię 😉 ważne że działa!😊

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

Osobiście nieco "zaszalałem" i zrobiłem zadanie 2.5 z dodatkowymi wariantami komend: lewy, prawy, oba, razem.
Chodziło mi o to aby można było sterować każdą diodą osobno oraz wspólnie zmieniać "oba" jednocześnie lub zapalać/gasić "razem".

#define PIN_Lewy 8
#define PIN_Prawy 7
#define TXT_Lewy "lewy"
#define TXT_Prawy "prawy"
#define TXT_Oba "oba"
#define TXT_Razem "razem"

String odebraneDane = "";
bool swieciLewy = false;
bool swieciPrawy = false;
bool swieciRazem = false;

void setup() {
  Serial.begin(9600);
  pinMode(PIN_Lewy, OUTPUT);
  pinMode(PIN_Prawy, OUTPUT);
  digitalWrite(PIN_Lewy, LOW);
  digitalWrite(PIN_Prawy, LOW);
}

void loop() {
  if(Serial.available() > 0) {
    odebraneDane = Serial.readStringUntil('\n'); 
    if (odebraneDane == TXT_Lewy || odebraneDane == TXT_Oba) {
      if (swieciLewy) {
        digitalWrite(PIN_Lewy, LOW); 
        swieciLewy = false;
        swieciRazem = false;
      } else {
        digitalWrite(PIN_Lewy, HIGH);
        swieciLewy = true;      
        swieciRazem = swieciLewy && swieciPrawy;
      }
    }
    if (odebraneDane == TXT_Prawy || odebraneDane == TXT_Oba) {
      if (swieciPrawy) {
        digitalWrite(PIN_Prawy, LOW);
        swieciPrawy = false;
        swieciRazem = false;
      } else{
        digitalWrite(PIN_Prawy, HIGH);
        swieciPrawy = true;
        swieciRazem = swieciPrawy && swieciLewy;
      }
    }
    if (odebraneDane == TXT_Razem) {
      if (swieciRazem) {
        digitalWrite(PIN_Lewy, LOW); 
        digitalWrite(PIN_Prawy, LOW);
        swieciRazem = false;
        swieciLewy = false;
        swieciPrawy = false;
      } else{
        digitalWrite(PIN_Lewy, HIGH); 
        digitalWrite(PIN_Prawy, HIGH);
        swieciRazem = true;
        swieciLewy = true;      
        swieciPrawy = true;
      }
    }
    if (odebraneDane != TXT_Lewy && odebraneDane != TXT_Prawy && odebraneDane != TXT_Oba && odebraneDane != TXT_Razem) {
      Serial.println("Nie ma takiej diody: \""+odebraneDane+"\" !");
    }
    delay(1000);
  }
}

 

Edytowano przez ModelAXE
Link do komentarza
Share on other sites

2.4 & 2.5 - 2 in 1 😉

Zdefiniowane komendy zmieniają stan diod, wysłanie czegokolwiek innego spowoduje zamiganie diodami i zwróci komunikat błędu na monitorze portu. 🙂

#define red 8
#define green 9
 
String odebraneDane = ""; //Pusty ciąg odebranych danych
String badColor = "Podano zły kolor";
boolean redView = false;
boolean greenView = false;
 
void setup() {
  Serial.begin(9600); //Uruchomienie komunikacji
  pinMode(red, OUTPUT); //Konfiguracja wyjść
  pinMode(green, OUTPUT);
  
  digitalWrite(red, LOW); //Wyłączamy diody
  digitalWrite(green, LOW);
}
 
void loop () {
  if (Serial.available() > 0) {
    odebraneDane = Serial.readStringUntil('\n');
    if (odebraneDane == "green") {
      delay(100);
      greenView = !greenView;
      digitalWrite(green, greenView);
    } else if (odebraneDane == "red") {
      delay(100);
      redView = !redView;
      digitalWrite(red, redView);
    } else {
      Serial.println(badColor);
      digitalWrite(green, LOW);
      digitalWrite(red, HIGH);
      delay(200);
      digitalWrite(green, HIGH);
      digitalWrite(red, LOW);
      delay(200);
      digitalWrite(green, LOW);
      digitalWrite(red, LOW);
      delay(200);
      digitalWrite(green, HIGH);
      digitalWrite(red, HIGH);
      delay(1000);
      digitalWrite(green, LOW);
      digitalWrite(red, LOW);
    }
  }
}

 

Edytowano przez Danyeru
  • Lubię! 1
Link do komentarza
Share on other sites

Kolejna bardzo ciekawa lekcja 👍

Gdyby ktoś potrzebował pomocy, poniżej podrzucam własne spostrzeżenia oraz działające kody programów do zadań domowych 😉

1️⃣ Zadanie domowe nr 2.4

Do rozwiązania tego zadania zastosowałem tzw. "pętle w pętli".

#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") { 
      digitalWrite(zielona, HIGH); 
      delay(1000);
      digitalWrite(zielona, LOW); 
    } else if (odebraneDane == "czerwona") { //Zastosowanie pętli w pętli
      digitalWrite(czerwona, HIGH); 
      delay(1000);
      digitalWrite(czerwona, LOW); 
    } else {
      Serial.print("Niewlasciwy kolor!"); //Podanie informacji zwrotnej
    }
  }
}

2️⃣ Zadanie domowe nr 2.5*

Do rozwiązania tego zadania wykorzystałem zmienną bool w oparciu o oficjalną stronę Arduino, na której można znaleźć jej dokładny sposób zastosowania [link]:

#define zielona 8
#define czerwona 9
 
String odebraneDane = "";

bool stanDiodyZielona = false; //Zmienna bool dla diody zielonej (true/false)
bool stanDiodyCzerwona = false; // Zmienna bool dla diody czerwonej (true/false)
 
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") { 
      delay(100);
      stanDiodyZielona = !stanDiodyZielona; //Przełączenie zmiennej z false na true (bądź odwrotnie)
      digitalWrite(zielona, stanDiodyZielona); 
    }
    
    if (odebraneDane == "czerwona") { 
      delay(100);
      stanDiodyCzerwona = !stanDiodyCzerwona; //Przełączenie zmiennej z false na true (bądź odwrotnie)
      digitalWrite(czerwona, stanDiodyCzerwona); 
    }
  }
}
  • Lubię! 1
Link do komentarza
Share on other sites

Praca Domowa 2.1 :
Jak się ustawi w terminalu inny baud niż w kodzie zaczną się pojawiać znaki %�4 itp.
Im więcej się ustawi tym więcej będzie pokazywało np: 300 baud = 1 znak.

Ciekawostka:
Jak się podłączy port 1 (TX) do jednej diody i port 2 (RX) do drugiej widać że port 1 (TX) jest mocniejszy ponieważ bardziej świeci dioda.

Jeśli ktoś umie wytłumaczyć moją ciekawostkę proszę pisać.

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.