Innehållsförteckning:

ESP32 med extern långdistansantenn: 10 steg
ESP32 med extern långdistansantenn: 10 steg

Video: ESP32 med extern långdistansantenn: 10 steg

Video: ESP32 med extern långdistansantenn: 10 steg
Video: Can chatGPT Program an ESP32? 2024, Juli
Anonim
Image
Image
Montering av AP med Wrover
Montering av AP med Wrover

Dagens ämne handlar om ett distansprov med en ESP32 med extern antenn. Låt oss använda två moduler idag: från Espressif och TTGO. Låt oss sedan kontrollera RSSI mellan dessa två ESP32 -antenner, generera ett diagram från historiken och skriva en logg över värdena i en.csv -fil.

Vi har sedan ESP32 Wrover som AP, och ESP32 för TTGO som station. Jag använde en antenn som jag tog från en lite större TP-Link och en annan router känd som en 9dbm antenn. Jag har inte märkt någon skillnad mellan de två.

Slutligen ansluter de två mikrokontrollerna via uttag och för varje sändning av datapaket skriver vi ut en graf med en stapel som visar förhållandet mellan dbm på en display.

Steg 1: Montering av AP med Wrover

Steg 2: Montering av STATION med TTGO

Montering av STATION Med TTGO
Montering av STATION Med TTGO

Steg 3: RESULTAT

RESULTAT
RESULTAT
RESULTAT
RESULTAT
RESULTAT
RESULTAT

Maximalt avstånd med 2x externa antenner: 315 meter

Maximalt avstånd med extern och intern antenn: 157 meter

Steg 4: Arkivera LOG. CSV

Arkiv LOG. CSV
Arkiv LOG. CSV
Arkiv LOG. CSV
Arkiv LOG. CSV

Jag spelade in data på ett SD -kort, med data i millis, dbm och paketsträngen.

Steg 5: Adafruit GFX -bibliotek

Adafruit GFX -bibliotek
Adafruit GFX -bibliotek

I Arduino IDE, gå till Sketch-> Inkludera bibliotek-> Hantera bibliotek …

Installera Adafruit GFX Library

Steg 6: Adafruit ST7735 bibliotek

Adafruit ST7735 bibliotek
Adafruit ST7735 bibliotek

I Arduino IDE, gå till Sketch-> Inkludera bibliotek-> Hantera bibliotek …

Installera Adafruit ST7735

Steg 7: Konfigurera korten

Konfigurera korten
Konfigurera korten
Konfigurera korten
Konfigurera korten

Håll utkik efter skillnader:

Steg 8: AP.ino

Vi har inkluderat de nödvändiga biblioteken och definierat några parametrar.

#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 a conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHTes 128 // Configuration 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.sv"

Vi definierar stiften, bland andra variabler

// Pinos visar #definiera 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álida 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; // String que recebemos do cliente String received; // RSSI enviado pelo cliente para este ESP32 long rssi = 0; // Faz o control do temporizador (interrupção por tempo) hw_timer_t *timer = NULL; // Utilizado para guardar os ultimos std:: vector rssiHistory;

Uppstart

void setup () {Serial.begin (115200); setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Cria a rede WiFi, official server o 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 (); }

Konfigurera WiFi

// Cria um Access Point e configura o IPvoid setupWiFi () {display.println ("Creating softAP" + String (SSID)); WiFi. Koppla bort (); WiFi.mode (WIFI_AP); WiFi.softAPConfig (IPAddress (192, 168, 0, 1), IPAddress (192, 168, 0, 1), IPAddress (255, 255, 255, 0)); WiFi.softAP (SSID, LÖSENORD); display.println ("softAP" + String (SSID) + "skapat!"); }

Setup Display

// Incializa o display, muda a orientação e limpa a telavoid setupDisplay () {// Inicializa 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 ("Väntar på klient"); // Aguarda o cliente conectar while (! (Client = server.available ())) {display.print ("."); fördröjning (500); } display.println ("Klient ansluten"); // Tempo máximo que o cliente deve demorar para responder // antes de dizermos que a conexão foi perdida client.setTimeout (TIMEOUT); }

IRAM_ATTR resetModule och 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, callback, interrupção de borda timerAttachInterrupt (timer, & resetModule, true); // timer, tempo (us), repetição timerAlarmWrite (timer, 10000000, true); timerAlarmEnable (timer); // habilita a interrupção}

Slinga

void loop () {timerWrite (timer, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // checa se possui conexão com o cliente readFromClient (); // läs vad vi gör för att skicka sendToClient (); // envia confirmmação 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 ("Klienten är bortkopplad"); 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 enviou received.remove (received.length ()-1); // Ta bort o / n gör sista rssi = client.parseInt (); // Lê o rssi que o cliente enviou clearText (); // Limpa o texto display.setCursor (0, 0); // Flytta markören till text för att visa display.println ("RSSI:" + String (rssi)); // Mostra o RSSI ingen display display.println ("mottaget:" + mottaget); // 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. Börja()); } // 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 sending = received + "OK"; client.println (skickar); }}

komplott

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 - värde, värde, PLOT_COLOR); currentX += 2;}}

clearText och log

void clearText () {// Limpa arearea com text of 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 ("Det gick inte att öppna filen"); lämna tillbaka; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + String (rssi) + ";" + fått; file.println (data); file.close (); }

Steg 9: Station.ino

Vi har inkluderat de nödvändiga biblioteken och definierat några parametrar.

#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 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 tam #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"

Vi definierar inställningarna som involverar displayen och SD -kortet.

långt antal = 0; // Contador de mensagens enviadaslong rssi = 0; // RSSI calculado Sträng mottagen; // Mensagem de confirmmação que o AP nos envia // Pixel onde o gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Utilizado para conexão com o server 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 e 18 respectivamente) #define SDCARD_CS 15 // Objeto responsável pelo display Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLR,;) hw_timer_t *timer = NULL; // faz o control do temporizador (interrupção por tempo) // Utilizado para guardar os ultimos std:: vector rssiHistory;

Uppstart

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

setupDisplay

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

setupWiFi

// Conecta ao AP void setupWiFi () {WiFi.disconnect (); WiFi.mode (WIFI_STA); WiFi. Börjar (SSID, LÖSENORD); display.println ("Ansluter till" + String (SSID)); // Enquanto não estiver conectado à rede WiFi while (WiFi.status ()! = WL_CONNECTED) {delay (500); display.print ("."); } display.println (""); display.print ("Ansluten till"); display.println (SSID); }

connectToServer

void connectToServer () {display.println ("Försöker ansluta socket"); // Espera a conexão com o server while (! Socket.connect (HOST, PORT)) {display.print ("."); fördröjning (500); } display.println (); display.println ("Ansluten!"); // Tempo máximo que o cliente deve demorar para responder // antes de dizermos que a conexão foi perdida socket.setTimeout (TIMEOUT); }

IRAM_ATTR resetModule och 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, callback, interrupção de borda timerAttachInterrupt (timer, & resetModule, true); // timer, tempo (us), repetição timerAlarmWrite (timer, 10000000, true); timerAlarmEnable (timer); // habilita a interrupção}

slinga

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 server readFromServer (); // espera a confirmmação do server log (); // salva um log no cartão SD -fördröjning (1000); // espera um segundo}

checkConnection

void checkConnection () {// Verifiera a conexão com o AP if (WiFi.status ()! = WL_CONNECTED) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("WiFi frånkopplad"); setupWiFi (); fördröjning (1000); } // verifica a conexão do socket if (! socket.connected ()) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("Socket frånkopplad"); connectToServer (); fördröjning (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); }

komplott

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 - värde, värde, PLOT_COLOR); currentX += 2;}}

sendToServer

void sendToServer () {// Se estiver conectado com o server if (socket.connected ()) {// Envia um hello com um contador, mostra no display e incrementa o contador String sending = "Hello" + String (count); display.setCursor (0, 10); display.println ("Skickar:" + sändning); socket.println (skickar); socket.print (String (rssi)); räkna ++; }}

readFromServer

void readFromServer () {// Espera até o server 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'); received.remove (mottagen.längd ()-1); display.println ("Mottaget:" + mottaget); }}

clearText och log

void clearText () {// Limpa arearea com text of 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 ("Det gick inte att öppna filen"); lämna tillbaka; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + String (rssi) + ";" + mottaget; file.println (data); file.close (); }

Steg 10: Filer

Ladda ner filerna:

PDF

INO

Rekommenderad: