Tabla de contenido:

ESP32 con antena externa de larga distancia: 10 pasos
ESP32 con antena externa de larga distancia: 10 pasos

Video: ESP32 con antena externa de larga distancia: 10 pasos

Video: ESP32 con antena externa de larga distancia: 10 pasos
Video: Nodo LoRa con RFM95W y ESP32 | Añade comunicaciones de largo alcance a tus proyectos. 2024, Mes de julio
Anonim
Image
Image
Montaje del AP con Wrover
Montaje del AP con Wrover

El tema de hoy se refiere a una prueba de distancia con un ESP32 con antena externa. Usemos dos módulos hoy: de Espressif y TTGO. Luego, verifiquemos el RSSI entre estas dos antenas ESP32, generemos un gráfico a partir del historial y escribamos un registro de los valores en un archivo.csv.

Luego tenemos el ESP32 Wrover como AP y el ESP32 de TTGO como estación. Usé una antena que tomé de un TP-Link un poco más grande y otro enrutador conocido como antena de 9dbm. No he notado ninguna diferencia entre los dos.

Finalmente, los dos microcontroladores se conectan vía socket y, con cada envío de paquetes de datos, imprimimos en un display un gráfico con las barras que indican la relación de dbm.

Paso 1: Montaje del AP con Wrover

Paso 2: Montaje de STATION con TTGO

Montaje de ESTACIÓN con TTGO
Montaje de ESTACIÓN con TTGO

Paso 3: RESULTADO

RESULTADO
RESULTADO
RESULTADO
RESULTADO
RESULTADO
RESULTADO

Distancia máxima con 2x antenas externas: 315 metros

Distancia máxima con antena externa e interna: 157 metros

Paso 4: Archivar LOG. CSV

Archivar LOG. CSV
Archivar LOG. CSV
Archivar LOG. CSV
Archivar LOG. CSV

Grabé los datos en una tarjeta SD, con datos en milis, dbm y la cadena del paquete.

Paso 5: Biblioteca Adafruit GFX

Biblioteca Adafruit GFX
Biblioteca Adafruit GFX

En el IDE de Arduino, vaya a Sketch-> Incluir biblioteca-> Administrar bibliotecas …

Instalar la biblioteca Adafruit GFX

Paso 6: Biblioteca Adafruit ST7735

Biblioteca Adafruit ST7735
Biblioteca Adafruit ST7735

En el IDE de Arduino, vaya a Sketch-> Incluir biblioteca-> Administrar bibliotecas …

Instalar Adafruit ST7735

Paso 7: configurar las tarjetas

Configurar las tarjetas
Configurar las tarjetas
Configurar las tarjetas
Configurar las tarjetas

Estén atentos a las diferencias:

Paso 8: AP.ino

Hemos incluido las bibliotecas necesarias y definido algunos 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 una conexión 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 los pines, entre otras variables

// Pinos muestra # 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 server (qualquer porta válido serve contanto que o cliente use a mesma porta) WiFiServer server (80); // Variável para armazenar o cliente (no caso o ESP32 em modo station) conectado WiFiClient client; // Cadena que recebemos do cliente Cadena recibida; // RSSI envió pelo cliente para este ESP32 long rssi = 0; // Control del temporizador (interrupción por tempo) hw_timer_t * timer = NULL; // Utilizado para guardar os ultimos std:: vector rssiHistory;

Configuración

configuración vacía () {Serial.begin (115200); setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Cria una red WiFi, inicializa o servidor e espera o cliente conectar setupWiFi (); server.begin (); waitForClient (); // Espera 3 segundos, limpa a la pantalla e inicializa o Watchdog delay (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }

Configurar WiFi

// Cria um Access Point e configura o IPvoid setupWiFi () {display.println ("Creando softAP" + String (SSID)); WiFi.disconnect (); Modo WiFi (WIFI_AP); WiFi.softAPConfig (dirección IP (192, 168, 0, 1), dirección IP (192, 168, 0, 1), dirección IP (255, 255, 255, 0)); WiFi.softAP (SSID, CONTRASEÑA); display.println ("softAP" + String (SSID) + "creado!"); }

Pantalla de configuración

// Incializa o display, muda a orientação e limpa a telavoid setupDisplay () {// Inicializa o display display.initR (INITR_BLACKTAB); // Rotaciona o conteúdo mostrado display.setRotation (3); // Pinta una tela de antemano para display.fillScreen (ST77XX_BLACK); }

waitForClient

void waitForClient () {display.println ("Esperando cliente"); // Aguarda o cliente conectar while (! (Client = server.available ())) {display.print ("."); retraso (500); } display.println ("Cliente conectado"); // Tempo máximo que o cliente deve demorar para respondedor // antes de dizermos que una conexión para perdida cliente.setTimeout (TIMEOUT); }

IRAM_ATTR resetModule y setupWatchdog

// función que o temporizador irá chamar, para reiniciar o ESP32void IRAM_ATTR resetModule () {ets_printf ("(perro guardián) reiniciar / n"); esp_restart_noos (); // reinicia o chip} void setupWatchdog () {timer = timerBegin (0, 80, true); // timerID 0, div 80 // timer, callback, interrupción de borda timerAttachInterrupt (timer, & resetModule, true); // temporizador, tempo (us), repetición timerAlarmWrite (temporizador, 10000000, verdadero); timerAlarmEnable (temporizador); // habilita una interrupción}

Círculo

bucle vacío () {timerWrite (temporizador, 0); // reseta o temporizador (alimenta o perro guardián) checkConnection (); // checa se possui conexão com o cliente readFromClient (); // lê os dados do cliente sendToClient (); // enviação para o cliente plot (); // mostra o gráfico de histórico de rssi log (); // salva um log no cartão SD}

verifica la conexión

void checkConnection () {// Se o cliente não estiver conectado if (! client.connected ()) {// Limpiar la pantalla y esperar 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 posui algo para receber do cliente if (client.connected ()) {selected = client.readStringUntil ('\ n'); // Lê o texto que o cliente enviou recibió.remove (recibió.longitud () - 1); // Eliminar o / n do final rssi = client.parseInt (); // Lê o rssi que o cliente enviou clearText (); // Limpa o texto display.setCursor (0, 0); // Mueve el cursor hacia el texto para hacer clic en mostrar display.println ("RSSI:" + String (rssi)); // Mostra o RSSI no display display.println ("Recibido:" + recibido); // 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.empezar()); } // 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 = recibido + "OK"; client.println (envío); }}

trama

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 y log

void clearText () {// Limpiar un á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 sin eliminación final File file = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("Failed to open file"); regreso; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + Cadena (rssi) + ";" + recibido; file.println (datos); file.close (); }

Paso 9: Station.ino

Hemos incluido las bibliotecas necesarias y definido algunos 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 establecido no setup do AP #define PORT 80 // Porta do sever. Qualquer porta válida contanto que seja igual nos dois arquivos // Tempo de timeout para considerar a 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 los ajustes que involucran la pantalla y la tarjeta SD.

cuenta larga = 0; // Contador de mensagens enviadaslong rssi = 0; // RSSI calculado String recibido; // Mensagem de confirmação que o AP nos envia // Pixel onde o gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Utilizado para conexión con el 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 pinos mosi, miso e sck são os nativos (23, 19 y 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;

Configuración

configuración vacía () {configuraciónDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Conecta sin punto de acceso criado pelo outro ESP32 e conecta ao server setupWiFi (); Conectar al servidor(); // Espera 3 segundos, limpa a la pantalla e inicializa o Retraso del perro guardián (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }

configuraciónDisplay

// Incializa o display, muda a orientação e limpa a telavoid setupDisplay () {// Inicializa o display display.initR (INITR_BLACKTAB); // Rotaciona o conteúdo mostrado display.setRotation (1); // Pinta una tela de branco display.fillScreen (ST77XX_BLACK); display.setTextColor (ST77XX_WHITE); }

configuraciónWiFi

// Conecta ao AP void setupWiFi () {WiFi.disconnect (); Modo WiFi (WIFI_STA); WiFi.begin (SSID, CONTRASEÑA); display.println ("Conectando a" + Cadena (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); }

Conectar al servidor

void connectToServer () {display.println ("Intentando conexión de socket"); // Espera una conexión com o servidor while (! Socket.connect (HOST, PORT)) {display.print ("."); retraso (500); } display.println (); display.println ("¡Conectado!"); // Tempo máximo que o cliente deve demorar para respondedor // antes de dizermos que una conexión para perdida socket.setTimeout (TIMEOUT); }

IRAM_ATTR resetModule y setupWatchdog

// función que o temporizador irá chamar, para reiniciar o ESP32void IRAM_ATTR resetModule () {ets_printf ("(perro guardián) reiniciar / n"); esp_restart_noos (); // reinicia o chip} void setupWatchdog () {timer = timerBegin (0, 80, true); // timerID 0, div 80 // timer, callback, interrupción de borda timerAttachInterrupt (timer, & resetModule, true); // temporizador, tempo (us), repetición timerAlarmWrite (temporizador, 10000000, verdadero); timerAlarmEnable (temporizador); // habilita una interrupción}

círculo

bucle vacío () {timerWrite (temporizador, 0); // reseta o temporizador (alimenta o perro guardián) checkConnection (); // checa se possui conexão com o servidor 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 una confirmación del servidor log (); // salva um log no cartão SD delay (1000); // espera um segundo}

verifica la conexión

void checkConnection () {// Verifica una conexión com o AP if (WiFi.status ()! = WL_CONNECTED) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("WiFi desconectado"); setupWiFi (); retraso (1000); } // verifica una conexión de socket if (! socket.connected ()) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("Toma desconectada"); Conectar al servidor(); retraso (3000); display.fillScreen (ST77XX_BLACK); }}

checkRSSI

void checkRSSI () {// Verifica o RSSI rssi = WiFi. RSSI (); // Limpiar el texto y mostrar el RSSI sin mostrar 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); }

trama

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 hola com um contador, no muestra pantalla e incrementa o contador Cadena enviando = "Hola" + Cadena (cuenta); display.setCursor (0, 10); display.println ("Enviando:" + enviando); socket.println (envío); socket.print (String (rssi)); contar ++; }}

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 muestra ninguna pantalla recibida = socket.readStringUntil ('\ n'); recibido.remover (recibido.longitud () - 1); display.println ("Recibido:" + recibido); }}

clearText y log

void clearText () {// Limpiar un á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 sin eliminación final File file = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("Failed to open file"); regreso; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + Cadena (rssi) + ";" + recibido; file.println (datos); file.close (); }

Paso 10: archivos

Descarga los archivos:

PDF

INO

Recomendado: