Conectar aplicação via browser

Olá, sou de 1965 e novo por aqui (risos)

Preciso de ajuda.

Estou criando uma aplicação que anda funcionando muito bem. Porém surgiu uma necessidade.

Minha aplicação precisa de acesso a internet. Desta forma utilizo este trecho para conectar:

const char* ssid     = "MINHA-REDE";          
const char* password = "MINHA-SENHA"; 

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.print("connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 64x48)
   // Clear the buffer.
  display.clearDisplay();
  display.display();
}

Funciona muito bem, configuro antecipadamente as informações de internet e minha aplicação funciona.

Mas, será que é possível levar minha aplicação para outro local e conectar-me ao Wifi que tenho acesso pelo browser do celular permitindo que minha aplicação funcione?

no meu exemplo tenho que programar digitando a rede. O que eu preciso, ao chegar em algum local, plugo minha placa na tomada e com celular acesso minha aplicação e digito as informações locais de acesso a internet.

Isso é possível? Poderiam me guiar nessa empreitada?

Olá, bem vindo :slight_smile:

O problema pode ser resolvido de vários modos. Penso que o modo mais simples será guardar as várias configurações Wi-Fi numa lista e sempre que necessário tentar efectuar a conexão Wi-Fi utilizando cada uma das configurações até conseguir realizar a conexão com sucesso.

Geralmente só é necessário configurar uma vez e isto pode ficar já feito directamente no programa e sempre que necessário pode-se adicionar outra configuração Wi-Fi à lista e voltar a programar o Arduino.

A lista de configurações pode ser feita de vários modos, vou exemplificar um modo simples que usa 2 matrizes bidimensionais de caracteres e uma constante com a quantidade de configurações. (Nota: não testei o código.)

#include <WiFi.h>

#define TOTAL_DE_REDES 3      // Numero total de configuracoes Wi-Fi na lista.
#define TAM_MAX_PALAVRA 32    // Tamanho máximo de cada SSID e senha na lista.
#define TEMPO_AGUARDA_MAX 10  // Tempo max. em segundos para aguardar que uma conexao Wi-Fi seja estabelecida.

char lista_ssid[TOTAL_DE_REDES][TAM_MAX_PALAVRA]={"MinhaRede1","MinhaRede2","MinhaRede3"};
char lista_senha[TOTAL_DE_REDES][TAM_MAX_PALAVRA]={"MinhaSenha1","MinhaSenha2","MinhaSenha3"};

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
  
  // Verifica periodicamente o estado da conexao Wi-Fi.
  verifica_conexao_wifi();

  // Coloque aqui as restantes tarefas do programa...

}


// Funcao para verificar o estado da conexao Wi-Fi e tentar ligar se nao estiver ja ligado.
void verifica_conexao_wifi(void) {
  int tempo_aguarda;

  // Esta funcao bloqueia aqui enquanto a conexao Wi-Fi nao for estabelecida.
  // Se o Arduino precisa de realizar outras tarefas enquanto verifica a situacao da conexao
  // Wi-Fi entao para evitar este bloqueio pode-se utilizar um temporizador e variaveis
  // de controlo no ciclo while (e removendo também o delay()).
  while ( WiFi.status() != WL_CONNECTED ) {
    for (int i=0; i<TOTAL_DE_REDES; i++) {
      WiFi.begin(lista_ssid[i], lista_senha[i]);
      Serial.print("Wi-Fi desconectado. Configuracao ");
      Serial.print(i+1);
      Serial.print("SSID: ");
      Serial.print(lista_ssid[i]);
      //Serial.print(", Senha: ");
      //Serial.print(lista_senha[i]);

      // Aguarda ate 10 s que a conexao seja estabelecida.
      tempo_aguarda=0;
      while ( (WiFi.status() != WL_CONNECTED) && ((tempo_aguarda/2)<TEMPO_AGUARDA_MAX) ) {
        delay(500);
        Serial.print(".");
        tempo_aguarda++;
      }
      if (WiFi.status() == WL_CONNECTED) {  // Verifica se conexao estabelecida.
        Serial.println("");
        Serial.print("Wi-Fi connectado. IP address: ");
        Serial.println(WiFi.localIP());
        break;                              // Termina ciclo de tentativas.
      }
    }
  }
}

Em vez de tentar cada configuração até conseguir, outra opção será verificar quais os SSID disponíveis e ligar a um que coincida com uma configuração na lista. A função WiFi.scanNetworks() permite obter as redes disponíveis. A página https://www.arduino.cc/en/Tutorial/LibraryExamples/ScanNetworks tem um exemplo de utilização.

O modo mais profissional de resolver este problema será como mencionou, permitindo ao utilizador configurar o dispositivo para a rede que bem entender. Para usar o smartphone para fazer a configuração penso que uma boa opção será utilizar um módulo bluetooth HC-06 no Arduino. Este módulo é muito fácil de usar. A página Arduino and Bluetooth module HC-06 • AranaCorp tem um exemplo de utilização.

Nesse caso as configurações devem ser guardadas na memória EEPROM do Arduino para evitar ter de configurar o Wi-Fi cada vez que liga o Arduino. A página https://www.arduino.cc/en/Tutorial/LibraryExamples/EEPROMWrite tem um exemplo de utilização da EEPROM.

Geralmente uso a aplicação “Arduino bluetooth controller” disponível na página https://play.google.com/store/apps/details?id=com.giumig.apps.bluetoothserialmonitor&hl=en&gl=US para enviar comandos e configurações para o Arduino por bluetooth. É muito simples de usar, a aplicação envia caracteres ou strings para o Arduino que depois podem ser processados de acordo o que for necessário.

Neste caso a aplicação poderia ser usada pelo utilizador para enviar uma string do tipo SSID=xxxx onde xxxx seria o SSID e outra string do tipo SENHA=xxxx. No Arduino bastaria receber as strings procurar pelas substrings “SSID=” e “SENHA=”, efectuar a conexão Wi-Fi e guardar o SSID e senha na EEPROM.

Humm, neste caso o código que criou continuaria inserindo as informações de Wifi manualmente correto?

Vou estudar mais, o ideal seria mesmo realizar dinamicamente pois quando o local muda a senha, preciso inserir rapidamente

Sim, é um modo simples de resolver a situação.

Mas se a alteração de senha é feita com alguma frequência então é melhor mesmo permitir a configuração no Arduino para evitar ter de o programar em cada mudança.

Como mencionei atrás, o uso de um módulo Bluetooth no Arduino permite fazer essa configuração através de uma aplicação no smartphone. Outra opção será adicionar um LCD e teclado ao Arduino para interacção directa com o utilizador.

Também poderá ser possível aceder directamente com smartphone ao Arduino por Wi-Fi, mas isto é algo que eu ainda nunca tentei… E não parece haver muita informação sobre esse modo de funcionamento. Encontrei estas duas páginas onde falam como fazer isso, utilizando o módulo ESP8266 em modo AP: https://circuits4you.com/2016/12/16/esp8266-web-server-ap/ e “https://tttapa.github.io/ESP8266/Chap07 - Wi-Fi Connections.html” (este último link não funciona bem porque tem espaços, é necessário copiar/colar o link entre aspas). O modo AP pode ser algo interessante a experimentar :slight_smile: , mas o bluetooth parece ser mais simples.

Entendi, de fato tenho um módulo pequeno que acho ser ideal para testar, tenho o esp8266 D1 mini com LCD 66’’

Este link aparentemente esta fora do ar: https://tttapa.github.io/ESP8266/Chap07

O forum não parece permitir links com espaços…

Surgem alguns links com exemplos no google: arduino esp8266 ap mode - Google Search

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.