Taula de continguts:

ESP32 amb antena externa de llarga distància: 10 passos
ESP32 amb antena externa de llarga distància: 10 passos

Vídeo: ESP32 amb antena externa de llarga distància: 10 passos

Vídeo: ESP32 amb antena externa de llarga distància: 10 passos
Vídeo: Cuando el copiloto me ensucia el sillín 👀😅 #humor #eli #motos 2024, Desembre
Anonim
Image
Image
Muntatge de l'AP amb Wrover
Muntatge de l'AP amb Wrover

El tema d’avui fa referència a una prova a distància amb un ESP32 amb antena externa. Utilitzem dos mòduls avui: d'Espressif i TTGO. A continuació, comprovem l'RSI entre aquestes dues antenes ESP32, generem un gràfic a partir de l'historial i escrivim un registre dels valors en un fitxer.csv.

Després tenim l’ESP32 Wrover com a AP i l’ESP32 de TTGO com a Estació. Vaig utilitzar una antena que vaig treure d’un TP-Link una mica més gran i un altre enrutador conegut com a antena de 9 dbm. No he notat cap diferència entre els dos.

Finalment, els dos microcontroladors es connecten mitjançant un sòcol i, amb cada enviament de paquets de dades, imprimim en una pantalla un gràfic amb les barres que indiquen la proporció de dbm.

Pas 1: muntatge de l'AP amb Wrover

Pas 2: Muntatge de STATION amb TTGO

Muntatge de STATION amb TTGO
Muntatge de STATION amb TTGO

Pas 3: RESULTAT

RESULTAT
RESULTAT
RESULTAT
RESULTAT
RESULTAT
RESULTAT

Distància màxima amb antenes externes 2x: 315 metres

Distància màxima amb antena externa i interna: 157 metres

Pas 4: Arxiu LOG. CSV

Arxiu LOG. CSV
Arxiu LOG. CSV
Arxiu LOG. CSV
Arxiu LOG. CSV

Vaig gravar les dades en una targeta SD, amb dades en mil·lis, dbm i la cadena de paquets.

Pas 5: biblioteca d'Adafruit GFX

Biblioteca AdFruit GFX
Biblioteca AdFruit GFX

A l'IDE Arduino, aneu a Sketch-> Inclou biblioteca-> Gestiona biblioteques …

Instal·leu la biblioteca Adafruit GFX

Pas 6: Biblioteca Adafruit ST7735

Biblioteca Adafruit ST7735
Biblioteca Adafruit ST7735

A l'IDE Arduino, aneu a Sketch-> Inclou biblioteca-> Gestiona biblioteques …

Instal·leu Adafruit ST7735

Pas 7: Configuració de les targetes

Configuració de les cartes
Configuració de les cartes
Configuració de les cartes
Configuració de les cartes

Estigueu atents a les diferències:

Pas 8: AP.ino

Hem inclòs les biblioteques necessàries i hem definit alguns paràmetres.

#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 per considerar una connexió 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"

Definim els pins, entre altres variables

// Pinos mostren # 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 i 18 respectivament) #define SDCARD_CS 15 // Pixel onde o graphic 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álida serve contanto que o client use a same porta) WiFiServer server (80); // Variável para armazenar o cliente (no caso o ESP32 em modo station) connectat WiFiClient client; // String que recebemos do client S'ha rebut la cadena; // RSSI enviado pelo cliente para este ESP32 long rssi = 0; // Faz o controle do temporizador (interrupció per tempo) hw_timer_t * timer = NULL; // Utilitzat per guardar els últims std:: vector rssiHistory;

Configuració

configuració nul·la () {Serial.begin (115200); setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Cria a rede WiFi, inicialització del servidor i espera o client connectar setupWiFi (); server.begin (); waitForClient (); // Espera 3 segons, limpa a tela e inicializa o Watchdog delay (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }

Configuració de WiFi

// Cria um Access Point i configura o IPvoid setupWiFi () {display.println ("Creació de softAP" + cadena (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, CONTRASENYA); display.println ("softAP" + Cadena (SSID) + "creat!"); }

Configuració de la pantalla

// Incialitza o display, muda a orientació i limpa a telavoid setupDisplay () {// Inicializa o display display.initR (INITR_BLACKTAB); // Rotaciona o conteúdo mostrado display.setRotation (3); // Pinta a tela de preto display.fillScreen (ST77XX_BLACK); }

waitForClient

void waitForClient () {display.println ("Esperant client"); // Aguarda o cliente conectar while (! (Client = server.available ())) {display.print ("."); retard (500); } display.println ("Client connectat"); // Temps màxim que el client ha de demorar per respondre // abans de dizermos que a conexão foi perdida client.setTimeout (TIMEOUT); }

IRAM_ATTR resetModule i setupWatchdog

// função que o temporizador irá chamar, per reiniciar o ESP32void IRAM_ATTR resetModule () {ets_printf ("(watchdog) reiniciar / n"); esp_restart_noos (); // reinicia o xip} void setupWatchdog () {timer = timerBegin (0, 80, true); // timerID 0, div 80 // timer, callback, interrupció de borda timerAttachInterrupt (temporitzador, & resetModule, true); // temporitzador, tempo (us), repetició timerAlarmWrite (temporitzador, 10000000, true); timerAlarmEnable (temporitzador); // habilita a interrupció}

Bucle

bucle buit () {timerWrite (temporitzador, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // checa se possui conexão com o client readFromClient (); // lê os dados do client sendToClient (); // envia confirmació per al client plot (); // mostra o gràfic d’històric de rssi log (); // salva um log no cartão SD}

checkConnection

void checkConnection () {// Se o client no està connectat if (! client.connected ()) {// Limpa a tela e espera pelo cliente display.fillScreen (ST77XX_BLACK); display.println ("Client desconnectat"); waitForClient (); }}

readFromClient

void readFromClient () {// Espera até o client enviar algo o desconectar while (client.connected () &&! client.available ()) {delay (100); } // Se chegou aqui e ainda estiver connectado is because possui algo for receber do client if (client.connected ()) {received = client.readStringUntil ('\ n'); // Lê o texto que o cliente envió recibido.remove (recibido.longa () - 1); // Elimina o / n fer final rssi = client.parseInt (); // Lê o rssi que o client us envia clearText (); // Limpa o texto display.setCursor (0, 0); // Mou el cursor del text per a l'aparició de display.println ("RSSI:" + String (rssi)); // Mostra o RSSI no display display.println ("Rebut:" + rebut); // Mostra a mensagem recebida do client // 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 recent) rssiHistory.push_back (rssi); }}

sendToClient

void sendToClient () {// Se o client estiver connectado enviamos de volta a mensagem com OK if (client.connected ()) {String Send = received + "OK"; client.println (enviament); }}

parcel · la

void plot () {// Coloca no ponto inicial i 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 and avançamos for o next 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 i registre

void clearText () {// Limpa a l'àrea com o text de mensatges vinda del client 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); // No es poden obrir arquiu mostramos un missatge d'error if (! File) {Serial.println ("No s'ha pogut obrir el fitxer"); tornar; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + String (rssi) + ";" + rebut; file.println (dades); file.close (); }

Pas 9: Station.ino

Hem inclòs les biblioteques necessàries i hem definit alguns paràmetres.

#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 va ser configurat 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 i tamanho do gráfico #define PLOT_COLOR ST77XX_GREEN #define PLOT_MARGIN 20 #define PLOT_SIZE (DISPLAY_HEIGHT - 2 * PLOT_MARGIN) // Arxiu de registre no SD #define FILE_PATH "/log.csv"

Definim la configuració que implica la pantalla i la targeta SD.

recompte llarg = 0; // Contador de mensagens enviadaslong rssi = 0; // RSSI calculado Cadena rebuda; // Mensagem de confirmmação que o AP nos envia // Pixel onde o gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Utilitzat per a connexió amb 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 i 18 respectivament) #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 * temporitzador = NULL; // faz o controle do temporizador (interrupció per tempo) // Utilizado para guardar os ultimos std:: vector rssiHistory;

Configuració

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 i connecta al servidor setupWiFi (); connectToServer (); // Espera 3 segons, limpa a tela e inicializa o Watchdog delay (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }

setupDisplay

// Incialitza o mostra, muda a l'orientació i limpa a una configuració telavoid setupDisplay () {// Inicialitza o mostra display.initR (INITR_BLACKTAB); // Rotaciona o conteúdo mostrado display.setRotation (1); // Pinta a tela de blanc display.fillScreen (ST77XX_BLACK); display.setTextColor (ST77XX_WHITE); }

configuració de Wi-Fi

// Conecta ao AP void setupWiFi () {WiFi.disconnect (); WiFi.mode (WIFI_STA); WiFi.begin (SSID, CONTRASENYA); display.println ("Connexió a" + Cadena (SSID)); // Enquanto no estiver connectado to rede WiFi while (WiFi.status ()! = WL_CONNECTED) {delay (500); display.print ("."); } display.println (""); display.print ("Connectat a"); display.println (SSID); }

connectToServer

void connectToServer () {display.println ("S'està provant la connexió de sòcol"); // Espera a conexão com o server while (! Socket.connect (HOST, PORT)) {display.print ("."); retard (500); } display.println (); display.println ("Connectat!"); // Temps màxim que el client ha de demorar per respondre // abans de dizermos que a conexão foi perdida socket.setTimeout (TIMEOUT); }

IRAM_ATTR resetModule i setupWatchdog

// função que o temporizador irá chamar, per reiniciar o ESP32void IRAM_ATTR resetModule () {ets_printf ("(watchdog) reiniciar / n"); esp_restart_noos (); // reinicia o xip} void setupWatchdog () {timer = timerBegin (0, 80, true); // timerID 0, div 80 // timer, callback, interrupció de borda timerAttachInterrupt (temporitzador, & resetModule, true); // timer, tempo (us), repetição timerAlarmWrite (temporitzador, 10000000, true); timerAlarmEnable (temporitzador); // habilita a interrupció}

bucle

bucle buit () {timerWrite (temporitzador, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // checa se possui conexão com o server checkRSSI (); // verifica o rssi plot (); // mostra o gràfic històric de rssi sendToServer (); // envia uma mensagem com um contador per a un servidor readFromServer (); // espera a confirmmação do server log (); // salva um log no cartão SD delay (1000); // espera um segon}

checkConnection

void checkConnection () {// Verifica una connexió amb AP si (WiFi.status ()! = WL_CONNECTED) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("WiFi desconnectat"); setupWiFi (); retard (1000); } // verifica una connexió de socket si (! socket.connected ()) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("Socket desconnectat"); connectToServer (); retard (3000); display.fillScreen (ST77XX_BLACK); }}

comprova RSSI

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:" + Cadena (rssi)); // Se a quantitat 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 recent) rssiHistory.push_back (rssi); }

parcel · la

void plot () {// Coloca no ponto inicial i 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 and avançamos for o next 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 () {// Es troba connectat amb el servidor if (socket.connected ()) {// Envia um hola com a contador, mostra no display e incrementa o contador String Send = "Hello" + String (count); display.setCursor (0, 10); display.println ("Enviament:" + enviament); socket.println (enviament); socket.print (String (rssi)); comptar ++; }}

readFromServer

void readFromServer () {// Espera até o server enviar algo o 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 displayed = socket.readStringUntil ('\ n'); Received.remove (Received.length () - 1); display.println ("Rebut:" + rebut); }}

clearText i registre

void clearText () {// Limpa a l'àrea com o text de mensatges vinda del client 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); // No es poden obrir arquiu mostramos uma mensagem de erro if (! File) {Serial.println ("No s'ha pogut obrir el fitxer"); tornar; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + String (rssi) + ";" + rebut; file.println (dades); file.close (); }

Pas 10: fitxers

Descarregueu els fitxers:

PDF

INO

Recomanat: