INHOUDSOPGAWE:

ESP32 met eksterne langafstand -antenne: 10 stappe
ESP32 met eksterne langafstand -antenne: 10 stappe

Video: ESP32 met eksterne langafstand -antenne: 10 stappe

Video: ESP32 met eksterne langafstand -antenne: 10 stappe
Video: Home Assistant - sluit adresband WS2812B aan via ESP8266 met WLED-firmware 2024, Julie
Anonim
Image
Image
Monteer die AP met Wrover
Monteer die AP met Wrover

Die onderwerp van vandag handel oor 'n afstandtoets met 'n ESP32 met eksterne antenne. Kom ons gebruik vandag twee modules: van Espressif en TTGO. Kom ons kyk dan na die RSSI tussen hierdie twee ESP32 -antennas, maak 'n grafiek uit die geskiedenis en skryf 'n logboek van die waardes in 'n CSV -lêer.

Ons het dan die ESP32 Wrover as AP, en die ESP32 van TTGO as Station. Ek gebruik 'n antenna wat ek van 'n effens groter TP-Link geneem het en 'n ander router wat bekend staan as 'n 9dbm antenna. Ek het geen verskil tussen die twee opgemerk nie.

Laastens sluit die twee mikrobeheerders via 'n sok aan, en met elke versending van datapakkies druk ons 'n grafiek op die skerm met die balke wat die verhouding van dbm aandui.

Stap 1: Monteer die AP met Wrover

Stap 2: Samestelling van STASIE Met TTGO

Vergadering van STASIE Met TTGO
Vergadering van STASIE Met TTGO

Stap 3: RESULTAT

UITSLAG
UITSLAG
UITSLAG
UITSLAG
UITSLAG
UITSLAG

Maksimum afstand met 2x eksterne antennas: 315 meter

Maksimum afstand met eksterne en interne antenne: 157 meter

Stap 4: Argiveer LOG. CSV

Argief LOG. CSV
Argief LOG. CSV
Argief LOG. CSV
Argief LOG. CSV

Ek het die data op 'n SD -kaart aangeteken, met data in millis, dbm en die pakketstring.

Stap 5: Adafruit GFX -biblioteek

Adafruit GFX -biblioteek
Adafruit GFX -biblioteek

Gaan in die Arduino IDE na Skets-> Sluit biblioteek in-> Beheer biblioteke …

Installeer Adafruit GFX Library

Stap 6: Adafruit ST7735 -biblioteek

Adafruit ST7735 Biblioteek
Adafruit ST7735 Biblioteek

Gaan in die Arduino IDE na Skets-> Sluit biblioteek in-> Beheer biblioteke …

Installeer Adafruit ST7735

Stap 7: Die opstel van die kaarte

Die opstel van die kaarte
Die opstel van die kaarte
Die opstel van die kaarte
Die opstel van die kaarte

Bly ingeskakel vir verskille:

Stap 8: AP.ino

Ons het die nodige biblioteke ingesluit en 'n paar parameters omskryf.

#include #include #include #include #include #include // Rede que of ESP criará. No Station deve ser igual #define SSID "RSSI_Test" #define PASSWORD "87654321" // Time of timeout for a conexão pedida #define TIMEOUT 2000 // Largura en altura 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"

Ons definieer die penne, onder andere veranderlikes

// Pinos vertoon wel #definieer 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. Ons kan dit ook doen (23, 19 e 18 respectivamente) #define SDCARD_CS 15 // Pixel onde or 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 (kwalifikasie porta válida serve contanto que o cliente utilize a mesma porta) WiFiServer server (80); // Verskeie weergawes vir kliënte (geen kas of ESP32 em modo -stasie) met WiFiClient -kliënt; // String que recebemos do cliente String ontvang; // RSSI enviado pelo cliente para este ESP32 long rssi = 0; // Faz o controle do temporizador (interrupção por tempo) hw_timer_t *timer = NULL; // Gebruik vir die beskerming van ons ultimos std:: vektor rssiHistory;

Stel op

ongeldige opstelling () {Serial.begin (115200); setupDisplay (); // Inisialisasie of SD as (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Gebruik WiFi, amptelike bedieners en e -posse vir die opstel van WiFi (); bediener.begin (); waitForClient (); // Espera 3 segundos, limpa a tela e inicializa o Watchdog delay (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }

Stel WiFi op

// Toegangspunt en konfigurasie van IPvoid setupWiFi () {display.println ("Creating softAP" + String (SSID)); WiFi. Ontkoppel (); WiFi.mode (WIFI_AP); WiFi.softAPConfig (IPAddress (192, 168, 0, 1), IPAddress (192, 168, 0, 1), IPAddress (255, 255, 255, 0)); WiFi.softAP (SSID, WAGWOORD); display.println ("softAP" + string (SSID) + "geskep!"); }

Stel skerm op

// Weergawe, vertoning en oriëntasie van 'n telavoid setupDisplay () {// Inisialisasie van display.initR (INITR_BLACKTAB); // Rotaciona o conteúdo mostrado display.setRotation (3); // Om die skerm te vertoon.fillScreen (ST77XX_BLACK); }

waitForClient

void waitForClient () {display.println ("Wag vir kliënt"); // Aguarda o cliente conectar while (! (Client = server.available ())) {display.print ("."); vertraging (500); } display.println ("Kliënt gekoppel"); // 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 en setupWatchdog

// função que o temporizador irá chamar, para reiniciar of ESP32void IRAM_ATTR resetModule () {ets_printf ("(watchdog) reiniciar / n"); esp_restart_noos (); // herstel van die chip} ongeldige setupWatchdog () {timer = timerBegin (0, 80, waar); // timerID 0, div 80 // timer, callback, interrupção de borda timerAttachInterrupt (timer, & resetModule, true); // timer, tempo (ons), repetição timerAlarmWrite (timer, 10000000, waar); timerAlarmEnable (timer); // habilita a interrupção}

Lus

leemte -lus () {timerWrite (timer, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // checa se possui conexão com of cliente readFromClient (); // lêers kan stuur na 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 () {// Ons kan nie 'n verskaffer kry as (! client.connected ()) {// 'n Klanker kan vertoon word.fillScreen (ST77XX_BLACK); display.println ("Kliënt ontkoppel"); 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); // Verwyder die finale rssi = client.parseInt (); // Lê o rssi que o cliente enviou clearText (); // Limp o texto display.setCursor (0, 0); // Beweeg na die wyser om die teks te vertoon om display.println ("RSSI:" + String (rssi)) te vertoon; // Mostra o RSSI no display display.println ("Ontvang:" + ontvang); // Mostra a mensagem recebida do cliente // Se a quantidade de barras do gráfico passou do limite apagamos or 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); }}

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 (stuur); }}

komplot

leegte 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 - waarde, waarde, PLOT_COLOR); currentX += 2;}}

clearText en log

void clearText () {// Ons kan ook 'n teksversameling vir klante display.fillRect (0, 0, DISPLAY_WIDTH, 2*PLOT_MARGIN, ST77XX_BLACK) gebruik; } void log () {// Abrimos o arquivo para escrevermos no final dele File file = SD.open (FILE_PATH, FILE_APPEND); // Sien die volgende voorbeelde: (Serial.println ("Kon nie lêer oopmaak nie"); terugkeer; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + String (rssi) + ";" + ontvang; file.println (data); file.close (); }

Stap 9: Station.ino

Ons het die nodige biblioteke ingesluit en 'n paar parameters omskryf.

#include #include #include #include #include #include // Nome da rede que nos conectaremos. Skakel AP toe #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 considera 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 taman #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"

Ons definieer die instellings wat die skerm en die SD -kaart behels.

lang telling = 0; // Contador de mensagens enviadaslong rssi = 0; // RSSI calculado String ontvang; // Mensagem de confirmmação que o AP nos envia // Pixel onde o gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Gebruik vir die gebruik van 'n bediener WiFiClient -aansluiting; #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 controle do temporizador (interrupção por tempo) // Gebruik vir ultimos std:: vektor rssiHistory;

Stel op

ongeldige opstelling () {setupDisplay (); // Inisialisasie of SD as (! 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

// Weergawe, vertoning en weergawe van 'n telavoid setupDisplay () {// Inisialisasie van display.initR (INITR_BLACKTAB); // Rotaciona o conteúdo mostrado display.setRotation (1); // Laai die branco display.fillScreen (ST77XX_BLACK); display.setTextColor (ST77XX_WHITE); }

setupWiFi

// Conecta ao AP void setupWiFi () {WiFi.disconnect (); WiFi.mode (WIFI_STA); WiFi.begin (SSID, WAGWOORD); display.println ("Koppel aan" + string (SSID)); // Enquanto não estiver conectado à rede WiFi while (WiFi.status ()! = WL_CONNECTED) {delay (500); display.print ("."); } display.println (""); display.print ("gekoppel aan"); display.println (SSID); }

connectToServer

void connectToServer () {display.println ("Sokverbinding probeer"); // Gebruik 'n bediener terwyl (! Socket.connect (HOST, PORT)) {display.print ("."); vertraging (500); } display.println (); display.println ("Verbind!"); // 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 en setupWatchdog

// função que o temporizador irá chamar, para reiniciar of ESP32void IRAM_ATTR resetModule () {ets_printf ("(watchdog) reiniciar / n"); esp_restart_noos (); // herstel van die chip} ongeldige setupWatchdog () {timer = timerBegin (0, 80, waar); // timerID 0, div 80 // timer, callback, interrupção de borda timerAttachInterrupt (timer, & resetModule, true); // timer, tempo (ons), repetição timerAlarmWrite (timer, 10000000, waar); timerAlarmEnable (timer); // habilita a interrupção}

lus

leemte -lus () {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 oma mensagem com um contador para o server readFromServer (); // espera a confirmmação do server log (); // salva um log no cartão SD vertraging (1000); // espera um segundo}

checkConnection

void checkConnection () {// Verifica a conexão with AP if (WiFi.status ()! = WL_CONNECTED) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("WiFi ontkoppel"); setupWiFi (); vertraging (1000); } // verifica a conexão do socket if (! socket.connected ()) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("Socket ontkoppel"); connectToServer (); vertraging (3000); display.fillScreen (ST77XX_BLACK); }}

checkRSSI

leegte kontrole RSSI () {// Verifikasie van RSSI rssi = WiFi. RSSI (); // Beperk die teks en die meeste o RSSI geen vertoning clearText (); display.setCursor (0, 0); display.print ("RSSI:" + string (rssi)); // Kyk na 'n kwantitatiewe dekking van 'n beperkte aantal van die antistieke as (rssiHistory.size () == (DISPLAY_WIDTH - 2*PLOT_MARGIN)/2) {rssiHistory.erase (rssiHistory.begin ()); } // Adiciona no final do histórico (mais recente) rssiHistory.push_back (rssi); }

komplot

leegte 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 - waarde, waarde, 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 ("Stuur:" + stuur); socket.println (stuur); socket.print (String (rssi)); tel ++; }}

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 ()) {// As u soek, kan u dit verwyder en uiteindelik geen vertoning ontvang nie = socket.readStringUntil ('\ n'); ontvang.verwyder (ontvang.lengte ()-1); display.println ("Ontvang:" + ontvang); }}

clearText en log

void clearText () {// Ons kan ook 'n teksversameling vir klante display.fillRect (0, 0, DISPLAY_WIDTH, 2*PLOT_MARGIN, ST77XX_BLACK) gebruik; } void log () {// Abrimos o arquivo para escrevermos no final dele File file = SD.open (FILE_PATH, FILE_APPEND); // Sien die volgende voorbeelde: (Serial.println ("Kon nie lêer oopmaak nie"); terugkeer; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + String (rssi) + ";" + ontvang; file.println (data); file.close (); }

Stap 10: lêers

Laai die lêers af:

PDF

EK NEE

Aanbeveel: