Tabla de contenido:
- Paso 1: Montaje del AP con Wrover
- Paso 2: Montaje de STATION con TTGO
- Paso 3: RESULTADO
- Paso 4: Archivar LOG.CSV
- Paso 5: Biblioteca Adafruit GFX
- Paso 6: Biblioteca Adafruit ST7735
- Paso 7: configurar las tarjetas
- Paso 8: AP.ino
- Paso 9: Station.ino
- Paso 10: archivos
Video: ESP32 con antena externa de larga distancia: 10 pasos
2024 Autor: John Day | [email protected]. Última modificación: 2024-01-30 08:43
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
Paso 3: 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
Grabé los datos en una tarjeta SD, con datos en milis, dbm y la cadena del paquete.
Paso 5: 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
En el IDE de Arduino, vaya a Sketch-> Incluir biblioteca-> Administrar bibliotecas …
Instalar Adafruit ST7735
Paso 7: 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:
INO
Recomendado:
Luces de bricolaje de larga distancia para mejores amigos: 4 pasos (con imágenes)
Luces de bricolaje para el mejor amigo de larga distancia: hice luces sincronizadas de larga distancia conocidas como " Mejor amigo " Lámparas. Eso solo significa que se mantienen sincronizados con el color actual de la otra lámpara. Entonces, si cambiara una lámpara a verde, poco después la otra lámpara se volvería verde
Circuito del sistema de transmisión de larga distancia: 6 pasos
Circuito del sistema de transmisión de larga distancia: hoy, en este artículo, hablaremos sobre cómo hacer un circuito básico del sistema de transmisión de larga distancia. En este sentido, permítanme darles una descripción concisa del circuito. En general, cómo funciona esto y cómo les hablo a las cosas al
Antena externa para ESP8266: 5 pasos
Antena externa para ESP8266: A veces necesita una antena externa para el ESP8266. Por ejemplo, desea instalar el ESP en una caja de metal para algunas aplicaciones externas u otras que se instalan en los casos. O solo necesita una señal más fuerte. Por lo tanto, debe instalar
Filtro de señal Wifi (WokFi) Larga distancia: 3 pasos (con imágenes)
Colador de señal Wifi (WokFi) de larga distancia: en este instructivo, convierto una unidad de pulgar WiFi común en un extensor de wifi robusto. 'El colador parabólico de cocina asiática (bola de masa) es el candidato perfecto para este proyecto. puntos de la ciudad y conectarse a una red
Huawei E160X (Vodafone K3565) 3G Dongle Antena / Carcasa externa: 13 pasos (con imágenes)
Huawei E160X (Vodafone K3565) 3G Dongle Antena externa / Carcasa: El dongle K3565 que proporciona Vodafone con su plan de pago por uso es excelente, pero frustrantemente el conector de la antena externa está escondido debajo de la carcasa. Aquí se explica cómo piratear la carcasa para acceder a ese conector oculto, y para aquellos que quieran