Inhaltsverzeichnis:
- Schritt 1: Montage des AP mit Wrover
- Schritt 2: Montage der STATION mit TTGO
- Schritt 3: ERGEBNIS
- Schritt 4: Archivieren Sie LOG.CSV
- Schritt 5: Adafruit GFX-Bibliothek
- Schritt 6: Adafruit ST7735 Bibliothek
- Schritt 7: Konfigurieren der Karten
- Schritt 8: AP.ino
- Schritt 9: Station.ino
- Schritt 10: Dateien
Video: ESP32 mit externer Fernantenne - Gunook
2024 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2024-01-30 07:19
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
Schritt 3: ERGEBNIS
Maximale Entfernung mit 2x externen Antennen: 315 Meter
Maximale Entfernung mit externer und interner Antenne: 157 Meter
Schritt 4: Archivieren Sie LOG. CSV
Ich habe die Daten auf einer SD-Karte aufgezeichnet, mit Daten in Millis, dbm und der Paketzeichenfolge.
Schritt 5: 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
Gehen Sie in der Arduino IDE zu Sketch-> Include Library-> Manage Libraries…
Installieren Sie Adafruit ST7735
Schritt 7: 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:
INO
Empfohlen:
Heimwerken -- Einen Spinnenroboter herstellen, der mit einem Smartphone mit Arduino Uno gesteuert werden kann – wikiHow
Heimwerken || Wie man einen Spider-Roboter herstellt, der mit einem Smartphone mit Arduino Uno gesteuert werden kann: Während man einen Spider-Roboter baut, kann man so viele Dinge über Robotik lernen. Wie die Herstellung von Robotern ist sowohl unterhaltsam als auch herausfordernd. In diesem Video zeigen wir Ihnen, wie Sie einen Spider-Roboter bauen, den wir mit unserem Smartphone (Androi
Bewegungsaktivierte Cosplay Wings mit Circuit Playground Express - Teil 1: 7 Schritte (mit Bildern)
Bewegungsaktivierte Cosplay-Flügel mit Circuit Playground Express - Teil 1: Dies ist Teil 1 eines zweiteiligen Projekts, in dem ich Ihnen meinen Prozess zur Herstellung eines Paars automatisierter Feenflügel zeige. Der erste Teil des Projekts ist der Mechanik der Flügel, und der zweite Teil macht es tragbar und fügt die Flügel hinzu
Raspberry Pi mit Node.js mit der Cloud verbinden – wikiHow
So verbinden Sie Raspberry Pi mit Node.js mit der Cloud: Dieses Tutorial ist nützlich für alle, die einen Raspberry Pi mit Node.js mit der Cloud, insbesondere mit der AskSensors IoT-Plattform, verbinden möchten. Sie haben keinen Raspberry Pi? Wenn Sie derzeit keinen Raspberry Pi besitzen, empfehle ich Ihnen, sich einen Raspberry Pi zuzulegen
DIY Circuit Activity Board mit Büroklammern - HERSTELLER - STEM: 3 Schritte (mit Bildern)
DIY Circuit Activity Board mit Büroklammern | HERSTELLER | STEM: Mit diesem Projekt können Sie den Weg des elektrischen Stroms ändern, um durch verschiedene Sensoren zu laufen. Mit diesem Design können Sie zwischen dem Aufleuchten einer blauen LED oder dem Aktivieren eines Summers wechseln. Sie haben auch die Wahl, einen lichtabhängigen Widerstand mit
Beginnen Sie mit Light Painting (kein Photoshop): 5 Schritte (mit Bildern)
Beginnend mit Light Painting (kein Photoshop): Ich habe vor kurzem eine neue Kamera gekauft und einige ihrer Funktionen untersucht, als ich im Internet auf Light Painting oder Langzeitbelichtung gestoßen bin. Die meisten von uns werden die Grundform des Lightpaintings mit einem Foto in einer Stadt mit einer Straße gesehen haben