|
SK LABS Raspberry Pi i drugi SBC (Single-Board Computer), Arduino, hardver, softver, projekti, diskusije... |
|
Alatke vezane za temu | Vrste prikaza |
21.1.2019, 16:46 | #1 |
Starosedelac
Član od: 9.7.2010.
Lokacija: N/A
Poruke: 1.795
Zahvalnice: 750
Zahvaljeno 536 puta na 369 poruka
|
IoT termostat (Arduino + ESP-01)
Nedavno sam ugradio u sobu jedan panelni (u narodu poznat kao norveški) radijator. I ideja je da ga nekako automatizujem da se uključi kada mi odgovara. (pre buđenja, pre dolaska kući i slično)
Za ovaj konkretan model postoji da se kupi već gotov modul sa termostatom i ugrađenim WiFi-om koji radi baš to ali košta ~60e. Korišćeni hardver: Arduino Uno/Nano ~ $3.25/$1.8 ESP-01 ~ $1.7 SG90 ~ $1.1 TS1117b, par otpornika, jedan keramički i jedan elektrolitski kondenzator ~ 100 din Ideja je da se podigne http server na arduino koji komunicira sa ruterom preko WiFi modula i da se na websajtu zadaje pozicija, tj temperatura na koju će servo da odvrne potenciometar temperature termostata na radijatoru. Izgled termostata: Za komunikaciju arduina sa esp korišćena je biblioteka AltSoftSerial koja koristi pin 8 za tx i pin 9 za rx. Za rad sa servom je korišćen ServoTimer2 da ne bi došlo do konflikta sa AltSoftSerial kao što bi bilo da je korišćena obična Servo biblioteka. Jedino je potrebna mala modifikacija unutar ServoTimer2.h. Iz nekog razloga su min i max pozicije takve da servo koji inače ide do 180 stepeni ograničen na oko 140 stepeni. Zato sam min i max konstante promenio na 544 i 2400. Povezivanje je jednostavno. Za esp sam već naveo a servo je dovoljno ubosti u bilo koji pwm digitalni pin. Ni servo ni esp ne treba napajati preko arduina, zato što mogu da povuku više struje nego što arduino može da da. Servo napajati direktno na 5v, a esp preko stabilizatora napona tc1117b na 3.3v. Bilo bi ispravno da se za vezu arduino -> esp koristi otpornički razdelnik napona sa 5v na 3.3v, ali ja nisam imao problema sa direktnom vezom. U sledećoj poruci ću da ubacim kod i da iskomentarišem bitnije delove. |
Sledeći korisnik se zahvaljuje korisniku Luka Filipovic na korisnoj poruci: | ||
Dekip (22.1.2019) |
22.1.2019, 1:02 | #2 |
V.I.P. Recenzent
Član od: 8.11.2008.
Lokacija: XV535
Poruke: 3.198
Zahvalnice: 767
Zahvaljeno 1.024 puta na 568 poruka
|
Re: IoT termostat (Arduino + ESP-01)
Nano $1,8 + esp01 $1,7 > nodemcu $2,5
Baš me interesuje šta si napravio. I drago mi je da se neko setio da postavi ovde svoj projekat. Forum Sveta Kompjutera ispade najgori što se tiče ove tematike, od sve dece. Neki noname forumi kod nas imaju višestruko više postova o mikrokontrolerima i SBC od foruma naj-naj časopisa u zemlji. Daj da vidimo šta si napravio. |
22.1.2019, 3:46 | #3 |
Starosedelac
Član od: 9.7.2010.
Lokacija: N/A
Poruke: 1.795
Zahvalnice: 750
Zahvaljeno 536 puta na 369 poruka
|
Re: IoT termostat (Arduino + ESP-01)
Za nodemcu sam kasno shvatio da sam mogao dosta lakse, a i jeftinije sa njim da odradim ovo.
Isto tako sam mogao da koristim biblioteku <ESP8266WiFi.h> i da olaksam sebi zivot, ali sam vec poceo ovako i morao sam da ga izguram do kraja. Kod:
#include <string.h> #include <EEPROM.h> #include <AltSoftSerial.h> #include <avr/pgmspace.h> #include <ServoTimer2.h> avr/pgmspace.h omogucava snimanje nekih promenljivih u flash memoriju arduina sto oslobadja prostor za radnu memoriju prilikom koriscenja brda teksa. u ovom slucaju html. Kod:
const char html_0[] PROGMEM = "Content-Type: text/html\r\nConnection: keep-alive\r\n\r\n"; const char html_1[] PROGMEM = "<!DOCTYPE html>\r\n<html><head><link rel=\"icon\" href=\"data:,\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">"; const char html_2[] PROGMEM = "<link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css\" integrity=\"sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm\""; const char html_3[] PROGMEM = "crossorigin=\"anonymous\"></head><body><div class=\"container\"><form method=\"post\"><div class=\"form-group\"><label for=\"poz\">Pozicija: <output id =\"pozout\" name=\"points\">"; const char html_4[] PROGMEM = "</output></label><input type=\"range\" id=\"poz\" class=\"form-control px-0\" name=\"points\" min=\"5\" max=\"28\" oninput=\"pozout.value = poz.value\" value=\""; const char html_5[] PROGMEM = "\"></div><div class=\"form-group\"><label for=\"pass\""; const char html_6[] PROGMEM = "</label><input type=\"password\" class=\"form-control\" name=\"psw\" id=\"pass\" placeholder=\"Password\"></div>"; const char html_7[] PROGMEM = "<div class=\"form-check\"><button type=\"submit\" class=\"btn btn-primary\">Podesi</button></div></form></div></body></html>"; const char html_8[] PROGMEM = " class=\"text-danger\">Bad password, please try again"; const char html_9[] PROGMEM = " class=\"text-success\">Password good, all set!"; const char html_10[] PROGMEM = ">Enter password"; const char* const string_table[] PROGMEM = {html_0, html_1, html_2, html_3, html_4, html_5, html_6, html_7, html_8, html_9, html_10}; Kod:
AltSoftSerial espSerial; char buffer[200]; ServoTimer2 servo; int address = 0; // za eeprom int pos; int temppos; const char line[] = "-----\r"; const char pass[] = "password"; const int timeconst = 1000; char reply[20]; char ipAddress [20] = "0.0.0.0"; char mcAddress [20]; char temp[5]; bool havePass; bool goodPass; Kod:
void setup() { pos = EEPROM.read(address); // cita se pozicija iz eeprom memorije servo.attach(11); servo.write(544+80.6956521739*(28-pos)); // linearna transformacija pozicije serva na temperaturu potenciometra Serial.begin(38400); //prethodno je esp podesen da radi sa baudrate 38400 espSerial.begin(38400); //softserial ne dozvoljava baudrate veci od 38400, podrazumevano za esp je 115200 espSerial.print("AT+RST\r\n"); getReply( 2*timeconst ); espSerial.print("AT+CWMODE=1\r\n"); getReply( 3*timeconst ); espSerial.print("AT+CWJAP=\"SSID\",\"PASSWORD\"\r\n"); getReply( 10*timeconst ); espSerial.print("AT+CIFSR\r\n"); getAdr(ipAddress); Serial.println(ipAddress); getAdr(mcAddress); Serial.println(mcAddress); getReply( 1*timeconst ); espSerial.print("AT+CIPMUX=1\r\n"); getReply( 1*timeconst ); espSerial.print("AT+CIPSERVER=1,80\r\n"); getReply( 1.5*timeconst ); if (strcmp(ipAddress, "0.0.0.0") ==0) reset(); } Kod:
void loop() { if (espSerial.available()) if (haveText("IPD")) sendHtml(); delay (100); } Ako jeste, pokrece se funkcija sendHtml(). memorije. Poslednja ispravka: Luka Filipovic (22.1.2019 u 4:24) |
22.1.2019, 3:48 | #4 |
Starosedelac
Član od: 9.7.2010.
Lokacija: N/A
Poruke: 1.795
Zahvalnice: 750
Zahvaljeno 536 puta na 369 poruka
|
Re: IoT termostat (Arduino + ESP-01)
Kod:
void sendHtml() { havePass = goodPass = false; if (haveText("points=")) { havePass = true; haveText("&"); temppos = atoi(reply); haveText("psw="); getReply(20); if (strcmp(reply, pass) == 0) { goodPass = true; pos = temppos; EEPROM.write(address, pos); servo.write(544+80.6956521739*(28-pos)); } espSend("HTTP/1.1 201 Created\r\n"); } else espSend("HTTP/1.1 200 OK\r\n"); getString(0); if (espSend(buffer) == -1) return; delay(50); getString(1); if (espSend(buffer) == -1) return; getString(2); if (espSend(buffer) == -1) return; getString(3); if (espSend(buffer) == -1) return; itoa( pos, temp, 10); strcpy(buffer, temp); if (espSend(buffer) == -1) return; getString(4); if (espSend(buffer) == -1) return; itoa( pos, temp, 10); strcpy(buffer, temp); if (espSend(buffer) == -1) return; getString(5); if (espSend(buffer) == -1) return; if (havePass && !goodPass) { getString(8) ; if (espSend(buffer) == -1) return; } if (havePass && goodPass) { getString(9) ; if (espSend(buffer) == -1) return; } if (!havePass) { getString(10); if (espSend(buffer) == -1) return; } getString(6); if (espSend(buffer) == -1) return; getString(7); if (espSend(buffer) == -1) return; espSerial.print( "AT+CIPCLOSE=0\r\n" ); getReply( timeconst ); } Za sad postoje samo dva podatka - pozicija i password. Ukoliko nalazi da je poslata pozicija, smesta je u temppos sve dok ne potvrdi autenticnost passworda. Ukoliko je ispravan, temppos se smesta u pos, pos u eeprom i servo dobija novu poziciju. Ukoliko nije ispravan password, pomocu dve bool promenljive ce se ispisati greska na web stranici. Posle toga se samo salju paketi htmla uz poneko ubacivanje vrednosti pozicije koja mora da se konveruje u string da bi mogla da se posalje kao html. Kod:
void getAdr(char *adr) { char c; int i = 0; haveText("\""); long int time = millis(); while ( ((time + 1000) > millis())) { while (espSerial.available()) { c = espSerial.read(); if (c == '\"') return; adr[i++] = c; } } } Kod:
bool haveText(const char *text) { char c; int i = 0; int j = 0; long int time = millis(); while ( ((time + 1000) > millis())) { while (espSerial.available()) { c = espSerial.read(); reply[j % 20] = c; j++; Serial.print(c); if (text[i] == c) i++; else { if (c == text[1]) i = 1; else i = 0; } if (i == strlen(text)) { reply[(j - 1) % 20] = 0; return true; } } } reply[i % 20] = 0; return false; } Kod:
int getReply(int wait) { bool isEnd = false; int i = 0; long int time = millis(); while ( ((time + wait) > millis()) && !isEnd) { while (espSerial.available()) { char c = espSerial.read(); Serial.print(c); reply[i % 20] = c; i++; if (reply[(i - 5) % 20] == 'E' && reply[(i - 4) % 20] == 'R' && reply[(i - 3) % 20] == 'R' && reply[(i - 2) % 20] == 'O' && reply[(i - 1) % 20] == 'R') return -1; if (reply[(i - 4) % 20] == 'F' && reply[(i - 3) % 20] == 'A' && reply[(i - 2) % 20] == 'I' && reply[(i - 1) % 20] == 'L') return -1; if (reply[(i - 2) % 20] == 'O' && reply[(i - 1) % 20] == 'K') { isEnd = true; break; } } reply[i % 20] = 0; } Serial.println(); Serial.println(line); } Ako je doslo do greske vraca -1. Kod:
int espSend(const char *html) { int lenHtml; char command[20]; char temp[5]; lenHtml = strlen( html ); strcpy(command, "AT+CIPSEND=0,"); itoa( lenHtml, temp, 10); strcat(command, temp); strcat(command, "\r\n"); espSerial.print(command); if (getReply( timeconst * 10 ) == -1) return -1; espSerial.print(html); if (getReply( timeconst * 10 ) == -1) return -1; } Kod:
void getString(int i) { strcpy_P(buffer, (char*)pgm_read_word(&(string_table[i]))); } |
22.1.2019, 4:00 | #5 |
Starosedelac
Član od: 9.7.2010.
Lokacija: N/A
Poruke: 1.795
Zahvalnice: 750
Zahvaljeno 536 puta na 369 poruka
|
Re: IoT termostat (Arduino + ESP-01)
Snimak kako to izgleda u praksi https://drive.google.com/open?id=1jo...85k1qVLZorHh2t
Izgled web stranice Spoiler za pocetna:
Spoiler za los pass:
Spoiler za dobar pass:
Spoiler za kolo:
Spoiler za servo:
Poslednja ispravka: Luka Filipovic (22.1.2019 u 4:49) |
22.1.2019, 4:23 | #6 |
Starosedelac
Član od: 9.7.2010.
Lokacija: N/A
Poruke: 1.795
Zahvalnice: 750
Zahvaljeno 536 puta na 369 poruka
|
Re: IoT termostat (Arduino + ESP-01)
Sledeci korak je da napravim plocicu na koju ce da idu esp, senzor, neke led diodice, arduino nano i adapter na 5v. Treba da stigne i senzor za temperaturu i onda da sve to spakujem u kutijicu koja ce da stoji iza radijatora.
Kod nije savrsen, mislim da je bezbednost najveci problem, ali ako primetim da se neko igrao sa temperaturom, najmanji mi je problem da ga iscupam odatle . Planiram da ubacim i tajmer pomocu koga cu moci da zadam nakon kojeg vremena da odradi nesto sa pozicijom, ali to tek kada budem imao vremena. Desava se da nece da se konektuje iz prve na sajt vec moram da refreshujem stranicu i onda uvek proradi. Sajtu mogu da pristupim i van lokalne mreze tako sto kucam ipadresa: port. Ovo sam omogucio pomocu opcije Port Range Forwarding na modemu. Obavezno stavite neki nestandardni port, jer sa defaulth portom (80) mi se nakacio neki kinez koji ne non stop spamovao sajt nekim requestovima. Nemam staticku ip adresu ali sbb drzi jednu istu duze vreme tako da to nije problem |
23.1.2019, 21:03 | #7 |
V.I.P. Recenzent
Član od: 8.11.2008.
Lokacija: XV535
Poruke: 3.198
Zahvalnice: 767
Zahvaljeno 1.024 puta na 568 poruka
|
Re: IoT termostat (Arduino + ESP-01)
Ja bih ovo rešio sa NodeMCU + Blynk app
Imaš oblake i baš te zabole za web. A možeš i da izvučeš widget na telefonu samo za to. U svakom slučaju ako treba pomoć... |
31.1.2019, 11:44 | #8 | |
Starosedelac
Član od: 9.7.2010.
Lokacija: N/A
Poruke: 1.795
Zahvalnice: 750
Zahvaljeno 536 puta na 369 poruka
|
Re: IoT termostat (Arduino + ESP-01)
Citat:
Ovo trenutno mi daje mogucnost da pristupim sa bilo kakvog uredjaja, dok me blynk ogranicava na aplikaciju. Mozda ako budem realizovao jos nesto po kuci na slican nacin pa bih onda presao na blynk gde bih sve to objedinio. Spoiler za slika:
Stigli su kutijica od $2 i nano. Kutijica je jako kvalitetna i super za slicne projekte. Ostalo mi je samo da napravim plocicu na kojoj ce da bude ESP sa stabilizatorom napona i otpornicima za diode, ali to ce morati da saceka da prodje ispitni rok. |
|
31.1.2019, 20:03 | #9 |
V.I.P. Recenzent
Član od: 8.11.2008.
Lokacija: XV535
Poruke: 3.198
Zahvalnice: 767
Zahvaljeno 1.024 puta na 568 poruka
|
Re: IoT termostat (Arduino + ESP-01)
He-he
Razmišljamo na isti način. |
31.1.2019, 23:21 | #10 |
Član
Član od: 24.9.2012.
Poruke: 489
Zahvalnice: 103
Zahvaljeno 271 puta na 151 poruka
|
Re: IoT termostat (Arduino + ESP-01)
Svaka cast, Luka, samo napred!
Jeste da je kod, koliko vidim, malo nezgrapan i da se to moglo elegantnije napisati ali to ce da nadodje sa vremenom. Mozes li postaviti link na ovo plasticno kuciste? Nisam imao priliku da vidim model sa prekidacem. |
31.1.2019, 23:56 | #11 |
Starosedelac
Član od: 9.7.2010.
Lokacija: N/A
Poruke: 1.795
Zahvalnice: 750
Zahvaljeno 536 puta na 369 poruka
|
Re: IoT termostat (Arduino + ESP-01)
Ista kao dekipova samo sto sam prekidac i diode ja ugradio.
Kod jeste veoma ruzan i nabudzen samo da radi. Da sam se opredelio na biblioteku esp8266wifi ovo bi bilo daleko jednostavnije. Ali zasto jednostavno kad moze komplikovano? |
1.2.2019, 11:49 | #12 |
Član
Član od: 24.9.2012.
Poruke: 489
Zahvalnice: 103
Zahvaljeno 271 puta na 151 poruka
|
Re: IoT termostat (Arduino + ESP-01)
ma vidim da su mi nesto vrlo slicne ali rekoh, ko zna Kinezima...
|
1.2.2019, 19:11 | #13 |
V.I.P. Recenzent
Član od: 8.11.2008.
Lokacija: XV535
Poruke: 3.198
Zahvalnice: 767
Zahvaljeno 1.024 puta na 568 poruka
|
Re: IoT termostat (Arduino + ESP-01)
Zapravo, ove kutije nisu baš jeftine. Ti kod nas po radnjama možeš naći i veće OG dozne za iste prare. Bez providnog poklopca, doduše. I ne čekaš meec dana.
|
1.2.2019, 19:58 | #14 |
Starosedelac
Član od: 9.7.2010.
Lokacija: N/A
Poruke: 1.795
Zahvalnice: 750
Zahvaljeno 536 puta na 369 poruka
|
Re: IoT termostat (Arduino + ESP-01)
Pa dobro, ali nije vece uvek bolje .
U silkenu za slicne pare imaju vece plastice kutije ali dosta tanje i losijeg kvaliteta + nema providne strane. |
14.2.2019, 16:08 | #15 |
Starosedelac
Član od: 9.7.2010.
Lokacija: N/A
Poruke: 1.795
Zahvalnice: 750
Zahvaljeno 536 puta na 369 poruka
|
Re: IoT termostat (Arduino + ESP-01)
Zavrsena je plocica |
14.2.2019, 16:50 | #16 |
V.I.P. Recenzent
Član od: 8.11.2008.
Lokacija: XV535
Poruke: 3.198
Zahvalnice: 767
Zahvaljeno 1.024 puta na 568 poruka
|
Re: IoT termostat (Arduino + ESP-01)
Flomaster i sona kiselina?
|
14.2.2019, 16:52 | #17 |
Starosedelac
Član od: 9.7.2010.
Lokacija: N/A
Poruke: 1.795
Zahvalnice: 750
Zahvaljeno 536 puta na 369 poruka
|
Re: IoT termostat (Arduino + ESP-01)
Laserski stampac, masni transfer papir i natrijum persulfat iz kelca jer hidrogen 30% ne mogu nigde da nadjem.
Ume to da ispadne dosta lepse nego na ovom sad, ovde sam ga malo zbrzao |
14.2.2019, 17:31 | #18 |
V.I.P. Recenzent
Član od: 8.11.2008.
Lokacija: XV535
Poruke: 3.198
Zahvalnice: 767
Zahvaljeno 1.024 puta na 568 poruka
|
Re: IoT termostat (Arduino + ESP-01)
Čekamo krajnji rezultat.
|
14.2.2019, 22:58 | #19 | |
Član
Član od: 24.9.2012.
Poruke: 489
Zahvalnice: 103
Zahvaljeno 271 puta na 151 poruka
|
Re: IoT termostat (Arduino + ESP-01)
Citat:
nesto ovako? https://www.youtube.com/watch?v=cVhSCEPINpM |
|
14.2.2019, 23:49 | #20 | |
Starosedelac
Član od: 9.7.2010.
Lokacija: N/A
Poruke: 1.795
Zahvalnice: 750
Zahvaljeno 536 puta na 369 poruka
|
Re: IoT termostat (Arduino + ESP-01)
Citat:
Sa peglom ne sme da se pretera, jer se papir zalepi za plocicu i tesko se skida a da se ne osteti stampa, a ako se prerano zavrsi onda se ne prenese lepo. Imao sam i problem sa nekim pertinaks plocicama da ne podnesu toplotu pa dodje do nekih deformacija, dok sa vitroplast nikad nisam imao problem |
|
Bookmarks sajtovi |
Alatke vezane za temu | |
Vrste prikaza | |
|
|
Slične teme | ||||
tema | temu započeo | forum | Odgovora | Poslednja poruka |
Arduino mega 2560 i Win 7 64 bit | miloš1968 | SK LABS | 31 | 27.1.2019 15:09 |
Arduino kontrola rotacije | JUGA_v | SK LABS | 11 | 23.8.2017 10:54 |
DHT22, 1602 LCD i Arduino UNO | Dekip | SK LABS | 23 | 11.8.2017 14:43 |
Arduino - Generalna diskusija | Dekip | SK LABS | 19 | 28.6.2017 23:42 |
pomoc oko izbora: Raspberry pi ili ARDUINO | Zmajodkaraburme | Šta da kupim? | 2 | 4.2.2017 10:30 |