Skocz do zawartości

RoboRemoFree - sterowanie diodą przyciskiem


MarJanPol

Pomocna odpowiedź

Witam, jestem mocno początkujący i próbuję w ramach nauki stworzyć prosty programik, który będzie zapalał diodę po wciśnięciu i przytrzymaniu przycisku w RoboRemoFree i wyłączał ją po zwolnieniu przycisku. Arduino Leonardo + HC06. Wszystko podłączyłem chyba jak należy, bo łączność nawiązałem i układ "prawie" działa 🙂 przycisk w RoboRemoFree skonfigurowałem tak, że po wciśnięciu wysyła UARTem wartość 1 a po zwolnieniu wysyła wartość 0 i wgrałem taki oto programik:

String odebraneDane = "";
void setup() 
{Serial1.begin(9600); 
Serial.begin(9600);
pinMode (8, OUTPUT);}
void loop() 
{if(Serial1.available() > 0) 
{odebraneDane = Serial1.readStringUntil('\n'); 
Serial.println(odebraneDane);
if (odebraneDane="1")
{digitalWrite (8, HIGH);}
else
{digitalWrite (8, LOW);}}} 

Niestety coś nie działa. Dioda rzeczywiście zapala się po wciśnięciu przycisku, ale już nie gaśnie po jego zwolnieniu. Jednocześnie mam podgląd w monitorze portu szeregowego i widzę, że komunikacja z RoboRemoFree działa poprawnie bo rzeczywiście po wciśnięciu na komórce przycisku widzę w okienku wartość „1” a po puszczeniu „0”. Dlaczego jednak ta wartość „0” nie przekłada się na gaszenie diody? Co jest nie tak z funkcją „if”? Musiałem zrobić jakiś głupi błąd, ale nie mogę się go doszukać...

Z góry dziękuję za pomoc!

Marek

Link do komentarza
Share on other sites

Nie mówiąc juz o tym, że w C nie ma operatora porównywania stringów. Zdecyduj się czy odpowiedź ma być jednym znakiem czy ich łańcuchem. Jeśli znakiem, to nie używaj ograniczników "" a jeśli łańcuchem, to strcmp().

Ale to nie jest C, tylko Arduino i to nie jest char* tylko String.

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

Różnica jest w bibliotekach - stdc++ versus Wiring.

Nikt Ci nie broni zaimplementowania klasycznej klasy string dla Arduino, ani wiringowego Stringa pod Windowsem.

Co nie zmienia faktu, że językiem jest C++, a Wiring to tylko zestaw podstawowych bibliotek (coś jak glibc versus avr-libc).

Link do komentarza
Share on other sites

Zanim zaczniemy filozoficzne dyskusje na temat tego co to jest język i czy dodanie biblioteki standardowej albo preprocesora zmienia język (moim zdaniem tak), to może wróćmy na chwilę na ziemię i zastanówmy się nad praktycznym znaczeniem.

W tym konkretnym przypadku używamy klasy String pochodzącej z bibliotek Arduino. Stwierdzenie, że to jest C++ nie pomaga, a nawet wprowadza w błąd, bo sugeruje, że używamy klasy String z biblioteki standardowej C++, a tak nie jest. Tak, Arduino jest zbudowane na bazie C++, to wszyscy wiemy i nie trzeba tego powtarzać za każdym razem. Ale tutaj akurat to, że to nie jest jakieś zwykłe C++ tylko Arduino ma znaczenie.

Link do komentarza
Share on other sites

Moim zdaniem nazywanie Arduino odrebnym jezykiem prowadzi do wielu nieporozumien. Pozniej poczatkujacy pytaja czy powinni sie uczyc C++ czy Arduino. W przypadku embedded biblioteka standardowa bywa niedostepna, czasem niepelna, ale to nie ma wplywu na sam jezyk. Jezyk formalny ma swoja definicje - warto jej poszukac i zobaczyc ze nie zawiera sie w nim biblioteka, srodowisko, system operacyjny ani nawet kompilator.

PS. sorki za brak polskich literek, to nie lenistwo ani chec stworzenia wlasnego jezyka

Link do komentarza
Share on other sites

Jezyk formalny ma swoja definicje - warto jej poszukac i zobaczyc ze nie zawiera sie w nim biblioteka, srodowisko, system operacyjny ani nawet kompilator.

Zawierają się, tylko są razem traktowane jako czarna skrzynka i nikt nie wnika w to co jest w środku, bo matematyczna definicja języka jest bardzo ścisła i dowolna zmiana daje ci nowy język. Jeśli spróbujesz w praktyce użyć definicji języka formalnego, to zobaczysz, że nie ma czegoś takiego jak "język C++". Ba, nawet konkretna specyfikacja C++, taka jak "C++11" czy "C++17" nie jest językiem formalnym zgodnie z definicją, bo jest zbyt ogólna. Wzięcie konkretnej implementacji na konkretnym systemie operacyjnym jest już bliżej, ale nadal przecież będziesz mieć różne języki formalne tutaj w zależności od zainstalowanych bibliotek, a nawet od tego w jakim katalogu uruchomisz program albo ile pamięci RAM masz wolne. Dopiero wzięcie całego komputera w konkretnym stanie (na przykład snapshota maszyny wirtualnej) byłoby w sensie matematycznym wystarczająco precyzyjne żeby zdefiniować jeden język formalny.

Prawda jest taka, że nawet kiedy mówisz "język C++" to na myśli masz "rodzinę języków" z jakąś tam w domyśle przyjętą listą cech powodującą, że dany język się do tej rodziny zalicza lub nie (na początek zgodność ze specyfikacją, na przykład).

Link do komentarza
Share on other sites

Może przeczytaj tą definicję języka formalnego jeszcze raz dokładnie. Albo może wytłumaczę łopatologicznie.

Definicja:

Język formalny jest definiowany za pomocą funkcji. Traktujemy tę funkcję jako czarną skrzynkę, która przyjmuje wejścia, a na wyjściu daje "tak", "nie" albo nigdy nie kończy działania. Językiem formalnym odpowiadającym naszej skrzynce nazywamy zbiór wszystkich tych wejść, na które odpowiada ona "tak".

Istotne jest tutaj jednak to, że aby taka czarna skrzynka definiowała język, to musi być funkcją w sensie matematycznym, to znaczy, między innymi, że dla tego samego wejścia musi zawsze konsekwentnie dawać takie samo wyjście. Inaczej nie ma funkcji i co za tym idzie nie ma języka.

No to teraz odnieśmy się do tego, co pisałeś wcześniej. Mówisz, że możesz zdefiniować dla C++ gramatykę. Pomijając takie drobiazgi, że żadna specyfikacja C++ nie zawiera formalnej definicji gramatyki, oraz że udowodniono, że to co zawiera specyfikacja nie pozawala na napisanie jednoznacznej gramatyki, zobaczmy jak to się ma do tego co robi z tymi wejściami komputer. Załóżmy, że napiszesz tą gramatykę i jakiś cudem ominiesz problemy z niejednoznacznością. Teraz bierzesz tą gramatykę i zgodnie z jej regułami generujesz program, który ma 42 petabajty wielkości. Gramatyka to dopuszcza. Ale jak spróbujesz to uruchomić na swoim komputerze, to okaże się, że on jednak zwraca błąd braku pamięci — czyli dostałeś odpowiedź "nie", podczas gdy gramatyka twierdzi, że ten program należy do języka. Zatem gramatyka, którą napisałeś, nie definiuje języka, który jest akceptowany przez twój komputer.

Link do komentarza
Share on other sites

Panowie, jestem bardzo wdzięczny za Wasz aktywny udział w moim skromnym wątku 😃 ale jeśli się zgodzicie, że na chwilę wrócę do meritum i zadam pytanie pomocnicze, o to w którym dokładnie miejscu trzeba zmienić "=" na "==", bo jakoś nie jest to dla mnie takie intuicyjne.

Poza tym rozumiem, że użycie zmiennej string jest nieoptymalne - czy zatem lepiej będzie zmienić linijkę:

String odebraneDane = "";

na:

int odebraneDane = "0";

Kłaniam się uniżenie wszystkim znawcom tematu... 😉

m.

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.