Taula de continguts:
- Pas 1: muntatge de l'AP amb Wrover
- Pas 2: Muntatge de STATION amb TTGO
- Pas 3: RESULTAT
- Pas 4: Arxiu LOG.CSV
- Pas 5: biblioteca d'Adafruit GFX
- Pas 6: Biblioteca Adafruit ST7735
- Pas 7: Configuració de les targetes
- Pas 8: AP.ino
- Pas 9: Station.ino
- Pas 10: fitxers
Vídeo: ESP32 amb antena externa de llarga distància: 10 passos
2024 Autora: John Day | [email protected]. Última modificació: 2024-01-30 08:14
El tema d’avui fa referència a una prova a distància amb un ESP32 amb antena externa. Utilitzem dos mòduls avui: d'Espressif i TTGO. A continuació, comprovem l'RSI entre aquestes dues antenes ESP32, generem un gràfic a partir de l'historial i escrivim un registre dels valors en un fitxer.csv.
Després tenim l’ESP32 Wrover com a AP i l’ESP32 de TTGO com a Estació. Vaig utilitzar una antena que vaig treure d’un TP-Link una mica més gran i un altre enrutador conegut com a antena de 9 dbm. No he notat cap diferència entre els dos.
Finalment, els dos microcontroladors es connecten mitjançant un sòcol i, amb cada enviament de paquets de dades, imprimim en una pantalla un gràfic amb les barres que indiquen la proporció de dbm.
Pas 1: muntatge de l'AP amb Wrover
Pas 2: Muntatge de STATION amb TTGO
Pas 3: RESULTAT
Distància màxima amb antenes externes 2x: 315 metres
Distància màxima amb antena externa i interna: 157 metres
Pas 4: Arxiu LOG. CSV
Vaig gravar les dades en una targeta SD, amb dades en mil·lis, dbm i la cadena de paquets.
Pas 5: biblioteca d'Adafruit GFX
A l'IDE Arduino, aneu a Sketch-> Inclou biblioteca-> Gestiona biblioteques …
Instal·leu la biblioteca Adafruit GFX
Pas 6: Biblioteca Adafruit ST7735
A l'IDE Arduino, aneu a Sketch-> Inclou biblioteca-> Gestiona biblioteques …
Instal·leu Adafruit ST7735
Pas 7: Configuració de les targetes
Estigueu atents a les diferències:
Pas 8: AP.ino
Hem inclòs les biblioteques necessàries i hem definit alguns paràmetres.
#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 per considerar una connexió pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // Configurações de 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"
Definim els pins, entre altres variables
// Pinos mostren # 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 i 18 respectivament) #define SDCARD_CS 15 // Pixel onde o graphic 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 client use a same porta) WiFiServer server (80); // Variável para armazenar o cliente (no caso o ESP32 em modo station) connectat WiFiClient client; // String que recebemos do client S'ha rebut la cadena; // RSSI enviado pelo cliente para este ESP32 long rssi = 0; // Faz o controle do temporizador (interrupció per tempo) hw_timer_t * timer = NULL; // Utilitzat per guardar els últims std:: vector rssiHistory;
Configuració
configuració nul·la () {Serial.begin (115200); setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Cria a rede WiFi, inicialització del servidor i espera o client connectar setupWiFi (); server.begin (); waitForClient (); // Espera 3 segons, limpa a tela e inicializa o Watchdog delay (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }
Configuració de WiFi
// Cria um Access Point i configura o IPvoid setupWiFi () {display.println ("Creació de softAP" + cadena (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, CONTRASENYA); display.println ("softAP" + Cadena (SSID) + "creat!"); }
Configuració de la pantalla
// Incialitza o display, muda a orientació i limpa a telavoid setupDisplay () {// Inicializa o display display.initR (INITR_BLACKTAB); // Rotaciona o conteúdo mostrado display.setRotation (3); // Pinta a tela de preto display.fillScreen (ST77XX_BLACK); }
waitForClient
void waitForClient () {display.println ("Esperant client"); // Aguarda o cliente conectar while (! (Client = server.available ())) {display.print ("."); retard (500); } display.println ("Client connectat"); // Temps màxim que el client ha de demorar per respondre // abans de dizermos que a conexão foi perdida client.setTimeout (TIMEOUT); }
IRAM_ATTR resetModule i setupWatchdog
// função que o temporizador irá chamar, per reiniciar o ESP32void IRAM_ATTR resetModule () {ets_printf ("(watchdog) reiniciar / n"); esp_restart_noos (); // reinicia o xip} void setupWatchdog () {timer = timerBegin (0, 80, true); // timerID 0, div 80 // timer, callback, interrupció de borda timerAttachInterrupt (temporitzador, & resetModule, true); // temporitzador, tempo (us), repetició timerAlarmWrite (temporitzador, 10000000, true); timerAlarmEnable (temporitzador); // habilita a interrupció}
Bucle
bucle buit () {timerWrite (temporitzador, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // checa se possui conexão com o client readFromClient (); // lê os dados do client sendToClient (); // envia confirmació per al client plot (); // mostra o gràfic d’històric de rssi log (); // salva um log no cartão SD}
checkConnection
void checkConnection () {// Se o client no està connectat if (! client.connected ()) {// Limpa a tela e espera pelo cliente display.fillScreen (ST77XX_BLACK); display.println ("Client desconnectat"); waitForClient (); }}
readFromClient
void readFromClient () {// Espera até o client enviar algo o desconectar while (client.connected () &&! client.available ()) {delay (100); } // Se chegou aqui e ainda estiver connectado is because possui algo for receber do client if (client.connected ()) {received = client.readStringUntil ('\ n'); // Lê o texto que o cliente envió recibido.remove (recibido.longa () - 1); // Elimina o / n fer final rssi = client.parseInt (); // Lê o rssi que o client us envia clearText (); // Limpa o texto display.setCursor (0, 0); // Mou el cursor del text per a l'aparició de display.println ("RSSI:" + String (rssi)); // Mostra o RSSI no display display.println ("Rebut:" + rebut); // Mostra a mensagem recebida do client // Se a quantidade de barras do gráfico passou do limite apagamos o registro mais antigo if (rssiHistory.size () == (DISPLAY_WIDTH - 2 * PLOT_MARGIN) / 2) {rssiHistory.erase (rssiHistory.begin ()); } // Adiciona no final do histórico (mais recent) rssiHistory.push_back (rssi); }}
sendToClient
void sendToClient () {// Se o client estiver connectado enviamos de volta a mensagem com OK if (client.connected ()) {String Send = received + "OK"; client.println (enviament); }}
parcel · la
void plot () {// Coloca no ponto inicial i 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 and avançamos for o next for (int i = 0; i -120? Map (rssiHistory , -120, 0, 0, PLOT_SIZE): 0; display.drawFastVLine (currentX, DISPLAY_HEIGHT - valor, valor, PLOT_COLOR); currentX + = 2;}}
clearText i registre
void clearText () {// Limpa a l'àrea com o text de mensatges vinda del client display.fillRect (0, 0, DISPLAY_WIDTH, 2 * PLOT_MARGIN, ST77XX_BLACK); } void log () {// Abrimos o arquivo para escrevermos no final dele File file = SD.open (FILE_PATH, FILE_APPEND); // No es poden obrir arquiu mostramos un missatge d'error if (! File) {Serial.println ("No s'ha pogut obrir el fitxer"); tornar; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + String (rssi) + ";" + rebut; file.println (dades); file.close (); }
Pas 9: Station.ino
Hem inclòs les biblioteques necessàries i hem definit alguns paràmetres.
#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 va ser configurat 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 e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // Configurações de cor, margem i tamanho do gráfico #define PLOT_COLOR ST77XX_GREEN #define PLOT_MARGIN 20 #define PLOT_SIZE (DISPLAY_HEIGHT - 2 * PLOT_MARGIN) // Arxiu de registre no SD #define FILE_PATH "/log.csv"
Definim la configuració que implica la pantalla i la targeta SD.
recompte llarg = 0; // Contador de mensagens enviadaslong rssi = 0; // RSSI calculado Cadena rebuda; // Mensagem de confirmmação que o AP nos envia // Pixel onde o gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Utilitzat per a connexió amb servidor 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 e sck são os nativos (23, 19 i 18 respectivament) #define SDCARD_CS 15 // Objeto responsável pelo display Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST) hw_timer_t * temporitzador = NULL; // faz o controle do temporizador (interrupció per tempo) // Utilizado para guardar os ultimos std:: vector rssiHistory;
Configuració
void setup () {setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Conecta no access point criado pelo outro ESP32 i connecta al servidor setupWiFi (); connectToServer (); // Espera 3 segons, limpa a tela e inicializa o Watchdog delay (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }
setupDisplay
// Incialitza o mostra, muda a l'orientació i limpa a una configuració telavoid setupDisplay () {// Inicialitza o mostra display.initR (INITR_BLACKTAB); // Rotaciona o conteúdo mostrado display.setRotation (1); // Pinta a tela de blanc display.fillScreen (ST77XX_BLACK); display.setTextColor (ST77XX_WHITE); }
configuració de Wi-Fi
// Conecta ao AP void setupWiFi () {WiFi.disconnect (); WiFi.mode (WIFI_STA); WiFi.begin (SSID, CONTRASENYA); display.println ("Connexió a" + Cadena (SSID)); // Enquanto no estiver connectado to rede WiFi while (WiFi.status ()! = WL_CONNECTED) {delay (500); display.print ("."); } display.println (""); display.print ("Connectat a"); display.println (SSID); }
connectToServer
void connectToServer () {display.println ("S'està provant la connexió de sòcol"); // Espera a conexão com o server while (! Socket.connect (HOST, PORT)) {display.print ("."); retard (500); } display.println (); display.println ("Connectat!"); // Temps màxim que el client ha de demorar per respondre // abans de dizermos que a conexão foi perdida socket.setTimeout (TIMEOUT); }
IRAM_ATTR resetModule i setupWatchdog
// função que o temporizador irá chamar, per reiniciar o ESP32void IRAM_ATTR resetModule () {ets_printf ("(watchdog) reiniciar / n"); esp_restart_noos (); // reinicia o xip} void setupWatchdog () {timer = timerBegin (0, 80, true); // timerID 0, div 80 // timer, callback, interrupció de borda timerAttachInterrupt (temporitzador, & resetModule, true); // timer, tempo (us), repetição timerAlarmWrite (temporitzador, 10000000, true); timerAlarmEnable (temporitzador); // habilita a interrupció}
bucle
bucle buit () {timerWrite (temporitzador, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // checa se possui conexão com o server checkRSSI (); // verifica o rssi plot (); // mostra o gràfic històric de rssi sendToServer (); // envia uma mensagem com um contador per a un servidor readFromServer (); // espera a confirmmação do server log (); // salva um log no cartão SD delay (1000); // espera um segon}
checkConnection
void checkConnection () {// Verifica una connexió amb AP si (WiFi.status ()! = WL_CONNECTED) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("WiFi desconnectat"); setupWiFi (); retard (1000); } // verifica una connexió de socket si (! socket.connected ()) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("Socket desconnectat"); connectToServer (); retard (3000); display.fillScreen (ST77XX_BLACK); }}
comprova RSSI
void checkRSSI () {// Verifica o RSSI rssi = WiFi. RSSI (); // Limpa o texto e mostra o RSSI no display clearText (); display.setCursor (0, 0); display.print ("RSSI:" + Cadena (rssi)); // Se a quantitat de barras do gráfico passou do limite apagamos o registro mais antigo if (rssiHistory.size () == (DISPLAY_WIDTH - 2 * PLOT_MARGIN) / 2) {rssiHistory.erase (rssiHistory.begin ()); } // Adiciona no final do histórico (mais recent) rssiHistory.push_back (rssi); }
parcel · la
void plot () {// Coloca no ponto inicial i 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 and avançamos for o next for (int i = 0; i -120? Map (rssiHistory , -120, 0, 0, PLOT_SIZE): 0; display.drawFastVLine (currentX, DISPLAY_HEIGHT - valor, valor, PLOT_COLOR); currentX + = 2;}}
sendToServer
void sendToServer () {// Es troba connectat amb el servidor if (socket.connected ()) {// Envia um hola com a contador, mostra no display e incrementa o contador String Send = "Hello" + String (count); display.setCursor (0, 10); display.println ("Enviament:" + enviament); socket.println (enviament); socket.print (String (rssi)); comptar ++; }}
readFromServer
void readFromServer () {// Espera até o server enviar algo o 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 displayed = socket.readStringUntil ('\ n'); Received.remove (Received.length () - 1); display.println ("Rebut:" + rebut); }}
clearText i registre
void clearText () {// Limpa a l'àrea com o text de mensatges vinda del client display.fillRect (0, 0, DISPLAY_WIDTH, 2 * PLOT_MARGIN, ST77XX_BLACK); } void log () {// Abrimos o arquivo para escrevermos no final dele File file = SD.open (FILE_PATH, FILE_APPEND); // No es poden obrir arquiu mostramos uma mensagem de erro if (! File) {Serial.println ("No s'ha pogut obrir el fitxer"); tornar; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + String (rssi) + ";" + rebut; file.println (dades); file.close (); }
Pas 10: fitxers
Descarregueu els fitxers:
INO
Recomanat:
HC-12 Estació meteorològica de llarga distància i sensors DHT: 9 passos
Estació meteorològica de llarga distància HC-12 i sensors DHT: en aquest tutorial aprendrem com fer una estació meteorològica de llarga distància remota mitjançant dos sensors dht, mòduls HC12 i la pantalla LCD I2C. Mireu el vídeo
Llums del millor amic de llarga distància de bricolatge: 4 passos (amb imatges)
Llums de millor amic de llarga distància de bricolatge: vaig fer llums sincronitzats de llarga distància coneguts com a "Millor amic" llums. Això només significa que es mantenen sincronitzats amb el color actual de l'altra làmpada. Per tant, si canvies una llum verda, poc després l’altra làmpada es tornaria grisa
Circuit del sistema de transmissió de llarga distància: 6 passos
Circuit del sistema de transmissió de llarga distància: avui en aquest article parlarem de com fer un circuit bàsic del sistema de transmissió de llarga distància. En aquesta línia, deixeu-me fer una descripció concisa del circuit. Com funciona això generalment i com us estic parlant de les coses al
Exposició llarga i astrofotografia amb Raspberry Pi: 13 passos (amb imatges)
Exposició llarga i astrofotografia amb Raspberry Pi: l’astrofotografia és la fotografia d’objectes astronòmics, esdeveniments celestes i zones del cel nocturn. A més d’enregistrar els detalls de la Lluna, el Sol i altres planetes, l’astrofotografia té la capacitat de capturar objectes invisibles per al tararel
Filtre de senyal Wifi (WokFi) de llarga distància: 3 passos (amb imatges)
Filtre de senyal Wifi (WokFi) de llarga distància: en aquest instructiu converteixo un Thumbdrive WiFi comú en un extensor wifi molt fort. "El colador parabòlic asiàtic de cuina (dumpling) és el candidat perfecte per a aquest projecte. Vaig poder agafar 20 accessos més punts de la ciutat i connectar-se a una xarxa