Skocz do zawartości

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


Pomocna odpowiedź

28 minut temu, Franek100 napisał:

mam nadzieję, że zdjęcie programu pomoże...

Nie, nie pomoże. Niektórzy korzystają z forum na smartfonach gdzie takie zdjęcie jest słabo czytelne (albo wręcz w ogóle nieczytelne). Inni (a parę starszych osób się tu udziela) mają po prostu za słaby wzrok aby gapić się w mało kontrastowe fotografie. Odrzucasz możliwość, że któraś z tych osób Ci pomoże?

A jeśli ktoś będzie chciał wrzucić to sobie na Arduino i sprawdzić, ma sobie przepisywać z ekranu?

Ale wklejony kod już jak najbardziej.

 

 

 

43 minuty temu, Franek100 napisał:

Zatem dlaczego działa z HIGH, a nie z LOW?

Ta pętla powoduje wstrzymanie programu przez cały czas, gdy stan pinu jest HIGH - w skrócie nie będzie ci powtarzało w nieskończoność instrukcji zmiany stanu pinów, tylko wykona się raz i program będzie czekał aż ktoś wciśnie przycisk (warunek pętli przestanie być spełniony).

Mozna i while zablokowac, ale wtedy zablokujesz wszystko inne..(no prawie wszystko) wiec jest to nie ekonomiczne...lepiej wykonac if'a raz i poczekac az guzik bedzie puszczony, i dopiero wtedy sprawdzac od nowa..

  • 2 tygodnie później...

Cześć, 

super kurs. Bardzo przejrzyście i jasno napisany, a przy tym nie za suto, co zmusza żeby samemu też pogrzebać :)

Próbowałem rozwiązać zadanie 2.5* tak jak było napisane korzystając ze zmiennych pomocniczych pamiętających stan poprzedni, natomiast nie wychodziło to tak jak należy. 

Zrobiłem to trochę po swojemu, ale działa :)

Wygląda to tak:

#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" & digitalRead(zielona) == LOW){
  digitalWrite(zielona, HIGH);
  odebraneDane = "";
}


if (odebraneDane == "zielona" & digitalRead(zielona) == HIGH) {
  digitalWrite(zielona, LOW);
  odebraneDane = "";
  }
  

if (odebraneDane == "czerwona" & digitalRead(czerwona) == LOW) {
  digitalWrite(czerwona, HIGH);
  odebraneDane = "";
  }
  

if (odebraneDane == "czerwona" & digitalRead(czerwona) == HIGH) {
  digitalWrite(czerwona, LOW);
  odebraneDane = "";
  }
}

} 

 

@Korzon w sumie ciekawe rozwiązanie. Jakoś nie jestem fanem stringów w Arduino, bo jak sam sprawdzałem na dłuższą metę jest to zły pomysł:

To co zrobiłeś jednak jest dodatkową zmienną wiec wszystko ok, tylko w zadaniu chodziło bardziej o zmienną typu int albo bool (który jest intem).

(edytowany)
26 minut temu, ethanak napisał:

A 8-bitowy int nie jest intem? 😉

Technicznie rzecz biorąc...

  • nie, bo według specyfikacji języka C "int" musi mieć minimum 16 bitów 😄
  • tak, bo jest to liczba całkowita

Zależy od definicji wyrażenia "int" 😄 

Edytowano przez H1M4W4R1

To jak już zapytałem o ten bool to dlaczego np dla stm8 w zależności od kompilatora bool zajmuje: cosmic 1 bit a dla sdcc 8 bit ?

dostanę adres do pamięci dla b1 i b2. Zakładając ,że adres dla b1 to x to dla b2 będzie x+1. Jeśli startup będzie taki sam to i adresy raczej się nie zmienią. Ale to tak na sucho piszę.

sprawdziłem w cosmic rejestr pod adresem 0x500c PC_ODR o ile dobrze pamiętam. Odniosłem się do piątego bitu w sposób specyficzny dla tego kompilatora. Sprawdziłem adres i pokazuje to samo 0x500c. 

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