Prikaz jedne poruke
Stara 22.1.2019, 3:46   #3
Luka Filipovic
Starosedelac
 
Član od: 9.7.2010.
Lokacija: N/A
Poruke: 1.795
Zahvalnice: 750
Zahvaljeno 536 puta na 369 poruka
Određen forumom 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>
EEPROM.h je tu da bih poziciju serva mogao da sacuvam u stalnu memoriju. U slucaju neocekivanog restarta, servo se vraca na prethodnu poziciju.
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};
To je veb stranica koja se salje, podeljena u vise stringova.

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;
Ovde nema nista konkretno da se napiste, neke promenljive koje su koriscene dalje u kodu.

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();
}
Esp se povezuje na kucnu wifi mrezu kao klijent, ukoliko je ip ostao 0.0.0.0 znaci da konekcija iz nekog razloga nije uspela i poziva se funkcija reset koja pocinje ponovno izvrsavanje celog koda.

Kod:
void loop() {
  if (espSerial.available())
    if (haveText("IPD")) sendHtml();
  delay (100);
}
Jednostavni glavni loop koji samo proverava ima li icega na serijskoj vezi sa ESPom i ako ima da li pronalazi tekst "IPD" koji oznacava da je neki klijent poslao zahtev serveru.
Ako jeste, pokrece se funkcija sendHtml().
memorije.

Poslednja ispravka: Luka Filipovic (22.1.2019 u 4:24)
Luka Filipovic je offline   Odgovor sa citatom ove poruke