logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Transmisja danych z czujnika temperatury Arduino Uno na serwer www przez USB

PitreC91 15 Kwi 2015 17:17 5301 10
  • #1 14619695
    PitreC91
    Poziom 13  
    Posty: 109
    Pomógł: 6
    Ocena: 11
    Witam, chciałbym zaimplementować czujnik temperatury działający pod arduino uno.

    Pierwszym problemem jest to, że chciałbym na razie zastosować tańsze rozwiązanie, bez użycia płytki ethernet shield.

    Otóż komunikację chciałbym rozwiązać w taki sposób:
    czujnik -> arduino -> port USB PC -> strona www - via ethernet/wifi.

    Czy jest to realne rozwiązanie? Nie chce wydawać pieniędzy do testów, na Ethernet shield do Arduino. Szukając natknąłem się na aplikacje, które portują dane z arduino.
    Link
    Nie jestem pewny czy to jest dobry trop. Proszę o podpowiedź jak to rozwiązać. Dodam, że projekt www ma być oparty na .NET i nie chcę 'gotowca'. Chcę napisać to samemu.
  • #2 14619739
    nasty_photon
    Poziom 22  
    Posty: 540
    Pomógł: 31
    Ocena: 67
    PitreC91 napisał:

    Otóż komunikację chciałbym rozwiązać w taki sposób:
    czujnik -> arduino -> port USB PC -> strona www - via ethernet/wifi.


    Co oznacza połączenie " port USB PC -> strona www - via ethernet/wifi."? Opis dokładnie co chcesz osiągnąć? Do czego podłączone jest USB w arduino, do USB w komputerze PC? Gdzie jest serwer WWW? Na tym PC? Na innym?
  • #3 14619765
    freebsd
    Poziom 42  
    Posty: 6790
    Pomógł: 766
    Ocena: 2027
    PitreC91 napisał:
    Czy jest to realne rozwiązanie?

    Tak, zrób to tylko w ten sposób, że dane z arduino są odczytywane co jakiś czas (np. cron'em) i zapisywane np. do pliku tekstowego na dysku (lub RAM dysku), lub do zmiennej w pamięci. Oczywiście ten czas odczytu danych musi być tak dobrany, by dane były aktualne, a arduino nie było przeciążone. Przykład: pomiar temperatury na zewnątrz można uaktualniać co kilkadziesiąt sekund. Dzięki temu serwer www będzie mógł być obciążony duża liczbą zapytań, co by się nie udało gdyby musiał czekać na arduino.
  • #4 14619864
    PitreC91
    Poziom 13  
    Posty: 109
    Pomógł: 6
    Ocena: 11
    nasty_photon napisał:
    Co oznacza połączenie " port USB PC -> strona www - via ethernet/wifi."? Opis dokładnie co chcesz osiągnąć? Do czego podłączone jest USB w arduino, do USB w komputerze PC? Gdzie jest serwer WWW? Na tym PC? Na innym?


    Serwer wisi w sieci. Napisałem w poście, że chcę oprzeć stronę na technologii .NET, poza tym USB jest podłączone do laptopa który ma wysyłać dane pomiarów na WWW. Bez używania modułu ethernet shield do arduino.
    Czasu na to mam 1,5 miesiąca, mam nadzieję, że to co spłodzę będzie mi śmigać bez problemów w ten sposób. Przerobienie tego na moduł wifi czy ethernet będzie wtedy bardzo proste.

    freebsd napisał:
    Tak, zrób to tylko w ten sposób, że dane z arduino są odczytywane co jakiś czas (np. cron'em) i zapisywane np. do pliku tekstowego na dysku (lub RAM dysku), lub do zmiennej w pamięci.


    Wnioskję z Twojego posta:
    -Zapisujemy dane z arduino do pliku, następnie wysyłamy je na serwer - dobra a jak z tym wysyłaniem? Jak to zrealizować? też tym cron'em? Potrzebujemy do tego jakieś narzędzie?

    Część z pomiarem i wyświetlaniem danych już mam własny kod do arduino. Zastanawiam się jak dalej to przesyłać, na przykład do bazy danych by nadpisywało poprzedni odczyt który wyświetlał się na serwerze. Wiadomo, serwer będzie miał zaimplementowane odświeżanie strony.
  • #5 14619929
    freebsd
    Poziom 42  
    Posty: 6790
    Pomógł: 766
    Ocena: 2027
    PitreC91 napisał:
    -Zapisujemy dane z arduino do pliku, następnie wysyłamy je na serwer - dobra a jak z tym wysyłaniem? Jak to zrealizować? też tym cron'em? Potrzebujemy do tego jakieś narzędzie?


    1) W zależności od systemu operacyjnego ustawiamy w: harmonogramie zadań lub w cron (google podpowie) lub nawet w pętli uruchomianie programu odczytującego dane z arduino i zapisującego je do pliku tekstowego. Chodzi o to, by takie przenoszenie danych nie "zabiło" arduino, czyli należy wykonywać je co jakiś czas. W ten sposób też, tylko jeden proces na raz próbuje odczytać dane z arduino. Tak samo tylko jeden proces zapisuje dane do pliku.

    2) Kod strony http (np. za pomocą php) może odczytać dane z pliku i umieścić je w odpowiednim miejscu strony. Ponieważ wiele procesów może odczytywać plik na raz to w ten sposób mamy możliwość obsłużenia wielu odczytów na sekundę, również równolegle, gdy wiele osób jednocześnie wczytuje stronę www.

    Można ten proces optymalizować poprzez zapisywanie danych w pamięci lub w pliku trzymanym w RAM-dysku.

    Dodano po 5 [minuty]:

    PitreC91 napisał:
    Serwer wisi w sieci. Napisałem w poście, że chcę oprzeć stronę na technologii .NET, poza tym USB jest podłączone do laptopa który ma wysyłać dane pomiarów na WWW. Bez używania modułu ethernet shield do arduino.

    Rozszerzę mój poprzedni wpis:
    1) Program na laptopie, pracujący w pętli, lub uruchamiany przez harmonogram zadań, odczytuje dane i poprzez np.: scp lub ftp przesyła dane (konkretnie plik) na serwer http.
    2) Kod strony mając dostęp do pliku (znajdującego sie na tym samym serwerze) może już zrobić z tymi danymi co chce.
  • #6 14619958
    PitreC91
    Poziom 13  
    Posty: 109
    Pomógł: 6
    Ocena: 11
    Właśnie poczytałem, zanim @freebsd napisałeś, o harmonogramie zadań Windows, hmm czyli jest potencjalnie możliwość nadpisywania pliku z pojedyńczą linią danych w arduino?
    By arduino się nie krztusiło myślałem o zdefiniowaniu pomiaru mniej więcej co 5 - 10 minut. Nie zależy mi na aż tak na dużej precyzji. :) Dobra- jedno pytanie czyli bez problemu uda mi się to poleceniem SQL-owym wrzucić na stronę? :) Skoro to jest .NET to w jaki sposób narzucić stronie by dopiero przy tym jak jest otwarta sama się odświeżała? Czy to odświeżanie musi być ciągłe?

    EDIT:
    Dobra to już rozumiem o co wtym chodzi, :-) dzięki i pomału zabieram się do pracy. :-) (podzielę się efektami na forum).
  • #7 14619961
    nasty_photon
    Poziom 22  
    Posty: 540
    Pomógł: 31
    Ocena: 67
    PitreC91 napisał:


    Serwer wisi w sieci. Napisałem w poście, że chcę oprzeć stronę na technologii .NET, poza tym USB jest podłączone do laptopa który ma wysyłać dane pomiarów na WWW. Bez używania modułu ethernet shield do arduino.
    Czasu na to mam 1,5 miesiąca, mam nadzieję, że to co spłodzę będzie mi śmigać bez problemów w ten sposób. Przerobienie tego na moduł wifi czy ethernet będzie wtedy bardzo proste.



    Arduino wysyła po USB/RS-232 (tak jest widziane arduino przez PC) wyniki pomiarów. Może to robić co 1s lub co 10 minut. To zależy od Ciebie. Musisz napisać jakiś program na laptopa, który będzie odczytywał dane z portu szeregowego a następnie wysyłał je na serwer. Wysłanie na serwer można zrealizować poprzez HTTP -- na przykład metodą POST lub GET. Strona WWW odczytuje przekany wynik pomiaru i musi jakoś zapisać dane na serwerze. Najlepsza byłaby baza danych, np. SQL, od biedy może być zapisywanie do pliku na dysku - ale to mało bezpieczne.
  • #8 14619963
    freebsd
    Poziom 42  
    Posty: 6790
    Pomógł: 766
    Ocena: 2027
    PitreC91 napisał:
    Zastanawiam się jak dalej to przesyłać, na przykład do bazy danych

    Przesyłasz plik poprzez ftp lub scp, a program (skrypt) na serwerze pracujący w pętli wstawia go do bazy danych. Możesz też wymusić wczytanie danych do bazy uruchamiając skrypt wczytujący poprzez ssh. Możesz też wystawić bazę na "zewnątrz" i zapisywać bezpośrednio do bazy, ale nie zawsze umożliwia to właściciel serwera i należało by to dodatkowo zabezpieczyć.
  • #9 14619971
    PitreC91
    Poziom 13  
    Posty: 109
    Pomógł: 6
    Ocena: 11
    Dziękuję wszystkim za podpowiedzi, mam teraz na czym się oprzeć :) teraz kwestia poświęcenia czasu i projekt będzie szybko zrealizowany. :-) Biorę się do pracy :-).
  • #10 14776226
    PitreC91
    Poziom 13  
    Posty: 109
    Pomógł: 6
    Ocena: 11
    Witam ponownie, praktycznie poradziłem sobie z problemem :-). W skrócie przybliżę szczegóły:

    - Mam gotowe skrypty w PHP na serwer oraz aplikację w C++ do obsługi komunikacji portu na USB, które działają :-).

    a) W skryptach zdefiniowałem 3 możliwości komunikatów - 0 oznacza błąd, 1 - oznacza utworzenie rekordów, 2 poprawną aktualizację danych. Skrypty sprawdzałem za pomocą Hurlit wysyłając metodą POST dane. Wszystko śmiga jak potrzeba - by nie zawalać bazy utworzyłem tylko jeden rekord w tabeli mySQL, który jest po prostu aktualizowany.

    b) Mam gotowy program działający pod portem COM (w tym przypadku USB) w C++ - wysyła on stringa z arduino przez COM i wyświetla w konsoli na komputerze. Kod nie jest całkowicie mój, ponieważ zależało mi na oparciu się na częściowo gotowych schematach, nigdy nie pisałem aplikacji używających komunikacji portowych. Zdecydowałem, że poszukam gotowego rozwiązania w Internecie :-). Ode mnie dodane jest tutaj czyszczenie buffora zmiennej odpowiedzialnej za odbiór danych ( działa prawie dobrze) - wcześniej był problem z krzaczeniem się cout'a, obecnie został on rozwiązany na 4+, do tego jeszcze zdefiniowany na sztywno port COM wg zaleceń z komentarza i zaalokowana pamięć na dane jako "IncomingData" Pracowałem głównie w pliku main.cpp.


    Problemem natomiast jest komunikacja C++ -> Serwer www... chciałbym, by te dane były wysyłane "gołe" czyli np w taki sposób:
    "hum 34" i "temp 25" - tak zdefiniowałem to w PHP bez zbędnych stringów w coutach. W aplikacji w C++ jest troszkę inaczej, kod zamieszczę poniżej, lub jak ktoś woli w pliku ZIP. I tutaj zaczyna się problem, otóż nie potrafię zrobić konwersji danych z buffora na osobne zmienne o ww. nazwach oraz przesłać ich na serwer... Czytałem, że do tego muszę użyć Socketów... Tylko nie wiem jak to zrobić... :roll:
    Patrzyłem na googlach za jakimś ciekawym rozwiązaniem, ale jakoś nic mi nie podeszło... :-(. Poniżej załącznik ze wszystkim pliki C++ I PHP z bazą danych włącznie :-)

    Pozdrawiam. :-)
    Załączniki:
    • praca.zip (8.42 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #11 14777447
    PitreC91
    Poziom 13  
    Posty: 109
    Pomógł: 6
    Ocena: 11
    Ktoś pomoże?

Podsumowanie tematu

✨ Użytkownik planuje implementację czujnika temperatury z wykorzystaniem Arduino Uno, z zamiarem przesyłania danych na serwer WWW przez port USB komputera, bez użycia modułu Ethernet shield. W dyskusji poruszono kwestie dotyczące odczytu danych z Arduino, ich zapisu do pliku oraz przesyłania na serwer. Sugerowano użycie harmonogramu zadań lub pętli w programie na laptopie do regularnego odczytu danych, a następnie ich wysyłania na serwer za pomocą metod HTTP (POST/GET). Użytkownik zrealizował projekt, tworząc skrypty w PHP oraz aplikację w C++ do obsługi komunikacji przez port USB, co pozwoliło na aktualizację danych w bazie MySQL.
Wygenerowane przez model językowy.
REKLAMA