Skocz do zawartości

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


Pomocna odpowiedź

Arduino IDE ma przypisane skróty klawiszowe pod alt+s czy alt+c. Trzeba by je zmienić (nie wiem czy się da), nie używać polskich znaków lub zmienić program do edycji kodu a do Arduino IDE tylko go wklejać. Ja używam ostatniej opcji a kody pisze w Visual Studio. 

Link do komentarza
Share on other sites

2 minuty temu, BHBmacieg napisał:

zmienić program do edycji kodu a do Arduino IDE tylko go wklejać

albo zajrzeć do instrukcji obsługi Arduino IDE i w preferencjach włączyć "użyj zewnętrznego edytora" (samo się wklei).

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

8 godzin temu, Vova napisał:

Tak trochę odbiegając od tematu może ktoś podpowie. Mam następujący problem, ja pisząc jakiś program używam liter np."ś" , "ć" samoczynnie wyskakuje mi okienko zapisywania zmian i od razu  następuje sprawdzanie kodu.

Wiem, że to mało eleganckie rozwiązanie, ale trzeba też zaznaczyć, że raczej nikt się nie obrazi, jeśli nie będziesz używał znaków diakrytycznych w komentarzach (bo rozumiem, że wtedy pojawia się ten problem) 😉

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

To takie trochę mylące.

Podstawowa konstrukcja "if/else" to:

if (coś) rób_coś_tam; else rób_coś_innego;

Ponieważ to "rób coś innego" może być również "if" lub "if/else" wyglądać to może tak:
 

if (coś) rób_coś_tam; else {
	if (coś_innego) rób_jeszcze_coś_innego;
}

Jako że nawiasy klamrowe nie są w tym przypadku konieczne, konstrukcja skraca się do:

if (coś) rób_coś_tam; else if (coś_innego) rób_jeszcze_coś_innego;

Jak widać nie ma czegoś takiego jak "else if" - to po prostu zbitka dwóch zdań.

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

@BarteQxQ pytałeś do czego służy, generalnie chyba do tego by nie dawać prockowi za dużo roboty. 

Możesz wszystkie warunki zrobić na if, ale wtedy procek będzie je wszystkie sprawdzał, nawet wtedy kiedy pozytywny wynik warunku pierwszego if-a, wyklucza pozytywny wynik warunku w następnych if-ach. 

Wyobraź sobie sytuację, że sprawdzasz co naciśnięto na klawiaturze numerycznej... 

if(klaw==1){}

if(klaw==2){}

if(klaw==3){}

itd. 

to nawet jeśli będzie wciśnięta "2" to procek i tak będzie sprawdzał do ostatniej cyfry, po kolei sprawdzi każdego ifa do końca. 

Ale jeśli zrobisz

if(klaw==1){}

else if(klaw==2){}

else if(klaw==3){}

itd

to procek będzie sprawdzał warunki do czasu aż znajdzie zwracający prawdę i wtedy resztę else if pominie. 

Przy dużej ilości else if, lepiej zainteresować się funkcją switch()... 

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

Napisałem sobie taki program do kontroli "otwarcia okna". Użyłem w nim operatora &&, którego nie było w kursie do tej pory (swoją drogą, trochę szkoda, że chyba nie wspominacie chociaż hasłowo o możliwości użycia większej ilości warunków w pętlach itp.). Program działa prawie jakbym chciał. Po "otwarciu okna" zapalają się i gasną odpowiednie lampki a w monitorze portu pojawia się jeden raz odpowiedni komunikat. Z tym, że o ile lampki zmieniają się za każdym razem po wciśnięciu czy puszczeniu przycisku, to komunikat czasami się nie wyświetla. Czy ktoś mógłby mi wytłumaczyć dlaczego?

void setup() {
  pinMode(8, OUTPUT); // LED Czerwona - okno zamknięte
  pinMode(9, OUTPUT); // LED Zolta - okno otwarte
  pinMode(2, INPUT_PULLUP); // Czujnik otwarcia okna, LOW = otwarte
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  Serial.begin(9600);
}

void loop() {
  while ((digitalRead(2) == LOW) && (digitalRead(9) == LOW)) {
    digitalWrite(8, LOW);
    digitalWrite(9, HIGH);
    Serial.println("Uwaga! Okno otwarte!");
  }
  if (digitalRead(2) == LOW) {
    digitalWrite(8, LOW);
    digitalWrite(9, HIGH);
  }
  else {
    digitalWrite(8, HIGH);
    digitalWrite(9, LOW);
  }
}

   

Link do komentarza
Share on other sites

while ((digitalRead(2) == LOW) && (digitalRead(9) == LOW)) 
 {
    digitalWrite(8, LOW);
    digitalWrite(9, HIGH);
    Serial.println("Uwaga! Okno otwarte!");
  }
  

Jakie jest przeznaczenie tej pętli? Wcześniej ustawiasz pin 9 sterujący LED-em jako OUTPUT, a tu go odczytujesz - czemu to ma służyć?

Edytowano przez Belferek
Link do komentarza
Share on other sites

@Belferek Sprawdzam stan wyjścia. W pierwszej chwili wyjście nie jest ustawione. Po wciśnięciu przycisku pętla jest wykonywana raz, ustawia się wyjście 9. Za drugim razem już warunki nie są spełnione i program idzie dalej. 

Edytowano przez Jaroodd
Link do komentarza
Share on other sites

a tak nie byłoby lepiej?

#define ZAMKNIETE 1
#define OTWARTE 0
boolean ostatni_stan=digitalRead(2);
void loop() 
{

  if (digitalRead(2) == LOW && ostatni_stan==ZAMKNIETE )      //jesli okno otwarte a bylo zamkniete
  {
    digitalWrite(8, LOW);
    digitalWrite(9, HIGH);
    ostatni_stan=OTWARTE;
  }
  else if (digitalRead(2) == HIGH && ostatni_stan==OTWARTE )  //jesli okno zamkniete a bylo otwarte
  {
    digitalWrite(8, HIGH);
    digitalWrite(9, LOW);
    ostatni_stan=ZAMKNIETE;
  }

  if(ostatni_stan==OTWARTE)     Serial.println("Uwaga! Okno otwarte!");
  else                          Serial.println("Uwaga! Okno zamkniete!");
}

 

Link do komentarza
Share on other sites

Moim celem było, żeby komunikat został wyświetlony/wysłany tylko raz, a nie wyświetlał się ciągle. Na razie chciałbym wiedzieć dlaczego czasami (raczej losowo) po wciśnięciu przycisku komunikat nie jest wysyłany. Podejrzewam, że to problem z momentem wciśnięcia przycisku i cyklem programu, ale może to jednak jakaś cecha portu? 

A do stosowania "prawdziwych" zmiennych w Ardiuno (definiowanie i takietam) jeszcze nie dotarłem. To na następnej lekcji 🙂

Link do komentarza
Share on other sites

5 minut temu, Jaroodd napisał:

Moim celem było, żeby komunikat został wyświetlony/wysłany tylko raz

No to jaki problem troszeczkę to zmienić - np. tak:

#define ZAMKNIETE 1
#define OTWARTE 0
boolean ostatni_stan=digitalRead(2);
void loop() 
{

  if (digitalRead(2) == LOW && ostatni_stan==ZAMKNIETE )      //jesli okno otwarte a bylo zamkniete
  {
    digitalWrite(8, LOW);
    digitalWrite(9, HIGH);
    ostatni_stan=OTWARTE;
    Serial.println("Uwaga! Okno otwarte!");
  }
  else if (digitalRead(2) == HIGH && ostatni_stan==OTWARTE )  //jesli okno zamkniete a bylo otwarte
  {
    digitalWrite(8, HIGH);
    digitalWrite(9, LOW);
    ostatni_stan=ZAMKNIETE;
    Serial.println("Uwaga! Okno zamkniete!");
  }
}

 

8 minut temu, Jaroodd napisał:

Podejrzewam, że to problem z momentem wciśnięcia przycisku i cyklem programu, ale może to jednak jakaś cecha portu? 

Przyciski mają to do siebie, że drżą. Poczytaj o tzw. debouncing i np. bibliotece Bounce2.

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.