Ir ao conteúdo
  • Cadastre-se

ESP8266 - A Pequena Maravilha para Comunicação WIFI


aphawk

Posts recomendados

Estou testando o ESP32, consegui compilar alguns exemplos com o Arduino IDE, mas parece que as bibliotecas para ele ainda estão um pouco pobres, por exemplo, as bibliotecas do ESP8266 como ESP8266HTTPClient.h, ESP8266WiFi.h, ESP8266WebServer.h, Tiker.h e outras não estão compilando (sendo aceitas pelo Arduino IDE compilando para ESP32), e até o momento não estou achando alternativas (imagino que devem existir para algumas sem que precise reescrever totalmente os programas).

 

Acho que ainda tenho muito que aprender, mas como isto foi a minha primeira tentativa no ESP32, ainda tem muita água para rolar, e eu ainda nem entendo direito os exemplos.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Estou começando a brincar com o ESP com o I2C: comprei um MPU-6050 *acelerômetro), mas não quer funcionar =/

Dá esse erro (mas no final acaba compilando):

 

C:\Users\Guilherme\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\Wire/Wire.h: In function 'void loop()':

C:\Users\Guilherme\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\Wire/Wire.h:70:13: note: candidate 1: uint8_t TwoWire::requestFrom(int, int, int)

     uint8_t requestFrom(int, int, int);

             ^

C:\Users\Guilherme\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\Wire/Wire.h:64:12: note: candidate 2: size_t TwoWire::requestFrom(uint8_t, size_t, bool)

     size_t requestFrom(uint8_t address, size_t size, bool sendStop);

            ^

C:\Users\Guilherme\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\Wire/Wire.h:70:13: note: candidate 1: uint8_t TwoWire::requestFrom(int, int, int)

     uint8_t requestFrom(int, int, int);

             ^

C:\Users\Guilherme\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\Wire/Wire.h:64:12: note: candidate 2: size_t TwoWire::requestFrom(uint8_t, size_t, bool)

     size_t requestFrom(uint8_t address, size_t size, bool sendStop);

            ^

 

O código que estou usando, é esse:

 

#include<Wire.h>
 
//Endereco I2C do MPU6050
const int MPU=0x68;  //pino aberto 0X68 , pino ligado em 3,3V 0x69

//Variaveis globais
int acelX,acelY,acelZ,temperatura,giroX,giroY,giroZ;

//configurações iniciais
void setup()
{

  Serial.begin(9600); 		//inicia a comunicação serial
  Wire.begin();                 //inicia I2C
  Wire.beginTransmission(MPU);  //Inicia transmissão para o endereço do MPU
  Wire.write(0x6B);             
   
  //Inicializa o MPU-6050
  Wire.write(0); 
  Wire.endTransmission(true);
}

//loop principal
void loop()
{
  Wire.beginTransmission(MPU);      //transmite
  Wire.write(0x3B);                 // Endereço 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);     //Finaliza transmissão
  
  Wire.requestFrom(MPU,14,true);   //requisita bytes
   
  //Armazena o valor dos sensores nas variaveis correspondentes
  acelX=Wire.read()<<8|Wire.read();  //0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)     
  acelY=Wire.read()<<8|Wire.read();  //0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  acelZ=Wire.read()<<8|Wire.read();  //0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  temperatura=Wire.read()<<8|Wire.read();  //0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
  giroX=Wire.read()<<8|Wire.read();  //0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  giroY=Wire.read()<<8|Wire.read();  //0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
  giroZ=Wire.read()<<8|Wire.read();  //0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
   
  //Envia valores lidos do acelerômetro
  Serial.print("Acel:"); 
  Serial.print("  X:");Serial.print(acelX);
  Serial.print("\tY:");Serial.print(acelY);
  Serial.print("\tZ:");Serial.print(acelZ);
  
  //Envia valores lidos do giroscópio
  Serial.print("\tGiro:"); 
  Serial.print("  X:");Serial.print(giroX);
  Serial.print("\tY:");Serial.print(giroY);
  Serial.print("\tZ:");Serial.print(giroZ);
   
  //Envia valor da temperatura em graus Celsius
  Serial.print("\tTemperatura: ");    Serial.println(temperatura/340.00+36.53);
   
  //Aguarda 500 ms
  delay(500);
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Papibakigrafo  Tenho um destes mas ainda não testei (guardado na gaveta). Fico imaginando que seja possível, com um pouco de inteligência (muita na verdade) e uma programação competente, fazer um GPS off-line usando um destes para que o geo-posicionamento continue funcionando mesmo em ambientes internos em que o GPS não tenha sinal.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Pessoal já começo o dia torcendo o rabo pro Vinicius Kruz pois, hehe, infelizmente ele tinha razão sobre uma coisa: A struct do renato Aloi é uma bela duma tristeza.

Usei e abusei dela, mas tive que fazer um código um pouquinho deferente e a struct ficou maluca X_X. To fazendo tudo num laço for mesmo e que se f*** e ripa na xulipa e rock na veia!!! Xd

 

agora, consegui fazer meu "carrinho" que é um primeiro passo e colocar umas senhas nele, pra que ninguém acesse o wi-fi do carrinho e fique fussando nele. Falta a parte de sensores e, se eu quiser alterar pra drones, implementar giroscópios e os karaleo, mas a parte de acionar os motores pra ele andar ta tudo em riba^^

vou mandar os layouts das telas que fiz, e o código, que falta implementar um botão físico pra dar reset nele caso eu  "esqueça" a senha, mas isso é o que menos importa agora hehe

 

o código:

#include <EEPROM.h>

 #include <ESP8266WebServer.h>
   // Comment this out to disable prints and save space
 #include <ESP8266WiFi.h>



 // Locais dos itens da configuração
 #define VERSION_START  500
 #define CONFIG_START   6
 #define CONFIG_VERSION "1a"
 boolean statusnet=false;
 // ID de Configuração
 boolean estado=false;


 boolean invalida=false;
 int in1 =D4; //LED do nodeMCU

 int in2=D5;
 int in3=D0;
 int in4=D1;
 char token1cha[50]="";
 char senha1cha[50]="";
 char tk;
 char s1;
 String senha11;
 String token11;

 int botao3=D3;

 //Situação do Relê
 boolean ligado1 = false;
 boolean ligado2=false;
 boolean ligado3=false;
 boolean ligado4=false;
 boolean controle=false;
 boolean luzautomatica=false;
 boolean internet=false;

 int valor=A0;
 int valor1=0;
 int i=0;
 int o=70;


 ESP8266WebServer server(80);
 bool is_authentified(){
   Serial.println("Enter is_authentified");
   if (server.hasHeader("Cookie")){   
     Serial.print("Found cookie: ");
     String cookie = server.header("Cookie");
     Serial.println(cookie);
     if (cookie.indexOf("ESPSESSIONID=1") != -1) {
       Serial.println("Authentification Successful");
       return true;
     }
   }
   Serial.println("Authentification Failed");
   return false;  
 }



 void callback(char* topic, byte* payload, unsigned int length);




 void handleRoot()
 {
   s1 = char(EEPROM.read(i));
   if (s1!='\0'){
     while (s1!='\0'){
       s1 = char(EEPROM.read(i));
       senha11+=s1;
       i++;
     }
   }
   i=0;
   tk= char(EEPROM.read(o));
   if(tk!='\0'){
     while(tk!='\0'){
       tk= char(EEPROM.read(o));
       token11+=tk;
       o++;
     }
   }
   o=0;
   String state = server.arg("funcao");
   if (state == "car") {
     digitalWrite(in1,HIGH);
     digitalWrite(in2,LOW);
     digitalWrite(in3,HIGH);
     digitalWrite(in4,LOW);
     delay(500);
     digitalWrite(in1,LOW);
     digitalWrite(in2,LOW);
     digitalWrite(in3,LOW);
     digitalWrite(in4,LOW);
  
    
   }
   if (state=="cart"){
     digitalWrite(in2,HIGH);
     digitalWrite(in1,LOW);
     digitalWrite(in4,HIGH);
     digitalWrite(in3,LOW);
     delay(500);
     digitalWrite(in1,LOW);
     digitalWrite(in2,LOW);
     digitalWrite(in3,LOW);
     digitalWrite(in4,LOW);
  
     
   }
   if (state=="care"){
     digitalWrite(in1,HIGH);
     digitalWrite(in2,LOW);
     digitalWrite(in3,LOW);
     digitalWrite(in4,HIGH);
     delay(500);
     digitalWrite(in1,LOW);
     digitalWrite(in2,LOW);
     digitalWrite(in3,LOW);
     digitalWrite(in4,LOW);
  
     
   }
   if(state=="card"){
     digitalWrite(in1,LOW);
     digitalWrite(in2,HIGH);
     digitalWrite(in3,HIGH);
     digitalWrite(in4,LOW);
     delay(500);
     digitalWrite(in1,LOW);
     digitalWrite(in2,LOW);
     digitalWrite(in3,LOW);
     digitalWrite(in4,LOW);
  
     
   }
   // HTML da pagina principal
   String html = "<html><meta charset='UTF-8' language='pt-br'><title>Eletrônica e utilidades</title><body><center>";
   html+="<style type='text/css' media='all'>body{background-color:#D3D3D3;color:#2F4F4F;width: 90%;}";
   html+=".btn{background-color:#00008B;color:white;font-size:20px;font-family:Arial,Verdana}.btn:hover{background-color:white;color:#00008B;font-size:23px}";
   html+=".btn1{background-color:#B0C4DE;color:blue;font-size:20px;font-family:Arial,Verdana}.btn1:hover{background-color:#000080;color:white;font-size:23px}";
   html+="</style><h1>Eletrônica e utilidades</h1><div style='background-color:#D3D3D3;color:#00008B;;font-size:23px'><p>carrinho de controle</p>";
   html+="</div><div style='background-color:#191970;color:#191970;width:50%;height:6%;font-size:23px'>";
   html+="<a href='/config'  class='btn'>configuração</a>&nbsp";
   html+="<a href='/'  class='btn'>acionamentos</a></div>";
 html+="<div style='background-color:#00008B;color:white;height:60%;width:50%'>";
 html +="<div style='background-color:#B0C4DE;color:#F8F8FF;height:60%;width:70%;margin: auto'><br><br><a href='/?funcao=car' class='btn1'>frente</a>";
 html+="<br><br><a href='/?funcao=cart' class='btn1'>trás</a>";
  html +="<br><br><a href='/?funcao=care' class='btn1'>esquerda</a><br><br><a href='/?funcao=card' class='btn1'>direita</a><br>"; 
   html +=(senha11);
   html+="<br><br>";
   html+=(token11);
    html +="</div></div></center></body></html>";
  
  
  
   ;
   //Script JS para não abrir uma nova página Bootstrap
   html += "<script language='JavaScript' type='text/javascript'>";
   html += "var a=document.getElementsByTagName('a');";
   html += "for(var i=0;i<a.length;i++)";
   html += "{";
   html += "a[i].onclick=function()";
   html += "{";
   html += "window.location=this.getAttribute('href');";
   html += "return false";
   html += "}";
   html += "}";
   html += "</script>";
   //Fim da instrução
   html += "</center></div>";
  
   html += "</body></html>";
   // Enviando HTML para o servidor
   server.send(200, "text/html", html);
 }


 void configWifi()
 {
   String header;
   if (!is_authentified()){
     String header = "HTTP/1.1 301 OK\r\nLocation: /login\r\nCache-Control: no-cache\r\n\r\n";
     server.sendContent(header);
     return;
   }

   String html =" <html><meta charset='UTF-8' language='pt-br'><title>Eletrônica e utilidades</title><body><center><style type='text/css' media='all'>body{background-color:#D3D3D3;color:#2F4F4F;width: 90%;}";
   html+=".btn{background-color:#00008B;color:white;font-size:20px;font-family:Arial,Verdana}.btn:hover{background-color:white;color:#00008B;font-size:23px}";
   html+=".btn1{background-color:#B0C4DE;color:blue;font-size:20px;font-family:Arial,Verdana}.btn1:hover{background-color:#000080;color:white;font-size:23px}";
   html+="</style><h1>Eletrônica e utilidades</h1><div style='background-color:#D3D3D3;color:#00008B;;font-size:23px'><p>carrinho de controle</p></div><div style='background-color:#191970;color:#191970;width:50%;height:6%;font-size:23px'>";
   html+="<a href='/config' class='btn'>configuração</a>&nbsp<a href='/'class='btn'>acionamentos</a></div>";
   html+="<div style='background-color:#00008B;color:white;height:60%;width:50%'><div style='background-color:#B0C4DE;color:blue;height:80%;width:70%;margin: auto'><br>";
   html+="<h2>Página de configuração</h2><form method =post>";
  html += "<p>Senha do login de autenticação: <input name=txtvalor type=text value=\"";
   
   html += "\" /></p>";
    html += "<p>Senha do tacess point: <input name=txttoken type=text value=\"";
   
   html += "\" /></p>";
   
  
   html += "<p><input name=button1 type=submit class=btn value=Enviar /></p></form>";
   html += "</div></div></center></body></html>";

   server.send(200, "text/html", html);
 }
 void handleNotFound(){
   String message = "File Not Found\n\n";
   message += "URI: ";
   message += server.uri();
   message += "\nMethod: ";
   message += (server.method() == HTTP_GET)?"GET":"POST";
   message += "\nArguments: ";
   message += server.args();
   message += "\n";
   for (uint8_t i=0; i<server.args(); i++){
     message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
   }
   server.send(404, "text/plain", message);
 }

 void configWifiSubmit()
 {
   int i=0;
   int o=0;
   
   String html = "<html><head><title>acess point e senha</title>";
   html += "<meta charset='UTF-8' language='pt-br'><style>body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }</style>";
   html += "</head><body>";
   html += "<h1>dados gravados  com sucesso</h1>";
  
 String senha1 = server.arg("txtvalor");
   String token1 = server.arg("txttoken");
   senha1.toCharArray(senha1cha, 50);
   token1.toCharArray(token1cha,50);
   
   for(i=0;i <sizeof(senha1cha);i++){
     EEPROM.write(i,senha1cha[i]);
   }
   for(o=0;o<sizeof(token1cha);o++){
     EEPROM.write(o+70,token1cha[o]);
   }
   EEPROM.commit();
   html += "</b></p>";
    html += "<p>Senha do login de autenticação: <b><br>";
    html+=(senha1);
   html += "</b></p>";
    html += "<p>Senha do acess point: <b>";
    html+="<br>";
    html+=(token1);
   
   html += "</b></p>";
   html += "<form method=GET>";
   html += "<p><input name=button2 type=submit value=Voltar /></p></form>";
   html += "</body></html>";
  
   server.send(200, "text/html", html);
 ESP.restart();
   
 }
 void handleLogin(){
  char senha21[50]="";
   s1 = char(EEPROM.read(i));
   if (s1!='\0'){
     while (s1!='\0'){
       s1 = char(EEPROM.read(i));
      senha11+=s1;
       i++;
     }
   }
   i=0;
   senha11.toCharArray(senha21,50);
  
   String msg;
   if (server.hasHeader("Cookie")){   
     Serial.print("Found cookie: ");
     String cookie = server.header("Cookie");
     Serial.println(cookie);
   }
   if (server.hasArg("DISCONNECT")){
     Serial.println("Disconnection");
     String header = "HTTP/1.1 301 OK\r\nSet-Cookie: ESPSESSIONID=0\r\nLocation: /login\r\nCache-Control: no-cache\r\n\r\n";
     server.sendContent(header);
     return;
   }
   if (server.hasArg("USERNAME") && server.hasArg("PASSWORD")){
     if (server.arg("USERNAME") == "carro" &&  server.arg("PASSWORD") == senha21){
       String header = "HTTP/1.1 301 OK\r\nSet-Cookie: ESPSESSIONID=1\r\nLocation: /\r\nCache-Control: no-cache\r\n\r\n";
       server.sendContent(header);
       Serial.println("Log in Successful");
       return;
     }
   msg = "Não foi possivel logar, tente novamente";
   Serial.println("Log in Failed");
   }
   String content = "<html><style>body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }</style><body><meta charset='UTF-8' language='pt-br'><form action='/login' method='POST'>Para logar, por favor use : Usuario/senha<br>";
   content += "Digite carro em minusculo:<input type='text' name='USERNAME' placeholder='user name'><br>";
   content += "Senha de login:senha inicial:1234<input type='password' name='PASSWORD' placeholder='password'><br>";
   content += "<input type='submit' name='SUBMIT' value='Submit'></form>" + msg + "<br>";
   content += "Você pode voltar clicando embaixo <a href='/inline'>here</a></body></html>";
   content += "<p><a href='/' class='btn' >voltar a pagina inicial</a>";
   server.send(200, "text/html", content);
 }

 void setup()
 {
   pinMode(in1,OUTPUT);
   pinMode(in2,OUTPUT);
   pinMode(botao3,INPUT);
   pinMode(in3,OUTPUT);
   pinMode(in4,OUTPUT);
  char taken11[50]="";
   
  
   // Iniciando Serial
   Serial.begin(9600);
  
    

   // Iniciando EEPROM
   EEPROM.begin(512);
  
 tk= char(EEPROM.read(o));
   if(tk!='\0'){
     while(tk!='\0'){
       tk= char(EEPROM.read(o));
       token11+=tk;
       o++;
     }
   }
   o=0;
      
   token11.toCharArray(taken11,50);

  
     
     WiFi.softAP("carrinhoteste",taken11);//nome da rede e senha do AP
     IPAddress myIP = WiFi.softAPIP();
  
  
   // Apresenta dados da conexão
   Serial.println("");
   Serial.print("Connected to ");
   Serial.println("192.168.4.1");
   Serial.print("IP address: ");
   
  
  
  
   // Atribuindo urls para funções
   // Quando não especificado método, uma função trata todos
   server.on("/",HTTP_GET, handleRoot);
   
   // Chamada dos métodos de configuração
   server.on("/config", HTTP_GET, configWifi);
   server.on("/config", HTTP_POST, configWifiSubmit);
  
  
   server.on("/login", handleLogin);
   server.on("/inline", [](){
     server.send(200, "text/plain", "this works without need of authentification");
   });
   server.begin();
  server.onNotFound(handleNotFound);
   //here the list of headers to be recorded
   const char * headerkeys[] = {"User-Agent","Cookie"} ;
   size_t headerkeyssize = sizeof(headerkeys)/sizeof(char*);
   //ask server to track these headers
   server.collectHeaders(headerkeys, headerkeyssize );
   server.begin();
   Serial.println("HTTP server started");
   // Apenas informando que servidor iniciou
   Serial.println("HTTP server started");
 }

 void loop()
 {// No loop só precisa dessa função
  server.handleClient();
   }

 

 

ddf (1).png

jjk.png

pagina.png

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

23 minutos atrás, Papibakigrafo disse:

Parabéns @lucianolcoa! Eu abandonei o webserver! Se seu wifi estiver em uso, o webserver também ficara lento, infelizmente.

 

Você disse sobre drone, mas acredito que somente com um arduino funcionaria, não?

Usaria o Wi-fi como uma "antena" de radio frequência. Essa hipótese me chamou a atenção por que já disseram aqui que, com uma antena externa, o alcance passa dos 4km fácil. Imagina um robô/drone que pode ir lá na *****. vou mata todos os outros de inveja :D /zoas

 

Mas talvez eu faça um robô aranha também, por ser mais "barato" que um drone e pahs e, queria me desafiar pra pegar experiências também..

 

Estou a procura de modular voz usando node também, pra fazer uma espécie de walkie-talkie. Se alguém tiver um norte, será bem vindo também.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@lucianolcoa Rapaz, eu acho que 4km não chega não! aUahAUAhuA Vê esse negócio ai!

Estou pra comprar um rádio 6CH pro drone, e vái até 2.5km só!

 

Estou montando o drone com Arduino, falta algumas peças chegarem! Quanso tudo chegar, faço um post em Microcontroladores! =)

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Papibakigrafo Sei que o nrfl2401 chega a 1 km com antena, consegui 1,2km pra testar um walkie talkie caseiro que fiz. Cláro que em campo aberto....

 

Quase nivelado aos comerciais :D

 

So que é ***** que, pra ganhar umas coisas, se perde outras. Se eu ficar no sinal do wifi, o cel não se conecta a outro sinal, logo, fica impossível usar um gps. Por exemplo....

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Papibakigrafo  nodemcu e arduino, no que se refere a programação, é praticamente a mesma coisa...

 

Sobre exemplos: Tem o Walkie talkie com arduino que publiquei no meu blog pessoal , haha. Alem do post do instructables do autor original do projeto

http://eletronicaeutilidades.blogspot.com.br/2017/03/walkie-talkie-com-arduino.html

 

Agora tem outros exemplos dele acendendo led, conversando pela serial, etc

http://buildbot.com.br/blog/comunicacao-wireless-com-o-modulo-nrf24l01/

 

Ahe se te agradar, eu comprei um com antena deste fornecedor aqui

http://produto.mercadolivre.com.br/MLB-685286844-modulo-wireless-arduino-nrf24l01-pa-lna-com-antena-1000m-_JM

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

47 minutos atrás, Papibakigrafo disse:

@lucianolcoa Rapaz, eu acho que 4km não chega não! aUahAUAhuA Vê esse negócio ai!

Estou pra comprar um rádio 6CH pro drone, e vái até 2.5km só!

 

Estou montando o drone com Arduino, falta algumas peças chegarem! Quanso tudo chegar, faço um post em Microcontroladores! =)

Consegue 4km, mas só com duas boas antenas direcionais, e mesmo assim em campo aberto.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Pessoal, voltei hehehe

Seguinte, estou usando o nodemcu (ESP8266) na IDE do arduino.

 

Vamos ver se conseguem me ajudar, vou explicar rapidamente: 

Terei uma aplicação em visual studio c# (ficará para depois) (no caso vamos usar um terminal tcp server pra simular essa aplicação) que irá receber varias conexões de varios nodemcu´s. Esses nodemcus irão enviar dados ao server (aplicação(sem ser solicitado pelo server) ) o server recebe trata etc.. em determinado momento preciso enviar dados do server para algum esp (para fins de teste vamos considerar somente 1 agora) o ESP recebe trata . só isso hehe

 

Andei lendo e testando alguns exemplos de comunicação tcpip sockets (não manjo disso hehe) fiz a aplicacção C# e testei com app no celular e funcionou..

 

 

 

 

Comprei umas apostilas (muito simples por sinal :mad::mad:) e nela continha um exemplo que testei e funciona com o terminal tccpserver (hercules) apertando o botão envia uma string ao server.

segue codigo:

#include <ESP8266WiFi.h>

const char* ssid = "ID_REDE";
const char* password = "SENHA_REDE";
const char* host = "192.168.1.106"; //IP DO PC QUE ESTÁ INSTALADO O HERCULES

#define INP1 14
#define LED 2

void setup()
{
   Serial.begin(9600);   // Inicia comunicação Serial em 9600 baud rate
  
  pinMode(INP1, INPUT_PULLUP);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while(WiFi.status() != WL_CONNECTED)
    delay(500); 

     Serial.println("test");

}

void loop() 
{

  WiFiClient client;
  
  if(digitalRead(INP1)==0)
  {
    if(!client.connect(host, 80)) // porta 80 ja estava no exemplo
    return;

      client.print("ENVIADO");
       delay(250);
       
  }
  
   

}

imagem do  que recebe.

14nd081.png

 

O que preciso agora é conseguir enviar uma informação do server para o ESP tipo uma string ou um valor uma letra alguma coisa :rezando:...

 

achei esse codigo e ele funciona no caminho inverso (envia dados pc ao esp porém ele torna o ESP server e tem que usar a aba tcp client do hercules) alem de agir estranho, ao enviar o dado ele automaticamente desconecta do server.

 

Mas a pergunta é: como juntar esses dois codigo para formar uma comunicação TIPO serial, onde ambos pode enviar e receber normalmente.

#include <ESP8266WiFi.h>

const char* ssid = "ID_REDE";   //put your SSID of the router to connect with
const char* pass = "_SENHA_REDE";   //put your password of the router to connect with
int led;
String responce;

WiFiServer server(80);

void setup() 
{
  Serial.begin(115200);
  delay(10);
  pinMode(2, OUTPUT);
  digitalWrite(2, 0);
  
  Serial.println();
  Serial.print("Connecting to............");
  Serial.println(ssid);
  
  WiFi.begin(ssid, pass);
  
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  
  Serial.println("");
  Serial.println("WiFi connected");
  
  server.begin();
  Serial.println("Server started.....");

  Serial.println(WiFi.localIP());
}

void loop() 
{
  WiFiClient client = server.available();
  if (!client)
  {
    return;
  }
  Serial.println("new client");
  
  while(!client.available())
  {
    delay(1);
  }
  
  String req = client.readStringUntil('\r');
  Serial.println(req);
  client.flush();

  if (req.indexOf("on") != -1)
  {
    led = 0;
    responce = "ON";
  }
  else if (req.indexOf("off") != -1)
  {
    led = 1;
    responce = "OFF";
  }
  else 
  {
    Serial.println("invalid request");
    return;
  }

  digitalWrite(2, led);
  client.flush();
  client.print(responce);
  
  delay(1);
  Serial.println("Client disonnected");
}

 

 

Conto com a inteligencia e boa vontade dos colegas... pois estou ficando doido hehe

 

Att.

 

adicionado 22 minutos depois

Bom tambem consegui no GITTER um exemplo de codigo que consegui fazer funcionar alguma coisa parecida com o que quero, porém tive que retirar uma parte de dentro de uma função e colocar no void loop.

 

#include <ESP8266WiFi.h>
  #define       LED0      2         // WIFI Module LED
//------------------------------------------------------------------------------------
String Message="";
//------------------------------------------------------------------------------------
// Authentication Variables
//------------------------------------------------------------------------------------
  char*         connect_to = "ID_REDE";
  char*         pass = "SENHA_REDE";
  IPAddress     qwertyServer(192,168,1,106);
  WiFiClient    qwertyClient;
//====================================================================================

  void setup()
  {        
    // Setting The Mode Of Pins ---------------------------------------------
    pinMode(LED0, OUTPUT);          // WIFI OnBoard LED Light
    digitalWrite(LED0, !LOW);       // Turn WiFi LED Off

    // Print Message Of I/O Setting Progress --------------------------------
    //Serial.println("\nI/O Pins Modes Set .... Done");

    // Starting To Connect --------------------------------------------------
    WiFi.mode(WIFI_STA);            // To Avoid Broadcasting An SSID
    WiFi.begin(connect_to, pass);          // The SSID That We Want To Connect To

    // Printing Message For User That Connetion Is On Process ---------------
    Serial.println("!--- Connecting To " + WiFi.SSID() + " ---!");

     // Setting The Serial Port ----------------------------------------------
    Serial.begin(9600);           // Computer Communication
    delay(500);
    Serial.print("\n");

    // WiFi Connectivity ----------------------------------------------------
    CheckConnectivity();            // Checking For Connection  
  }

//====================================================================================

  void loop()
  {

    if(WiFi.status() != WL_CONNECTED)
    {
        Serial.println("\nOops! Connection lost. Trying to reconnect " + String(WiFi.SSID()));
        Serial.println("");
        CheckConnectivity();
    }
    else if(qwertyClient.available() > 0)
    {
        ReadMessage();
        Serial.print(Message);
         Serial.print();

      qwertyClient.flush();
      }

        if(qwertyClient.connect(qwertyServer, 23))
    {
      delay(250);
      Serial.print("status\n");
      Serial.println    ("Connected");
      qwertyClient.println ("teste");
    }

  }
//====================================================================================

  void ReadMessage()
  {
      Message = "";
      Message = qwertyClient.readStringUntil('\r');
  }

//====================================================================================

  void CheckConnectivity()
  {
    while(WiFi.status() != WL_CONNECTED)
    {
      for(int i=0; i < 2; i++)
      {
        digitalWrite(LED0, !HIGH);
        delay(50);
        digitalWrite(LED0, !LOW);
        delay(550);
        Serial.print(".");
      }
      Serial.println("");
    }

  // Stop Blinking To Indicate Connected ----------------------------------
    digitalWrite(LED0, LOW);
    Serial.println("\n!-- Client Device Connected --!");
    Serial.print("\n\n");

    // Printing IP Address --------------------------------------------------
    Serial.println("Connected To      : " + String(WiFi.SSID()));
    Serial.println("Signal Strenght   : " + String(WiFi.RSSI()) + " dBm");
    Serial.print  ("Server IP Address : ");
    Serial.println(qwertyServer);
    Serial.print  ("Device IP Address : ");
    Serial.println(WiFi.localIP());

    // Conecting The Device As A Client -------------------------------------
    ClientRequest();

  }
 
//====================================================================================

  void ClientRequest()
  {
    // First Make Sure You Got Disconnected
    qwertyClient.stop();

    // If Sucessfully Connected Send Connection Message
    if(qwertyClient.connect(qwertyServer, 23))///copiei isso
    {									      ///copiei isso
      delay(250);						      ///copiei isso
      Serial.print("status\n");       	      ///copiei isso
      Serial.println    ("Connected");        ///copiei isso
      qwertyClient.println ("teste1");        ///copiei isso
    } 									      ///copiei isso e colei la no loop infinito ai 
  }											  /// começou a trafegar dados

Abrindo o serial monitor fica printando varias coisas hehe, mas também envia dado para o terminal server, e de la se eu escrevo algo no send também envia...vou tentar tratar isso amanha :tw_cold_sweat:

Link para o comentário
Compartilhar em outros sites

@rodrigocirilo  Não entendi bem aonde você quer chegar. Mas penso eu que você conseguiria algo mais fácil fazendo comunicação serial por algum dispositivo de RF, tipo esse que mencionei nos posts acima, nrfl2401 que, com antena, chega a 1km de alcance fácil... Mas o que você quer fazer realmente necessita de aplicação web??? web cliente e web server?

----------------------------

Edit:uma coisa que você pode fazer também e configurar um esp como cliente e vários outros como servers. Ahe você faz o client fazer uma requisição tipo GET para os servers com botões pre configurados para acionar comandos e mandar mensagens.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

23 minutos atrás, lucianolcoa disse:

@rodrigocirilo  Não entendi bem aonde você quer chegar. Mas penso eu que você conseguiria algo mais fácil fazendo comunicação serial por algum dispositivo de RF, tipo esse que mencionei nos posts acima, nrfl2401 que, com antena, chega a 1km de alcance fácil... Mas o que você quer fazer realmente necessita de aplicação web??? web cliente e web server?

----------------------------

Edit:uma coisa que você pode fazer também e configurar um esp como cliente e vários outros como servers. Ahe você faz o client fazer uma requisição tipo GET para os servers com botões pre configurados para acionar comandos e mandar mensagens.

Olá, não pode ser por RF, serial etc... tem que ser pela rede ethernet/wifi. pois deverá mandar as informações para um pc que não vai estar no loccal (porém chegará até no local uma rede ethernet via radio (uma rede local) que levará os dados até o pc de destino..

 

Esqueça webserver webclient... o esp não vai hospedar nenhuma pagina...só vai ler um botão e enviar o estado. recebendo um dado do servidor aciona uma saida.

 

Os esp´s deverão se conectar ao SERVIDOR que será uma aplicação V C# (nos testes estou simulando com um terminal tcp server. 

 

Não sei se seria possivel(creio que sim) mas nao queria usar nada de web/html/get/post etc.. hehe....

 

Esse ultimo codigo que postei veio no finzinho da tarde.. quebrei um pouco a cabeça mas acho que é o melhor caminho a seguir... pois como falei consegui de maneira meio tosca uma comunicação de duas vias..

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Amigos, estou tentando mudar o meu sistema de EEPROM, e achei um exemplo assim:

 

//******************** EEPROM *******************//
// Endereços reservados na memória
uint8_t addr = 6;    // horaliga
uint8_t addr1 = 7;   // minutoLiga
uint8_t addr2 = 8;   // horaDesl
uint8_t addr3 = 9;   // minutoDesl
uint8_t addr4 = 10;  // stateRelay
uint8_t addr5 = 11;  // status_auto
//uint8_t addr5 = 12;  // First Run Status

// Funções para gerenciamento
void Clear_Data() {
  Serial.println("*WifiRTC: Limpando EEPROM!");
  for (int i = 0; i <= 255; i++) {
    EEPROM.write(i, 0);
    EEPROM.end();
  }Serial.println("*WifiRTC: EEPROM apagada!");
}
void Read_Data(){
  horaLiga = EEPROM.read(addr);
  minutoLiga = EEPROM.read(addr1);
  horaDesl = EEPROM.read(addr2);
  minutoDesl = EEPROM.read(addr3);
  stateRelay = EEPROM.read(addr4);
  status_auto = EEPROM.read(addr5);
  Serial.println("*WifiRTC: Dados lidos da EEPROM");
}
void Save_Data(){
  EEPROM.write(addr, (byte) horaLiga);
  EEPROM.write(addr1, (byte) minutoLiga);
  EEPROM.write(addr2, (byte) horaDesl);
  EEPROM.write(addr3, (byte) minutoDesl);
  EEPROM.write(addr4, (byte) stateRelay);
  EEPROM.write(addr5, (byte) status_auto);
  EEPROM.commit();
  Serial.println("*WifiRTC: Dados salvos na EEPROM");
}

Como eu faço para gravar um SSID, Password, IP e Gateway?

 

Tentei alguns jeitos mas sempre dá errado! =/

Link para o comentário
Compartilhar em outros sites

@Papibakigrafo  consigo te ajudar a gravar na eeprom SSID e password. Ip e gateway não garanto por que parece que a biblioteca webserver ou wifi shield não reconhece numero de ip como string ou array, pra ser sincero, nem sei que tipo de variável ele reconhece, seria int???

 

Mas SSID e password já daria pra quebrar um galho.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

6 horas atrás, Papibakigrafo disse:

Como eu faço para gravar um SSID, Password, IP e Gateway?

Se for o ESP12 ele tem 4MB de memoria onde 1MB é para o programa e os outros 3MB são para dados, o Esp não possui eeprom fisica logo ele usa os 3MB para simular uma. Por exemplo, se definir a eeprom com 512, você terá 512 Bytes de 8 bits cada, ou seja, daria para armazenar uma frase com 512 caracteres. 

 

Para gravar/ler as informações nas eepron seja simulada ou fisica, tem que acessar endereço por endereço. Por exemplo, para gravar a palavra "senha" você envia cada caractere para uma posição espacífica da memória tipo assim:

 

eeprom (0,"s")

eeprom (1,"e")

eeprom (2,"n")

eeprom (3,"h")

eeprom (4,"a")

 

Depois para ler, pega de um po um:

String pass;

pas [0]=eeprom (0)

pass [1]=eeprom (1)

pass [2]=eeprom (2)

pass[3]=eeprom (3)

pass [4]=eeprom (4)

 

Ignorem a sintaxe!

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

O meu programa que postei na página 83 (se não me falha a memória) tem tudo isso, pois eu gravo a configuração IP, SSD, Password e outras coisas na EEPROM do DS3231, mas a rotina é bem parecida para fazer isso na memória flash do ESP8266 (por sinal foi baseado nela e de um exemplo na Internet que fiz a minha para escrever as configurações na EEPROM). Mas se for no ESP32 ainda estou dando umas cabeçadas e não estou conseguindo utilizar as bibliotecas do Arduino, ainda não consigo fazer muita coisa no ESP32 (quase nada).

 

O meu programa tem umas rotinas para fazer isso, vou postar abaixo as rotinas de escrever e ler da EEPROM do DS3231 (da placa que eu tenho com o DS3231)  com trechos do código que podem ser uteis.

 

// =========== Rotinas para ler e escrever na EEPROM AT24C32 ===========
#define AT24C32 0x57 // Endereço da EEPROM AT24C32 no barramento I2C, (A0, A1 e A2 abertos)

void i2c_eeprom_write_byte(int deviceaddress, unsigned int eeaddress,
    byte data) {
  int rdata = data;
  Wire.beginTransmission(deviceaddress);
  Wire.write((int) (eeaddress >> 8)); // MSB
  Wire.write((int) (eeaddress & 0xFF)); // LSB
  Wire.write(rdata);
  Wire.endTransmission();
}

// WARNING: address is a page address, 6-bit end will wrap around
// also, data can be maximum of about 30 bytes, because the Wire library has a buffer of 32 bytes
void i2c_eeprom_write_page(int deviceaddress, unsigned int eeaddresspage,
    byte *data, byte length) {
  Wire.beginTransmission(deviceaddress);
  Wire.write((int) (eeaddresspage >> 8)); // MSB
  Wire.write((int) (eeaddresspage & 0xFF)); // LSB
  byte c;
  for (c = 0; c < length; c++)
    Wire.write(data[c]);
  Wire.endTransmission();
}

byte i2c_eeprom_read_byte(int deviceaddress, unsigned int eeaddress) {
  byte rdata = 0xFF;
  Wire.beginTransmission(deviceaddress);
  Wire.write((int) (eeaddress >> 8)); // MSB
  Wire.write((int) (eeaddress & 0xFF)); // LSB
  Wire.endTransmission();
  Wire.requestFrom(deviceaddress, 1);
  if (Wire.available())
    rdata = Wire.read();
  return rdata;
}

// maybe let's not read more than 30 or 32 bytes at a time!
void i2c_eeprom_read_buffer(int deviceaddress, unsigned int eeaddress, byte *buffer, int length) {
  Wire.beginTransmission(deviceaddress);
  Wire.write((int) (eeaddress >> 8)); // MSB
  Wire.write((int) (eeaddress & 0xFF)); // LSB
  Wire.endTransmission();
  Wire.requestFrom(deviceaddress, length);
  int c = 0;
  for (c = 0; c < length; c++)
    if (Wire.available())
      buffer[c] = Wire.read();
}

void loadDefault() {

  user = UsuarioPadrao;
  pwd = SenhaPadrao;
  GravaUsuario(user, pwd); // Grava usuário e senha padrão
  gravaIpLocal("192.168.15.21"); // Grava rede padrão
  gravaSubrede("255.255.255.0");
  gravaGateway("192.168.15.1");
  gravaSsid("Esp8266", "1234"); // Grava o nome padrão da rede wifi a ser conectada
  gravaServidorNTP("ntp.puc-rio.br"); // Grava o Servidor NTP padrão
  i2c_eeprom_write_byte(AT24C32, end_fusohorario, timezonedefault); // grava -3

}

boolean gravaSsid(String qsid, String qpass) {
  byte tamanho = qsid.length() + 1;
  if (tamanho > 0) {
    if (tamanho > tam_SSID) {
      tamanho = tam_SSID;
      qsid[tamanho - 1] = '\0'; // se a string for maior que o tamanho máximo trunca o que passar do máximo
    }
    Serial.println("Gravando ssid na eeprom " + qsid);
    for (int i = 0; i < tamanho; i++) {
      i2c_eeprom_write_byte(AT24C32, i, qsid[i]);
      delay(10);
    }
    //i2c_eeprom_write_page((AT24C32, 0, &qsid, tamanho);
    //delay(10);
    Serial.println("Gravando senha na eeprom");
    tamanho = qpass.length() + 1;
    if (tamanho > tam_Senha_Wifi) {
      tamanho = tam_Senha_Wifi;
      qpass[tamanho - 1] = '\0'; // se a string for maior que o tamanho máximo trunca o que passar do máximo
    }
    for (int i = 0; i < tamanho; i++) {
      i2c_eeprom_write_byte(AT24C32, i + end_Senha_Wifi, qpass[i]);
      delay(10);
    }
    //i2c_eeprom_write_page((AT24C32, tam_SSID, &qpass, tamanho);
    //delay(10);
    //EEPROM.commit(); // EEPROM Virtual
    return true;
  } else {
    return false;
  }
}


boolean GravaUsuario(String usuario, String senha) {
  byte tamanho = usuario.length() + 1;
  if (tamanho > 0) {
    if (tamanho > tam_Usuario) {
      tamanho = tam_Usuario;
      usuario[tamanho - 1] = '\0'; // se a string for maior que o tamanho máximo trunca o que passar do máximo
    }
    Serial.println();
    Serial.print("tamanho = " + String(tamanho) + " usuário = \"" + usuario + "\"");
    for (int i = end_Usuario; i < end_Usuario + tamanho; i++) { // grava o novo nome do usuário na EEPROM
      i2c_eeprom_write_byte(AT24C32, i, usuario[i -  end_Usuario]);
      delay(10);
    }
    /*i2c_eeprom_write_page(AT24C32, end_Usuario, &usuario, tamanho); // grava o novo nome de usuário na EEPROM
     Serial.print(usuario);
     delay(10);*/
    //EEPROM.commit(); // EEPROM Virtual
    tamanho = senha.length() + 1;
    if (tamanho > tam_Senha_Login) {
      tamanho = tam_Senha_Login;
      senha[tamanho - 1] = '\0'; // se a string for maior que o tamanho máximo trunca o que passar do máximo
    }
    //Serial.print(" tamanho = " + String(tamanho) + " senha = \"" + senha + "\"");
    for (int i = end_Senha_Login; i < end_Senha_Login + tamanho; i++) { // grava o novo nome do usuário na EEPROM
      i2c_eeprom_write_byte(AT24C32, i, senha[i - end_Senha_Login]);
      delay(10);
    }
    Serial.println();
    /*i2c_eeprom_write_page(AT24C32, end_Senha_Login, &senha, tamanho); // grava a nova senha de usuário na EEPROM
     Serial.println(pwd);
     delay(10);*/
    //EEPROM.commit();  // EEPROM Virtual
    return true;
  } else {
    Serial.println("Não Gravou o Usuário e Senha !");
    return false;
  }
}

boolean gravaServidorNTP(String Servidor_NTP) {
  byte tamanho = Servidor_NTP.length() + 1;
  if (tamanho > 0) {
    if (tamanho > tam_Servidor_NTP) {
      tamanho = tam_Servidor_NTP;
      Servidor_NTP[tamanho - 1] = '\0'; // se a string for maior que o tamanho máximo trunca o que passar do máximo
    }
    Serial.println();
    Serial.println("tamanho = " + String(tamanho) + " Servidor NTP = \"" + Servidor_NTP + "\" ");
    for (int i = end_Servidor_NTP; i < tamanho + end_Servidor_NTP; i++) { // grava o novo nome do Servidor NTP na EEPROM
      i2c_eeprom_write_byte(AT24C32, i, Servidor_NTP[i - end_Servidor_NTP]);
      delay(10);
    }
    return true;
  } else {
    Serial.println("Não Gravou o Servidor NTP na EEPROM!");
    return false;
  }
}

boolean gravaIpLocal(String _qip) {
  IPAddress qip;
  if (qip.fromString(_qip.c_str())) {
    for (int i = 0; i < 4; i++) { // grava o novo IP
      i2c_eeprom_write_byte(AT24C32, i + 200, qip[i]);
      delay(10);
    }
    //i2c_eeprom_write_page(AT24C32, 200, &qip, 4); // grava o novo IP
    //delay(10);
    //EEPROM.commit();
    return true;
  } else {
    return false;
  }
}

boolean gravaSubrede(String _qmsk) {
  IPAddress qmsk;
  if (qmsk.fromString(_qmsk.c_str())) {
    for (int i = 0; i < 4; i++) { // grava o novo IP
      i2c_eeprom_write_byte(AT24C32, i + 208, qmsk[i]);
      delay(10);
    }
    //i2c_eeprom_write_page(AT24C32, 208, &qmsk, 4); // grava o novo IP
    //delay(10);
    //EEPROM.commit();
    return true;
  } else {
    return false;
  }
}

boolean gravaGateway(String _qgtw) {
  IPAddress qgtw;
  if (qgtw.fromString(_qgtw.c_str())) {
    for (int i = 0; i < 4; i++) { //grava o novo Gateway
      i2c_eeprom_write_byte(AT24C32, i + 204, qgtw[i]);
      delay(10);
    }
    //i2c_eeprom_write_page(AT24C32, 204, &qgtw, 4); // grava o novo Gateway
    //delay(10);
    //EEPROM.commit();
    return true;
  } else {
    return false;
  }
}

  String esid = "";
  char aux;
  for (int i = 0; i < tam_SSID; i++) {
    aux = char(i2c_eeprom_read_byte(AT24C32, i));
    if (!aux) {
      break;
    }
    esid += aux;
  }

  Serial.println("SSID: \"" + esid + "\"");
  Serial.println("Lendo a senha da rede na EEPROM");
  String epass = "";
  for (int i = end_Senha_Wifi; i < end_Senha_Wifi + tam_Senha_Wifi; i++) {
    aux = char(i2c_eeprom_read_byte(AT24C32, i));
    if (!aux) {
      break;
    }
    epass += aux;
  }

  //lê o ip da EEPROM
  for (int i = 0; i < 4; i++) {
    ip[i] = i2c_eeprom_read_byte(AT24C32, i + 200);
  }
  //lê o Gateway da EEPROM
  for (int i = 0; i < 4; i++) {
    gateway[i] = i2c_eeprom_read_byte(AT24C32, i + 204);
  }
  //lê a Sub-rede da EEPROM
  for (int i = 0; i < 4; i++) {
    subnet[i] = i2c_eeprom_read_byte(AT24C32, i + 208);
  }

  String Str_Servidor_NTP_Aux = "";
  //lê o nome do Servidor NTP da EEPROM
  for (int i = end_Servidor_NTP; i < end_Servidor_NTP + tam_Servidor_NTP; i++) {
    aux = char(i2c_eeprom_read_byte(AT24C32, i));
    if (!aux) { // para se for igual a 0, FIM do String
      Str_Servidor_NTP = Str_Servidor_NTP_Aux;
      break;
    }
    Str_Servidor_NTP_Aux += aux;
    // ntpServerName
  }

 

Isto é parte do meu programa de sincronismo do DS3231. Todas as rotinas estão lá se eu esqueci de colocar alguma coisa.

 

As bibliotecas para acessar a flash do ESP8266 como  EEPROM, e trabalhar com número IP é:

#include <EEPROM.h>  // EEPROM virtual
  
#include <IPAddress.h>

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!