Sisällysluettelo:

ESP32 ulkoisella pitkän matkan antennilla: 10 vaihetta
ESP32 ulkoisella pitkän matkan antennilla: 10 vaihetta

Video: ESP32 ulkoisella pitkän matkan antennilla: 10 vaihetta

Video: ESP32 ulkoisella pitkän matkan antennilla: 10 vaihetta
Video: Hardware Build of LoRa Transmitter, BME280 Sensor based on Arduino ESP32 (EP08) 2024, Heinäkuu
Anonim
Image
Image
AP: n asennus Wroverin avulla
AP: n asennus Wroverin avulla

Tämän päivän aihe koskee etätestiä ESP32: lla ulkoisella antennilla. Käytämme tänään kahta moduulia: Espressifistä ja TTGO: sta. Tarkistetaan sitten RSSI näiden kahden ESP32 -antennin välillä, luodaan kaavio historiasta ja kirjoitetaan loki arvoista.csv -tiedostoon.

Meillä on sitten ESP32 Wrover AP: na ja TTGO: n ESP32 asemana. Käytin antennia, jonka otin hieman isommasta TP-Linkistä ja toisesta reitittimestä, joka tunnetaan 9 dBm: n antennina. En ole huomannut eroa näiden kahden välillä.

Lopuksi kaksi mikro -ohjainta muodostavat yhteyden pistorasian kautta ja jokaisen datapakettien lähetyksen yhteydessä tulostamme näytölle kaavion, jossa on palkit, jotka ilmaisevat dbm -suhteen.

Vaihe 1: Tukiaseman asennus Wroverin avulla

Vaihe 2: ASEMAN asentaminen TTGO: n kanssa

Aseman kokoonpano TTGO: n avulla
Aseman kokoonpano TTGO: n avulla

Vaihe 3: TULOS

TULOS
TULOS
TULOS
TULOS
TULOS
TULOS

Suurin etäisyys 2x ulkoisella antennilla: 315 metriä

Suurin etäisyys ulkoisen ja sisäisen antennin kanssa: 157 metriä

Vaihe 4: Arkistoi LOG. CSV

Arkisto LOG. CSV
Arkisto LOG. CSV
Arkisto LOG. CSV
Arkisto LOG. CSV

Tallensin tiedot SD -kortille, tiedot millisekunteina, dbm ja paketin merkkijono.

Vaihe 5: Adafruit GFX -kirjasto

Adafruit GFX -kirjasto
Adafruit GFX -kirjasto

Siirry Arduino IDE: ssä Sketch-> Include Library-> Manage Libraries…

Asenna Adafruit GFX -kirjasto

Vaihe 6: Adafruit ST7735 -kirjasto

Adafruit ST7735 -kirjasto
Adafruit ST7735 -kirjasto

Siirry Arduino IDE: ssä Sketch-> Include Library-> Manage Libraries…

Asenna Adafruit ST7735

Vaihe 7: Korttien määrittäminen

Korttien määrittäminen
Korttien määrittäminen
Korttien määrittäminen
Korttien määrittäminen

Pysy kuulolla eroista:

Vaihe 8: AP.ino

Olemme sisällyttäneet tarvittavat kirjastot ja määrittäneet joitain parametreja.

#include #include #include #include #include #include // Rede que o ESP criará. No Station deve ser igual #define SSID "RSSI_Test" #define SALASANA "87654321" // Tempo de timeout para conrarara a conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEURIS 128 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.cs

Määritämme nastat muiden muuttujien joukossa

// Pinos näyttävät #määrittävät 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 or gráfico começaa horizontalmente int currentX = PLOT_MARGIN; // Objektivastaus pelonäyttö Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST); // Criamos um -palvelin (laadukas portti vaihtoehtona palvella contanto que tai asiakas käyttää mesma -porttia) WiFiServer -palvelin (80); // Variável para armazenar o cliente (no caso o ESP32 em modo station), jossa on WiFiClient -asiakas; // String que recebemos do cliente Merkkijono vastaanotettu; // RSSI enviado pelo cliente para este ESP32 long rssi = 0; // Faz o controle do temporizador (keskeytys tempo) hw_timer_t *timer = NULL; // Utilizado para guardar os ultimos std:: vector rssiHistory;

Perustaa

void setup () {Serial.begin (115200); setupDisplay (); // Inicializa tai SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Luo Wi -Fi, aloita tai palvelin ja espera tai asiakasyhteys setupWiFi (); server.begin (); waitForClient (); // Espera 3 segmenttiä, limpa a tela e inicializa o Watchdog delay (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }

Määritä WiFi

// Cria um Access Point ja IPvoid setupWiFi () {display.println ("SoftAP: n luominen" + merkkijono (SSID)); WiFi. Irrota (); WiFi.mode (WIFI_AP); WiFi.softAPConfig (IPAddress (192, 168, 0, 1), IPAddress (192, 168, 0, 1), IPAddress (255, 255, 255, 0)); WiFi.softAP (SSID, SALASANA); display.println ("softAP" + merkkijono (SSID) + "luotu!"); }

Asetusnäyttö

// 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 tela de preto display.fillScreen (ST77XX_BLACK); }

waitForClient

void waitForClient () {display.println ("Odotetaan asiakasta"); // Aguarda o cliente conectar while (! (Client = server.available ())) {display.print ("."); viive (500); } display.println ("Asiakas yhdistetty"); // 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 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 // timer, callback, interrupção de borda timerAttachInterrupt (timer, & resetModule, true); // ajastin, tempo (us), repetição timerAlarmWrite (ajastin, 10000000, tosi); timerAlarmEnable (ajastin); // habilita a interrupção}

Silmukka

void loop () {timerWrite (ajastin, 0); // reseta o temporizador (alimenta tai watchdog) checkConnection (); // checa se possui conexão com o cliente readFromClient (); // lê os dados do cliente sendToClient (); // envia confirmaçã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 ("Asiakas katkaistu"); 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 ()) {got = client.readStringUntil ('\ n'); // Lê o texto que o cliente enviou gavo.remove (vastaanotettu.pituus ()-1); // Poista o / n tee lopullinen rssi = client.parseInt (); // Lê o rssi que o cliente enviou clearText (); // Limpa tai texto display.setCursor (0, 0); // Siirrä kohdistinta tekstin mukaan tai tule näyttöön.println ("RSSI:" + Jono (rssi)); // Mostra tai RSSI ilman näyttöä.println ("Vastaanotettu:" + vastaanotettu); // Mostra a mensagem recebida do cliente // Katso quantidade de barras do gráfico passou do limite apagamos o registerro mais antigo if (rssiHistory.size () == (DISPLAY_WIDTH - 2*PLOT_MARGIN)/2) {rssiHistory.erase (rssiHistory.alkaa()); } // Näyttö ei lopullista historiaa (mais recente) rssiHistory.push_back (rssi); }}

sendToClient

void sendToClient () {// Jos asiakas on estiver conectado enviamos de volta a mensagem com um OK if (client.connected ()) {Jono lähetys = vastaanotettu + "OK"; client.println (lähetys); }}

juoni

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

clearText ja log

void clearText () {// Limpa ja alue com tai 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 Tiedostotiedosto = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("Tiedoston avaaminen epäonnistui"); palata; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + Jono (rssi) + ";" + vastaanotettu; tiedosto.println (data); file.close (); }

Vaihe 9: Station.ino

Olemme sisällyttäneet tarvittavat kirjastot ja määrittäneet joitain parametreja.

#Sisällytä #Sisällytä #Sisällytä #Sisällytä #Sisällytä #Sisällytä // Nome da rede que nos conectaremos. Criado pelo AP #define SSID "RSSI_Test" #define SALASANA "87654321" #define HOST "192.168.0.1" // IP que foi configurarado 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 harkitsee a conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // Configurações de cor, mar do e #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"

Määritämme näytön ja SD -kortin asetukset.

pitkä luku = 0; // Contador de mensagens enviadaslong rssi = 0; // RSSI calculado Merkkijono vastaanotettu; // Mensagem de confirmação que o AP nos envia // Pixel onde tai gráfico começaa horizontalmente int currentX = PLOT_MARGIN; // Yhteyden käyttö palvelimen WiFiClient -pistorasiaan; #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 // Objektiivinen vastaus pelonäyttö Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CL hw_timer_t *ajastin = NULL; // faz o controle do temporizador (interrupção por tempo) // Utilizado para guardar os ultimos std:: vector rssiHistory;

Perustaa

void setup () {setupDisplay (); // Inicializa tai SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Conecta ei tukiasemaa criado pelo outro ESP32 e conecta ao server setupWiFi (); connectToServer (); // Espera 3 segmenttiä, 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 o display display.initR (INITR_BLACKTAB); // Rotaciona o conteúdo mostrado display.setRotation (1); // Pinta tela de branco display.fillScreen (ST77XX_BLACK); display.setTextColor (ST77XX_WHITE); }

Wi -Fi -asetukset

// Conecta ao AP void setupWiFi () {WiFi.disconnect (); WiFi.mode (WIFI_STA); WiFi.binin (SSID, SALASANA); display.println ("Yhdistäminen" + merkkijono (SSID)); // Enquanto não estiver conectado à rede WiFi while (WiFi.status ()! = WL_CONNECTED) {delay (500); display.print ("."); } display.println (""); display.print ("Yhdistetty"); display.println (SSID); }

connectToServer

void connectToServer () {display.println ("Yritetään pistorasiayhteyttä"); // Esperaa yhteyspalvelin, kun (! Socket.connect (HOST, PORT)) {display.print ("."); viive (500); } display.println (); display.println ("Yhdistetty!"); // 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 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 // timer, callback, interrupção de borda timerAttachInterrupt (timer, & resetModule, true); // ajastin, tempo (us), repetição timerAlarmWrite (ajastin, 10000000, tosi); timerAlarmEnable (ajastin); // habilita a interrupção}

silmukka

void loop () {timerWrite (ajastin, 0); // reseta o temporizador (alimenta tai 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 or server readFromServer (); // espera a confirmaçã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 katkaistu"); setupWiFi (); viive (1000); } // verifica a conexão do socket if (! socket.connected ()) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("Pistorasia irrotettu"); connectToServer (); viive (3000); display.fillScreen (ST77XX_BLACK); }}

checkRSSI

void checkRSSI () {// Verifica tai RSSI rssi = WiFi. RSSI (); // Limpa o texto e mostra o RSSI no display clearText (); display.setCursor (0, 0); display.print ("RSSI:" + Jono (rssi)); // Katso kvantidide de barras do gráfico passou do limite apagamos o registerro anti anti if if (rssiHistory.size () == (DISPLAY_WIDTH - 2*PLOT_MARGIN)/2) {rssiHistory.erase (rssiHistory.begin ()); } // Näyttö ei lopullista historiaa (mais recente) rssiHistory.push_back (rssi); }

juoni

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

sendToServer

void sendToServer () {// Katso palvelimen yhteys, jos (socket.connected ()) {// Envia um hei com um contador, mostra no display e lisäykset tai contador String send = "Hei" + String (count); display.setCursor (0, 10); display.println ("Lähetetään:" + lähetetään); socket.println (lähetys); socket.print (Jono (rssi)); laskea ++; }}

readFromServer

void readFromServer () {// Espera até tai palvelin 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 gavo = socket.readStringUntil ('\ n'); vastaanotettu.poista (vastaanotettu.pituus ()-1); display.println ("Vastaanotettu:" + vastaanotettu); }}

clearText ja log

void clearText () {// Limpa ja alue com tai 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 Tiedostotiedosto = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("Tiedoston avaaminen epäonnistui"); palata; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + Jono (rssi) + ";" + vastaanotettu; tiedosto.println (data); file.close (); }

Vaihe 10: Tiedostot

Lataa tiedostot:

PDF

INO

Suositeltava: