Witam wszystkich, przedstawię wam dzisiaj jak zrobić prosty czujnik temperatury, dzięki któremu będziemy mogli sprawdzić aktualną temperaturę w naszym pokoju z każdego miejsca na świecie gdzie jest internet :)
W mojej wersji pokażę podłączenie tylko jednego czujnika, ale oczywiście może to być kilka czujników np. temperatury, wilgotności, ciśnienia itp.
Co nam będzie potrzebne?
– Arduino, w moim przypadku Leonardo
Od czego zacząć?
Na początku trzeba złożyć nasz prosty układ (jak zwykle brzydko mi to wyszło):
Konto w ThingSpeak
Po podłączeniu naszego układu należy założyć konto w serwisie ThingSpeak.
Po wejściu na stronę klikamy na przycisk “Get Started Now”:
Następnie uzupełniamy dane do naszego konta:
Po utworzeniu konta i aktywacji e-mail klikamy na przycisk “New Channel”:
Wpisujemy nazwę naszego kanału i nazwę wykresu, a następnie klikamy na przycisk “Save Channel”:
Potem wystarczy przejść do zakładki “API Keys” i skopiować nasz klucz:
Tutaj mamy już wszystko gotowe, została nam część Arduino.
Wgrywamy kod do Arduino
W kodzie wystarczy wpisać wcześniej skopiowany API KEY w odpowiednie miejsce i wszystko gotowe:
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
// // edited by Michał Dorawa // // 6.03.2015 // // #include <EtherCard.h> #include <OneWire.h> int DS18S20_Pin = 7; OneWire ds(DS18S20_Pin); // ethernet interface mac address, must be unique on the LAN static uint8_t mymac[6] = { 0x54, 0x55, 0x58, 0x10, 0x00, 0x24}; // tutaj możemy zmienić adres mac static uint8_t ip[4] = { 192, 168, 0, 115}; // tutaj możemy zmienić adres ip static uint16_t port = 80; byte Ethernet::buffer[700]; static uint32_t timer; const char website[] PROGMEM = "api.thingspeak.com"; // called when the client request is complete static void my_callback (byte status, word off, word len) { Serial.println(">>>"); Ethernet::buffer[off+300] = 0; Serial.print((const char*) Ethernet::buffer + off); Serial.println("..."); } void setup () { Serial.begin(57600); Serial.println(F("\n[webClient]")); if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) Serial.println(F("Failed to access Ethernet controller")); if (!ether.dhcpSetup()) Serial.println(F("DHCP failed")); ether.printIp("IP: ", ether.myip); ether.printIp("GW: ", ether.gwip); ether.printIp("DNS: ", ether.dnsip); if (!ether.dnsLookup(website)) Serial.println("DNS failed"); ether.printIp("SRV: ", ether.hisip); } void loop () { float temperature = getTemp(); ether.packetLoop(ether.packetReceive()); if (millis() > timer) { timer = millis() + 5000; Serial.println(); Serial.print("<<< REQ "); Serial.print(temperature); int myInt = temperature; char myIntAsString[7]; itoa(myInt, myIntAsString, 10); ether.browseUrl(PSTR("/update?key=XXX&field1="), myIntAsString, website, my_callback); // XXX - należy zamienić właśnym API KEYem } } float getTemp(){ //returns the temperature from one DS18S20 in DEG Celsius byte data[12]; byte addr[8]; if ( !ds.search(addr)) { //no more sensors on chain, reset search ds.reset_search(); return -1000; } if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.println("CRC is not valid!"); return -1000; } if ( addr[0] != 0x10 && addr[0] != 0x28) { Serial.print("Device is not recognized"); return -1000; } ds.reset(); ds.select(addr); ds.write(0x44,1); // start conversion, with parasite power on at the end byte present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad for (int i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); } ds.reset_search(); byte MSB = data[1]; byte LSB = data[0]; float tempRead = ((MSB << 8) | LSB); //using two's compliment float TemperatureSum = tempRead / 16; return TemperatureSum; } |
Tutaj możecie zobaczyć dane, które wysyłałem przez kilkanaście minut :)
Zakończenie
Jeśli wszystko działa, to możemy dodać więcej czujników itp. Jeśli się wam spodoba, to mogę zrobić wersję z innymi czujnikami :)
Myślę, że poradnik jest krótki, ale każdemu się przyda, bo bardzo długo szukałem jak to zrobić :D
Dla mnie super na pewno wykorzystam w swoim nowym domu daję 5 :D
Dziękuję bardzo. Gdyby była taka potrzeba, to służę pomocą :)
Ja mam gorącą prośbę o pomoc nie mogę sobie poradzić coś mi nie chce działać ;/ wogóle to mojego andurino nie widać w sieci, ;/ to pierwszy problem, A ogólnie to szukam gotowego programu dla odczytu bezpośrednio z web na andurino pomiarów temperatury. do 8 czujników cyfrowych, tak abym mógł z komórki podejrzeć sobie. było by super gdyby szło ustawić alarmy górnych i dolnych granic temperatur. np. na maila
Wszystko fajnie pięknie, ale niech ktoś opiszę taką samą akcję, ale bez użycia serwisu ThingSpeak, a przy wykorzystaniu skryptów PHP i własnego serwera
Ja osobiście wolę się uniezależnić od jakiejś strony, która może za rok czy 5 lat zniknąć z sieci i cały mój wysiłek pójdzie na marne
Może coś takiego? :)
https://majsterkowo.pl/wlasny-internetowy-termometr/
@Anonim (nie wiem komu odpisuję)
Ehh… byłem święcie przekonany, że ten projekt z linku opierał się na HTML’u – a ja na forum otworzyłem temat z pytaniem o PHP :)
Ale przynajmniej będzie można zobaczyć jak to jest robione na dwa sposoby :)
@TheJalo
Oczywiście, to jest dobry artykuł – nie chciałem, by to co napisałem było uznane za jakiś atak czy coś podobnego ;)
Po prostu szukam rozwiązań z własnym serwerem, a z kodowaniem w PHP u mnie słabo – stąd taki mój komentarz wyżej :)
Ja sb zrobiłem stację meteo w oparciu o Pi i Arduino i jak będę miał chwilę to ją opiszę :D
Był napewno taki artykuł. Inny od tego co podał kolega wyżej. Tylko w tym wypadku nie trzeba się męczyć, bo nie potrzeba ani kodu HTML ani publicznego IP, także jeśli ktoś nie chce się męczyć to to jest idelane rozwiązanie dla niego.
Zobacz nettemp.pl
Ode mnie 5. Świetny projekt dla ludzi, którzy nie chcą się bawić w pisanie kodu HTML i ustawaiania publicznego IP.
Fajnie że wziąłeś gotowy kod i wklepałeś swoje dane… I dodatkowo go nie wyjaśniłeś.
BTW to ostatnio był artykuł o module ESP8266 i thingspeak tak jak kolega wyżej napisał lepiej jest to zrobić na własnym serwerze bo co chmura padnie i koniec…
W sumie nie ma za bardzo co tłumaczyć w kodzie, bo 1 część służy do łączenia się i wysyłania danych i tutaj nie ma co zmieniać poza API keyem, a reszta obsługuje termometr :)
A co do własnego serwera, też nie ma co opisywać, bo już jest tutaj taki artykuł :D
Tak na prawde to maly problem to przeportowac na dowolny wlasny serwer.
Wystaczy wystawic jeden servlet, ktory oczekuje 2-ch parametrow:
– key
– field1
Jeżeli key nie jest wartoscia przez nas zdefiniowana – zwroc blad
Field1 – to jest temparatura
I teraz jezeli key sie zgadza to wrzucic wartosc Field1 (i sysdate) do jakiejs bazy danych
5 min roboty w PHP
a – bym zapomnial – jak wysatwimy taki serwisik, to jedyne co w kodzie podanym wyzej trzeba bedzie zmienic to adres serwisu, ktory jest wykorzystywany – zmiana linii 23 i dziala ;)
A da się wysłać maila z temperaturą ?????
Od robienia takich rzeczy na arduino, bardziej polecam serwer na malinie, który będzie zbierał dane z wielu takich czujników
Da się. Tylko musisz mieć serwer bez szyfrowania i leciec komendami smtp w plain. IMHO prościej zrobić sobie jakiś skrypt php do którego wyślesz po get i dopiero on puści maila.
A jakby pójść krok dalej i wysłać maila lub nawet sms gdy temperatura spadnie lub podniesie się do jakiejś ustalonej przez nas?
Nie widzę sensu wykorzystywania ENC28J60. Cały projekt można oprzeć na ESP8266 z językiem arduino.
Nie widze sensu wykorzystywac tutaj ESP8266 poniewaz kosztuje wiecej,lubi lapac zwiechy i jest wiecej przy tym pracy.
Cena jest taka sama – 3$ za esp8366 i 3$ za enc20j60. Esp8266 z językiem arduino i kondensatorem nigdy mi się nie zawiesił. Kod do esp8266 jest o wiele protszy.
Na ESP8366 jest pełno podobnych projektów, a ja mam tylko ENC28J60, dlatego go wykorzystałem :D
Fellfree – Daj linka gdzie jest kod na Arduino i ESP8366
Dziwne, bo do 1.0.1 było pełno bugów, które generowały busy s …. lub busy p …. Nawet producent na swoim bbs sugerował problemy.
Chyba, że lecisz na NodeMCU – mam na nim 3xDS18B20 mierzące temperaturę w garażu, części gospodarczej i na zewnątrz. Wszystko bez użycia arduino tylko 2 stabilizatory na 3.3V i 5V.
@leszektg – Jest taki przykład w przerobionym arduino IDE (opisałem w moim ostatnim poście), wystarczy zmienić serwer.
Mi chodzi po głowie projekt w którym poprzez Arduino zbieram pomiary z czujników i przesyłam po sieci do serwera postawionego na SynologyNas gdzie można założyć serwer www i zbierać dane do MySQL.
NAS nie jest włączony cały czas i dlatego chciałbym zbierać dane na SD a w momencie kiedy www zacznie odpytywać to niech pobierze dane z SD.
Czy jest możliwe skorzystanie z zasobów Arduino na SD odpytując się zewnętrznym hostem po RJ? Pytanie – chaos, ale jestem na etapie koncepcji i zaczynam dopiero układać to w całość.
Pozdrawiam,
Gumers
https://thingspeak.com/channels/31146
w kolejce do podpięcia leży mq135 i GP2Y1010AU0F (dzisiaj dotarł). Z MQ135 da się wyznaczyć charakterystyki NOx i CO2 etc. Trochę liczenia i da się wyłuskać dane. Niby jest biblioteka dla ardunio ale słaba i trzeba będzie samemu się pobawić w obliczenia. W dodatku uruchomienie czujnika to 24 wypalenia dla poprawnej kalibracji.
Już z tego co jest da się policzyć punkt rosy, a potem wysokość podstawy chmur. Podoba mi się, że API thingspeak nie daje żadnych ograniczeń. Trochę podstaw programowania i można zrobić co tylko się zamarzy. Tak samo jak thingspeak pozwala wykonać określone działania po przekroczeniu pewnych poziomów z czujników.
BTW: Esp8266 z API 1.0 działa już bez zwisów od tygodnia, pewnie nowe 1.0.1 jest jeszcze stabilniejsze, bo w changelogu jest sporo drobnych poprawek.
Czy ktoś z was wie gdzie dostać MICS-4514? I inne sensory z SGX Sensortech.
Witam
Mógłbyś podesłać bibliotekę z jakiej korzystasz? Chodzi mi o bibliotekę do modułu ethernet.
Pozdrawiam
Możesz powiedzieć mi jak do tego zamiast obsługi one-wire, dać normalny termometr? (np. LM35)
Wiecie może dlaczego nie chce wystartować z DHCP? A DHCP mam w sieci włączone. Dziwne, bo w kazdym programie to nie działa.
Dobra.
Zrobiłem takie coś http://pastebin.com/cWmLhFEV, ale i tak coś nie działa. Nie wiem dlaczego. Mam adapter ethernet Enc28j60. On jest podłączony ro routera. Ale router jest podpięty do anteny radiowej i to ona daje DHCP. Wszystkie urządzenia bez problemu sobie pobierają adres ip.
Dobra…
A teraz konkrety: Powiedz mi drogi Autorze na jakim Arduino IDE to wgrywałeś oraz poproszę o bibliotekę, której używałeś do kompilowanie tego kodu
Bo ni chu chu nie chce się ona kompilować prawidłowo:
“webClient.ino: In function ‘void loop()’:
webClient:56: error: invalid conversion from ‘const char‘ to ‘prog_char‘
webClient:56: error: initializing argument 3 of ‘static void EtherCard::browseUrl(prog_char, const char, prog_char, void ()(uint8_t, uint16_t, uint16_t))'”
Ruszyło na jakiejś innej bibliotece (pewnie nowszej) na Arduino 1.0.4
Na jakiej bibliotece działa?
Mógłbyś wstawić link?
Mam takie same błędy przy kompilacji
ok, poszło
Arduino 1.0.4
ethercard: https://github.com/jcw/ethercard/
Jak długi i czy jeszcze w ogóle działa ten projekcik? Ja miałem problem z zawieszaniem się modułu ethernetu (program działał) – przestał się komunikować, odpowiadać na pingi. Dopiero reset pomagał…
OFFTOP: Nie dawno robiłem coś podobnego, tylko mierzyłem temperaturę, wilgotność oraz obecność prądu w gniazdku. Do tego miałem swój własny serwer z napisaną aplikacją PHP we frameworku PHP oraz serwer smsowy, pozwalający na wysyłanie powiadomień sms z telefonu (dodatkowo gdy ktoś podeśle sms o treści raportuj na numer telefonu, to dostanie raport w odpowiedzi). Byłby ktoś zainteresowany takim artykulikiem? :) Mogę opisać. Tylko będzie wymagał od użytkowników co najmniej średniego zaawansowania w programowanie PHP.
Jak dodać kolejne czujniki ?
Jak można dodać kolejny czujnik do tego sketcha ?
Bo z moich prób wynikło tyle że tylko jeden z nich wysyłał dane, albo jeden albo drugi.
english comment,, I am slovak
I change code and added suport for more than one sensor
you need to add your API KEY, address for ds18b20, use 1-wire finder sketch
in sketch are 2 sensor
add other address, field and add others lines
this was added
DeviceAddress Thermometer = { 0x28, 0x5C, 0x46, 0xB4, 0x01, 0x00, 0x00, 0x0C };
DeviceAddress Thermometer1 = { 0x28, 0xFF, 0xE2, 0x44, 0x31, 0x04, 0x00, 0xB1 };
float aThermometer = sensors.getTempC(Thermometer);
float aThermometer1 = sensors.getTempC(Thermometer1);
stash.print(“field1=”);
stash.println(aThermometer);
stash.print(“&field2=”);
stash.println(aThermometer1);
here is download
http://uloz.to/xDCmxtrQ/arduino-thingspeak-enc28j60-multiple-sensors-zip
arduino 2x 1-wire bus 4x ds18b20 thingspeak.txt
arduino 2x 1-wire bus 4x ds18b20.txt
arduino onewire 4x ds18b20 with address.txt
OneWireAddresssFinder.ino
web_tepl_thingspeak 2 sensors.ino
5x sketch
send temperatures to thingspeak::
2x 1-wire bus, 2x ds18b20 pin7 and 2x ds18b20 pin6
1x 1-wire bus on pin7 and 2x ds18b20
only temperature in terminal::
2x 1-wire bus, 2x ds18b20 pin7 and 2x ds18b20 pin6
1-wire pin7, 4x ds18b20
3 sensors on 3 floors in house and 1 sensor is out
you download and change code
http://uloz.to/xKf7nTPK/arduino-thingspeak-enc28j60-multiple-sensors-zip
Witam,
czy do projektu wystarczy Arduino Uno?
Pozdrawiam
Jak najbardziej. Jedynie podłączenie ENC28J60 trochę się różni ;)
A można wiedzieć dokładniej czym to podłączenie się różni?
Port ICSP jest chyba identyczny w obu arduino (uno i leonardo)?
mój moduł ma 2x6pin a tu jest moduł 2x5pin i mi to nie działa… jest jakaś różnica w podłaczeniu tego??
Tam jest opornik 4700 Omów?
Możecie podac jak dołożyć kilka czujników ?
Niestety nie mogę uruchomić tego na Arduino UNO.
Czy to mogą być różnice w pinout?
Hej, czy do tego projekto można użyć arduino nano + ENC28J60 + 6 sensorów DS18b20?
Z tego co wyczytałem może być problem z zasileniem eth?
Możesz mi pomóc zbudować coś takiego na arduino nano + ENC28J60 + 6 sensorach. Pozdrawiam i dziękuję
Mogę użyć tego czujnka?: http://abc-rc.pl/czujnik-temperatury-10-a-250v-ac
Złożyłem wg opisu. Na monitorze portu temperatura wyświetlana jest prawidłowo, ale na Thingspeak wartości rzędu 4,5,8,9 ?
Użyłem DS18B20, taki jest na schemacie, ale w kodzie pojawia się DS18S20. To nie ma znaczenia? Może jakieś inne wartości MSB. LSB?
Hej,
Ciekawa sprawa. Na ThingSpeak dostaję “krzaki” zamiast temperatury:
2017-11-27T07:48:30Z46Y�KF����
jaki pomysł?
Czołem
W trudzie z znoju raczkującego w temacie poskładałem to z użyciem klona ArduinoNANOv3.
I niby działa ale są problemy opisane w dwóch powyższych postach. W monitorze portu i na doklejonym LCD pokazuje prawidłową temp. Na TS wykres jest poniżej 10*C a przy exporcie danych krzaki jak u kolegi kapik.
Czy ma wpływ wydajność zasilania? Bo początkowo przy zasilaniu z USB były kłopoty z łącznością z TS, teraz po przejściu na ładowarkę jest lepiej, ale może jeszcze mało?
P.S, Odpięcie LCD nie poprawia sytuacji
P.S.2 A może to kwestia ustawień w TS???