Warning: mysqli_select_db() expects parameter 1 to be mysqli, string given in /home/itstreet/public_html/classes/CMySQL.php on line 22

Warning: mysqli_query() expects at least 2 parameters, 1 given in /home/itstreet/public_html/classes/CMySQL.php on line 24
ITstreet -NodeMCU, LED & static IP
Preskoči na sadržaj

ITstreet postovi

NodeMCU, LED & static IP

Na mreži se može naći dosta tutorijala o tome kako programirati NodeMCU i kako upravljati modulima preko web pregledača. Svi su uglavnom sa dinamičkom IP adresom što kao tutorijal i nije loše ali za pravljenje stand alone projekta nije dobro. Svakim resetovanjem rutera se u tom slučaju IP adresa menja i dolazimo u situaciju da svaki put nakon resetovanja teba da priključimo NodeMCU sa računarom da bi videli novu IP adresu. Rešenje je u statičkoj IP adresi u okviru kućne mreže.

Sastojci za ovaj recept su:
NodeMCU v1.0
Dupont žice
Breadboard
LED

Povezivanje prema šemi. Pinovi se, naravno mogu koristiti po želji. Ja sam upotrebio D7 i D8, što će reći GPIO13 i GPIO15. Obratite samo pažnju prilikom povezivanja LED. Anoda je duža (+) a katoda je kraća (-).



Na redu je skeč. Standardno na početku dodajemo biblioteku za rad sa ESP8266 modulom. Dalje popunjavamo SSID i lozinku naše kućne mreže. Sledeće na redu su adrese. U prvom redu postavljamo statičnu IP adresu. Prilikom odabira ove adrese treba imati na umu limite rutera i broj priključenih wi-fi uređaja. Postavljamo gateway i subnet adrese prema našem ruteru. Dalje je definisanje izlaznih pinova i promenljivih koje će nam kasnije trebati. Na kraju pokrećemo WIfi server. U void setup sekciji postavljamo izlazne pinove na LOW, povezujemo modul na mrežu i sve to ispisujemo na serijal monitor. Serial.println(ip) bi morala da ispiše istu onu adresu koju smo postavili iznad. U void loop sekciji osim ispisivanja trenutnog stanja modula na serijal monitoru što je bitno za otklanjanje eventualnih grešaka, menjamo stanje izlaznih pinova. U zavisnosti šta je poslato preko web pregledača, menjamo svaki pin sa LOW na HIGH i obrnuto. Sledeće na redu je postavljanje html stranice. Za to koristimo client.println funkciju. Stranica se može formatirati po želji ali se mora voditi računa o upotrebi navodnika (").

-----------------------------------------------
#include <ESP8266WiFi.h>
 
const char* ssid = "xxxxxxxxxxxxxxx"; // ssid
const char* password = "xxxxxxxxxxxxx";// password
IPAddress ip(192, 168, 0, 107); //set static ip
IPAddress gateway(192, 168, 0, 1); //set getteway
IPAddress subnet(255, 255, 255, 0);//set subnet
 
int led1 = 13; // GPIO13
int led2 = 15; // GPIO15
int stat1;
int stat2;
WiFiServer server(80);
 
void setup() {
  Serial.begin(115200);
  delay(10);
 
  pinMode(led1, OUTPUT);
  digitalWrite(led1, LOW);
  pinMode(led2, OUTPUT);
  digitalWrite(led2, LOW);
 
  // Connection to wireless network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.config(ip, gateway, subnet);
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
 
  server.begin();
  Serial.println("Server started");
 
  // Print the IP address in serial monitor. It must be the same we entered above
  Serial.print("Type this address in URL to connect: ");
  Serial.print("http://");
  Serial.println(ip);
  Serial.println("/");
 
}
 
void loop() {
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
 
  // Read the first line of the request
  String request = client.readStringUntil('r');
  Serial.println(request);
  client.flush();
 
  // engine
 

  int stat1 = 0;
  if (request.indexOf("/led1=on") != -1)  {
    digitalWrite(led1, HIGH);
    stat1 = 1;
  }
  if (request.indexOf("/led1=off") != -1)  {
    digitalWrite(led1, LOW);
    stat1 = 0;
  } 
  int stat2 = 0;
  if (request.indexOf("/led2=on") != -1)  {
    digitalWrite(led2, HIGH);
    stat2 = 1;
  }
  if (request.indexOf("/led2=off") != -1)  {
    digitalWrite(led2, LOW);
    stat2 = 0;
  } 

 
  // Return the response
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("");
  client.println("<!DOCTYPE HTML>");
  client.println("<head>");
  client.println("<meta charset='UTF-8'>");
  client.println("<style>");
  client.println(" a {background:#F44336; color:white; padding:25px; text-decoration:none; display:inline-block; width:50%; margin: 20px; text-align:center;}");
  client.println("</style>");
  client.println("</head>");
  client.println("<html>");
  client.println("<div align="center">");
 /// led1 part. GUI, etc
  client.print("LED je sada ");
  if(stat1 == 1) {
    client.print("upaljena");
  } else {
    client.print("ugašena");
  }
  client.println("<br><br>");
  client.println("<a href="/led1=on" >Upali </a>");
  client.println("<a href="/led1=off">Ugasi </a><br />");
  client.println("<br><br>");

  ///led2 part. GUI, etc
  client.print("LED je sada ");
  //if(value == HIGH) {
    if(stat2 == 1){
    client.print("upaljena");
  } else {
    client.print("ugašena");
  }
  client.println("<br><br>");
  client.println("<a href="/led2=on">Upali </a>");
  client.println("<a href="/led2=off">Ugasi </a><br />"); 
  client.println("</div>");
  client.println("</html>");
 
  delay(1);
  Serial.println("Client disonnected");
  Serial.println("");
 
}
-----------------------------------------------

Kucanjem IP adrese u URL web pregledača dolazimo do html stranice koju smo napravili. Možemo joj pristupiti preko bilo kog računara, tableta, mobilnog telefona... dokle god koriste isti ruter. Bez obzira da li će se ruter iz nekog razloga restartovati, IP adresa će ostati ista.



Kao što vidite, u pitanju je prost projekat sa dosta prostora za proširivanje. Uz osnovno znanje web progamskih jezika se GUI može napraviti po želji. Ja sam kao primer dodao osnovni CSS, podršku za UTF8 slova, ali u principu se stranica može formatirati kako god želite. Za neki eventualni projekat koji će se koristiti na duže staze, trebalo bi razmisliti o responsivnom templejtu zbog ekrana mobilnih uređaja. Moj mali propust je ispisivanje stanja LED u okviru web pregledača, gde postoji mali bag kada se nakon prve upali druga LED. To zahteva upotrebu sesija i vreme za neophodno programiranje a moj dugo očekivani godišnji odmor je konačno došao. Budite slobodni da korigujete skeč po volji i da ispravke postavite ispod. Neću se ljutiti.

Toliko od mene do sledećeg skeča.

Ostavite poruku

Vaša mejl adresa neće biti objavljena.Označena polja su obavezna*