Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Arduino Uno-jaki kod czy ktoś wie

hotdriver 09 Maj 2017 22:58 1221 15
  • #1 09 Maj 2017 22:58
    hotdriver
    Poziom 9  

    Witam wszystkich bawie się płytką Arduino i mam mały problem z kodem jak zrobić żeby po wpisaniu w serial monitorze np. 1 można było po wciśnięciu liczby "a" otworzyć pin 2, "b" pin3, a po wciśnięciu 2 i wpisaniu "c" pin 4, "d" pin5 z tym że jeżeli bym wcisnął w każdym innym momencie na klawiaturze obojętnie co wyskoczy "0" lub jeżeli po wciśnięciu 1 wcisne "c" również wyskoczy "0" i analogicznie w 2 wcisne "a" też bedzie "0". Czyli do cyfry 1 przypisana jest tylko i wyłącznie litera "a" i "b" każde inne działanie wyskoczy "0", do cyfry 2 litera "b" i "c" i jeżeli nie wcisne ani 1 ani 2 tylko coś innego np "c" tez bedzie "0" prosze o pomoc już mi ręce opadaja a nie znam dobrze języka C++ będę niezłomnie wdzieczny za pomoc

  • Pomocny post
    #2 09 Maj 2017 23:58
    Jawi_P
    Poziom 29  

    Witaj,
    Nie wiem dokładnie z czym masz problem, z samym kodem, czy z komunikacją między PC z Arduino. Żeby Arduino przyjmowało zmienną z terminala.
    Przeczytaj, tu jest przykład komunikacji dwukierunkowej przez UART:
    http://forbot.pl/blog/artykuly/programowanie/...rduino-3-uart-komunikacja-z-pc-zmienne-id3836
    Jeśli jednak chodzi o kod, to przeczytaj cały kurs ten lub inny, przyda Ci się bardziej niż napisanie przez kogoś tych kilku linijek. Serio, będziesz wiedział więcej, będziesz się lepiej bawił. Szczególnie instrukcję " Swith Case", "if".
    Im więcej będziesz czytał, to będziesz lepiej zadawał pytania. Bo zdanie złożone, bez interpunkcji czyta się fatalnie i wolno. (Przynajmniej mi) Wielu osobom nie chce się na takie posty odpowiadać, weź to pod uwagę. ;)
    Poza tym, od Arduino jest osobny dział.
    Dobrej nocy

  • #3 10 Maj 2017 06:58
    hotdriver
    Poziom 9  

    Dzieki za odpowiedź, chodzi mi o kod, napisałem już jakiś kod tylko co nie wcisnę wyskakuje 'blad', jak go zmodyfikować aby działał poprawnie? Oto mój kod

    Kod: c
    Zaloguj się, aby zobaczyć kod

  • #4 11 Maj 2017 15:16
    hotdriver
    Poziom 9  

    Nikt nie pomoże?

  • Pomocny post
    #5 11 Maj 2017 15:40
    dondu
    Moderator Mikrokontrolery Projektowanie

    Nie znam Arduino, ale patrząc na opis:

    Cytat:
    readStringUntil() reads characters from the serial buffer into a string. The function terminates if the terminator character is detected or it times out (see setTimeout()).

    https://www.arduino.cc/en/Serial/ReadStringUntil

    być może należy ustawić Serial.setTimeout(): https://www.arduino.cc/en/Serial/SetTimeout

  • #6 12 Maj 2017 07:17
    kosmogon
    Poziom 13  

    Nie podoba mi się linia:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Przypisujesz tutaj pusty string do zmiennej odebraneDane, nadpisując to, co chcesz odczytać.

    A tak poza tym, to nie będzie działać tak, jak Ty chciałeś. Po odebraniu pierwszego znaku (q, lub 2) program sprawdzi dwa warunki wewnętrzne, które zwrócą 0 i poleci dalej. Wpisanie drugiego znaku zwróci błąd.

  • #7 14 Maj 2017 20:50
    hotdriver
    Poziom 9  

    kosmogon napisał:
    Nie podoba mi się linia:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Przypisujesz tutaj pusty string do zmiennej odebraneDane, nadpisując to, co chcesz odczytać.

    Jak zmienić tą linie żeby każdy inny wpisany znak był rozpoznawalny jako błąd?? Myślałem że to ona odpowiada za to. Co do drugiego stwierdzenia właśnie jak to zrobić aby program był za każdym razem tak jakby w stanie czuwania czyli powracał na początek pętli??

  • Pomocny post
    #8 15 Maj 2017 07:17
    kosmogon
    Poziom 13  

    hotdriver napisał:
    Myślałem że to ona odpowiada za to


    No nie, ona odpowiada za wyświetlanie zawsze pustego w tym wypadku Stringa. Możesz ją po prostu wywalić, albo skasować to = "". Wtedy będzie wyświetlał to, co odebrał.

    Co do rozpoznawania błędu, to od tego masz if, albo switch.

    A jak zrobić, żeby to działało tak jak chcesz? Rozbij rozpoznawanie odebranych danych na dwa etapy: w pierwszym będziesz rozpoznawał pierwszy znak i ustawiał odpowiednią flagę, jeżeli zostanie rozpoznany odpowiedni znak. W drugim etapie rozpoznajesz drugi znak i zerujesz flagę.

    Ten program zawsze wraca na początek pętli.

  • Pomocny post
    #9 16 Maj 2017 06:04
    emarcus
    Poziom 34  

    hotdriver napisał:

    Jak zmienić tą linie żeby każdy inny wpisany znak był rozpoznawalny jako błąd?? Myślałem że to ona odpowiada za to. Co do drugiego stwierdzenia właśnie jak to zrobić aby program był za każdym razem tak jakby w stanie czuwania czyli powracał na początek pętli??


    Tu nie wystarczy zmienic tylko jedną linię – wymagany jest nowy kod pisany ze zrozumieniem problemu..
    Twój koncept mógłby pracowac, gdyby wysyłana z monitora zmienna (string) zawierała tylko jeden character (jeden znak/element), albo miała wartośc numeryczną (integer).
    Poza tym stosowanie wielopoziomowego ‘if / else if ’ prowadzi do dośc nadmiernej rozbudowy programu i często komplikuje program utrudniając jego zrozumienie lub modyfikację.

    W skrócie: Odbierając dane ‘string’ /(text) w metodzie transmisji seryjnej , otrzymujesz bajt bez wartości liczbowej; otrzymując kolejny znak processor dodaje (a raczej dopisuje) ten znak do poprzedniego jeżeli program tego przewiduje, inaczej poprzedni element zostanie nadpisany. Nawet mając odebrane obydwa znaki processor nie jest w stanie ‘rozpoznac’ co który z nich oddzielnie przedstawia (traktuje je jak foto dwóch elementów) i w procesie porównania w twoim programie pamięta tylko ten otrzymany ostatni. Twój program nie zawiera możliwosci komasowania kolejno wysłanych/otrzymanych znaków w jedną sensowną całośc, tak aby później (!), w procesie porównania otrzymanych danych z tymi spodziewanymi, miec oddzielny dostęp do kazdego z nich w trybie jak założono, zatem w efekcie końcowym nie otrzymujesz spodziewanej reakcji programu.

    Niemniej jednak, aby to funkcjonowało, potrzebujesz zmienic sposób odczytu otrzymanych danych z monitora, - zbierac je do array zaopatrzone indexem i wg. tego odczytu możesz stosowac metodę ‘if /else if’ porównując zadaną postac stringu złożonego z kilku elementów z otrzymanym odczytem; - każdą parę elementów oddzielnie.

    Spróbuj przeanalizowac i ewentualnie posłużyc sie tym przykładem (nieco zmodyfikowanym twoim kodem), - może coś z niego wykorzystasz.. /zmienisz.. /dopiszesz..
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Myślę że taki, albo podobny cel miałeś do osiągnięcia.
    Nie jest to bynajmniej jedyny możliwy sposób interpretacji projektu.
    Łatwiejszym jednak i prostszym w zastosowaniu wydaje się byc stosowanie alternatywnej metody z użyciem ‘switch’ gdzie wskaźnikiem dla case winien byc też integer albo pojedynczy (unikalny) character ‘string’. Metoda ta wymaga dalszej dyskusji....
    Dla przypadku wieloelementowego stringu należałoby stosowac enumeration (enum) zmiennych ‘string’ , tak aby wskaźnikiem dla case był integer zamiast string.

    e marcus

  • #10 16 Maj 2017 21:27
    hotdriver
    Poziom 9  

    Dziękuję za pomoc, mega mi to pomogło :) program działa fajnie tylko muszę jednocześnie napisać 'qa', '2c' a chodzilo mi żeby wpisać 'q' i dopiero mam wybór a lub b a tak muszę łączyć pierwsza fraze z drugą jak to zrobić?? no i mam pytanie: co ta 3 w tej linii oznacza??

    emarcus napisał:


    Kod: c
    Zaloguj się, aby zobaczyć kod


  • #11 23 Maj 2017 21:52
    hotdriver
    Poziom 9  

    Witam po dłuższej przerwie trochę pozmieniałem w kodzie. Zmiksowałem swój kod, kod kolegi i dodałem funkcję case. wszystko działa tak jak zakładałem tylko mam problem bo żeby zainicjować włączenie przekaźnika muszę jednocześnie nacisnąć 'a1', 'a2' itd. A chciałbym aby po naciśnięciu 'a' i daniu enteru nie wyskoczy 'błąd' tylko dalej mam wybór na '1' lub '2', dopiero naciśnięcie np. '3' wyskoczy 'błąd' cofnie się do początku pętli i znów muszę nacisnąć najpierw 'a' aby zainicjować pozostałe wyjścia. Czyli tak jakby naciśnięcie 'a' powoduje tak jakby zapamiętanie w ''chmurze''.Tylko trzeba zapamiętać że '3' i '4' są dla 'b'. Jak to zrobić, co muszę dodać do kodu czy całkowicie trzeba go zmienić. Proszę o pomoc. To mój zmieniony kod

    Kod: c
    Zaloguj się, aby zobaczyć kod

  • Pomocny post
    #12 24 Maj 2017 11:27
    kosmogon
    Poziom 13  

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Nie mam jak sprawdzić tego kodu, ale powinno działać.

  • #13 24 Maj 2017 20:14
    hotdriver
    Poziom 9  

    Dzięki kosmogon fajnie o to mi chodziło i nawet działa :) tylko jest jeden problem, po wklepaniu samego a muszę wpisać '1' tylko że nie samo 1 a 1 w apostrofach czyli '1' inaczej nie zadziała przekaźnik. Jak ominąć ten mały szkopuł, niby nic a jednak przeszkadza.

  • #15 24 Maj 2017 21:02
    hotdriver
    Poziom 9  

    No tak dziękuje za info będzie przydatne, tylko ten program to prototyp i zamiast cyfr i pojedynczych liter chcę je zastąpić pełnymi słowami. A i zauważyłem że zamiast '1' w apostrofach muszę wpisać '1 czyli apostrof i 1

  • Pomocny post
    #16 25 Maj 2017 07:08
    kosmogon
    Poziom 13  

    No racja, jak mówiłem: "skompilowałem" program w głowie i taki mały błąd jednak się wkradł. Ale dobrze, że sobie poradziłeś.

    Zamiast pojedynczych znaków możesz wpisywać również całe słowa, tylko wtedy zmieni się wartość zmiennej numChars. Musi być o jeden większa od najdłuższego słowa.

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME