Índice:
- Etapa 1: Montagem do AP com Wrover
- Etapa 2: Montagem da ESTAÇÃO com TTGO
- Etapa 3: RESULTADO
- Etapa 4: Arquivar LOG.CSV
- Etapa 5: Biblioteca Adafruit GFX
- Etapa 6: Biblioteca Adafruit ST7735
- Etapa 7: Configurando os Cartões
- Etapa 8: AP.ino
- Etapa 9: Station.ino
- Etapa 10: Arquivos
Vídeo: ESP32 com antena externa de longa distância: 10 etapas
2024 Autor: John Day | [email protected]. Última modificação: 2024-01-30 11:38
O tópico de hoje diz respeito a um teste à distância com um ESP32 com antena externa. Vamos usar dois módulos hoje: do Espressif e TTGO. Vamos então verificar o RSSI entre essas duas antenas ESP32, gerar um gráfico do histórico e escrever um registro dos valores em um arquivo.csv.
Temos então o Wrover ESP32 como AP e o ESP32 do TTGO como Estação. Usei uma antena que tirei de um TP-Link um pouco maior e outro roteador conhecido como antena de 9dbm. Eu não notei nenhuma diferença entre os dois.
Por fim, os dois microcontroladores se conectam via socket e, a cada envio de pacotes de dados, imprimimos em um display um gráfico com as barras que indicam a relação de dbm.
Etapa 1: Montagem do AP com Wrover
Etapa 2: Montagem da ESTAÇÃO com TTGO
Etapa 3: RESULTADO
Distância máxima com 2 antenas externas: 315 metros
Distância máxima com antena externa e interna: 157 metros
Etapa 4: Arquivar LOG. CSV
Gravei os dados em um cartão SD, com dados em millis, dbm e a string do pacote.
Etapa 5: Biblioteca Adafruit GFX
No IDE Arduino, vá para Sketch-> Incluir Biblioteca-> Gerenciar Bibliotecas …
Instale a biblioteca Adafruit GFX
Etapa 6: Biblioteca Adafruit ST7735
No IDE Arduino, vá para Sketch-> Incluir Biblioteca-> Gerenciar Bibliotecas …
Instale Adafruit ST7735
Etapa 7: Configurando os Cartões
Fique atento às diferenças:
Etapa 8: AP.ino
Incluímos as bibliotecas necessárias e definimos alguns parâmetros.
#include #include #include #include #include #include // Rede que o ESP criará. No Station deve ser igual #define SSID "RSSI_Test" #define PASSWORD "87654321" // Tempo de timeout para considerar uma conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // Configurações de cor, margem e tamanho do gráfico #define PLOT_COLOR ST77XX_GREEN #define PLOT_MARGIN 20 #define PLOT_SIZE (DISPLAY_HEIGHT - 2 * PLOT_MARGIN) // Arquivo de log no SD #define FILE_PATH "/log.csv"
Definimos os pinos, entre outras variáveis
// Pinos do display # define DISPLAY_DC 12 // A0 #define DISPLAY_CS 13 // CS #define DISPLAY_MOSI 14 // SDA #define DISPLAY_CLK 27 // SCK #define DISPLAY_RST 0 // Pino do SDCard. Os pinos mosi, miso e sck são os nativos (23, 19 e 18 respectivamente) #define SDCARD_CS 15 // Pixel onde o gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Objeto responsável pelo display Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST); // Criamos um servidor (qualquer porta válida serve contanto que o cliente utiliza uma mesma porta) WiFiServer server (80); // Variável para armazenar o cliente (no caso o ESP32 em estação modo) conectado WiFiClient client; // Cadeia que recebemos do cliente Cadeia recebida; // RSSI enviado pelo cliente para este ESP32 long rssi = 0; // Faz o controle do temporizador (interrupção por tempo) hw_timer_t * timer = NULL; // Utilizado para guardar os ultimos std:: vector rssiHistory;
Configurar
void setup () {Serial.begin (115200); setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Cria uma rede WiFi, inicializa o servidor e espera o cliente conectar setupWiFi (); server.begin (); waitForClient (); // Espera 3 segundos, limpa a tela e inicializa o Watchdog delay (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }
Configurar WiFi
// Cria um Ponto de Acesso e configura o IPvoid setupWiFi () {display.println ("Criando softAP" + String (SSID)); WiFi.disconnect (); WiFi.mode (WIFI_AP); WiFi.softAPConfig (IPAddress (192, 168, 0, 1), IPAddress (192, 168, 0, 1), IPAddress (255, 255, 255, 0)); WiFi.softAP (SSID, SENHA); display.println ("softAP" + String (SSID) + "criado!"); }
Configuração de exibição
// Inicializa o display, muda a orientação e limpa a telavoid setupDisplay () {// Inicializa o display display.initR (INITR_BLACKTAB); // Rotaciona o conteúdo conteúdo display.setRotation (3); // Pinta a tela de preto display.fillScreen (ST77XX_BLACK); }
waitForClient
void waitForClient () {display.println ("Aguardando cliente"); // Aguarda o cliente conectar while (! (Client = server.available ())) {display.print ("."); atraso (500); } display.println ("Cliente conectado"); // Tempo máximo que o cliente deve demorar para responder // antes de dizermos que uma conexão foi perdida client.setTimeout (TIMEOUT); }
IRAM_ATTR resetModule e setupWatchdog
// função que o temporizador irá chamar, para reiniciar o ESP32void IRAM_ATTR resetModule () {ets_printf ("(watchdog) reiniciar / n"); esp_restart_noos (); // reinicia o chip} void setupWatchdog () {timer = timerBegin (0, 80, true); // timerID 0, div 80 // timer, retorno de chamada, interrupção de borda timerAttachInterrupt (timer, & resetModule, true); // cronômetro, tempo (us), repetição cronômetroAlarmWrite (cronômetro, 10000000, true); timerAlarmEnable (timer); // habilita a interrupção}
Ciclo
void loop () {timerWrite (timer, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // checa se possui conexão com o cliente readFromClient (); // lê os dados do cliente sendToClient (); // envia para o cliente plot (); // mostra o gráfico de histórico de rssi log (); // salva um log no cartão SD}
checkConnection
void checkConnection () {// Se o cliente não estiver conectado if (! client.connected ()) {// Limpa a tela e espera pelo cliente display.fillScreen (ST77XX_BLACK); display.println ("Cliente desconectado"); waitForClient (); }}
readFromClient
void readFromClient () {// Espera até o cliente enviar algo ou desconectar while (client.connected () &&! client.available ()) {delay (100); } // Se chegou aqui e ainda estiver conectado é porque possui algo para receber do cliente if (client.connected ()) {received = client.readStringUntil ('\ n'); // Lê o texto que o cliente adicionou received.remove (received.length () - 1); // Remova o / n do final rssi = client.parseInt (); // Lê o rssi que o cliente adicionou clearText (); // Limpa o texto display.setCursor (0, 0); // Mova o cursor do texto para o começo do display display.println ("RSSI:" + String (rssi)); // Mostra o RSSI sem display display.println ("Recebido:" + recebido); // Mostra a mensagem recebida do cliente // Se a quantidade de barras do gráfico passou do limite apagamos o registro mais antigo if (rssiHistory.size () == (DISPLAY_WIDTH - 2 * PLOT_MARGIN) / 2) {rssiHistory.erase (rssiHistory.começar()); } // Adiciona no final do histórico (mais recente) rssiHistory.push_back (rssi); }}
sendToClient
void sendToClient () {// Se o cliente estiver conectado enviamos de volta a mensagem com um OK if (client.connected ()) {String enviando = recebido + "OK"; client.println (enviando); }}
enredo
void plot () {// Coloca no ponto inicial e limpamos o gráfico currentX = PLOT_MARGIN; display.fillRect (PLOT_MARGIN, 2 * PLOT_MARGIN, DISPLAY_WIDTH - 2 * PLOT_MARGIN, DISPLAY_HEIGHT - 2 * PLOT_MARGIN, ST77XX_BLACK); // Para cada valor do histórico, fazemos o cálculo do tamanho da barra do gráfico, desenhamos e avançamos para o próximo for (int i = 0; i -120? Map (rssiHistory , -120, 0, 0, PLOT_SIZE): 0; display.drawFastVLine (currentX, DISPLAY_HEIGHT - valor, valor, PLOT_COLOR); currentX + = 2;}}
clearText e log
void clearText () {// Limpa a área com o texto da mensagem vinda do cliente display.fillRect (0, 0, DISPLAY_WIDTH, 2 * PLOT_MARGIN, ST77XX_BLACK); } void log () {// Abrimos o arquivo para escrevermos no final dele File file = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("Falha ao abrir o arquivo"); Retorna; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem enviada String data = String (millis ()) + ";" + String (rssi) + ";" + recebido; file.println (dados); file.close (); }
Etapa 9: Station.ino
Incluímos as bibliotecas necessárias e definimos alguns parâmetros.
#include #include #include #include #include #include // Nome da rede que nos conectaremos. Criado pelo AP #define SSID "RSSI_Test" #define PASSWORD "87654321" #define HOST "192.168.0.1" // IP que foi configurado no setup do AP #define PORT 80 // Porta do servidor. Qualquer porta válida contanto que seja igual nos dois arquivos // Tempo de timeout para considerar uma conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // Configurações de cor, margem e do gráfico #define PLOT_COLOR ST77XX_GREEN #define PLOT_MARGIN 20 #define PLOT_SIZE (DISPLAY_HEIGHT - 2 * PLOT_MARGIN) // Arquivo de log no SD #define FILE_PATH "/log.csv"
Definimos as configurações que envolvem a tela e o cartão SD.
contagem longa = 0; // Contador de mensagens sentlong rssi = 0; // RSSI limite String recebida; // Mensagem de confirmação que o AP nos envia // Pixel onde o gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Utilizado para conexão com o servidor WiFiClient socket; #define DISPLAY_DC 12 // A0 #define DISPLAY_CS 13 // CS #define DISPLAY_MOSI 14 // SDA #define DISPLAY_CLK 27 // SCK #define DISPLAY_RST 0 // Pino do SDCard. Os mosi, miso e sck são os nativos (23, 19 e 18 respectivamente) #define SDCARD_CS 15 // Objeto responsável pelo display Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST); hw_timer_t * timer = NULL; // faz o controle do temporizador (interrupção por tempo) // Utilizado para guardar os ultimos std:: vector rssiHistory;
Configurar
void setup () {setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Conecta no access point criado pelo outro ESP32 e conecta ao server setupWiFi (); conecte-se ao servidor(); // Espera 3 segundos, limpa a tela e inicializa o Watchdog delay (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }
setupDisplay
// Inicializa o display, muda a orientação e limpa a telavoid setupDisplay () {// Inicializa o display display.initR (INITR_BLACKTAB); // Rotaciona o conteúdo conteúdo display.setRotation (1); // Pinta a tela de branco display.fillScreen (ST77XX_BLACK); display.setTextColor (ST77XX_WHITE); }
configuraçãoWiFi
// Conecta ao AP void setupWiFi () {WiFi.disconnect (); WiFi.mode (WIFI_STA); WiFi.begin (SSID, SENHA); display.println ("Conectando a" + String (SSID)); // Enquanto não estiver conectado à rede WiFi while (WiFi.status ()! = WL_CONNECTED) {delay (500); display.print ("."); } display.println (""); display.print ("Conectado a"); display.println (SSID); }
conecte-se ao servidor
void connectToServer () {display.println ("Tentando conexão de soquete"); // Espera uma conexão com o servidor while (! Socket.connect (HOST, PORT)) {display.print ("."); atraso (500); } display.println (); display.println ("Conectado!"); // Tempo máximo que o cliente deve demorar para responder // antes de dizermos que uma conexão foi perdida socket.setTimeout (TIMEOUT); }
IRAM_ATTR resetModule e setupWatchdog
// função que o temporizador irá chamar, para reiniciar o ESP32void IRAM_ATTR resetModule () {ets_printf ("(watchdog) reiniciar / n"); esp_restart_noos (); // reinicia o chip} void setupWatchdog () {timer = timerBegin (0, 80, true); // timerID 0, div 80 // timer, retorno de chamada, interrupção de borda timerAttachInterrupt (timer, & resetModule, true); // cronômetro, tempo (us), repetição cronômetroAlarmWrite (cronômetro, 10000000, verdadeiro); timerAlarmEnable (timer); // habilita a interrupção}
ciclo
void loop () {timerWrite (timer, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // checa se possui conexão com o server checkRSSI (); // verifica o rssi plot (); // mostra o gráfico de histórico de rssi sendToServer (); // envia uma mensagem com um contador para o servidor readFromServer (); // espera a server log (); // salva um log no cartão SD delay (1000); // espera um segundo}
checkConnection
void checkConnection () {// Verifica a conexão com o AP if (WiFi.status ()! = WL_CONNECTED) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("WiFi desconectado"); configuraçãoWiFi (); atraso (1000); } // verifica a conexão do socket if (! socket.connected ()) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("Soquete desconectado"); conecte-se ao servidor(); atraso (3000); display.fillScreen (ST77XX_BLACK); }}
checkRSSI
void checkRSSI () {// Verifica o RSSI rssi = WiFi. RSSI (); // Limpa o texto e mostra o RSSI no display clearText (); display.setCursor (0, 0); display.print ("RSSI:" + String (rssi)); // Se a quantidade de barras do gráfico passou do limite apagamos o registro mais antigo if (rssiHistory.size () == (DISPLAY_WIDTH - 2 * PLOT_MARGIN) / 2) {rssiHistory.erase (rssiHistory.begin ()); } // Adiciona no final do histórico (mais recente) rssiHistory.push_back (rssi); }
enredo
void plot () {// Coloca no ponto inicial e limpamos o gráfico currentX = PLOT_MARGIN; display.fillRect (PLOT_MARGIN, 2 * PLOT_MARGIN, DISPLAY_WIDTH - 2 * PLOT_MARGIN, DISPLAY_HEIGHT - 2 * PLOT_MARGIN, ST77XX_BLACK); // Para cada valor do histórico, fazemos o cálculo do tamanho da barra do gráfico, desenhamos e avançamos para o próximo for (int i = 0; i -120? Map (rssiHistory , -120, 0, 0, PLOT_SIZE): 0; display.drawFastVLine (currentX, DISPLAY_HEIGHT - valor, valor, PLOT_COLOR); currentX + = 2;}}
sendToServer
void sendToServer () {// Se estiver conectado com o servidor if (socket.connected ()) {// Envia um hello com um contador, mostra no display e incrementa o contador String send = "Hello" + String (count); display.setCursor (0, 10); display.println ("Enviando:" + enviando); socket.println (enviando); socket.print (String (rssi)); contagem ++; }}
readFromServer
void readFromServer () {// Espera até o servidor enviar algo ou desconectar while (socket.connected () &&! socket.available ()) {delay (100); } // Se tem algo para receber if (socket.available ()) {// Faz a leitura, remove o / n do final e mostra no display received = socket.readStringUntil ('\ n'); recebido.remover (recebido.comprimento () - 1); display.println ("Recebido:" + recebido); }}
clearText e log
void clearText () {// Limpa a área com o texto da mensagem vinda do cliente display.fillRect (0, 0, DISPLAY_WIDTH, 2 * PLOT_MARGIN, ST77XX_BLACK); } void log () {// Abrimos o arquivo para escrevermos no final dele File file = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("Falha ao abrir o arquivo"); Retorna; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem enviada String data = String (millis ()) + ";" + String (rssi) + ";" + recebido; file.println (dados); file.close (); }
Etapa 10: Arquivos
Baixe os arquivos:
EU NÃO
Recomendado:
Estação meteorológica de longa distância e sensores DHT HC-12: 9 etapas
Estação meteorológica de longa distância e sensores DHT HC-12: Neste tutorial, aprenderemos como fazer uma estação meteorológica remota de longa distância usando dois sensores dht, módulos HC12 e o visor LCD I2C. Assistir ao vídeo
Luzes DIY de longa distância do melhor amigo: 4 etapas (com fotos)
Luzes DIY de Longa Distância Melhor Amigo: Eu fiz luzes sincronizadas de longa distância conhecidas como " Melhor Amigo " lâmpadas. Isso significa apenas que eles são mantidos em sincronia com a cor atual da outra lâmpada. Então, se você mudasse uma lâmpada para verde, logo depois que a outra lâmpada mudaria para verde
Circuito do sistema de transmissão de longa distância: 6 etapas
Circuito do Sistema de Transmissão de Longa Distância: Hoje, neste artigo, falaremos sobre como fazer um circuito do sistema de transmissão de longa distância básico. Ao longo dessas linhas, deixe-me apresentar uma descrição concisa do circuito. Como geralmente isso funciona e como estou falando as coisas para todos vocês
Antena Bowtie interna / externa: 5 etapas
Antena Bowtie Interna / Externa: Sempre fui fascinado com a antena Bowtie padrão e descobri que elas tinham boas propriedades. então, quando eu estava em um RadioShack um tempo atrás e vi 2 deles no rack por US $ 5 cada, eu não pude evitar e adicionei 2 à minha coleção, perfazendo 3
Filtro de sinal Wifi (WokFi) Longa distância: 3 etapas (com imagens)
Wifi Signal Strainer (WokFi) Long Distance: Neste instrutível, eu transformo um WiFi Thumbdrive comum em um extensor wi-fi robusto! 'O coador parabólico de culinária asiática (bolinho de massa) é o candidato perfeito para este projeto. Consegui obter mais 20 acessos pontos na cidade e se conectar a uma rede