Skocz do zawartości
Komentator

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

Pomocna odpowiedź

30 minut temu, Maszynyodsrodka napisał:

czy to jednie, albo aż kwestia dodatkowych nawiasów i z nimi będzie wszystko?

Według mnie jest to "aż" kwestia nawiasów 🙂 Oczywiście można w prostych warunkach nie stosować nawiasów klamrowych, ale takie mieszanie dwóch podejść doprowadzi szybko do wielu błędów. Szczególnie, że w innych miejscach masz po else nawiasy klamrowe.

Do tego w złym miejscu zostawiasz nawiasy zamykające, przez co bardzo obniżasz czytelność swojego kodu. Chodzi mi o te fragmenty:

293c0-2019-01-06_19-42-32-5409.png

Wyłamujesz się ze wszystkich popularnych konwencji formatowania kodu. W kursie cały czas trzymałem się poniższej wersji i polecam formatować kod podobnie. Będziesz miał wtedy mniejsze szanse na popełnienie przypadkowych błędów w przyszłości (związanych z dopisywaniem czegoś do programu lub kopiowaniem jego fragmentów).

if (warunek) {
	//Instrukcje jeśli prawda
} else {
	//Instrukcje jeśli fałsz
}

 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Ja mógłbym jeszcze polecić taki system stawiania nawiasów, który w połączeniu z tabulacją i komentarzami czyni kod jeszcze bardziej moim zdaniem czytelnym:

if(warunek)
{
  while(a==10)
  {
    // cos tam, cos tam
    if(b==12)
    {
      //cos tam, cos tam
    }
    else
    {
      //cos tam, cos tam
    }
    a--;
  }//koniec while
}
else
{
 Serial.println("Hello");
 z=0;
}

 

Edytowano przez Belferek

Udostępnij ten post


Link to post
Share on other sites

Tak, taka wersja też jest poprawna, ale we wszystkich kursach Arduino trzymamy się jednego standardu (wspomnianego przeze mnie wyżej), więc nie chciałbym już tutaj mieszać. Szczególnie, że Twoja wersja stwarza (moim zdaniem) również pewne zagrożenie podczas kopiowania/wklejania fragmentów kodów - można sobie "wstrzelić coś"  między nawiasy,  a if/else. Oczywiście każdy może pisać jak mu wygodnie, ale w przypadku początkujących lepiej sprawdza się chyba wersja pokazywana w kursie.

Udostępnij ten post


Link to post
Share on other sites

Wgrałem ten program do Arduino, niestety w oknie Monitor portu szeregowego nie wyświetla się "Witaj w Forbocie!", lecz od razu "Minęło 5 sekund!". Ktoś wie dlaczego?

void setup(){

  Serial.begin(9600); //Ustawienie prędkości transmisji

  Serial.println("Witaj na Forbocie!"); //Jednorazowe wysłanie tekstu

}

void loop() {

  delay(5000);

  Serial.println("Minelo 5 sekund!"); //Wysyłanie w pętli

}

 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

W setup() po Serial.begin() możesz dać krótkie delay(500) chociaż Arduino z pewnością wysyła komunikat powitalny lecz chyba nie nadążasz z włączeniem monitora. W moim arduino jest przycisk reset. Przy włączonym monitorze zresetuj moduł  (lub wgraj szkic)- powinieneś zobaczyć ten komunikat

Edytowano przez Belferek

Udostępnij ten post


Link to post
Share on other sites

Podczas wpisywania delay(500);  w setup() po Serial.begin() wyskakuje błąd. Monitor mam włączony już przed wgraniem programu do Arduino.

Udostępnij ten post


Link to post
Share on other sites

Niemożliwe, sprawdź średniki, nawiasy - pokaż kod

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Wpisałem wszystko od początku, tym razem delay(500) w setup() działa lecz to nic nie zmieniło. Komunikatu "Witaj na Forbocie!" nadal nie ma.

void setup(){
  Serial.begin(9600); //Ustawienie prędkości transmisji
  delay(500);
  Serial.println("Witaj na Forbocie!"); //Jednorazowe wysłanie tekstu
}
void loop() {
  delay(2000);
  Serial.println("Minelo 5 sekund!"); //Wysyłanie w pętli
}

 

Edytowano przez Treker
Poprawiłem formatowanie.

Udostępnij ten post


Link to post
Share on other sites

@kamilzazi, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.

Pamiętaj proszę jeszcze, że kody programów należy umieszczać przez narzędzie KOD (znajdziesz je w edytorze pod ikonką "<>"). Dzięki niemu programy są odpowiednio formatowane i kolorowane, a wtedy wszystkim znacznie łatwiej analizować wklejone programy. Tym razem poprawiłem to za Ciebie, ale pamiętaj o tym w przyszłości - z góry dziękuję za zrozumienie i pomoc przy utrzymaniu porządku na forum 🚀

11 godzin temu, kamilzazi napisał:

Wgrałem ten program do Arduino, niestety w oknie Monitor portu szeregowego nie wyświetla się "Witaj w Forbocie!", lecz od razu "Minęło 5 sekund!". Ktoś wie dlaczego?

Dodawanie sztucznego opóźnienia nie zawsze zadziała. Jeśli masz taki problem, to dodaj w programie taka instrukcję:

  Serial.begin(9600);
  while (!Serial) {}

Pętla while wstrzyma działanie programu do momentu, gdy połączenie przez UART zostanie poprawnie nawiązane. Wtedy wszystko powinno działać poprawnie 🙂

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Zadanie 2.5 - sterowanie dwoma diodami z zapamiętaniem stanu 

#define zielona 8
#define czerwona 9

String kolor = ""; // odebrana komenda
boolean stanZ = false; // stan diosy zielonej
boolean stanC = false; // stan diody czerwonej

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

  pinMode(zielona, OUTPUT);
  pinMode(czerwona, OUTPUT);

  digitalWrite(zielona, LOW);
  digitalWrite(czerwona, LOW);
}

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

    if(kolor == "zielona") // jezeli komenda "zielona"
    {
      if(stanZ == false) // wylaczona -> wlacz
      {
        digitalWrite(zielona, HIGH);
        stanZ = true;
      }
      else if(stanZ == true) // wlaczona -> wylacz
      {
        digitalWrite(zielona, LOW);
        stanZ = false;
      }
    }
    
    else if(kolor == "czerwona") // jezeli komenda "czerwona"
    {
      if(stanC == false) // wylaczona -> wlacz
      {
        digitalWrite(czerwona, HIGH);
        stanC = true;
      }
      else if(stanC == true) // wlaczona -> wylacz
      {
        digitalWrite(czerwona, LOW);
        stanC = false;
      }
    }
    
    else // inna komenda
    {
      Serial.println("Blad");
    }
  }
}

 

Edytowano przez Masteroreo13

Udostępnij ten post


Link to post
Share on other sites
#define czerwona 9
#define zielona 8

String odebraneDane = "";

void setup() {
  Serial.begin(9600);
  pinMode(czerwona, OUTPUT);
  pinMode(zielona, OUTPUT);

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

}

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

  if(odebraneDane == "czerwona")
  {
    digitalWrite(czerwona, HIGH);
    delay(1000);
    digitalWrite(czerwona, LOW);
  }

  if(odebraneDane == "zielona")
  {
    digitalWrite(zielona, HIGH);
    delay(1000);
    digitalWrite(zielona, LOW);
  }

  else if(odebraneDane != ("czerwona") && ("zielona"))
  {
    Serial.println("zly kolor");
  }
  }
}

zadanie 2.4

#define czerwona 9
#define zielona 8

boolean stanCzerwonej = false;
boolean stanZielonej = false;


String kolor = "";

void setup() {
  Serial.begin(9600);
  pinMode(czerwona, OUTPUT);
  pinMode(zielona, OUTPUT);

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

}

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

  if(kolor == "czerwona")
  {
    if(stanCzerwonej == false)
    {
      digitalWrite(czerwona, HIGH);
      stanCzerwonej = true;
    }
    else if(stanCzerwonej == true)
    {
      digitalWrite(czerwona, LOW);
      stanCzerwonej = false;
    }
  }

  else if(kolor == "zielona")
  {
    if(stanZielonej == false)
    {
      digitalWrite(zielona, HIGH);
      stanZielonej = true;
    }
    else if(stanZielonej == true)
    {
      digitalWrite(zielona, LOW);
      stanZielonej = false;
    }
  }
}
}

zad 2.5

mam problem z używaniem boolean. nie do końca rozumiem jak z tego korzystać i pisząc to zadanie sięgałem po pomoc forum

dodam ze to moje poczatki z programowaniem

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@arek2007100, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.

Dnia 7.02.2019 o 17:10, arek2007100 napisał:

mam problem z używaniem boolean. nie do końca rozumiem jak z tego korzystać i pisząc to zadanie sięgałem po pomoc forum

dodam ze to moje poczatki z programowaniem

Czego dokładnie nie rozumiesz w przypadku zmiennych typu boolean? To raczej nic trudnego - po prostu przyjmują tylko dwie wartości fałsz lub prawda 😉

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Dlaczego wyjściowy stan diod to false a nie true? Nie potrafię za bardzo tego używać w programowaniu. Nie wiem kiedy używać boolean. 

Edytowano przez arek2007100

Udostępnij ten post


Link to post
Share on other sites

Musisz pamiętać, że:

  • 1 = TRUE = HIGH
  • 0 = FALSE = LOW

Te określenia można stosować praktycznie zamiennie, równie dobrze możesz sobie zapisać, że stan diody na początku to LOW. To tylko kwestia nazewnictwa 🙂

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Hej, mam oto taki program 

int zielona = 1;
int zolta = 2;
int czerwona = 3;
String odebraneDane = "";
void setup() {
  // put your setup code here, to run once:
pinMode(5,OUTPUT);
Serial.begin(9600);

}

void loop() {

  // put your main code here, to run repeatedly:
if(Serial.available() > 0) {
  odebraneDane = Serial.readStringUntil('\n');
  if(odebraneDane == "zielony") {
    if(zielona == 1) {
      digitalWrite(5, HIGH);
      zielona = zielona + 1;
    }else if(zielona == 2) {
      digitalWrite(5, LOW);
      zielona = zielona - 1;  
      }
    }
      if(odebraneDane == "zolty") {
    if(zolta == 2) {
      digitalWrite(6, HIGH);
      zolta = zolta + 1;
    }else if(zolta == 3) {
      digitalWrite(6, LOW);
      zolta = zolta - 1;  
      }
    }
      if(odebraneDane == "czerwony") {
    if(czerwona == 3) {
      digitalWrite(7, HIGH);
      czerwona = czerwona + 1;
    }else if(czerwona == 4) {
      digitalWrite(7, LOW);
      czerwona = czerwona - 1;  
      }
    }
  }  
}

Jego zadaniem jest włączać i wyłączać diody jednak i działa jednak nie mogę wyjaśnić tego że dioda zielona świeci mocno, czerwona średnio a żółta tak słabo. Ktoś może wytłumaczyć dlaczego tak się stało?

51538298_2241367589258559_2317005586266324992_n.jpg

Wyjaśniło się, nie ustawiłem pinów jako wyjście ale i tak to jest ciekawe że i tak prąd płynie pomimo, że nie ustawiłem pinów.

Edytowano przez Karliko

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