Obsah:

ESP32 s externou diaľkovou anténou: 10 krokov
ESP32 s externou diaľkovou anténou: 10 krokov

Video: ESP32 s externou diaľkovou anténou: 10 krokov

Video: ESP32 s externou diaľkovou anténou: 10 krokov
Video: DAB+ radio with T4A tuner and tft touchscreen 2024, November
Anonim
Image
Image
Montáž AP pomocou Wrover
Montáž AP pomocou Wrover

Dnešná téma sa týka testu vzdialenosti s ESP32 s externou anténou. Dnes použijeme dva moduly: od Espressif a TTGO. Potom skontrolujeme RSSI medzi týmito dvoma anténami ESP32, vygenerujeme graf z histórie a napíšeme protokol hodnôt do súboru.csv.

Potom máme ESP32 Wrover ako AP a ESP32 od TTGO ako Station. Použil som anténu, ktorú som vzal z o niečo väčšieho TP-Link a iného smerovača známeho ako 9dbm anténa. Nevšimol som si žiadny rozdiel medzi týmito dvoma.

Nakoniec sa dva mikrokontroléry spoja pomocou zásuvky a pri každom odoslaní dátových paketov vytlačíme na displej graf s pruhmi, ktoré udávajú pomer dbm.

Krok 1: Pripojenie AP pomocou Wrover

Krok 2: Zostavenie STANICE s TTGO

Zostava STANICE s TTGO
Zostava STANICE s TTGO

Krok 3: VÝSLEDOK

VÝSLEDOK
VÝSLEDOK
VÝSLEDOK
VÝSLEDOK
VÝSLEDOK
VÝSLEDOK

Maximálna vzdialenosť s 2x externou anténou: 315 metrov

Maximálna vzdialenosť s externou a internou anténou: 157 metrov

Krok 4: Archivácia LOG. CSV

Archív LOG. CSV
Archív LOG. CSV
Archív LOG. CSV
Archív LOG. CSV

Údaje som zaznamenal na kartu SD s údajmi v milis, dbm a reťazcom balíka.

Krok 5: Knižnica Adafruit GFX

Knižnica Adafruit GFX
Knižnica Adafruit GFX

V Arduino IDE prejdite na Skica-> Zahrnúť knižnicu-> Spravovať knižnice …

Nainštalujte knižnicu Adafruit GFX

Krok 6: Knižnica Adafruit ST7735

Knižnica Adafruit ST7735
Knižnica Adafruit ST7735

V Arduino IDE prejdite na Skica-> Zahrnúť knižnicu-> Spravovať knižnice …

Nainštalujte Adafruit ST7735

Krok 7: Konfigurácia kariet

Konfigurácia kariet
Konfigurácia kariet
Konfigurácia kariet
Konfigurácia kariet

Sledujte rozdiely:

Krok 8: AP.ino

Zahrnuli sme potrebné knižnice a definovali niektoré parametre.

#include #include #include #include #include #include // Rede que o ESP criará. Žiadna oficiálna stanica #define SSID „RSSI_Test“#define PASSWORD „87654321“// Časový limit času pre úvahy o pripojených pedidoch #define TIMEOUT 2000 // Veľká veľkosť a altura do displeja #define DISPLAY_WIDTH 160 #definine DISPLAY_HEIGHT 128 // Konfigurácia 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"

Okrem iných premenných definujeme kolíky

// Pinos do display #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. Môžeme veľa problémov (23, 19 a 18 rešpektovať) #definovať SDCARD_CS 15 // Pixel onde o gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Objeto responzívny pelo displej Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST); // Criamos um server (kvalita porta válida slúžiť kontanto que o kliente use a mesma porta) WiFiServer server (80); // Variável para armazenar o cliente (no caso o ESP32 em modo station) conectado WiFiClient client; // Prijímanie reťazcov do klientov Prijatý reťazec; // Klienti RSSI získavajú dôležité údaje z ESP32, dlhé rssi = 0; // Ovládanie časovača (prerušenie alebo tempo) hw_timer_t *timer = NULL; // Použitie špeciálnych strážcov std:: vector rssiHistory;

Nastaviť

void setup () {Serial.begin (115200); setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao initializar lib SD!"); } // Vytvorte a pripojte Wi -Fi, inicializujte server a nainštalujte si klientske pripojenie konektoraWiFi (); server.begin (); waitForClient (); // Espera 3 segundos, limpa and tela e inicializa o Watchdog delay (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }

Nastaviť WiFi

// Vytvorenie prístupového bodu a konfigurácia IP Vyhnite sa setupWiFi () {display.println ("Vytváranie softAP" + reťazec (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, HESLO); display.println ("softAP" + String (SSID) + "created!"); }

Nastavenie displeja

// Inializa o display, muda and orientação e limpa and 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 ("Čakanie na klienta"); // Aguarda alebo klientský konektor while (! (Client = server.available ())) {display.print ("."); oneskorenie (500); } display.println („Klient pripojený“); // Tempo maximálneho počtu klientov, ktorí reagujú na demorálnu situáciu // // ostatné otázky súvisiace s klientom.setTimeout (TIMEOUT); }

IRAM_ATTR resetModule and 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 // časovač, spätné volanie, prerušenie časovača timerAttachInterrupt (timer, & resetModule, true); // timer, tempo (us), repetição timerAlarmWrite (časovač, 10 000 000, pravda); timerAlarmEnable (časovač); // habilita a interrupção}

Slučka

void loop () {timerWrite (časovač, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // čo sa týka pripájania klientov k readFromClient (); // mame dados to cliente sendToClient (); // potvrdenie platnosti klienta (); // mostra o gráfico de historco de rssi log (); // salva um log no cartão SD}

checkConnection

neplatné checkConnection () {// Se o kliente não estiver conectado if (! client.connected ()) {// Limpa a tela e espera pelo cliente display.fillScreen (ST77XX_BLACK); display.println („Klient odpojený“); waitForClient (); }}

readFromClient

void readFromClient () {// Espera até o cliente enviar algo ou desconectar while (client.connected () &&! client.available ()) {delay (100); } // Nájdite a získajte ďalšie informácie o spojení prijímača a prijímača do klienta, ak (client.connected ()) {receive = client.readStringUntil ('\ n'); // Lê o texto que o cliente enviou receive.remove (receive.length ()-1); // Odstrániť o / n do final rssi = client.parseInt (); // Lê o rssi que o cliente enviou clearText (); // Limpa o texto display.setCursor (0, 0); // Presun kurzora na textovú stránku alebo zobrazenie displeja.println ("RSSI:" + String (rssi)); // Mostra o RSSI žiadny displej display.println ("Prijaté:" + prijaté); // Väčšina príjemcov údajov o klientoch // Množstvo údajov, ktoré môžete urobiť, aby ste získali maximálnu hodnotu, ak (rssiHistory.size () == (DISPLAY_WIDTH - 2*PLOT_MARGIN)/2) {rssiHistory.erase (rssiHistory.začať()); } // Doplňujúce informácie o histórii (nedávne) rssiHistory.push_back (rssi); }}

sendToClient

void sendToClient () {// Se o cliente estiver conectado enviamos de volta a mensagem com um OK if (client.connected ()) {String sent = receive + "OK"; client.println (odosielanie); }}

zápletka

neplatný 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 historyco 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 - hodnota, hodnota, PLOT_COLOR); currentX += 2;}}

clearText a protokol

void clearText () {// Limpa a área 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 no final dele File file = SD.open (FILE_PATH, FILE_APPEND); // Pokračujte v čítaní alebo kliknite na obrázok, ak (! Súbor) {Serial.println ("Nepodarilo sa otvoriť súbor"); návrat; } // Gravamos uma linha com o tempo desde o boot, or rssi atual e a mensagem recebida String data = String (millis ()) + ";" + Reťazec (rssi) + ";" + prijaté; file.println (údaje); file.close (); }

Krok 9: Station.ino

Zahrnuli sme potrebné knižnice a definovali niektoré parametre.

#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. Rýchla a rýchla kontrola počtu snímok // Časový limit pre sledovanie a pridávanie pedálov #define TIMEOUT 2000 // Väčšina a výška zobrazenia #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // Konfigurácia údajov #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"

Definujeme nastavenia, ktoré zahŕňajú displej a kartu SD.

dlhý počet = 0; // Contador de mensagens enviadaslong rssi = 0; // RSSI calculado Reťazec prijatý; // Mensagem de potvrdmação que o AP nos envia // Pixel onde o gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Pripojenie k serveru Wi -Fi klientskeho soketu; #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. Mnoho ďalších (viac ako 23, 19 a 18) #definovať SDCARD_CS 15 // Zobrazenie pelo displeja Adafruit_ST7735 = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_) hw_timer_t *timer = NULL; // ovládacie prvky dočasného prehrávania (s prerušením tempa) // Použitie špeciálnych strážcov maximálne:: vektor rssiHistory;

Nastaviť

void setup () {setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao initializar lib SD!"); } // Conecta no access point criado pelo outro ESP32 e conecta ao server setupWiFi (); connectToServer (); // Espera 3 segundos, limpa and tela e inicializa o Watchdog delay (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }

nastavenieDisplej

// Inaktivácia displeja, prehĺbenie a zaostrenie nastavenia telaDisplay () {// Inicializácia zobrazenia 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); }

nastavenie Wi -Fi

// Conecta ao AP void setupWiFi () {WiFi.disconnect (); WiFi.mode (WIFI_STA); WiFi.begin (SSID, HESLO); display.println („Pripojenie k“+ reťazcu (SSID)); // Pripojenie zdroja signálu k WiFi pripojeniu while (WiFi.status ()! = WL_CONNECTED) {delay (500); display.print ("."); } display.println (""); display.print („Pripojené k“); display.println (SSID); }

connectToServer

void connectToServer () {display.println ("Skúste pripojenie pomocou zásuvky"); // Espera a conexão com o server while (! Socket.connect (HOST, PORT)) {display.print ("."); oneskorenie (500); } display.println (); display.println („Pripojené!“); // Maximálne množstvo klientov, ktorí reagujú na demorálne zmeny // Doplnkové informačné systémy, ktoré môžu obsahovať socket.setTimeout (TIMEOUT); }

IRAM_ATTR resetModule and 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 // časovač, spätné volanie, prerušenie časovača timerAttachInterrupt (timer, & resetModule, true); // timer, tempo (us), repetição timerAlarmWrite (časovač, 10 000 000, pravda); timerAlarmEnable (časovač); // habilita a interrupção}

slučka

void loop () {timerWrite (časovač, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // čo sa týka pripojenia servera checkRSSI (); // verifica o rssi plot (); // mostra o historickej histórii rssi sendToServer (); // závidí viac informácií o serveri readFromServer (); // espera a confirmmação do server log (); // salva um log no cartão SD delay (1000); // espera um segundo}

checkConnection

void checkConnection () {// Verifica a conexão com o AP if (WiFi.status ()! = WL_CONNECTED) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println („WiFi odpojené“); setupWiFi (); oneskorenie (1000); } // overenie a pripojenie konektora if (! socket.connected ()) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println („Zásuvka odpojená“); connectToServer (); oneskorenie (3000); display.fillScreen (ST77XX_BLACK); }}

skontrolujte RSSI

zrušiť kontroluRSSI () {// 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)); // Pozrite sa na jednu veľkú úroveň, ktorá vám pomôže zaregistrovať sa, ak (rssiHistory.size () == (DISPLAY_WIDTH - 2*PLOT_MARGIN)/2) {rssiHistory.erase (rssiHistory.begin ()); } // Doplňujúce informácie o histórii (nedávne) rssiHistory.push_back (rssi); }

zápletka

neplatný 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 historyco 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 - hodnota, hodnota, PLOT_COLOR); currentX += 2;}}

sendToServer

void sendToServer () {// Pripojenie externého servera k serveru if (socket.connected ()) {// Ukážte dobrý deň, keď sa nezobrazí, alebo sa nezobrazí, o koľko bude odosielať reťazec = "Ahoj" + Reťazec (počet); display.setCursor (0, 10); display.println ("Odosielanie:" + odosielanie); socket.println (odosielanie); socket.print (String (rssi)); počítať ++; }}

readFromServer

void readFromServer () {// Espera até o server enviar algo ou desconectar while (socket.connected () &&! socket.available ()) {delay (100); } // Sekvenčný para para prijímač if (socket.available ()) {// Faz a leitura, remove o / n do final e mostra no display receiving = socket.readStringUntil ('\ n'); prijatý.odstrániť (prijatý.dĺžka ()-1); display.println („Prijaté:“+ prijaté); }}

clearText a protokol

void clearText () {// Limpa a área 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 no final dele File file = SD.open (FILE_PATH, FILE_APPEND); // Pokračujte v čítaní alebo kliknite na obrázok, ak (! Súbor) {Serial.println ("Nepodarilo sa otvoriť súbor"); návrat; } // Gravamos uma linha com o tempo desde o boot, or rssi atual e a mensagem recebida String data = String (millis ()) + ";" + Reťazec (rssi) + ";" + prijaté; file.println (údaje); file.close (); }

Krok 10: Súbory

Stiahnite si súbory:

PDF

INO

Odporúča: