Obsah:
- Krok 1: Připojení AP pomocí Wrover
- Krok 2: Sestavení STANICE s TTGO
- Krok 3: VÝSLEDEK
- Krok 4: Archivujte LOG.CSV
- Krok 5: Knihovna Adafruit GFX
- Krok 6: Knihovna Adafruit ST7735
- Krok 7: Konfigurace karet
- Krok 8: AP.ino
- Krok 9: Station.ino
- Krok 10: Soubory
Video: ESP32 s externí dálkovou anténou: 10 kroků
2024 Autor: John Day | [email protected]. Naposledy změněno: 2024-01-30 08:22
Dnešní téma se týká dálkového testu s ESP32 s externí anténou. Dnes použijeme dva moduly: od Espressif a TTGO. Pojďme tedy zkontrolovat RSSI mezi těmito dvěma anténami ESP32, vygenerovat graf z historie a zapsat protokol hodnot do souboru.csv.
Pak máme ESP32 Wrover jako AP a ESP32 TTGO jako stanici. Použil jsem anténu, kterou jsem vzal z trochu většího TP-Link a jiného routeru známého jako 9dbm anténa. Nezaznamenal jsem žádný rozdíl mezi těmito dvěma.
Nakonec se dva mikrokontroléry propojí pomocí soketu a s každým odesláním datových paketů vytiskneme na displej graf s pruhy, které udávají poměr dbm.
Krok 1: Připojení AP pomocí Wrover
Krok 2: Sestavení STANICE s TTGO
Krok 3: VÝSLEDEK
Maximální vzdálenost s 2x externí anténou: 315 metrů
Maximální vzdálenost s externí a interní anténou: 157 metrů
Krok 4: Archivujte LOG. CSV
Data jsem zaznamenal na kartu SD s daty v milis, dbm a řetězcem balíčku.
Krok 5: Knihovna Adafruit GFX
V Arduino IDE přejděte na Sketch-> Include Library-> Manage Libraries…
Nainstalujte si knihovnu Adafruit GFX
Krok 6: Knihovna Adafruit ST7735
V Arduino IDE přejděte na Sketch-> Include Library-> Manage Libraries…
Nainstalujte Adafruit ST7735
Krok 7: Konfigurace karet
Zůstaňte naladěni na rozdíly:
Krok 8: AP.ino
Zahrnuli jsme potřebné knihovny a definovali některé parametry.
#include #include #include #include #include #include // Rede que o ESP criará. Žádná stanice nevyvíjí sériový #define SSID „RSSI_Test“#define PASSWORD „87654321“// Časový limit času pro další připojení #define TIMEOUT 2000 // Největší zobrazení a zobrazení #define DISPLAY_WIDTH 160 #definovat DISPLAY_HEIGHT 128 // Konfigurace 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"
Mezi dalšími proměnnými definujeme piny
// Pinos do 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 // Pino do SDCard. Nejčastěji se vyskytují (23, 19 a 18 respektují) #define SDCARD_CS 15 // Pixel onde o gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Displej responeto reagovat pelo Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST); // Criamos um server (kvalita porta válida slouží kontanto que o kliente use a mesma porta) WiFiServer server (80); // Variável para armazenar o cliente (no caso o ESP32 em modo station) conectado WiFiClient client; // Příjem řetězců do klientů Řetězec přijat; // RSSI enviado pelo cliente para este ESP32 long rssi = 0; // Faz o ovládání do dočasného času (přerušení nebo tempo) hw_timer_t *timer = NULL; // Využití pro maximální ochranu std:: vector rssiHistory;
Založit
neplatné nastavení () {Serial.begin (115200); setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Vytvoření a připojení WiFi, inicializace serveru a espera o nastavení klientského konektoruWiFi (); server.begin (); waitForClient (); // Espera 3 segundos, limpa and tela e inicializa o Watchdog delay (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }
Nastavení WiFi
// Nastavení přístupového bodu a konfigurace IP Vyhněte se setupWiFi () {display.println ("Vytváření softAP" + řetězec (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, HESLO); display.println ("softAP" + String (SSID) + "vytvořeno!"); }
Nastavení displeje
// Incializa o display, muda and orientação e limpa a telavoid setupDisplay () {// Inicializa o display display.initR (INITR_BLACKTAB); // Rotaciona o conteúdo mostrado display.setRotation (3); // Pinta a tela de proto display.fillScreen (ST77XX_BLACK); }
waitForClient
void waitForClient () {display.println ("Čekání na klienta"); // Aguarda o klientský konektor while (! (Client = server.available ())) {display.print ("."); zpoždění (500); } display.println („Klient připojen“); // Tempo má maximální počet klientů, kteří reagují na demorální paragrafy // // ostatní problémy s připojením klienta client.setTimeout (TIMEOUT); }
IRAM_ATTR resetModule and 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); // ID časovače 0, div 80 // časovač, zpětné volání, přerušení časovače timerAttachInterrupt (časovač, & resetModule, true); // časovač, tempo (us), repetição timerAlarmWrite (časovač, 10000000, true); timerAlarmEnable (časovač); // habilita a interrupção}
Smyčka
void loop () {timerWrite (časovač, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // co se může připojovat ke klientům readFromClient (); // více informací o klientech sendToClient (); // potvrzení potvrzení o klientském grafu (); // mostra o gráfico de historiico de rssi log (); // salva um log no cartão SD}
checkConnection
neplatné checkConnection () {// Se o kliente não estiver conectado if (! client.connected ()) {// Limpa a tela e espera pelo cliente display.fillScreen (ST77XX_BLACK); display.println („Klient odpojen“); waitForClient (); }}
readFromClient
void readFromClient () {// Espera até o cliente enviar algo ou desconectar while (client.connected () &&! client.available ()) {delay (100); } // Hledáme, zda a přijímáme vše, co přijímáme, nebo přijímáme para para přijímače do klienta (client.connected ()) {receive = client.readStringUntil ('\ n'); // Lê o texto que o cliente enviou receive.remove (receive.length ()-1); // Odebrat o / n do konečného rssi = client.parseInt (); // Lê o rssi que o cliente enviou clearText (); // Limpa o texto display.setCursor (0, 0); // Přesuňte kurzor na textovou stránku nebo zobrazte display.println ("RSSI:" + String (rssi)); // Mostra o RSSI žádný displej display.println ("Přijato:" + přijato); // Většina příjemců více klientů // Prohlédněte si celou řadu důležitých údajů, které vám pomohou zaregistrovat více (rssiHistory.size () == (DISPLAY_WIDTH - 2*PLOT_MARGIN)/2) {rssiHistory.erase (rssiHistory).začít()); } // Doposud žádné konečné do historieco (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 sent = receive + "OK"; client.println (odesílání); }}
spiknutí
neplatný 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 historyco 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 - hodnota, hodnota, PLOT_COLOR); currentX += 2;}}
clearText a protokol
void clearText () {// Limpa a área com o texto da mensagem vinda do cliente 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); // Další informace o tom, jak získat nejvíce informací o chybě (! Soubor) {Serial.println ("Nepodařilo se otevřít soubor"); vrátit se; } // Gravamos uma linha com o tempo desde o boot, or rssi atual e a mensagem recebida String data = String (millis ()) + ";" + Řetězec (rssi) + ";" + přijato; file.println (data); file.close (); }
Krok 9: Station.ino
Zahrnuli jsme potřebné knihovny a definovali některé parametry.
#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 fori configurado no setup do AP #define PORT 80 // Porta do sever. Počet barev, které můžete dále sledovat, // Časový limit pro různé časové pásmo #define TIMEOUT 2000 // Největší velikost zobrazení #define DISPLAY_WIDTH 160 #definovat DISPLAY_HEIGHT 128 // Konfigurace #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"
Definujeme nastavení, která zahrnují displej a kartu SD.
dlouhý počet = 0; // Contador de mensagens enviadaslong rssi = 0; // Řetězec RSSI přijat; // Mensagem de confirmmação que o AP nos envia // Pixel onde o gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Využití pro připojení k serveru WiFi zásuvka klienta; #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. Nejčastěji se načítají (23, 19 a 18 respektují) #define SDCARD_CS 15 // Zobrazovací pelo displej pelo Adafruit_ST7735 displej = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_) hw_timer_t *timer = NULL; // ovládání nebo ovládání času (přerušení/tempo) // Využití pro maximální ochranu std:: vector rssiHistory;
Založit
neplatné nastavení () {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 and tela e inicializa o Watchdog delay (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }
nastavení Displej
// Incializa o display, muda and 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); }
nastavení Wi -Fi
// Conecta ao AP void setupWiFi () {WiFi.disconnect (); WiFi.mode (WIFI_STA); WiFi.begin (SSID, HESLO); display.println („Připojování k“+ řetězci (SSID)); // Připojení k externímu vysílači obnoví WiFi while (WiFi.status ()! = WL_CONNECTED) {delay (500); display.print ("."); } display.println (""); display.print („Připojeno k“); display.println (SSID); }
connectToServer
void connectToServer () {display.println ("Trying socket socket"); // Espera a conexão com o server while (! Socket.connect (HOST, PORT)) {display.print ("."); zpoždění (500); } display.println (); display.println („Připojeno!“); // Tempo má maximální počet klientů, kteří reagují na demorální paragrafy // ostatní příznaky, které způsobují problémy s připojením. SetTimeout (TIMEOUT); }
IRAM_ATTR resetModule and 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 // časovač, zpětné volání, přerušení časovače timerAttachInterrupt (časovač, & resetModule, true); // časovač, tempo (us), repetição timerAlarmWrite (časovač, 10000000, true); timerAlarmEnable (časovač); // habilita a interrupção}
smyčka
void loop () {timerWrite (časovač, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // co se může připojit k serveru checkRSSI (); // verifica o rssi plot (); // mostra o gráfico de historiico de rssi sendToServer (); // envia uma mensagem com cont contador para o server readFromServer (); // espera a confirmmação do server log (); // salva um log no cartão SD delay (1000); // espera um segundo}
checkConnection
neplatné checkConnection () {// Verifica a conexão com o AP if (WiFi.status ()! = WL_CONNECTED) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println („WiFi odpojeno“); setupWiFi (); zpoždění (1000); } // verifica a conexão do socket if (! socket.connected ()) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("Zásuvka odpojena"); connectToServer (); zpoždění (3000); display.fillScreen (ST77XX_BLACK); }}
zkontrolujte RSSI
neplatné checkRSSI () {// Verifica o RSSI rssi = WiFi. RSSI (); // Limpa o texto e mostra o RSSI no display clearText (); display.setCursor (0, 0); display.print ("RSSI:" + String (rssi)); // Prohlédněte si všechny možnosti, které vám pomohou omezit registraci, pokud (rssiHistory.size () == (DISPLAY_WIDTH - 2*PLOT_MARGIN)/2) {rssiHistory.erase (rssiHistory.begin ()); } // Doposud žádné konečné do historieco (mais recente) rssiHistory.push_back (rssi); }
spiknutí
neplatný 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 historyco 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 - hodnota, hodnota, PLOT_COLOR); currentX += 2;}}
sendToServer
void sendToServer () {// Vyhledání připojení k serveru if (socket.connected ()) {// Envia um ahoj com contador, mostra no display e incrementa o contador String sent = "Hello" + String (count); display.setCursor (0, 10); display.println ("Odesílání:" + odesílání); socket.println (odesílání); socket.print (String (rssi)); počet ++; }}
readFromServer
void readFromServer () {// Espera até o server enviar algo ou desconectar while (socket.connected () &&! socket.available ()) {delay (100); } // Sekvenční para para přijímač if (socket.available ()) {// Faz a leitura, remove o / n do final e mostra no display receiving = socket.readStringUntil ('\ n'); receive.remove (receive.length ()-1); display.println ("Přijato:" + přijato); }}
clearText a protokol
void clearText () {// Limpa a área com o texto da mensagem vinda do cliente 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); // Další informace o tom, jak získat nejvíce informací o chybě (! Soubor) {Serial.println ("Nepodařilo se otevřít soubor"); vrátit se; } // Gravamos uma linha com o tempo desde o boot, or rssi atual e a mensagem recebida String data = String (millis ()) + ";" + Řetězec (rssi) + ";" + obdržel; file.println (data); file.close (); }
Krok 10: Soubory
Stáhnout soubory:
INO
Doporučuje:
Spuštění Raspberry Pi 4 Retropie z externí, pokud není přítomna karta SD: 5 kroků
Zavedení Raspberry Pi 4 Retropie z externí, pokud není přítomna karta SD: ~ github.com/engrpanda
Přidejte externí reproduktor ke zlepšení kvality zvuku: 5 kroků
Chcete -li zlepšit kvalitu zvuku, přidejte externí reproduktor: Kvalita zvuku z tohoto malého rádia byla strašná! Všechno ostatní o rádiu je skvělé, snadné použití, nabíjení telefonu, displej atd. Lékem je použít externí reproduktor a Čím větší, tím lepší
Přístupový bod Raspberry Pi Zero Wifi s vlastní anténou PCB: 6 kroků (s obrázky)
Přístupový bod Raspberry Pi Zero Wifi s vlastní anténou PCB: Co vyrábíme? Název tohoto tutoriálu obsahuje spoustu odborných výrazů. Pojďme to rozebrat. Co je Raspberry Pi Zero (Rπ0)? Raspberry Pi Zero je malý počítač. Jedná se o menší verzi jednodeskového počítače Raspberry Pi
NFC zámek - když jsou PCB také tlačítky, anténou a dalšími : 7 kroků (s obrázky)
Zámek NFC - Když jsou PCB také tlačítky, anténou a dalšími …: Z tohoto Instructable si můžete vzít jednu ze dvou věcí. Můžete pokračovat a vytvořit si vlastní kombinaci numerické klávesnice a čtečky NFC. Schéma je zde. Rozložení DPS je zde. Najdete u nás kusovník k objednání p
Zvyšte efektivní vzdálenost na dálkovém spouštěcím vysílači „ebay“s anténou: 6 kroků
Zvyšte efektivní vzdálenost na dálkovém spouštěcím vysílači „ebay“s anténou: Milovníci fotoaparátu si mohou zakoupit levné verze dálkových spouště pro externí zábleskové jednotky, které ovládají buď bleskové jednotky typu „hot-shoe“nebo „studiové“. Tyto spouště trpí nízkým výkonem vysílače a tím i malou efektivní řídicí vzdáleností. Tento mo