terça-feira, 7 de setembro de 2021

Controle remoto via WIFI - nodemcu (ESP8266) - Modo cliente e servidor

 Olá pessoal que acompanha este blog!

    Vou demonstrar aqui como fazer um controle remoto de 3 canais usando o modulo wifi ESP8266 pela interface do Arduino, um das placas estará rodando como servidor web e a outra como cliente web. 

    Para reduzir o tempo de resposta optei por não envia pagina nenhuma apenas o comando para informar o estado dos 3 botões que foram colocados na placa do nodemcu, por ser muito simples e basico não vou colocar o esquemático apenas a imagem da protoboard, creio que seja o suficiente para que vcs entendam o circuito.


    A placa é alimentada com 5V da usb ou 5V de uma fonte externa pelo pino Vin e GND, os leds são ligados a resistores de 220R ao GND e aos pinos D1,D2 e D3.Os botões São ligado ao GND e ao pinos D1,D2,D3 diretamente pois não precisam de resistores externos de pull up´s. Coloquei as placas uma ao lado da outra pra facilitar a visualização e o vídeo veja abaixo ( https://youtu.be/KVtNlUg0EF0):


O código fonte:

Código do servidor (lê os botões):

//desenvolvedor: Aguivone M. Fogia
//Data : 07/09/2021                        // Deu certo
//Blog: Microcontroladores-C 
//exemplo com NodeMCU - modo servidor
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>//caso use o modo servidor

//------------------------------------------------------------------------------------
// definição dos pinos
//------------------------------------------------------------------------------------
#define       LED         2        // led do modulo wifi
#define       BOT_1        D1         // botão 1
#define       BOT_2        D2         // botão 2
#define       BOT_3        D3         // botão 3

WiFiServer server(80);//usa porta 80

void setup() 
{
  pinMode(LED, OUTPUT);        // inicializa o led da placa
  pinMode(BOT_1, INPUT_PULLUP);  // habilita pull up interno do pino
  pinMode(BOT_2, INPUT_PULLUP);  // habilita pull up interno do pino
  pinMode(BOT_3, INPUT_PULLUP);  /// habilita pull up interno do pino
  setupWiFi();  
}

void loop() 
{
  // checa se tem algum dispositivo conectado!
  WiFiClient client = server.available();
  if (!client) 
      { 
       digitalWrite(LED, LOW);
       delay(100); 
       digitalWrite(LED, HIGH);
       delay(100); //espera conexão   
       return;
       }

  // Lê a primeir linha dos dados recebidos pelo pacote ethernet
  String req = client.readStringUntil('\r');
  client.flush(); 

  // prepara pagina ehtenet
  String s = "S-";
  if (digitalRead(BOT_1) == LOW)                         //botão pressionado
  {
    s += "1";
  }
  else
  {
    s += "0"; 
  } 
  if (digitalRead(BOT_2) == LOW)                         //botão pressionado
  {
    s += "1";
  }
  else
  {
    s += "0"; 
  } 
  if (digitalRead(BOT_3) == LOW)                         //botão pressionado
  {
    s += "1";
  }
  else
  {
    s += "0"; 
  }
  s += "*\n";
  // envia dados
  client.print(s);
  delay(100); //tempo de tratamento por parte do cliente
  //cliente desconectado
  // a cada requisição a pagina é enviada e o cliente é desconectado
}

void setupWiFi()
{
    //////////////////////
    // definições da WiFi  //
    //////////////////////
  const char*  WiFi_Senha = "123456789";//senha que você quer usar(deve ser em branco(aberta) ou maior que 8 caráteres,senão não funciona e não troca o nome da wifi)

  const char*  WiFi_Nome = "MICROCONTROLADORES-C";//nome que você quer dar a sua rede 
  IPAddress ip(192,168,50,4);//ok
  IPAddress gateway(192,168,50,1);//ok
  IPAddress subnet(255,255,255,0);//ok
  //////inicializa a wifi//////////////////////////////////////////////  
  uint8_t mac[WL_MAC_ADDR_LENGTH];
  WiFi.softAPmacAddress(mac);//mac qualquer pra testar
  WiFi.softAPConfig(ip, gateway, subnet);
  WiFi.mode(WIFI_STA);//modo acess point e servidor
  //  WiFi.mode(WIFI_AP_STA);//modo acess point e servidor
  WiFi.softAP(WiFi_Nome, WiFi_Senha); 
  WiFi.begin(); 
  server.begin();
}

Código do cliente(aciona os leds):

//desenvolvedor: Aguivone M. Fogia
//Data : 07/09/2021                        // Deu certo
//Blog: Microcontroladores-C 
//exemplo com NodeMCU - modo cliente
#include <ESP8266WiFi.h>

#define       LED       2        // led do modulo wifi
#define       LED1      D1        
#define       LED2      D2        
#define       LED3      D3        

char nome_wifi[] = "MICROCONTROLADORES-C";                // nome da rede wifi
char senha[] = "123456789";                          // senha deve ter no minimo 8 caracteres 

const char* host = "192.168.50.4";


void setup()
{
  Serial.begin(115200);
  pinMode(LED, OUTPUT);        // inicializa o led da placa
  pinMode(LED1, OUTPUT); 
  pinMode(LED2, OUTPUT); 
  pinMode(LED3, OUTPUT); 
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, LOW);
  Serial.println();

  Serial.printf("Connecting to %s ", nome_wifi);
  WiFi.begin(nome_wifi,senha);
  while (WiFi.status() != WL_CONNECTED)
  {
       digitalWrite(LED, LOW);//sem conexão pisca led da placa do node
       delay(300); 
       digitalWrite(LED, HIGH);
       delay(300); //espera conexão
  }
  Serial.println(" connected");
}


void loop()
{
  WiFiClient client;

  Serial.printf("\n[Connecting to %s ... ", host);
  if (client.connect(host, 80))
  {
    Serial.println("connected]");
    Serial.println("[Sending a request]");
    client.print(String("GET /") + " HTTP/1.1\r\n" +
                 "Host: " + host + "\r\n" +
                 "Connection: close\r\n" +
                 "\r\n"
                );

    Serial.println("[Response:]");
    while (client.connected() || client.available())
    {
      if (client.available())
      {
        String pacote = client.readStringUntil('\n');
        Serial.println(pacote);          
          if(pacote.indexOf("*")> 0) 
          {
             int pos = pacote.indexOf("*");
             if(pacote[pos-1]=='1')
             {
               digitalWrite(LED1,HIGH); 
             }
             else
             {
              digitalWrite(LED1,LOW);
             }
             if(pacote[pos-2]=='1')
             {
               digitalWrite(LED2,HIGH); 
             }
             else
             {
              digitalWrite(LED2,LOW);
             }
             if(pacote[pos-3]=='1')
             {
               digitalWrite(LED3,HIGH); 
             }
             else
             {
              digitalWrite(LED3,LOW);
             }
          }
          else
          {
            digitalWrite(LED1,LOW);
            digitalWrite(LED2,LOW);
            digitalWrite(LED3,LOW); 
          }

          client.flush();        
      }
    }
    client.stop();
    Serial.println("\n[Disconnected]");
  }
  else
  {
    Serial.println("connection failed!]");   
  }
  delay(200);
}

formatado por http://hilite.me/  07/09/2021

Até a próxima! Que a paz de cristo esteja com vcs.

Nenhum comentário :

Postar um comentário

olá,digite aqui seu comentário!