Ta strona używa ciasteczek (plików cookies), dzięki którym może działać lepiej. Dowiedz się więcejRozumiem i akceptuję

RoboRemoFree - sterowanie diodą przyciskiem

Autor Wiadomość
MarJanPol 



Posty: 14
Otrzymał 1 piw(a)
Wysłany: 07-12-2017, 10:39   RoboRemoFree - sterowanie diodą przyciskiem

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:
Kod programu: Zaznacz cały

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

Ostatnio popularny » Rzut oka na zestaw STM32F3Discovery


Postaw piwo autorowi tego posta
 
 
deshipu 




Posty: 2158
Pomógł: 115 razy
Otrzymał 187 piw(a)
Programuję w:
Python, C, Lua
Należę do:
Nigmalabs
Moje roboty:
uKubik, pKubik, Katka, Tote

Wysłany: 07-12-2017, 12:44   

Operator przypisania "=" działa inaczej niż operator porównania "==".

Postaw piwo autorowi tego posta
 
 
marek1707 



Posty: 4387
Pomógł: 471 razy
Otrzymał 613 piw(a)
Skąd: WAW
Programuję w:
C, asm
Wysłany: 07-12-2017, 13:16   

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

Postaw piwo autorowi tego posta
 
 
deshipu 




Posty: 2158
Pomógł: 115 razy
Otrzymał 187 piw(a)
Programuję w:
Python, C, Lua
Należę do:
Nigmalabs
Moje roboty:
uKubik, pKubik, Katka, Tote

Wysłany: 07-12-2017, 13:24   

marek1707 napisał/a:
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.

Polecany artykuł » Technika cyfrowa - #8 - podsumowanie kursu


Postaw piwo autorowi tego posta
 
 
ethanak 




Posty: 75
Otrzymał 3 piw(a)
Programuję w:
C, C++
Wysłany: 07-12-2017, 13:39   

Nie Arduino tylko C++ (to tak w kwestii formalnej).
Czyli dla klasy String jest zdefiniowany operator porównania, również z const char*.

Postaw piwo autorowi tego posta
 
 
deshipu 




Posty: 2158
Pomógł: 115 razy
Otrzymał 187 piw(a)
Programuję w:
Python, C, Lua
Należę do:
Nigmalabs
Moje roboty:
uKubik, pKubik, Katka, Tote

Wysłany: 07-12-2017, 13:45   

ethanak napisał/a:
Nie Arduino tylko C++ (to tak w kwestii formalnej).


Nie C++ tylko Arduino. Tak w kwestii formalnej. Wiem co piszę, klasa String w "dorosłym" C++ jest trochę inna, ta w Arduino jest nieco uproszczona.

Postaw piwo autorowi tego posta
 
 
Elvis 



Posty: 1362
Pomógł: 93 razy
Otrzymał 250 piw(a)
Skąd: wawa
Programuję w:
C, asm
Wysłany: 07-12-2017, 13:50   

To jest C++, dodanie lub zmiana biblioteki nie zmienia samego jezyka. Arduino uzywa preprocesora, ale poza tym to czyste C oraz C++.

Postaw piwo autorowi tego posta
 
 
ethanak 




Posty: 75
Otrzymał 3 piw(a)
Programuję w:
C, C++
Wysłany: 07-12-2017, 13:53   

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

Postaw piwo autorowi tego posta
 
 
deshipu 




Posty: 2158
Pomógł: 115 razy
Otrzymał 187 piw(a)
Programuję w:
Python, C, Lua
Należę do:
Nigmalabs
Moje roboty:
uKubik, pKubik, Katka, Tote

Wysłany: 07-12-2017, 13:58   

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.

Ostatnio zmieniony przez deshipu 07-12-2017, 14:01, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 
 
ethanak 




Posty: 75
Otrzymał 3 piw(a)
Programuję w:
C, C++
Wysłany: 07-12-2017, 14:08   

Jeśli już to nie Arduino tylko Wiring.
Arduino to konkretna implementacja, a nie odrębny język.

Postaw piwo autorowi tego posta
 
 
Elvis 



Posty: 1362
Pomógł: 93 razy
Otrzymał 250 piw(a)
Skąd: wawa
Programuję w:
C, asm
Wysłany: 07-12-2017, 14:15   

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

Postaw piwo autorowi tego posta
 
 
deshipu 




Posty: 2158
Pomógł: 115 razy
Otrzymał 187 piw(a)
Programuję w:
Python, C, Lua
Należę do:
Nigmalabs
Moje roboty:
uKubik, pKubik, Katka, Tote

Wysłany: 07-12-2017, 14:52   

Elvis napisał/a:
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).

Postaw piwo autorowi tego posta
 
 
Elvis 



Posty: 1362
Pomógł: 93 razy
Otrzymał 250 piw(a)
Skąd: wawa
Programuję w:
C, asm
Wysłany: 07-12-2017, 15:12   

To nieprawda. Dla C, C++ itd mozesz zdefiniowac gramatyke, ktora okresla jezyk. Gramatyka nie zawera informacji o bibliotece, systemie itd.
https://pl.wikipedia.org/wiki/J%C4%99zyk_formalny

Postaw piwo autorowi tego posta
 
 
deshipu 




Posty: 2158
Pomógł: 115 razy
Otrzymał 187 piw(a)
Programuję w:
Python, C, Lua
Należę do:
Nigmalabs
Moje roboty:
uKubik, pKubik, Katka, Tote

Wysłany: 07-12-2017, 15:29   

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.

Ostatnio zmieniony przez deshipu 07-12-2017, 15:30, w całości zmieniany 2 razy  
Postaw piwo autorowi tego posta
 
 
MarJanPol 



Posty: 14
Otrzymał 1 piw(a)
Wysłany: 07-12-2017, 15:32   

Panowie, jestem bardzo wdzięczny za Wasz aktywny udział w moim skromnym wątku :-D 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.

Postaw piwo autorowi tego posta
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Wersja do druku

Skocz do:  

Nie rozwiązałeś swojego problemu? Zobacz podobne tematy: Arduino, problem z o... Arduino i programowa... Przysyłanie/Odbieran... Atmega - problem z b...
lub przeszukaj forum po wybranych tagach: roboremofree


Powered by phpBB modified by Przemo © 2003 phpBB Group
Popularne kursy: Arduinopodstawy elektroniki