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 573 9
  • #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 23  

    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 12  

    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 12  

    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.

  • #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


Szybka odpowiedź lub zadaj pytanie
Dziękuję Ci. Ta wiadomość oczekuje na moderatora.
 Szukaj w ofercie
Wyszukaj w ofercie 200 tys. produktów TME