Pentru a putea programa o placa cu ESP32 cu mediul Arduino IDE trebuie urmaţi paşii prezentaţi în articolul lui Rui Santos numit Installing the ESP32 Board in Arduino IDE (Windows instructions).
Am constatat că această placa are 2 leduri (buit-in), unul la GPIO0 şi unul la GPIO27 (nu doar la GPIO27) aşa că am modificat programul original să imi aprindă aceste leduri, modificând şi logica de aprindere (inversă), acest program modificat de mine este ESP32_WebServer.ino.
După încărcarea programului, în ecranul de monitorizare serială găsim adresa IP a paginii web
accesând pagina vom vedea
Apăsând pe butonul de sus (GPIO0), se va aprinde ledul corespunzător, schimbându-se şi informaţia de pe ecran
,
apăsând şi pe al doilea buton (GPIO27), se aprinde şi cel de-al doilea
Pentru a rămâne doar led-ul din dreapta imaginii aprins (cel de la GPIO27), îl stingem pe cel din stânga (GPIO0)
Am făcut 2 filmuleţe, pentru înţelegea mai uşoară a modului de comandă şi funcţionare
In primul articol, am prezentat un sistem de control al unui led (releu, contactor, etc) de pe o pagina web protejata cu parola (1234), care are reconectare automata la reteau wi-fi, in caz de pierdere a legaturii cu acesta (oprire si repornire router, de exemplu). Pagina web este realizata folosind tehnica AJAX (pagina statica si doar o parte din informatii se schimba), doar ca in caz de intrerupere a alimentarii sau restartare automata in caz de blocare a paginii web, nu se memora starea led-ului si nici numarul de apasari (numarul de apasari il folosesc pentru a-mi da seama daca lucreaza bine), asa ca m-am gandit sa folosesc memoria EEPROM a integratului ESP8266. Am gasit la http://www.esp8266.com/wiki/doku.php?id=arduino-docs partea cu libraria EEPROM si am vazut ca sunt mici diferente fata de cea clasica pentru Arduino, in sensul ca trebuie sa-i spun cate memorie EEPROM folosesc (pasul 1) si sa-i spun clar ca trebuie sa scrie ceva in memorie (pas 2):
Ca si in cazul anterior, led-ul din dreapta aprins sau clipind indica o problema la conectarea in reteaua wi-fi.
Am facut 2 poze, cu cele 2 cazuri, led controlat aprins si apoi stins si langa un telefon cu pagian web de control pe care se vede si starea ledului (verde - aprins si rosu - stins): - led comandat aprins (cel din stanga)
Placa WeMos D1 are forma unei placi Arduino Uno, cu interfata USB (micro USB) doar "inima" este un ESP8266EX cu conectare Wi-Fi, care are doar 11 intrari/iesiri digitale si doar una analogica, tensiunea de lucru si comenzi/intrari fiind la 3,3V dupa cum am prezentat si in articolul Prezentare si stocare date pe pagina ThingSpeak (4) - folosind placa WeMos D1.
Daca folosesc programul Arduino IDE pentru a programa aceasta placa WeMos D1, corespondenta pinilor este
iar in program (in versiune folosita de mine 1.6.5) gasom placa WeMos D1 cu urmatoarele informatii:
Pentru a aparea placile cu ESP8266, trebuie intrat in FILE -> PREFERENCES si sa introduceti un link pentru a activa si acesta placi:
dupa care in TOOLS -> BOARD->BOARDS MANAGER
vede si date suplimentare despre placile care se pot incarca cu acest program
Pagina web este construita folosind tehnica AJAX (pagina statica si doar o parte din informatii se schimba), are si parola de acces (1234).
Dupa ce am facut mici modificari ale sketch-ului de acolo, am ajuns la versiunea led_controlled_from_webpage.ino unde am un led rosu (direct) pus intre GPIO5 (D15/SCL) si GND; de asemenea am folosit un port anume 8087 si tot parola 1234 pentru a activa butonul de comanda pornit/oprit. pe pagina se vede si starea led-ului.
Placa a fost in teste cam o luna si, uneori, din cauze externe (intrerupere tensiune alimentare, deconectare router de la net, etc), pagina web creata de WeMos era indisponibila.
Dintr-o discutie cu Mircea Craciun, legata de un alta aplicatie a unei placi cu ESP8266 si aceeasi problema, am aflat un "post" tot de pe forumul ESP8266, care dadea o solutie de reconectare automata la reteaua wi-fi a placii cu ESP8266, asa ca am implementat-o si eu in sketch-ul meu
Am conectat si un led de eroare, intre GPIO12 (D12/MISO) si GND.
In schema desenata sunt inseriate rezistente de 330 ohmi cu fiecare led, pentru protejarea placii WeMos, asa ca va recomanda sa le montati.
La pornirea placii WeMos, ledul rosu clipeste pana se conecteaza la reteaua wi-fi pentru care are datele, apoi ramane stins cat totul este in regula, daca se pierde legatura cu router-ul, ledul incepe sa clipeasca pana se reconecteaza...
Am facut si 2 filmulete pentru a intelege mai usor cum se dau comenzi si cum reactioneaza pagina si led-ul (consumatorul, etc):
Fata de articolul anterior, in care am folosit o placa Arduino Mega si o placa de retea de tip shield cu W5100, care creeea pagina de fiecare data, acum folosesc stilul Ajax, adica pagina web este statica si se schimba periodic sau la cerere parti din pagina, astfel placa de retea este putin utilizata si apar cazuri de "blocare" mai rar sau.. deloc... Schema folosita este aceeasi:
doar ca pagina, respectiv fisierul index.html este memorat pe cardul micro SD, deci folosesc incriptorul de pe placa de retea, cum este prezentat in articolul SD Card Web Server I/O, care avea o interfata de genul:
Eu am incercat sa folosesc stilul anterior:
iesindu-mi:
apoi, am mai lucrat la pagina, care reseteaza din ora in ora placa Arduino si placa de retea (prin legarea pinului D7 la pinul RESET); pagina este asa:
Acolo se foloseste o placa Arduino cu o placa de retea tip shield, care are si cititor de carduri SD (versiunea oficiala cu W5100). Pe card se va incarca fisierul index.htm care include partea de indicatoare, iar placa Arduino trimite din cand in cand, doar daca e solicitata, date care sunt puse in pagina..
Eu am adaptat sketch-ul si fisierul sa primesc date despre temperatura si umiditatea relativa a aerului citite de un senzor DHT22 (AM12302):
poze pierdute repostate in 06.10.2015 Acum ceva timp am folosit placa de retea cu cipset W5100 de tip shield (se aseaza direct pe Arduino Uno, fara alte legaturi) pentru a avea informatii in retea despre temperatura si umiditate (vezi articolul Webserver cu informatii despre temperatura si umiditate oferite de senzorul DHT11), apoi am scris date pe un card SD (vezi Memorare date pe cardul micro SD), acum voi aprinde si stinge un LED. Fizic, placa de retea "shield" cu W5100, arata asa:
La montajul meu am folosit un led multicolor, comandand doar led-ul verde, care e conectat la D9 nefolosit de placa de retea, iar cel rosu si cel albastru sunt conectate pe pini folositi si de placa de retea (D10 si D11):
Starile sunt:
- led verde stins:
- led verde aprins:
Pentru comanda am folosit un telefon conectat prin wireless la retea... dar merge foarte bine si de pe calculator, vedeti in filmuletul LED controlat prin retea sau wireless unde este o varianta simplificata de pagina, doar buton de aprindere si buton de stingere LED, cu indicare stare LED si linkuri la pagina autorului si la a mea:
Poze cu cele 2 stari si pagina nefinisata:
- led verde stins:
- led verde aprins:
Pentru a stii cum e configurata reteaua, se cauta IP-ul calculatorului fix, cu care se face si incarcarea sketch-ului, gasind ca IP-ul este 192.168.2.17, Subset Mask e 255.255.255.1 si Default gateway este 192.168.2.1.. pentru placa de retea folosita la Arduino o sa aloc 192.168.2.178...
Sketch-ul folosit de mine este:
/* Created by Rui Santos Visit: http://randomnerdtutorials.com for more arduino projects Modified by Nicu Florica aka niq_ro visit http://nicuflorica.blogspot.ro/ or http://arduinotehniq.blogspot.com or http://www.tehnic.go.ro Arduino with Ethernet Shield */
#include <SPI.h>
#include <Ethernet.h>
int led = 9;
int pos = 0;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac addressbyte ip[] = { 192, 168, 2, 178 }; // ip in lan (that's what you need to use in your browser. ("192.168.1.178")byte gateway[] = { 192, 168, 2, 1 }; // internet access via routerbyte subnet[] = { 255, 255, 255, 0 }; //subnet maskEthernetServer server(80); //server port String readString;
voidsetup() {
// Open serial communications and wait for port to open:Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
pinMode(led, OUTPUT);
// start the Ethernet connection and the server:Ethernet.begin(mac, ip, gateway, subnet);
server.begin();
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}
voidloop() {
// Create a client connectionEthernetClient client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();
//read char by char HTTP requestif (readString.length() < 100) {
//store characters to string
readString += c;
//Serial.print(c);
}
//if HTTP request has endedif (c == '\n') {
Serial.println(readString); //print to serial monitor for debuging
client.println("HTTP/1.1 200 OK"); //send new page
client.println("Content-Type: text/html");
client.println();
client.println("<HTML>");
client.println("<HEAD>");
client.println("<meta name='apple-mobile-web-app-capable' content='yes' />");
client.println("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />");
client.println("<link rel='stylesheet' type='text/css' href='http://randomnerdtutorials.com/ethernetcss.css' />");
client.println("<TITLE>Random Nerd Tutorials Project</TITLE>");
client.println("</HEAD>");
client.println("<BODY>");
client.println("<H2>Random Nerd Tutorials Project</H1>");
client.println("<hr />");
client.println("<br />");
client.println("<H1>Arduino with Ethernet Shield</H2>");
client.println("<br />");
client.println("<a href=\"/?button1on\"\">Turn On LED</a>");
client.println("<a href=\"/?button1off\"\">Turn Off LED</a><br />");
client.println("<br />");
client.println("<br />");
client.println("<H2>");
if (readString.indexOf("?button1on") >0){
client.print("<p>LED is ON</p>");
}
if (readString.indexOf("?button1off") >0){
client.print("<p>LED is OFF</p>");
}
client.println("<br />");
client.println("<br />");
client.println("<H4>");
client.println("<p>Created by Rui Santos. Visit <a href=http://randomnerdtutorials.com target=blank>http://randomnerdtutorials.com</a> for more projects!</p>");
client.println("<br />");
client.println("<p>Tested by Nicu Florica aka niq_ro. Visit <a href=http://www.tehnic.go.ro target=blank>http://www.tehnic.go.ro</a> for more projects!</p>");
client.println("<br />");
client.println("</BODY>");
client.println("</HTML>");
delay(1);
//stopping client
client.stop();
//controls the Arduino if you press the buttonsif (readString.indexOf("?button1on") >0){
digitalWrite(led, HIGH);
// client.print("<p>LED is ON</p>");
}
if (readString.indexOf("?button1off") >0){
digitalWrite(led, LOW);
// client.print("<p>LED is OFF</p>");
}
//clearing string for next read
readString="";
}
}
}
}
}