Turinys:
- 1 žingsnis: AP montavimas naudojant „Wrover“
- 2 žingsnis: STOTO su TTGO surinkimas
- 3 žingsnis: REZULTATAS
- 4 veiksmas: archyvuokite LOG.CSV
- 5 veiksmas: „Adafruit GFX“biblioteka
- 6 veiksmas: „Adafruit ST7735“biblioteka
- 7 veiksmas: kortelių konfigūravimas
- 8 žingsnis: AP.ino
- 9 žingsnis: Station.ino
- 10 veiksmas: failai
2025 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2025-01-13 06:57
Šiandienos tema susijusi su nuotoliniu testu su ESP32 su išorine antena. Šiandien naudokime du modulius: iš „Espressif“ir „TTGO“. Tada patikrinkime RSSI tarp šių dviejų ESP32 antenų, sugeneruosime diagramą iš istorijos ir įrašysime reikšmių žurnalą į.csv failą.
Tada mes turime ESP32 Wrover kaip AP, o TTGO ESP32 - kaip stotį. Aš naudoju anteną, kurią paėmiau iš šiek tiek didesnės TP-Link ir kito maršrutizatoriaus, žinomo kaip 9 dB. Aš nepastebėjau jokio skirtumo tarp šių dviejų.
Galiausiai du mikrovaldikliai jungiasi per lizdą ir, kiekvieną kartą siunčiant duomenų paketus, ekrane spausdiname grafiką su juostomis, nurodančiomis dbm santykį.
1 žingsnis: AP montavimas naudojant „Wrover“
2 žingsnis: STOTO su TTGO surinkimas
3 žingsnis: REZULTATAS
Maksimalus atstumas su 2x išorinėmis antenomis: 315 metrai
Maksimalus atstumas su išorine ir vidine antena: 157 metrai
4 veiksmas: archyvuokite LOG. CSV
Aš įrašiau duomenis į SD kortelę, duomenis milis, dbm ir paketo eilutę.
5 veiksmas: „Adafruit GFX“biblioteka
„Arduino IDE“eikite į Eskizas-> Įtraukti biblioteką-> Tvarkyti bibliotekas …
Įdiekite „Adafruit GFX“biblioteką
6 veiksmas: „Adafruit ST7735“biblioteka
„Arduino IDE“eikite į Eskizas-> Įtraukti biblioteką-> Tvarkyti bibliotekas …
Įdiekite „Adafruit ST7735“
7 veiksmas: kortelių konfigūravimas
Sekite skirtumus:
8 žingsnis: AP.ino
Mes įtraukėme reikalingas bibliotekas ir apibrėžėme kai kuriuos parametrus.
#include #include #include #include #include #include // Rede que o ESP criará. Nr Station deve ser igual #define SSID "RSSI_Test" #define PASSWORD "87654321" // Tempo de timeout para conrarar a conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEURIS 128 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.cs
Mes apibrėžiame kaiščius, be kitų kintamųjų
// 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. Os pinos mosi, miso e sck são os nativos (23, 19 e 18 respectivamente) #define SDCARD_CS 15 // Pixel onde or gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Objektinis atsakas į pelės ekraną Adafruit_ST7735 ekranas = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST); // Criamos um server (qualquer porta válida serve contanto que o cliente utilize a mesma porta) WiFiServer server (80); // Variável para armazenar o cliente (no caso o ESP32 em modo station) su „WiFiClient“klientu; // String que recebemos do cliente String gavo; // RSSI enviado pelo cliente para este ESP32 long rssi = 0; // Faz o controle do temporizador (interruptção por tempo) hw_timer_t *timer = NULL; // Utilizado para guardar os ultimos std:: vector rssiHistory;
Sąranka
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“, inicializacija arba serverio ir espera ar klientų sąsajos sąrankaWiFi (); server.begin (); waitForClient (); // Espera 3 segundos, limpa a tela e inicializa o Watchdog delay (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }
Nustatykite „WiFi“
// „Cria um Access Point“ir „IPvoid setupWiFi“konfigūracija () {display.println ("SoftAP kūrimas" + eilutė (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" + eilutė (SSID) + "sukurta!"); }
Sąrankos ekranas
// 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); // Paruoškite ekraną. Užpildykite ekraną (ST77XX_BLACK); }
waitForClient
void waitForClient () {display.println ("Laukiama kliento"); // Aguarda o cliente conectar while (! (Client = server.available ())) {display.print ("."); vėlavimas (500); } display.println („Klientas prijungtas“); // 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 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 // timer, callback, interrupção de borda timerAttachInterrupt (timer, & resetModule, true); // timer, tempo (us), repetição timerAlarmWrite (timer, 10000000, true); timerAlarmEnable (laikmatis); // habilita a interrupção}
Kilpa
void loop () {timerWrite (laikmatis, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // checa se possui conexão com o cliente readFromClient (); // lê os dados do cliente sendToClient (); // envia confirmaçã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 () {// Žr. kliento não estiver conectado if (! client.connected ()) {// Limpa a tela e espera pelo cliente display.fillScreen (ST77XX_BLACK); display.println („Klientas atjungtas“); 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 ()) {gavo = client.readStringUntil ('\ n'); // Lê o texto que o cliente enviou gavo.remove (gavo.length ()-1); // Pašalinti o / n padaryti galutinį rssi = client.parseInt (); // Lê o rssi que o cliente enviou clearText (); // Limpa arba texto display.setCursor (0, 0); // Perkelti žymeklį į tekstą, kad būtų rodomas ekranas.println ("RSSI:" + Styga (rssi)); // Mostra o RSSI no display display.println ("Gautas:" + gautas); // 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.pradėti ()); } // Skelbimas be galutinio istorijos (mais recente) rssiHistory.push_back (rssi); }}
sendToClient
void sendToClient () {// Žiūrėkite klientą, kad suprastumėte, ar jis yra menasgem com um OK if (client.connected ()) {Eilutės siuntimas = gautas + "Gerai"; client.println (siuntimas); }}
siužetas
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 - vertė, vertė, PLOT_COLOR); currentX += 2;}}
clearText ir log
void clearText () {// Limpa ir aplinkos tekstas arba teksto dainos, skirtos klientams display.fillRect (0, 0, DISPLAY_WIDTH, 2*PLOT_MARGIN, ST77XX_BLACK); } void log () {// Abrimos o arquivo para escrevermos no final dele Failo failas = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("Nepavyko atidaryti failo"); grįžti; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + Styga (rssi) + ";" + gavo; failas.println (duomenys); file.close (); }
9 žingsnis: Station.ino
Mes įtraukėme reikalingas bibliotekas ir apibrėžėme kai kuriuos parametrus.
#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 accrar a conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // Configurações de cor do mar, e #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"
Mes nustatome nustatymus, susijusius su ekranu ir SD kortele.
ilgas skaičius = 0; // Contador de mensagens enviadaslong rssi = 0; // RSSI apskaičiuota eilutė gauta; // Mensagem de confirmação que o AP nos envia // Pixel onde arba gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Utilizado para conexão com or 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 e sck são os nativos“(23, 19 ir 18 pagarba) #define SDCARD_CS 15 // Objekto atsakymas į pelės ekraną „Adafruit_ST7735“ekranas = „Adafruit_ST7735“(DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CL hw_timer_t *laikmatis = NULL; // faz o controle do temporizador (interruptção por tempo) // Utilizado para guardar os ultimos std:: vector rssiHistory;
Sąranka
void setup () {setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // „Conecta“be prieigos taško criado pelo outro ESP32 ir prijungtas prie serverio sąrankos „Wi -Fi“(); 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 tela de branco display.fillScreen (ST77XX_BLACK); display.setTextColor (ST77XX_WHITE); }
„Wi -Fi“sąranka
// „Conecta ao AP void setupWiFi“() {WiFi.disconnect (); „WiFi.mode“(WIFI_STA); WiFi.begin (SSID, PASSWORD); display.println ("Prisijungimas prie" + eilutė (SSID)); // Enquanto não estiver conectado à rede WiFi while while (WiFi.status ()! = WL_CONNECTED) {delay (500); display.print ("."); } display.println (""); display.print („Prisijungta“); display.println (SSID); }
connectToServer
void connectToServer () {display.println ("Bandoma prijungti prie lizdo"); // Espera a conexão com o server while (! Socket.connect (HOST, PORT)) {display.print ("."); vėlavimas (500); } display.println (); display.println ("Prisijungta!"); // 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 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 // timer, callback, interrupção de borda timerAttachInterrupt (timer, & resetModule, true); // timer, tempo (us), repetição timerAlarmWrite (timer, 10000000, true); timerAlarmEnable (laikmatis); // habilita a interrupção}
kilpa
void loop () {timerWrite (laikmatis, 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 server server readFromServer (); // espera a confirmação do server log (); // salva um log no cartão SD delay (1000); // espera um segundo}
checkConnection
void checkConnection () {// Patikrinkite a conexão com o AP if (WiFi.status ()! = WL_CONNECTED) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println („WiFi atjungtas“); setupWiFi (); vėlavimas (1000); } // verifica a conexão do socket if (! socket.connected ()) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println („Lizdas atjungtas“); connectToServer (); vėlavimas (3000); display.fillScreen (ST77XX_BLACK); }}
checkRSSI
void checkRSSI () {// Verifica arba RSSI rssi = WiFi. RSSI (); // Limpa o texto e mostra o RSSI no display clearText (); display.setCursor (0, 0); display.print ("RSSI:" + eilutė (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 ()); } // Skelbimas be galutinio istorijos (mais recente) rssiHistory.push_back (rssi); }
siužetas
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 - vertė, vertė, PLOT_COLOR); currentX += 2;}}
sendToServer
void sendToServer () {// Žr. serverio prisijungimą prie serverio, jei (socket.connected ()) {// Envia um hello com um contador, mostra no display e inkremtata o contador String send = "Sveiki" + Styga (skaičius); display.setCursor (0, 10); display.println ("Siunčiama:" + siuntimas); lizdas.println (siuntimas); socket.print (Styga (rssi)); skaičiuoti ++; }}
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 gavo = socket.readStringUntil ('\ n'); gavo.pašalinti (gautas.ilgis ()-1); display.println ("Gautas:" + gautas); }}
clearText ir log
void clearText () {// Limpa ir aplinkos tekstas arba teksto dainos, skirtos klientams 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); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("Nepavyko atidaryti failo"); grįžti; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + Styga (rssi) + ";" + gavo; failas.println (duomenys); file.close (); }
10 veiksmas: failai
Atsisiųskite failus:
AŠ NE