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.

  • 2 tygodnie później...
  • 3 tygodnie później...
(edytowany)

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
  • 2 tygodnie później...

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

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
(edytowany)
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

@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
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
(edytowany)

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
  • 2 miesiące później...
(edytowany)

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
  • 1 miesiąc później...

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
  • 1 miesiąc później...

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

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