Indholdsfortegnelse:
- Trin 1: Montering af AP med Wrover
- Trin 2: Montering af STATION med TTGO
- Trin 3: RESULTAT
- Trin 4: Arkiver LOG.CSV
- Trin 5: Adafruit GFX -bibliotek
- Trin 6: Adafruit ST7735 bibliotek
- Trin 7: Konfiguration af kortene
- Trin 8: AP.ino
- Trin 9: Station.ino
- Trin 10: Filer
Video: ESP32 med ekstern langdistanceantenne: 10 trin
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:28
Dagens emne vedrører en afstandstest med en ESP32 med ekstern antenne. Lad os bruge to moduler i dag: fra Espressif og TTGO. Lad os derefter kontrollere RSSI mellem disse to ESP32 -antenner, generere en graf fra historikken og skrive en log over værdierne i en.csv -fil.
Vi har derefter ESP32 Wrover som AP, og ESP32 fra TTGO som Station. Jeg brugte en antenne, som jeg tog fra en lidt større TP-Link og en anden router kendt som en 9dbm antenne. Jeg har ikke bemærket nogen forskel mellem de to.
Endelig forbinder de to mikrokontrollere via stikket, og ved hver afsendelse af datapakker udskriver vi på en skærm en graf med søjlerne, der angiver forholdet mellem dbm.
Trin 1: Montering af AP med Wrover
Trin 2: Montering af STATION med TTGO
Trin 3: RESULTAT
Maksimal afstand med 2x eksterne antenner: 315 meter
Maksimal afstand med ekstern og intern antenne: 157 meter
Trin 4: Arkiver LOG. CSV
Jeg registrerede dataene på et SD -kort med data i millis, dbm og pakkestrengen.
Trin 5: Adafruit GFX -bibliotek
I Arduino IDE skal du gå til Skitse-> Inkluder bibliotek-> Administrer biblioteker …
Installer Adafruit GFX -bibliotek
Trin 6: Adafruit ST7735 bibliotek
I Arduino IDE skal du gå til Skitse-> Inkluder bibliotek-> Administrer biblioteker …
Installer Adafruit ST7735
Trin 7: Konfiguration af kortene
Hold øje med forskelle:
Trin 8: AP.ino
Vi har inkluderet de nødvendige biblioteker og defineret nogle parametre.
#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 for a conexão pedida #define TIMEOUT 2000 // Largura og altura display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHTes 128 // Configuration 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.sv"
Vi definerer stifterne, blandt andre variabler
// Pinos viser #definere 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 e 18 respectivamente) #define SDCARD_CS 15 // Pixel onde o 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 (kvalitets porta válida serve contanto que o cliente use a mesma porta) WiFiServer server (80); // Variabel for armazenar o cliente (no caso o ESP32 em modo station) conectado WiFiClient client; // String que recebemos do cliente String received; // RSSI enviado pelo cliente para este ESP32 long rssi = 0; // Faz o control do temporizador (interrupção por tempo) hw_timer_t *timer = NULL; // Utilizado para guardar os ultimos std:: vector rssiHistory;
Opsætning
ugyldig opsætning () {Serial.begin (115200); setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Cria and rede WiFi, inicial of server and espera o 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 (); }
Opsæt WiFi
// Cria um Access Point e configura o IPvoid setupWiFi () {display.println ("Creating softAP" + 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, PASSWORD); display.println ("softAP" + streng (SSID) + "oprettet!"); }
Opsætning Display
// Incializa o display, muda a orientação e limpa a telavoid setupDisplay () {// Inicializa o display display.initR (INITR_BLACKTAB); // Rotaciona o conteúdo mostrado display.setRotation (3); // Du kan også se display.fillScreen (ST77XX_BLACK); }
waitForClient
void waitForClient () {display.println ("Venter på klient"); // Aguarda o cliente conectar while (! (Client = server.available ())) {display.print ("."); forsinkelse (500); } display.println ("Klient forbundet"); // Tempo máximo que o cliente deve demorar para responder // antes de dizermos que a conexão foi perdida client.setTimeout (TIMEOUT); }
IRAM_ATTR resetModule og 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, interrupção de borda timerAttachInterrupt (timer, & resetModule, true); // timer, tempo (us), repetição timerAlarmWrite (timer, 10000000, true); timerAlarmEnable (timer); // habilita a interrupção}
Sløjfe
void loop () {timerWrite (timer, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // checa se possui conexão com o cliente readFromClient (); // læs os gøre klienten sendToClient (); // envia confirmmação para o cliente plot (); // mostra o gráfico de histórico de rssi log (); // salva um log no cartão SD}
checkConnection
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 ("Klient afbrudt"); waitForClient (); }}
readFromClient
void readFromClient () {// Espera até o cliente enviar algo ou desconectar while (client.connected () &&! client.available ()) {delay (100); } // Se chegou aqui e ainda estiver conectado é porque possui algo para receber do cliente if (client.connected ()) {received = client.readStringUntil ('\ n'); // Læ o texto que o cliente enviou received.remove (received.length ()-1); // Fjern o / n gør sidste rssi = client.parseInt (); // Lê o rssi que o cliente enviou clearText (); // Limpa o texto display.setCursor (0, 0); // Flyt markøren til tekst for at vise display.println ("RSSI:" + streng (rssi)); // Mostra o RSSI no display display.println ("Modtaget:" + modtaget); // Mostra a mensagem recebida do cliente // 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.begynde()); } // Adiciona no final do histórico (mais recente) rssiHistory.push_back (rssi); }}
sendToClient
void sendToClient () {// Se o cliente estiver conectado enviamos de volta a mensagem com um OK if (client.connected ()) {String sending = modtaget + "OK"; client.println (afsendelse); }}
grund
void plot () {// Coloca no ponto inicial e 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 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 - værdi, værdi, PLOT_COLOR); currentX += 2;}}
clearText og log
void clearText () {// Limpa arearea o texto da mensagem vinda do cliente display.fillRect (0, 0, DISPLAY_WIDTH, 2*PLOT_MARGIN, ST77XX_BLACK); } ugyldig log () {// Abrimos o arquivo para escrevermos no final dele File file = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("Filen kunne ikke åbnes"); Vend tilbage; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + String (rssi) + ";" + modtaget; file.println (data); file.close (); }
Trin 9: Station.ino
Vi har inkluderet de nødvendige biblioteker og defineret nogle parametre.
#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 konfigurado 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 e taman #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"
Vi definerer de indstillinger, der involverer displayet og SD -kortet.
lang optælling = 0; // Contador de mensagens enviadaslong rssi = 0; // RSSI calculado String modtaget; // Mensagem de confirmmação que o AP nos envia // Pixel onde o gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Udnyttelse til konexão med server WiFiClient -stik; #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 e 18 respectivamente) #define SDCARD_CS 15 // Objeto responsável pelo display Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLR,); hw_timer_t *timer = NULL; // faz o control do temporizador (interrupção por tempo) // Utilizado para guardar os ultimos std:: vector rssiHistory;
Opsætning
ugyldig opsætning () {setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Conecta no access point criado pelo outro ESP32 e conecta ao server setupWiFi (); connectToServer (); // 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 display.initR (INITR_BLACKTAB); // Rotaciona o conteúdo mostrado display.setRotation (1); // Pinta a tela de branco display.fillScreen (ST77XX_BLACK); display.setTextColor (ST77XX_WHITE); }
setupWiFi
// Conecta ao AP void setupWiFi () {WiFi.disconnect (); WiFi.mode (WIFI_STA); WiFi. Begyndt (SSID, PASSWORD); display.println ("Opretter forbindelse til" + streng (SSID)); // Enquanto não estiver conectado à rede WiFi while (WiFi.status ()! = WL_CONNECTED) {delay (500); display.print ("."); } display.println (""); display.print ("Tilsluttet"); display.println (SSID); }
connectToServer
void connectToServer () {display.println ("Prøv forbindelse til forbindelse"); // Espera a conexão com o server while (! Socket.connect (HOST, PORT)) {display.print ("."); forsinkelse (500); } display.println (); display.println ("Tilsluttet!"); // Tempo máximo que o cliente deve demorar para responder // antes de dizermos que a conexão foi perdida socket.setTimeout (TIMEOUT); }
IRAM_ATTR resetModule og 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, interrupção de borda timerAttachInterrupt (timer, & resetModule, true); // timer, tempo (os), repetição timerAlarmWrite (timer, 10000000, true); timerAlarmEnable (timer); // habilita a interrupção}
sløjfe
void loop () {timerWrite (timer, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // checa se possui conexão com o server checkRSSI (); // verifica o rssi plot (); // mostra o gráfico de histórico de rssi sendToServer (); // envia uma mensagem com um contador para o server readFromServer (); // espera a confirmmação do server log (); // salva um log no cartão SD forsinkelse (1000); // espera um segundo}
checkConnection
void checkConnection () {// Verifica a conexão with AP if (WiFi.status ()! = WL_CONNECTED) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("WiFi frakoblet"); setupWiFi (); forsinkelse (1000); } // verifica a conexão do socket if (! socket.connected ()) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("Socket frakoblet"); connectToServer (); forsinkelse (3000); display.fillScreen (ST77XX_BLACK); }}
checkRSSI
ugyldig checkRSSI () {// Verifica o RSSI rssi = WiFi. RSSI (); // Limpa o texto e mostra o RSSI no display clearText (); display.setCursor (0, 0); display.print ("RSSI:" + streng (rssi)); // 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 recente) rssiHistory.push_back (rssi); }
grund
void plot () {// Coloca no ponto inicial e 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 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 - værdi, værdi, PLOT_COLOR); currentX += 2;}}
sendToServer
void sendToServer () {// Se estiver conectado com o server if (socket.connected ()) {// Envia um hello com um contador, mostra no display e incrementa o contador String sending = "Hello" + String (count); display.setCursor (0, 10); display.println ("Sender:" + afsendelse); socket.println (sender); socket.print (String (rssi)); tæl ++; }}
readFromServer
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'); modtaget.fjerne (modtaget.længde ()-1); display.println ("Modtaget:" + modtaget); }}
clearText og log
void clearText () {// Limpa arearea o texto da mensagem vinda do cliente display.fillRect (0, 0, DISPLAY_WIDTH, 2*PLOT_MARGIN, ST77XX_BLACK); } ugyldig log () {// Abrimos o arquivo para escrevermos no final dele File file = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("Filen kunne ikke åbnes"); Vend tilbage; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + String (rssi) + ";" + modtaget; file.println (data); file.close (); }
Trin 10: Filer
Download filerne:
INO
Anbefalede:
Ekstern VGA / GPU til bærbare computere, der bruger EXP GDC Beast: 15 trin (med billeder)
Ekstern VGA / GPU til bærbare computere ved hjælp af EXP GDC Beast: Hej Guys .. Dette er min første tutorial om instruktører. Engelsk er ikke mit første sprog, så tilgiv mine grammatiske fejl. Jeg lavede dette baseret på min erfaring med at opgradere min bærbare computer. Og jeg vil ikke kede dig med lang introduktion, da jeg ikke ved noget
Fra gammel bærbar computer til ekstern skærm med digitalt tv: 6 trin
Fra gammel bærbar computer til ekstern skærm med digitalt tv: Har du nogensinde spekuleret på, hvad du skal gøre med din gamle bærbare computer eller skærm liggende? I denne instruktive vil jeg vise dig, hvordan du vender din gamle bærbare eller gamle skærm, der ikke har HDMI -porte, til en ekstern skærm med HDMI, AV, komposit
Luftkvalitetsmonitor med MQ135 og ekstern temperatur- og luftfugtighedssensor over MQTT: 4 trin
Luftkvalitetsmonitor med MQ135 og ekstern temperatur- og luftfugtighedssensor over MQTT: Dette er til testformål
Ekstern nedlukning eller genstart af en computer med ESP8266 -enhed: 10 trin (med billeder)
Ekstern nedlukning eller genstart af en computer med ESP8266 -enhed: For at være klar her lukker vi din computer ned, ikke en andens computer. flok matematik, men hver morgen klokken 3 om morgenen låser de. S
Lav en ekstern harddisk fra gammel ekstern cd/rw: 5 trin
Lav en ekstern harddisk fra gammel ekstern cd/rw: Ret enkel konvertering af en gammel ekstern cd/rw til en mere nyttig ekstern harddisk. Supplies1-ekstern cd/rw (helst den mere boxy type) 1-harddisk (skal matche det interne stik i drevkassen, skal formateres/syses) 1-sm