Inhoudsopgave:

ESP32 met externe langeafstandsantenne - Ajarnpa
ESP32 met externe langeafstandsantenne - Ajarnpa

Video: ESP32 met externe langeafstandsantenne - Ajarnpa

Video: ESP32 met externe langeafstandsantenne - Ajarnpa
Video: ESP32 Guide 2024 | Choosing and Using an ESP32 Board 2024, November
Anonim
Image
Image
De AP monteren met Wrover
De AP monteren met Wrover

Het onderwerp van vandaag betreft een afstandstest met een ESP32 met externe antenne. Laten we vandaag twee modules gebruiken: van Espressif en TTGO. Laten we dan de RSSI tussen deze twee ESP32-antennes controleren, een grafiek uit de geschiedenis genereren en een log van de waarden in een.csv-bestand schrijven.

We hebben dan de ESP32 Wrover als AP, en de ESP32 van TTGO als Station. Ik gebruikte een antenne die ik nam van een iets grotere TP-Link en een andere router die bekend staat als een 9dbm-antenne. Ik heb geen verschil gemerkt tussen de twee.

Ten slotte maken de twee microcontrollers verbinding via een socket en bij elke verzending van datapakketten drukken we op een display een grafiek af met de balken die de verhouding van dbm aangeven.

Stap 1: De AP monteren met Wrover

Stap 2: Montage van STATION met TTGO

Montage van STATION met TTGO
Montage van STATION met TTGO

Stap 3: RESULTAAT

RESULTAAT
RESULTAAT
RESULTAAT
RESULTAAT
RESULTAAT
RESULTAAT

Maximale afstand met 2x externe antennes: 315 meter

Maximale afstand met externe en interne antenne: 157 meter

Stap 4: Archiveer LOG. CSV

Archief LOG. CSV
Archief LOG. CSV
Archief LOG. CSV
Archief LOG. CSV

Ik heb de gegevens op een SD-kaart vastgelegd, met gegevens in millis, dbm en de pakketreeks.

Stap 5: Adafruit GFX-bibliotheek

Adafruit GFX-bibliotheek
Adafruit GFX-bibliotheek

Ga in de Arduino IDE naar Sketch-> Include Library-> Manage Libraries…

Installeer de Adafruit GFX-bibliotheek

Stap 6: Adafruit ST7735 Bibliotheek

Adafruit ST7735 Bibliotheek
Adafruit ST7735 Bibliotheek

Ga in de Arduino IDE naar Sketch-> Include Library-> Manage Libraries…

Installeer Adafruit ST7735

Stap 7: De kaarten configureren

De kaarten configureren
De kaarten configureren
De kaarten configureren
De kaarten configureren

Blijf op de hoogte voor verschillen:

Stap 8: AP.ino

We hebben de nodige bibliotheken toegevoegd en enkele parameters gedefinieerd.

#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 en altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // cor, margem en 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"

We definiëren onder andere de pinnen

//Pino's weergeven#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. Er zijn verschillende mogelijkheden, er is geen verschil (23, 19 en 18 respectievelijk) #define SDCARD_CS 15 //Pixel onde of grafische começa horizontalmente in de huidigeX = PLOT_MARGIN; //Objeto responsavel 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 gebruiken een mesma porta) WiFiServer server(80); //Variável para armazenar o cliente (geen caso o ESP32 em modo station) conectado WiFiClient client; //String que recebemos do cliente String ontvangen; // RSSI enviado pelo cliente para este ESP32 lange rssi = 0; //Faz o control do temporizador (interrupção por tempo) hw_timer_t *timer = NULL; // Gebruik voor de ultimos std::vector rssiHistory;

Opstelling

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, inicializa o server en espera o client verbinding 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(); }

Wifi instellen

//Cria um Access Point e configura o IPvoid setupWiFi () { display.println ("SoftAP maken" + String (SSID)); WiFi.verbinding verbreken(); WiFi.modus (WIFI_AP); WiFi.softAPConfig(IP-adres(192, 168, 0, 1), IP-adres(192, 168, 0, 1), IP-adres (255, 255, 255, 0)); WiFi.softAP (SSID, WACHTWOORD); display.println("softAP" + String(SSID) + "gemaakt!"); }

Instelscherm

//Incializa o display, muda a orientação e limpa a telavoid setupDisplay () {//Inicializa o display.initR (INITR_BLACKTAB); //Rotaciona of conteúdo meestrado display.setRotation (3); //Pinta a preto display.fillScreen (ST77XX_BLACK); }

waitForClient

void waitForClient(){ display.println("Wachten op cliënt"); //Aguarda o cliente conectar while(!(client = server.available())) { display.print("."); vertraging (500); } display.println("Cliënt verbonden"); //Tijdstip van de klant die de vraag stelt voor de beantwoorder //deze vragen voor de klant.setTimeout(TIMEOUT); }

IRAM_ATTR resetModule en 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, onderbreking van het bord timerAttachInterrupt(timer, &resetModule, true); //timer, tempo (us), herhaling timerAlarmWrite (timer, 10000000, true); timerAlarmInschakelen (timer); // habilita een interrupção }

Lus

void loop() { timerWrite(timer, 0); //reset of temporizador (alimenta of watchdog) checkConnection(); //controleer de mogelijkheid om de klant te lezenFromClient(); //lê os dados do cliente sendToClient(); // envia confirmação para o cliente plot(); // de meeste geschiedenis van de rssi log(); //salva um log geen cartão SD}

checkVerbinding

void checkConnection(){ //Se o cliente não estiver conectado if(!client.connected()) { //Limpa a tele e espera pelo cliente display.fillScreen(ST77XX_BLACK); display.println("Klant losgekoppeld"); waitForClient(); } }

lezenVanClient

void readFromClient () { // Espera at o cliente enviar algo ou desconectar while(client.connected() && !client.available()) { delay(100); } //Zorg voor een goede verbinding en een goede kans om de klant te ontvangen if(client.connected()) {ontvangen = client.readStringUntil('\n'); //Lê o texto que o cliente benijden ontvangen.verwijderen(ontvangen.lengte()-1); //Verwijder o \n doe final rssi = client.parseInt(); //Lê o rssi que o cliente jaloers clearText(); //Limpa of texto display.setCursor (0, 0); // Verplaats de cursor naar tekst voor de weergave van display.println ("RSSI: " + String (rssi)); // Mostra o RSSI geen weergave display.println ("Ontvangen: " + ontvangen); //Mostra a mensagem recebida do cliente //Se a quantidade de barras do grafico passou do limite apagamos o registro mais antigo if(rssiHistory.size() == (DISPLAY_WIDTH - 2*PLOT_MARGIN)/2) {rssiHistory.story(rssiHistory(rssiHistory).beginnen()); } //Adiciona no final do histórico (meer recent) rssiHistory.push_back(rssi); } }

verzendenNaarClient

void sendToClient() {//Se o cliente estiver conectado enviamos de volta a mensagem um um OK if(client.connected()) { String verzending = ontvangen + "OK"; klant.println(verzenden); } }

verhaal

void plot () {// Coloca no ponto inicial en limpamos of grafische huidigeX = 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 en 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 () {//Limpa is een gebied dat wordt weergegeven door klanten display.fillRect (0, 0, DISPLAY_WIDTH, 2 * PLOT_MARGIN, ST77XX_BLACK); } void log() {//Abrimos o arquivo para escrevermos no final dele Bestandsbestand = SD.open(FILE_PATH, FILE_APPEND); //Se não conseguimos abrir of arquivo mostramos uma mensagem de erro if(!file) { Serial.println("Kan bestand niet openen"); opbrengst; } //Gravamos uma linha com o tempo desde o boot, of rssi atual e a mensagem recebida String data = String(millis()) + ";" + Tekenreeks(rssi) + ";" + ontvangen; bestand.println(gegevens); bestand.close(); }

Stap 9: Station.ino

We hebben de nodige bibliotheken toegevoegd en enkele parameters gedefinieerd.

#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 en altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 //Configuraçes de marge #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"

We definiëren de instellingen die betrekking hebben op het display en de SD-kaart.

lange telling = 0; //Contador de mensagens enviadaslong rssi = 0; // RSSI-berekening String ontvangen; //Bevestiging van AP nos envia //Pixel onde of grafische começa horizontalmente int currentX = PLOT_MARGIN; // Gebruik voor verbinding met de 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. Er zijn verschillende manieren om te kiezen tussen twee verschillende soorten (23, 19 en 18 respectieve jaren) #define SDCARD_CS 15 //Objeto responsavel pelo display Adafruit_ST7735 display = Adafruit_ST7735(DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI_MOSI, DISPLAY_MOSI, DIS); hw_timer_t *timer = NULL; //faz o control do temporizador (interrupção por tempo) //Utilizado para guardar os ultimos std::vector rssiHistory;

Opstelling

void setup(){ setupDisplay(); //Inicializa o SD if (!SD.begin(SDCARD_CS)) { display.println("Erro ao inicializar lib SD!"); } //Verbind geen toegangspunt criado pelo outro ESP32 en verbinding oa server setupWiFi(); Connecteer met de server(); //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 o display.initR (INITR_BLACKTAB); //Rotaciona of conteúdo meestrado display.setRotation(1); //Pinta en branco display.fillScreen (ST77XX_BLACK); display.setTextColor(ST77XX_WHITE); }

wifi instellen

//Conecta oa AP void setupWiFi() { WiFi.disconnect(); WiFi.modus (WIFI_STA); WiFi.begin(SSID, PASWOORD); display.println("Verbinding maken met " + String(SSID)); // Er is geen verbinding met wifi terwijl (WiFi.status ()! = WL_CONNECTED) { delay (500); display.print("."); } display.println(""); display.print("Verbonden met "); display.println(SSID); }

Connecteer met de server

void connectToServer(){ display.println("Socketverbinding proberen"); // Espera a conexão com o server while(!socket.connect(HOST, PORT)) { display.print("."); vertraging (500); } display.println(); display.println("Verbonden!"); //Tijdstip van de klant deve demorar para responder //antes de dizermos que conexão foi perdida socket.setTimeout(TIMEOUT); }

IRAM_ATTR resetModule en 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, onderbreking van het bord timerAttachInterrupt(timer, &resetModule, true); //timer, tempo (us), herhaling timerAlarmWrite (timer, 10000000, true); timerAlarmInschakelen (timer); // habilita een interrupção }

lus

void loop() { timerWrite(timer, 0); // reset of temporizador (alimenta of watchdog) checkConnection(); //checa se possui conexão com o server checkRSSI(); // verifica o rssi plot(); // meest recente geschiedenis van de rssi sendToServer(); //envia uma mensagem com um contador para o server readFromServer(); // Espera een confirmação do server log(); //salva um log geen cartão SD-vertraging (1000); //het is een segundo }

checkVerbinding

void checkConnection () {//Verificatie van een verbinding com o AP if (WiFi.status ()! = WL_CONNECTED) { display.fillScreen (ST77XX_BLACK); display.setCursor(0, 0); display.println("WiFi verbroken"); wifi instellen(); vertraging (1000); } // verifica a conexão do socket if (! socket.connected ()) { display.fillScreen (ST77XX_BLACK); display.setCursor(0, 0); display.println("Socket losgekoppeld"); Connecteer met de server(); vertraging (3000); display.fillScreen(ST77XX_BLACK); } }

checkRSSI

void checkRSSI(){ //Verifica o RSSI rssi = WiFi. RSSI(); //Limpa o texto en mostra o RSSI geen weergave clearText(); display.setCursor(0, 0); display.print("RSSI: " + String(rssi)); //Zorg ervoor dat er geen grenzen zijn aan het aantal apagamos of registro mais antigo if(rssiHistory.size() == (DISPLAY_WIDTH - 2*PLOT_MARGIN)/2) {rssiHistory.erase(rssiHistory.begin()); } //Adiciona no final do histórico (meer recent) rssiHistory.push_back(rssi); }

verhaal

void plot () {// Coloca no ponto inicial en limpamos of grafische huidigeX = 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 en 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;} }

verzendenNaarServer

void sendToServer () { // Zie estiver conectado com o server if (socket.connected ()) { // Envia um hallo com um contador, mostra no display e incrementa o contador String verzenden = "Hallo" + String (tel); display.setCursor(0, 10); display.println("Verzenden: " + verzenden); socket.println (verzenden); socket.print(String(rssi)); tellen++; } }

lezenVanServer

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'); ontvangen.verwijder(ontvangen.lengte()-1); display.println("Ontvangen: " + ontvangen); } }

clearText en log

void clearText () {//Limpa is een gebied dat wordt weergegeven door klanten display.fillRect (0, 0, DISPLAY_WIDTH, 2 * PLOT_MARGIN, ST77XX_BLACK); } void log() {//Abrimos o arquivo para escrevermos no final dele Bestandsbestand = SD.open(FILE_PATH, FILE_APPEND); //Se não conseguimos abrir of arquivo mostramos uma mensagem de erro if(!file) { Serial.println("Kan bestand niet openen"); opbrengst; } //Gravamos uma linha com o tempo desde o boot, of rssi atual e a mensagem recebida String data = String(millis()) + ";" + Tekenreeks(rssi) + ";" + ontvangen; bestand.println(gegevens); bestand.close(); }

Stap 10: Bestanden

Download de bestanden:

PDF

INO

Aanbevolen: