Arduino i Visual C#

Arduino i Visual C#

ikona

Na wstępie chciałbym się przywitać, gdyż jest to mój pierwszy artykuł.

Od dłuższego czasu byłem zainteresowany napisaniem programu który by odczytywał dane wysłane z mikrokontrolera. Dzisiaj przedstawię wam bardzo prosty program napisany w Visual C#, który będzie odczytywał dane z czujnika DHT11 i odpowiednio wyświetlał.

Podłączenie czujnika do arduino

DHT11 to cyfrowy czujnik temperatury i wilgotności powietrza. Jego zalety to bardzo łatwe podłączenie, niska cena i brak kalibracji. Jego wady to słaba dokładność, mierzy tylko dodatnie temperatury. Czujnik posiada 4 nóżki, z czego tylko 3 są używane. Pierwsza nóżka to zasilanie 5v, druga to wyjście sygnałowe, które podłączamy do pinu cyfrowego w Arduino (w moim przypadku był to pin 2) oraz do 5V przez rezystor o wartości 10kΩ. Ostatnia nóżka to GND.

Schemat:

dhtwiring

Wyjście sygnałowe czujnika (na schemacie zielony przewód) dodatkowo podłączamy do 5V przez rezystor o wartości 10kΩ.

Programowanie Arduino

Program który tutaj zastosuje to zmodyfikowany program przykładowy czujnika który dostarczony jest wraz z biblioteką obsługującą czujniki DHTxx.

Następnie wgrywamy program do Arduino i włączamy monitor portu szeregowego. Jak wszystko poprawnie zrobiliśmy to powinniśmy zobaczyć coś takiego:

monitor1

28.00 to temperatura w stopniach Celsjusza, a 34.00 to wilgotność powietrza w procentach.

Visual C# 2010 Express

Visual C# 2010 Express można ściągnąć z tej strony. Na początku tworzymy nowy projekt i wybieramy Windows Forms Application.

monitor2

Przed nami ukaże się ekran w którym będziemy tworzyć cały interface. Przeciągając odpowiednie elementy z lewej części ekranu tworzymy mniej więcej coś takiego:

monitor3

Należy pamiętać aby dodać także komponent portu szeregowego.

Napisy przycisków zmieniamy w prawej części ekranu w menu “properties” po zaznaczenu danego elementu (wartość “text”). Dla ułatwienia po zmieniam sobie nazwy pól tekstowych na coś bardziej czytelnego (wartości “name”).

Trzeba pamiętać żeby nie pomylić wartości “name” z wartością “text” !

Ogólnie cały kod programu prezentuje się jak poniżej. Konkretne kawałki kodu opiszę komentarzami.

Jako, że Arduino wysyła dwie zmienne (temperatura i wilgotność) program zbudowałem tak, by na zmianę odczytywał wartość temperatury i wilgotności (do tego służy zmienna ‘parz’). Pewnie jest to nie do końca poprawne ale jak na pierwszy program proszę mi to wybaczyć.

 monitor4 monitor5

Jest to też mój pierwszy artykuł więc za wszelkie błędy stylistyczne proszę mi wybaczyć. :)

Ocena: 4.19/5 (głosów: 75)

Podobne posty

36 komentarzy do “Arduino i Visual C#

  • Jezusie …
    Czy atmega / arduino sprowadza się tylko do termometrów ?!
    Jest to już 3?4? poradnik o termometrach, konstrukcja nie zaskakująca…
    Zastosowanie Visual odróżnia od reszty…
    Jeżeli wykorzystałbyś Visual do sterowania przekaźnikami lub np. robotem uwierz mi 5tki by leciały :)
    4 i nic więcej

    Odpowiedz
  • Ciekawe połączenie Arduino z PC ;)

    Plus dla Ciebie za komentarze w kodzie :) Ode mnie 5 :)

    BTW, ostatnio bawiłem się trochę mikrokontrolerami i powstał sterownik zasłaniania/odsłaniania żaluzji lub rolet (albo na czujnik zmierzchowy albo ręcznie), dodatkowo zegar i kalendarz, wszystko wyświetlane na LCD 2×16. Zbudowałem to na Atmedze8. Jeżeli kogoś interesowałoby powyższe urządzenie, to może bym się zebrał i opisał to na Majsterkowie ;) Z tym że na razie jest sam sterownik, części mechanicznej (silnik i jego mocowanie) nie ma :(

    Odpowiedz
    • W tym projekcie chodziło głównie o tym, żeby zrobić aplikacje, która będzie współpracować z Arduino/Atmega. Dlatego wybrałem coś prostego (czujnik temperatury) by skupić się na samym C#.

      Mam plany by w przyszłości zbudować większy projekt wykorzystując Visual C# :)

      Odpowiedz
  • Fajny temat, ale poruszę kilka kwestii kodu c#.

    Po pierwsze załącz cały projekt. Każdy kto zna c# potrafi sobie to sam zrobić a reszta nie skorzysta ponieważ podałeś tylko część kodu. Wklejenie go nie zadziała ponieważ trzeba powiązać zdarzenie z odpowiednią metodą (EventHandler). Tak jak np button_stop_Click jest tylko metodą którą trzeba powiązać z button_stop.Click. Robi się to na kilka sposobów (najlepiej w Properties w zakładce Events – ikona z błyskawicą)

    Dobrze wyuczyć w sobie takie nawyki jak obsługa błędów – otwarcie portu zawsze może się nie udać (np zajęty). Zobacz jak brzydko wywala się Twoja aplikacja a wystarczy użyć try catch.

    Jeszcze jedna rzecz – moje arduino Leonardo nie działa dopóki nie włączę DTR (serialPort1.DtrEnable = true;). Opcja ta zgłasza gotowość trerminala odczytującego dane z serial portu. Bez tego arduino w ogóle nie wysyła danych – widać to po diodzie TX.

    Daję 4 na zachętę.

    Odpowiedz
  • Hej,
    program w C# ma błędny algorytm odczytu danych z czujnika. Wystarczy, że chociaż jeden odczyt się nie uda, aby odczyt temperatury był zamieniony z odczytem wilgotności.

    W skrócie to ja bym to rozwiązał chociażby tak
    W Arduino:

    a w C#:

    No, coś w ten deseń. Chociaż można całą tę komunikację rozwiązać na 100 innych sposobów :)

    Odpowiedz
    • Jak już wspomniałem w artykule, zapewne cały algorytm jest źle wykonany. Myślałem, żeby wykonac to tak, żeby przed wysłaniem temperatury arduino dodawało jakiś przedrostek, który potem program odczyta i za pomocą którego będzie wiedział jaki to odczyt.

      Odpowiedz
  • Proponuję zatem aby arduino wysyłało te dane w jednej linii rozdzielone znakiem np #. A jeszcze lepiej aby oznaczyć początek i koniec linii. Arduino mogłoby wysyłać coś takiego: @b#24.00#34.00#@e

    I teraz:

    Przy danych bardziej wrażliwych mogę sprawdzać czy np temperatura jest w odpowiednim formacie, a w danych super wrażliwych sprawdzać sumę kontrolną bądź całego ciągu bądź samych wartości.

    I do tego sprawdzanie czy odczyt z czujnika się udał jak napisał kolega kr0nos.

    Pamiętajmy, że zawsze może się coś nie udać i róbmy tak aby wykluczyć te możliwości. O ile w wyświetlaniu nic się takiego nie stanie program się wysypie o tyle w danych zapisywanych np do bazy danych wywalić może się całkiem sporo włącznie z położeniem całej bazy.

    Odpowiedz
    • Hej,
      ten fragment:

      oryginalnego kodu już załatwia problem poprawności samego odczytu. Dlaczego? Otóż funkcja isnan() sprawdza, czy jej argument jest poprawną liczbą, czy nie. Jeżeli jest – zwraca 1, jeżeli nie, zwraca 0. Jeżeli jeden z odczytów, czy to temperatury, czy wilgotności nie zwróci liczby, generowany jest sygnał błędu. Problemem jest parsowanie w “odbiorniku”.

      Zaproponowany przez Ciebie sposób wysyłki danych od strony pomysłu jest oczywiście poprawny. Można by polemizować z jego czytelnością i wydajnością (zapewne można użyć po prostu znacznie mniejszej ilości wysyłanych danych), ale nie o tym ten temat ;).

      Odpowiedz
  • Cześć,

    Masz u mnie 5 za te komentarze w kodzie C#.
    Dwie uwagi:
    – nazwa zmiennej ‘parz’ jest mało czytelna w przeciwieństwie do ‘temperatura’ i ‘wilgotnosc’
    – na Visual Express świat C# się nie kończy. Można wykorzystać np. SharpDevelop czy MonoDevelop, ( z tych dwóch korzystam akurat w pracy).

    Odpowiedz
    • ogolnie to fajny wstep do arduino no i podlaczenie tego do PC. niemniej za komentarze w kodzie to u mnie jest pala u wujka boba tez:) bo komentarze mowia jedno, kod sam w sobie napisany niejasno. po jakims czasie jak sie nanosi poprawki w kodzie, komentarze sie rozjerzdzaja, bo oczywiscie ich czasem zapomni sie poprawic, potem jak sie do niego siada za pol roku i patrzy, to nie wiadomo czym sie sugerowac, komentarzem czy kodem… polecam clean code – robert c martin.

      Odpowiedz
  • Ciekawe podejście. Brakuje mi zawsze tylko przy takich projektach, realizacji bez płytki Arduino. Takie samodzielne rozwiązanie ma dopiero sens użycia wykonania.

    Odpowiedz
  • Mam takie pytanie. Jak to zrobić bez Arduino? Przykładowo na ATtiny2313 (chodzi mi głównie o to jak podłączyć do mikrokontorlera kabel usb)

    Odpowiedz
  • Obsługa DHT11 jest banalna, więc korzystanie z gotowych bibliotek to czyste lenistwo. Ogólnie nie polecam tego czujnika, ma straszną bezwładność a wskazywana wilgotność powietrza to czysta abstrakcja (w praktyce jest to zwykle wartość 60-80%, czujnik pokazuje 30-40).

    Odpowiedz
  • Nie ma co marudzić na czujnik. Nie o to autorowi chodziło. Ja akurat zgłębiam Arduino od prawie miesiąca i bardzo mi się artykuł przydał bo widzę że można pisać oprogramowanie na kompa do obsługi Arduino. Akurat teraz robię maszynkę której by się przydał taki interfejs na PCta żeby sterować silnikiem krokowym

    Odpowiedz
  • “Obsługa DHT11 jest banalna, więc korzystanie z gotowych bibliotek to czyste lenistwo. “. Po to są biblioteki, żeby z nich korzystać. Świat idzie do przodu a nie stoi w miejscu. Obudź się.

    Odpowiedz
  • Witam,
    Postanowiłem zrobić podobny projekt jak autor, lecz zakupiłem wcześniej inny czujnik temperatury (choć to nie problem i wszystko działa od tej strony).
    Program działa bez problemu jeśli chodzi o odczytanie danych z portu COM5 (nie mam COM3 jako USB w laptopie), ale tylko w programie Arduino. Jak zrobiłem już program w VS2013 to kompiluje bez problemu, otwiera port, ale nie otrzymuje żadnych danych. Bardzo proszę o pomoc. Oto kod z C#

    A oto z Arduino (dodałem jeszcze wyświetlacz LCD ale to chyba nie problem)

    Odpowiedz
    • Jestem zielony w programowaniu na wstępie mówiąc, ale miałem ten sam problem i irytowałem się przy tym nie wyobrażalnie :) ale rozwiązaniem problemu było dodanie do public Form1() danych o serial porcie oraz ” serialPort1.DataReceived += serialPort1_DataReceived; ” serialPort1.Open(); podpiąłem dopiero pod przycisk start. ogólnie to wygląda tak:
      public Form1()
      {
      InitializeComponent();
      button_stop.Enabled = false; // zablokowanie przycisku stop w momencie uruchomienia programu.
      serialPort1.PortName = “COM6”;
      serialPort1.BaudRate = 9600;
      serialPort1.DtrEnable = true;
      //serialPort1.Open();

      serialPort1.DataReceived += serialPort1_DataReceived; // to jest ważne bez tego nie odczyta danych z seriala

      }

      Odpowiedz
  • Kurcze zastanawia mnie to, jak by to ugryźć aby zrobić coś takiego, tylko termometr, jest w jednym miejscu (np. na baterię 9V) i wysyła dane do płytki umieszczonej w innym pokoju podłączonej do komputera, i bezprzewodowo można wyświetlać odebrane dane przez drugą płytkę. Tylko nie wiem co zastosować żeby wysłać dane, no i oczywiście czy takie coś jest w ogóle możliwe :)

    Odpowiedz

Odpowiedz

anuluj

Masz uwagi?