Od czasu do czasu różne osoby podpytują mnie na Majsterkowym fanpage, na stronie na Google+ i na naszym czacie, jak najprościej zapisywać dane odbierane z różnych czujników podpiętych do Arduino, żeby móc później zrobić na ich podstawie np. jakiś wykres, lub użyć ich do dalszych obliczeń.
Żeby nie musieć powtarzać tego samego każdemu z osobna, postanowiłem przygotować prosty poradnik, w którym pokażę Wam, jak dane z Arduino zapisać bezpośrednio na komputerze i zrobić z nich wykres w Excelu – i to bez żadnych dodatkowych kosztów :)
Układ
Na potrzeby tego poradnika zmontowałem sobie prosty układ z dwoma czujnikami temperatury LM35, z których odczyty będą zapisywane:
Jeden z czujników umieściłem w pokoju, a drugi wsadziłem do obudowy mojego komputera.
Program
Najprostszym sposobem zapisywania danych z Arduino jest podpięcie go do komputera kablem USB i wysyłanie wszystkiego za pomocą funkcji Serial.print(), a następnie zapisywanie odebranych danych już w komputerze.
Do swojego Arduino wrzuciłem prosty program, który odczytuje dane z obu czujników i co sekundę wysyła aktualną temperaturę do komputera:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#define lm35_1_pin A0 #define lm35_2_pin A1 int lm35_1, lm35_2; float temperatura_1, temperatura_2; unsigned long czas; void setup() { Serial.begin(9600); } void loop() { czas = millis(); lm35_1 = analogRead(lm35_1_pin); lm35_2 = analogRead(lm35_2_pin); temperatura_1 = (5.0 * lm35_1 * 100.0)/1024.0; temperatura_2 = (5.0 * lm35_2 * 100.0)/1024.0; Serial.print(czas/1000); Serial.print(" "); Serial.print(temperatura_1); Serial.print(" "); Serial.println(temperatura_2); delay(1000); } |
Nas interesują głównie linie od 21 do 25, które są odpowiedzialne za wysyłane odczytanych danych do komputera.
- w linii 21 wysyłam do komputera informację, ile sekund minęło od momentu uruchomienia Arduino. Jak komuś by się chciało bawić, można by rozbić to na sekundy, minuty, godziny, dni, … – ja jednak w przykładzie tym nie chciałem sprawy niepotrzebnie komplikować, dlatego pozostałem przy samych sekundach
- w liniach 22 i 24 wysyłam samą spację, której zadaniem jest po prostu oddzielenie od siebie kolejnych danych. Zamiast spacji można wstawić równie dobrze przecinek, średnik, myślnik, gwiazdkę, lub jakikolwiek inny znak
- w liniach 23 i 25 wysyłam kolejno temperaturę odczytaną z obu czujników. Dodatkowo w linii 25 zastąpiłem funkcję Serial.print() funkcją Serial.println(), która wstawia na końcu znak nowej linii
I od strony Arduino to już jest wszystko. Zapisywaniem przesyłanych danych zajmie się już aplikacja uruchomiona na komputerze.
Odczyt danych z Arduino za pomocą Arduino IDE
Najprostszym sposobem na odczytanie danych przesyłanych z Arduino jest Serial Monitor dostępny w Arduino IDE (menu Tools -> Serial Monitor):
Jest to jednak opcja bardzo kiepska, bo nie mamy możliwości automatycznego zapisywania odebranych danych i możemy je sobie co najwyżej zaznaczyć, skopiować do schowka i wkleić do notatnika. Brzydko…, bardzo brzydko… ;)
Odczyt i zapis danych z Arduino za pomocą CoolTerm
Dużo większe możliwości daje darmowa aplikacja CoolTerm (z tej strony można pobrać wersję dla systemu Windows, Linux i Mac).
Wersję pod Windowsy (nie wiem, jak pod innymi systemami) wystarczy ściągnąć, rozpakować gdzieś na dysku i uruchomić.
Po uruchomieniu aplikacji CoolTerm musimy kliknąć w Options i ustawić tam kilka rzeczy:
W ustawieniach musimy wybrać Port, pod który jest podłączone nasze Arduino, oraz w Baudtare wybrać taką samą prędkość transmisji, jaką ustawiliśmy w funkcji Serial.begin().
I w sumie tylko te dwa ustawienia są w tej chwili istotne, więc zamykamy okno klikając “OK”.
CoolTerm jest już gotowy do pracy i wystarczy kliknąć przycisk Connect, żeby zacząć odbierać dane wysyłane przez Arduino:
Aby zacząć zapisywać na dysku wszystkie odbierane dane, wystarczy wybrać Start… z menu “Connection -> Capture to Textfile” (lub użyć skrótu Ctrl+R). W pliku tekstowym będzie się zapisywało wszystko to, co zostanie odebrane z Arduino.
Jak zrobić wykres z danych odebranych z Arduino?
Pokażę Wam teraz, jak zapisane dane zaimportować do arkusza kalkulacyjnego Excel (z pakietu Microsoft Office 2007) i zrobić z nich ładny wykres.
Po uruchomieniu Excela przechodzimy do zakładki “Dane” i wstawiamy dane zewnętrzne “Z tekstu”:
W pierwszym kroku importu danych nie zmieniamy nic i klikamy “Dalej”:
W drugim kroku wybieramy, jakim znakiem zostały rozdzielone dane (w tym przykładzie jest to spacja):
W kroku trzecim musimy zmienić separator dziesiętny, ponieważ Excel domyślnie operuje na przecinkach, a liczby przesłane z Arduino mają kropki. Zaznaczamy jedną z kolumn zawierających odebrane pomiary:
A następnie klikamy “Zaawansowane” i zmieniamy separator z przecinka na kropkę:
Analogicznie postępujemy dla kolumny z danymi z drugiego czujnika.
Następnie klikamy “OK” i “Zakończ”. Gotowe – wszystkie dane mamy już w Excelu:
Teraz wystarczy zaznaczyć kolumny z danymi i w menu “Wstawianie” wstawić nowy wykres:
I w tym momencie powinien się ukazać naszym oczom ładny wykres wyrysowany na podstawie danych otrzymanych z Arduino:
Czy da się inaczej? Lepiej? Prościej?
Inaczej się da – i to na wiele sposobów :) Zaprezentowana wyżej metoda jest jednak najprostsza i najtańsza, bowiem nie wymaga żadnych dodatkowych inwestycji. Jej wadą jest jedynie to, że w czasie dokonywania pomiarów nie możemy wyłączyć komputera.
Gdybyśmy dokupili do Arduino Ethernet Shield, lub sam moduł Ethernet, moglibyśmy zapisywać dane bez użycia komputera bezpośrednio na jakimś serwerze (chociażby w arkuszu kalkulacyjnym w Google Drive). To już jest jednak temat na osobny post, który mogę przygotować, jeżeli będziecie chcieli :)
Mam nadzieję, że teraz już każdy z Was poradzi sobie z zapisywaniem na komputerze danych z Arduino. Powyższy poradnik może się na pierwszy rzut oka wydawać skomplikowany, ale po przerobieniu tego kilka razy wszystko robi się już niemalże odruchowo w kilka sekund.
Tak Tak Tak ! Chcemy poradnik z podłączeniem do internetu – Google Drive albo Twitter. Właśnie mam w planach na wiosnę zrobienie sobie w ogrodzie podobny system do http://gardenbot.org/ i będę chciał go podpiąć do sieci. ;)
Jak już zrobisz gardenbot to czekam na twój artykuł na majsterkowie ;)
Twittera załatwisz przez np http://www.pushingbox.com/ – ja używam tak arduino przez raspberry pi (bo nie mam ethernet shielda)
Akurat do Twittera są gotowce w przykładowych szkicach dołączanych do bibliotek od Shielda, i od modułu na ENC28J60 :) Ale Google Drive opiszę.
I mam nadzieję, że jak już skończysz swój projekt, to też go opiszesz w Majsterkowie ;)
Hmmm a może współpraca z RRDTool?
oo tak, dobrze by było
Fajny poradnik a wie ktoś jak sterować komputerem z poziomu Arduino ?? tzn myszka klawiatura itp. :P
http://arduino.cc/en/Reference/MouseKeyboard
W Łukaszowym wpisie o czujniku IR, tutaj na majsterkowie, jest przykładowy kod.
https://majsterkowo.pl/jak-sterowac-dowolnym-urzadzeniem-za-pomoca-pilota-i-arduino/
Też jestem za ! I to jak najszybciej :)
Zainspirowany postami o Arduino na majsterkowie, zrobiłem termometr na arduino + 3xDS18b20.
Dane przez port szeregowy do laptopa -> na laptopie skrypt w pythonie wysyłający te dane na serwer -> na serwerze kawałek PHP + JS.
Efekt końcowy -> https://docs.google.com/file/d/0B8La6w56BoPRV1ZIajN3dzBldXc/edit
PS. Jak moduł ENC28J60 dojdzie z Chin to zrobię wersję, bez pośrednictwa komputera.
PS 2. Chcemy art o ENC28J60 :)
Ja podobnie, ale trochę bardziej “oldskulowo” – też DS18B20, ale: nie Arduino a po prostu Atmega32, dowolna ilość czujników (obecnie podpięte 3), serial over bluetooth, na laptopie skrypt zbiera dane z BT, loguje, robi wykresy gnuplotem, wrzuca na serwer. Efekt: http://meteo.matemaciek.com/meteo/today-all.png
U mnie to ATMEGA8 + bootloader Arduino + MAX232.
Prawie kupiłem arduino, ale przypomniałem sobie, że gdzieś w szafie leżą jakieś Atmegi, poczytałem majsterkowo i mam “prawie arduino” :)
Hmm . . . Ładnie Łukasz Ładnie ;] Ale dodam swoje kilka groszy jeśli mogę ;] Odnośnie tych innych metod.
Po 1. W STM32, a w Arduino pewnie też się da (kwestia kodu) często stosuje znak tabulacji (0x09) znany z kodu ASCII co pozwala mi na oddzielenie wartości tak, żeby nie trzeba było separować w excel’u (pomocne zwłaszcza jak ma się 15 000 próbek na sekundę),
Po 2. Tak zmierzone wartości nadają się do mierzenia wolno zmieniających się parametrów np. temperatury w innym wypadku trzeba filtrować zakłócenia i czasami nawet trzeba zastosować średnią ruchomą, ale tak jak mowie to tylko w przypadku próbkowania o wysokiej częstotliwości,
Po 3. Do odczytywania danych z RS’a można zamiast Coolterm zastosować Realterm (również darmowy, ale wydaje mi się, że jest bardziej rozbudowany),
Po 4. Do bardziej zaawansowanych narzędzi należy z pewnością LabVIEW i matlab, ale niestety nie są darmowe, ale można w łatwy sposób zdobyć wersję edukacyjną,
A tak na marginesie to GOOD JOB, jak tylko się obronię co mam nadzieję nastąpi już nie długo to biorę się ostro do artykułów ;] Będzie dużo o STM32, ale również i o Arduino, a nad LabVIEW się jeszcze zastanowię ;P Nie ma co komplikować na początek chyba że ktoś bardzo będzie chciał/potrzebował.
Pozdrawiam gorąco.
P.S.
Ten GardenBot to ciekawa konstrukcja, ale jak zwykle zapytam jak to się sprawdzi w naszym klimacie, ale koncepcja wydaję się właściwa.
Dla fanów linux’a, polecam albo:
http://ser2net.sourceforge.net/ czyli wystawienie portu szeregowego w sieć (można sobie taki myk zrobić na openwrt a potem z innego komputera odczytywać z portu sieciowego dane – socket / telnet kto co lubi)
albo:
stty :-)
Rozwiń proszę pomysł z tym stty
Nie mam teraz dostępu do kompa. Z tego co znalazłem w necie na szybko to wpisujesz:
stty -F /dev/ttyACM0 cs8 9600 ignbrk -brkint -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts
gdzie /dev/ttyACM0 to arduino a 9600 to prędkość.
Możesz też zrobić prosto:
tail -f /dev/ttyACM0
:-)
Aby pisać do arduino:
echo “tekst do wyslania” > /dev/ttyACM0
Do poczytania też masz tutaj:
http://playground.arduino.cc/Interfacing/LinuxTTY
Można również podpiąć Arduino pod router z OpenWrt i odczytywać dane przez terminal :)
Jesteś już którąś osobą, która mi o tym wspomina, a ja wciąż nie mam kiedy zgłębić tego tematu ;) Może chciałbyś przygotować post na ten temat? :D
Dopiero zaczynam się w to bawić :)
Polecam stronę Cezarego Jackiewicza (eko.one.pl) oraz openrouter.info .
Ja po jakimś tygodniu zabawy w modyfikację routera (TL-WR1043ND) mam wgrane OpenWrt z gui Gargoyle, dysk zewnętrzny, DLNA dla telewizora, podłączoną drukarkę, kamerę internetową dla monitoringu z zapisem na dysk i termometr na arduino z odczytem przez telnet (na razie). A to tylko podstawowe możliwości dla tego systemu :)
Wszystko opisane na wyżej wymienionych stronach, bez problemu idzie zrozumieć :)
Jak będę mieć trochę czasu to mogę opisać coś na majsterkowie :)
Generalnie można zrobić dwie zabawki:
– zapisywać wyniki pomiarów na karcie SD/w pamięci na I2C i poprzez serial odczytywać i na komputerze obrabiać – w ten sposób swego czasu robiłem (na posklejanych gotowcach z przykładów Arduino) logger GPS
– zainteresować się munin’em i/lub rrdtool i/lub GNUplot. Do munina będzie trzeba napisać trywialny plugin czytający z portu szeregowego i wysyłający na standardowe wyjście kawałek tekstu (program, skrypt w praktycznie dowolnym języku…), malować wykresy munin potrafi. Zapisując wyniki pomiarów do pliku (my mamy do tego skrypt w bash’u), można z nich obrazki zrobić GNU plot’em – potężne narzędzie, łatwe do wsadowego opanowania. Efekt z sieci 6-ciu czujników: https://lh6.googleusercontent.com/-5b1OzKllC1A/UOY0Yt0dsyI/AAAAAAAAAzw/qAJIBoyb9VE/s800/327.last.png
http://openwrt.pl/doku.php/zastosowania:arduino
A jak zapisać dane na karcie SD z czujnika temperatury?
http://arduino.cc/en/Tutorial/Datalogger
W serial.princie rozdzielaj od razu ; to wyjdzie Ci gotowy CVS. Żaden import nie będzie potrzebny. Te LM35 trzeba kalibrować (tak jak termistor) czy sa stabilne bez względu na napięcie zasilania?
Widzę, że takie połączenie nie sprawdzi się dla temperatur poniżej +2 stopni celcjusza …..
http://botland.com.pl/temperatury/376-analogowy-czujnik-temperatury-lm35-dip.html
co to jest -Vs?
Ujemnie napięcie.
Dzięki za wyjaśnienie tej sprawy, zawsze mnie zastanawiało w jaki sposób można to wykonać a tu taka perełka. Pozdrawiam
Dzięki za poradnik. Tego właśnie szukałem i w końcu działa jak powinno :)
Dzięki za poradnik :)
Proszę o wyjaśnienie linii 18 lub 19
Jest to po prostu zamienienie wartości odczytanej przez wejście analogowe (od 0 do 1023) na jakąś konkretną temperaturę. Praktycznie dla każdego analogowego czujnika trzeba wykonać podobne obliczenia :)
świetne artykuły! zawsze się zastanawiałem jak to jest z komunikacją mikrokontrolera z komputerem, tzn. jak jest z wymianą danych, czy to trudne. Dziś okazało się, że w tę stronę jest to bardzo proste. A jak sprawa wygląda przy wysyłaniu danych? Zapisane w txt. dane pobierane przez arduino. Przykładowo w pliku zapisane są kolejne wartości oznaczające liczbę kroków dla silnika krokowego. Arduino pobiera je i wykonuje określony cykl. Czy to równie łatwe?
Samo wysyłanie danych do Arduino jest banalnie proste. Trzeba by tylko napisać jakiś prosty program pod Windowsa (chociażby w Processing), który by wysyłał po kolei kolejne linie z pliku przez port Serial (bo przez samo Arduino pliku nie odczytasz, a możesz jedynie nasłuchiwać na Serial).
Ewentualnie możesz podpiąć moduł Ethernet i odczytywać całe pliki przez sieć ;)
żaden skrypt type plik.txt > COMx
powinno działać, albo po prostu echo polecenie” > COMx
Rozumiem rozumiem, właśnie chodziło mi o program prosty jak cool term ale służący do wysyłania. Nie ruszałem jeszcze tematu Processing ale chętnie się tym zajmę w wolnej chwili. A może znasz jakieś programy już napisane, przygotowane pod windows do współpracy z arduino, które przy wgranym odpowiednim kodzie pozwalają robić konkretne rzeczy?
Mam takie pytanko: Czy serial monitor działałby gdybym programował w środowisku Arduino IDE, nie używając Arduino, lecz programatora USBasp? Chyba nie, co? :/
Pingback: Serial port - wprowadzenie w pigułce » Majsterkowo.pl
Pingback: Własny detektor burzy - część 1 » Majsterkowo.pl
Witam , mam małe pytanko czy przy zmianie LM35 na DS18B20 wystarczy w skrypcie zmienić z
#define lm35_1_pin A0
#define lm35_2_pin A1
na
#define DS18B20_1_pin A0
#define DS18B20_2_pin A1
czy tu coś trzeba więcej kombinować , przepraszam za takie proste pytanie ale niestety po raz pierwszy mam z tym styczność jak i dopiero się uczę :)
LM35 jest czujnikiem analogowym, a DS18B20 cyfrowym i ich obsługa wygląda zupełnie inaczej :)
No nic , to będę coś później kombinował , bo zamówiłem sobie jakiś mały zestaw z arduino uno r3 i tam są już te cyfrowe czujniki , ale ma być też płyta CD z bibliotekami i może uda mi się coś zrobić wraz z twoim poradnikiem i się okaże jak wyjdą moje pierwsze kroki w tym kierunku .
Czy planuje może ktoś zrobić pomiar temperatury w oparciu o DS18b20, enc28j60 i python-a ?
Głównie chodzi mi o wysyłanie pythonem zapytania o stan temperatury i odbiór wyniku. Próbuję zrobić coś takiego w oparciu o pythonowe sockety ale nic mi nie wychodzi.
A da się to jakoś w prosty sposób przerobić tak żeby zwizualizować prace czujnika indukcyjnego?
Chodzi mi o stany pracy działa, nie działa.
A zrobiłbyś to z internetem bo raczej arduino cały czas do laptopa bym nie chciał mieć podłączonego
very good information
O ja pierd… ludzie nauczcie się programować, jest tyle bibliotek do monitorowania portów COM (np. pyserial dla j. Python) że można komunikacje dwukierunkową zrobić nie męcząc się z officem!!!
Czy ktoś może wie jakim programem można zczytać dane z SerialMonitora ale tak by był jeszcze zapis daty i godziny do pliku ? A nie tylko numer kolejnego zapisu ?
Witam
W ubiegłym roku napisałem skrypt bash, który zapisuje do bazy MySQL dane odczytywane z 4 czujników temperatury 1 jeden wilgotności. Odczyt następował co minutę, później zmieniłem co 5 min ponieważ tabelka, gdzie przechowywana była temperatura, rosła w zastraszającym tempie.
Później te dane prezentowane były przez www na wykresach z możliwością wyboru czasookresu.
(Wszystko napisane do pracy magisterskiej)
Pozdrawiam
Witam serdecznie kolegów. Mam bardzo ważne pytanie dla mnie. Czy ktoś wie co dzieje się ze stronką Arduinomonitor.com. Od pewnego czasu nie mogę się zalogować. Może ktoś zna odpowiedź.
Piotr.
Super opis. Czy można przporządkować uzyskane pomiary temperatury do czasu ich otrzymania? Czy posiadają znacznik czasowy lub czy można go dodać do konkretnych wartości? Pozdrawiam!
Super opis. Czy można przporządkować uzyskane pomiary temperatury do czasu ich otrzymania? Czy posiadają znacznik czasowy lub czy można go dodać do konkretnych wartości? Pozdrawiam!
Hej, udało się komuś dopalić CoolTerm na bananaPi, albo innych Pi z prockiem ARM?
Pod adresem:
http://www.forkrobotics.com/2013/07/using-raspberry-pi-to-control-a-tinyg-shapeoko/
znalazłem informację, że CoolTerm został skompilowany pod procesory x86 i nie będzie pracował na procesorach Raspberry Pi ARM. Autor radzi, żeby skorzystać z PUTTY. Mnie się to udało.
Można też użyć Plink.
Projekt bardzo fajny. Niedługo zabieram się za zrobienie ale będę chciał zapisywać dane na karte SD a potem obrabiać je na komputerze. Jakieś pomysły jak podpiąć moduł kart SD ?
U mnie CoolTerm widzi tylko jeden COM1, a mam podpięte więcej…
jak to naprawić?
Arduino Nano podpięte za pośrednictwem FTDI232 przez usb do kompa z Win 10…
Hej, potrzebuje dane z czujnika położenia wykorzystać w programie napisanym w C++ w visual studio, czy orientuje się ktoś może jak to zrobić?