Inhoudsopgave:
- Stap 1: De AP monteren met Wrover
- Stap 2: Montage van STATION met TTGO
- Stap 3: RESULTAAT
- Stap 4: Archiveer LOG.CSV
- Stap 5: Adafruit GFX-bibliotheek
- Stap 6: Adafruit ST7735 Bibliotheek
- Stap 7: De kaarten configureren
- Stap 8: AP.ino
- Stap 9: Station.ino
- Stap 10: Bestanden
Video: ESP32 met externe langeafstandsantenne - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:17
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
Stap 3: RESULTAAT
Maximale afstand met 2x externe antennes: 315 meter
Maximale afstand met externe en interne antenne: 157 meter
Stap 4: Archiveer LOG. CSV
Ik heb de gegevens op een SD-kaart vastgelegd, met gegevens in millis, dbm en de pakketreeks.
Stap 5: Adafruit GFX-bibliotheek
Ga in de Arduino IDE naar Sketch-> Include Library-> Manage Libraries…
Installeer de Adafruit GFX-bibliotheek
Stap 6: Adafruit ST7735 Bibliotheek
Ga in de Arduino IDE naar Sketch-> Include Library-> Manage Libraries…
Installeer Adafruit ST7735
Stap 7: 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:
INO
Aanbevolen:
Standalone Arduino 3.3V W / externe 8 MHz klok wordt geprogrammeerd vanaf Arduino Uno via ICSP / ISP (met seriële bewaking!): 4 stappen
Standalone Arduino 3,3 V met externe 8 MHz-klok die wordt geprogrammeerd vanaf Arduino Uno via ICSP / ISP (met seriële bewaking!): Doelstellingen: een stand-alone Arduino bouwen die op 3,3 V van een externe klok van 8 MHz draait. Om het te programmeren via ISP (ook bekend als ICSP, in-circuit serieel programmeren) vanaf een Arduino Uno (draaiend op 5V) Om het bootloader-bestand te bewerken en de
Een mobiele/mobiele telefoon van stroom voorzien met externe batterij of netstroom: 3 stappen
Voorzie een mobiele/mobiele telefoon van stroom met externe batterij of netvoeding: Inleiding. Dit idee werkt alleen met telefoons of tablets als de batterij verwijderbaar is. Het observeren van polariteit is natuurlijk belangrijk. Pas op dat u uw apparaat niet door onvoorzichtigheid beschadigt. Als u niet zeker weet of u dit kunt, kunt u de
Verbind uw Arduino met externe services: 6 stappen
Verbind uw Arduino met externe services: Hallo daar! Deze zelfstudie laat u zien hoe u uw aangesloten Arduino- of IOT-apparaat naar keuze aansluit op een externe service. Voor deze tutorial werken we met Easy Window (een fictief maar programmeerbaar slim venster), If This The
Windows installeren op externe schijf met Mac-partitie op Mac: 5 stappen (met afbeeldingen)
Windows installeren op externe schijf met Mac-partitie op Mac: als je zoiets als een baseline MacBook pro hebt gekocht en een beetje geld hebt bespaard, maar al snel het opslagprobleem krijgt wanneer je Windows probeert te installeren met Bootcamp We weten allemaal dat 128 GB niet genoeg is deze zodat we misschien iets hebben gekocht
Een externe HDD maken van een oude externe CD/RW: 5 stappen
Maak een externe harde schijf van een oude externe cd/rw: vrij ongecompliceerde conversie van een oude externe cd/rw naar een nuttigere externe harde schijf. Benodigdheden1-externe cd/rw (bij voorkeur het meer boxy type)1-harde schijf (moet overeenkomen met de interne connector van de schijfbehuizing, moet worden geformatteerd/sysed)1-sm