Inhaltsverzeichnis:

ESP32 mit externer Fernantenne - Gunook
ESP32 mit externer Fernantenne - Gunook

Video: ESP32 mit externer Fernantenne - Gunook

Video: ESP32 mit externer Fernantenne - Gunook
Video: ESP32 - SMA Buchse für externe Antenne anlöten. / External antenna for ESP32 2024, Juli
Anonim
Image
Image
Montage des AP mit Wrover
Montage des AP mit Wrover

Das heutige Thema betrifft einen Distanztest mit einem ESP32 mit externer Antenne. Lassen Sie uns heute zwei Module verwenden: von Espressif und TTGO. Lassen Sie uns dann den RSSI zwischen diesen beiden ESP32-Antennen überprüfen, ein Diagramm aus dem Verlauf erstellen und ein Protokoll der Werte in eine.csv-Datei schreiben.

Wir haben dann den ESP32 Wrover als AP und den ESP32 von TTGO als Station. Ich habe eine Antenne verwendet, die ich von einem etwas größeren TP-Link und einem anderen Router, der als 9dbm-Antenne bekannt ist, genommen habe. Ich habe keinen Unterschied zwischen den beiden bemerkt.

Schließlich verbinden sich die beiden Mikrocontroller per Socket und bei jedem Senden von Datenpaketen drucken wir auf einem Display eine Grafik mit den Balken aus, die das Verhältnis von dbm anzeigen.

Schritt 1: Montage des AP mit Wrover

Schritt 2: Montage der STATION mit TTGO

Montage der STATION mit TTGO
Montage der STATION mit TTGO

Schritt 3: ERGEBNIS

ERGEBNIS
ERGEBNIS
ERGEBNIS
ERGEBNIS
ERGEBNIS
ERGEBNIS

Maximale Entfernung mit 2x externen Antennen: 315 Meter

Maximale Entfernung mit externer und interner Antenne: 157 Meter

Schritt 4: Archivieren Sie LOG. CSV

Archiv LOG. CSV
Archiv LOG. CSV
Archiv LOG. CSV
Archiv LOG. CSV

Ich habe die Daten auf einer SD-Karte aufgezeichnet, mit Daten in Millis, dbm und der Paketzeichenfolge.

Schritt 5: Adafruit GFX-Bibliothek

Adafruit GFX-Bibliothek
Adafruit GFX-Bibliothek

Gehen Sie in der Arduino IDE zu Sketch-> Include Library-> Manage Libraries…

Installieren Sie die Adafruit GFX-Bibliothek

Schritt 6: Adafruit ST7735 Bibliothek

Adafruit ST7735 Bibliothek
Adafruit ST7735 Bibliothek

Gehen Sie in der Arduino IDE zu Sketch-> Include Library-> Manage Libraries…

Installieren Sie Adafruit ST7735

Schritt 7: Konfigurieren der Karten

Konfigurieren der Karten
Konfigurieren der Karten
Konfigurieren der Karten
Konfigurieren der Karten

Bleiben Sie dran für Unterschiede:

Schritt 8: AP.ino

Wir haben die notwendigen Bibliotheken eingebunden und einige Parameter definiert.

#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 zur Berücksichtigung einer pedida conexão #define TIMEOUT 2000 //Largura und altura to display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 //Konfigurationseinstellungen 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"

Wir definieren unter anderem die Pins

//Pinos tun 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 //Pinos tun SDCard. Os pinos mosi, miso und sck são os nativos (23, 19 und 18 respektivamente) #define SDCARD_CS 15 //Pixel onde oder 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 empfangen; // RSSI-Enviado Pelo-Client für ESP32-Long-RSSI = 0; //Faz o controle do temporizador (Unterbrechung des Tempos) hw_timer_t *timer = NULL; //Utilizado para guardar os ultimos std::vector rssiHistory;

Aufstellen

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, initialize of server and espera or 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(); }

WLAN einrichten

//Cria um Access Point e configura o IPvoid setupWiFi () { display.println ("SoftAP erstellen" + String (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, PASSWORT); display.println("softAP" + String(SSID) + "erstellt!"); }

Setup-Anzeige

//Incializa o display, muda a orientação and limpa a televoid setupDisplay() { //Inicializa o display display.initR(INITR_BLACKTAB); //Rotaciona oder conteúdo Mostrado display.setRotation(3); // Pinta a tela de preto display.fillScreen (ST77XX_BLACK); }

waitForClient

Void waitForClient () { display.println ("Warten auf Client"); //Aguarda o cliente conectar while(!(client = server.available())) { display.print("."); Verzögerung (500); } display.println("Client verbunden"); //Tempo maximo que o cliente deve demorar para Responder //Antes de dizermos que a conexão foi perdida client.setTimeout(TIMEOUT); }

IRAM_ATTR resetModule und setupWatchdog

//função que oder temporizador irá chamar, para reiniciar oder ESP32void IRAM_ATTR resetModule(){ ets_printf("(watchdog) reiniciar\n"); esp_restart_noos(); // Reinicia o Chip aufrechtzuerhalten. Void setupWatchdog () { Timer = TimerBegin (0, 80, true); //timerID 0, div 80 //Timer, Rückruf, Bordunterbrechung timerAttachInterrupt(timer, &resetModule, true); // Timer, Tempo (us), Wiederholung TimerAlarmWrite (Timer, 10000000, true); TimerAlarmEnable (Timer); //eine Unterbrechung haben }

Schleife

Void Schleife () { TimerWrite (Timer, 0); //Reseta oder Temporizador (alimenta oder Watchdog) checkConnection(); //checa se possui conexão com oder cliente readFromClient(); // lê os dados tun cliente sendToClient(); //Bestätigung für Kundenplot(); //mostra oder gráfico de histórico de rssi log(); //salva um log kein cartão SD}

Überprüfen Sie Ihre Verbindung

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("Client getrennt"); waitForClient(); } }

readFromClient

Void readFromClient () {// Espera até o cliente enviar algo ou desconectar while (client.connected() && !client.available()) { delay (100); aufrechtzuerhalten. //L o texto que o cliente enviou Received.remove(received.length()-1); //Entferne o \n mache final rssi = client.parseInt(); //L oder rssi que o Kunden enviou clearText(); //Limpa o texto display.setCursor (0, 0); // Bewegen Sie den Cursor, um einen Text zu einem oder einen Começo anzuzeigen display.println("RSSI: " + String(rssi)); //Mostra o RSSI keine Anzeige display.println("Empfangen: " + empfangen); //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. Start()); } //Adiciona no final do histórico (mais aktuell) rssiHistory.push_back(rssi); } }

sendToClient

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

Handlung

Void plot () {//Coloca kein Ponto inicial e limpamos oder 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 - Wert, Wert, PLOT_COLOR); currentX += 2; } }

clearText und log

void clearText () {//Limpa a área com o texto da mensagem vinda do cliente display.fillRect (0, 0, DISPLAY_WIDTH, 2*PLOT_MARGIN, ST77XX_BLACK); aufrechtzuerhalten. aufrechtzuerhalten. // Se não conseguimos abrir or arquivo mostramos uma mensagem de erro if (! file) { Serial.println ("Fehler beim Öffnen der Datei"); Rückkehr; } //Gravamos uma linha com o tempo desde o boot, oder rssi atual e a mensagem recebida String data = String(millis()) + ";" + String(rssi) + ";" + erhalten; file.println (Daten); Datei.close(); }

Schritt 9: Station.ino

Wir haben die notwendigen Bibliotheken eingebunden und einige Parameter definiert.

#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 Berücksichtigung einer conexão pedida #define TIMEOUT 2000 //Largura und altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 //Configurações de cortacomanho do grfi #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"

Wir definieren die Einstellungen, die das Display und die SD-Karte betreffen.

lange Zählung = 0; //Contador de mensagens enviadaslong rssi = 0; // RSSI-Berechnung String empfangen; //Mensagem de Confirmação que o AP nos envia //Pixel onde oder 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 und sck são os nativos (23, 19 und 18 respektivamente) #define SDCARD_CS 15 //Objeto responsável pelo display Adafruit_ST7735 display = Adafruit_ST7735(DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI_KRDISPLAY_DC, DISPLAY_MOSI_KRDISPLAY); hw_timer_t *timer = NULL; //faz o controle do temporizador (Interrupt por tempo) //Utilizado para guardar os ultimos std::vector rssiHistory;

Aufstellen

Void setup () { setupDisplay (); //Inicializa o SD if (!SD.begin(SDCARD_CS)) { display.println("Erro ao inicializar lib SD!"); } // Verbindung ohne Zugangspunkt für ESP32 und Verbindung zum Server setupWiFi (); verbinden zum 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 and limpa a teleavoid setupDisplay() { //Inicializa o display display.initR(INITR_BLACKTAB); //Rotaciona oder Conteúdo Mostrado display.setRotation(1); // Pinta a tela de branco display.fillScreen (ST77XX_BLACK); display.setTextColor(ST77XX_WHITE); }

einrichtenWiFi

// Conecta ao AP Void setupWiFi () { WiFi.disconnect (); WiFi.mode(WIFI_STA); WiFi.begin(SSID, PASSWORT); display.println("Verbindung mit " + String(SSID)); // Enquanto não estiver conectado à rede WiFi while (WiFi.status () != WL_CONNECTED) { delay (500); display.print("."); } display.println(""); display.print("Verbunden mit"); display.println (SSID); }

verbinden zum Server

Void connectToServer () {display.println ("Socket-Verbindung wird versucht"); //Espera a conexão com o server while(!socket.connect(HOST, PORT)) { display.print("."); Verzögerung (500); } display.println(); display.println("Verbunden!"); //Tempo maximo que o cliente deve deve demorar para Responder //Antes de dizermos que a conexão foi perdida socket.setTimeout(TIMEOUT); }

IRAM_ATTR resetModule und setupWatchdog

//função que oder temporizador irá chamar, para reiniciar oder ESP32void IRAM_ATTR resetModule(){ ets_printf("(watchdog) reiniciar\n"); esp_restart_noos(); // Reinicia o Chip aufrechtzuerhalten. Void setupWatchdog () { Timer = TimerBegin (0, 80, true); //timerID 0, div 80 //Timer, Rückruf, Bordunterbrechung timerAttachInterrupt(timer, &resetModule, true); // Timer, Tempo (us), Wiederholung TimerAlarmWrite (Timer, 10000000, true); TimerAlarmEnable (Timer); //eine Unterbrechung haben }

Schleife

Void Schleife () { TimerWrite (Timer, 0); //Reseta oder Temporizador (alimenta oder Watchdog) checkConnection(); //checa se possui conexão com oder server checkRSSI(); // Überprüfung oder RSS-Plot (); //mostra oder graphik de histórico de rssi sendToServer(); // envia uma mensagem com um contador für den Server readFromServer(); // espera a Confirmação do server log(); //salva um log kein cartão SD-Verzögerung (1000); //espera um segundo}

Überprüfen Sie Ihre Verbindung

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 getrennt"); setupWiFi(); Verzögerung (1000); } //Überprüfen Sie eine Verbindung zum Socket if (!socket.connected()) { display.fillScreen (ST77XX_BLACK); display.setCursor(0, 0); display.println("Socket getrennt"); verbinden zum Server(); Verzögerung (3000); display.fillScreen(ST77XX_BLACK); } }

checkRSSI

void checkRSSI () {//Verifica o RSSI rssi = WiFi. RSSI (); //Limpa o texto e mostra o RSSI keine Anzeige clearText(); display.setCursor(0, 0); display.print("RSSI: " + String(rssi)); //Sehen Sie eine 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 aktuell) rssiHistory.push_back(rssi); }

Handlung

Void plot () {//Coloca kein Ponto inicial e limpamos oder 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 - Wert, Wert, PLOT_COLOR); currentX += 2; } }

sendToServer

void sendToServer(){ //Setiver conectado com o server if(socket.connected()) { //Envia um hallo com um contador, meistens keine Anzeige und Inkrementierung oder Contador String senden = "Hallo" + String(count); display.setCursor(0, 10); display.println("Senden: " + senden); socket.println (senden); socket.print(String(rssi)); zählen++; } }

readFromServer

Void readFromServer () {//Espera até o server enviar algo ou desconectar while(socket.connected() && !socket.available()) { delay(100); aufrechtzuerhalten. empfangen.entfernen (empfangen.länge () - 1); display.println("Empfangen: " + empfangen); } }

clearText und log

void clearText () {//Limpa a área com o texto da mensagem vinda do cliente display.fillRect (0, 0, DISPLAY_WIDTH, 2*PLOT_MARGIN, ST77XX_BLACK); aufrechtzuerhalten. aufrechtzuerhalten. // Se não conseguimos abrir or arquivo mostramos uma mensagem de erro if (! file) { Serial.println ("Fehler beim Öffnen der Datei"); Rückkehr; } //Gravamos uma linha com o tempo desde o boot, oder rssi atual e a mensagem recebida String data = String(millis()) + ";" + String(rssi) + ";" + erhalten; file.println (Daten); Datei.close(); }

Schritt 10: Dateien

Laden Sie die Dateien herunter:

PDF

INO

Empfohlen: