Përmbajtje:

ESP32 Me antenë të jashtme me distancë të gjatë: 10 hapa
ESP32 Me antenë të jashtme me distancë të gjatë: 10 hapa

Video: ESP32 Me antenë të jashtme me distancë të gjatë: 10 hapa

Video: ESP32 Me antenë të jashtme me distancë të gjatë: 10 hapa
Video: $5 WiFi Camera Setup | ESP32 Wifi Setup view on Mobile phone 2024, Nëntor
Anonim
Image
Image
Montimi i AP me Wrover
Montimi i AP me Wrover

Tema e sotme ka të bëjë me një test në distancë me një ESP32 me Antenë të Jashtme. Le të përdorim dy module sot: nga Espressif dhe TTGO. Le të kontrollojmë RSSI midis këtyre dy antenave ESP32, të krijojmë një grafik nga historia dhe të shkruajmë një regjistër të vlerave në një skedar.csv.

Ne pastaj kemi ESP32 Wrover si AP, dhe ESP32 të TTGO si Stacion. Kam përdorur një antenë që kam marrë nga një TP-Link pak më e madhe dhe një ruter tjetër i njohur si një antenë 9dbm. Unë nuk kam vënë re ndonjë ndryshim midis të dyve.

Së fundi, dy mikrokontrolluesit lidhen përmes prizës dhe, me çdo dërgim të paketave të të dhënave, ne shtypim në një ekran një grafik me shufrat që tregojnë raportin e dbm.

Hapi 1: Montimi i AP me Wrover

Hapi 2: Montimi i STACIONIT Me TTGO

Montimi i STACIONIT Me TTGO
Montimi i STACIONIT Me TTGO

Hapi 3: REZULTATI

REZULTATI
REZULTATI
REZULTATI
REZULTATI
REZULTATI
REZULTATI

Distanca maksimale me 2 antena të jashtme: 315 metra

Distanca maksimale me antenë të jashtme dhe të brendshme: 157 metra

Hapi 4: Arkivoni LOG. CSV

Arkivi LOG. CSV
Arkivi LOG. CSV
Arkivi LOG. CSV
Arkivi LOG. CSV

I regjistrova të dhënat në një kartë SD, me të dhëna në milis, dbm dhe vargun e paketës.

Hapi 5: Biblioteka Adafruit GFX

Biblioteka Adafruit GFX
Biblioteka Adafruit GFX

Në Arduino IDE, shkoni te Sketch-> Include Library-> Manage Bibliotekat …

Instaloni Bibliotekën Adafruit GFX

Hapi 6: Biblioteka Adafruit ST7735

Biblioteka Adafruit ST7735
Biblioteka Adafruit ST7735

Në Arduino IDE, shkoni te Sketch-> Include Library-> Manage Bibliotekat …

Instaloni Adafruit ST7735

Hapi 7: Konfigurimi i Kartave

Konfigurimi i Kartave
Konfigurimi i Kartave
Konfigurimi i Kartave
Konfigurimi i Kartave

Ndiqni dallimet:

Hapi 8: AP.ino

Ne kemi përfshirë bibliotekat e nevojshme dhe kemi përcaktuar disa parametra.

#përfshi #përfshi #përfshi #përfshi #përfshi #përfshi // Rede que o ERI criará. No Station deve ser igual #define SSID "RSSI_Test" #define PASSWORD "87654321" // Kohëzgjatja e kohës për të marrë parasysh #define TIMEOUT 2000 // Largura e altura do të shfaq #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // defura DISPLAY_HEIGHT 128 cor, margem e tamanho do gráfico #define PLOT_COLOR ST77XX_GREEN #define PLOT_MARGIN 20 #përcakto PLOT_SIZE (DISPLAY_HEIGHT - 2*PLOT_MARGIN) // Arquivo de log no SD #define FILE_cATH "/

Ne përcaktojmë kunjat, midis ndryshoreve të tjera

// Pinot shfaqin #përcaktojnë DISPLAY_DC 12 // A0 #përcakto 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 ose 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 (cilësia e portës së shërbimit shërben nëse klienti përdor një mesmë portë) Serveri WiFiServer (80); // Ndryshimi për armatosjen e klientit (pa rast në stacionin ESP32 në modo) lidh klientin WiFiClient; // String que recebemos do cliente Vargu i marrë; // RSSI siguron klientët e tjerë për këtë ESP32 të gjatë rssi = 0; // Faz o controle do temporizador (interrupção por tempo) hw_timer_t *timer = NULL; // Përdorni për guardar os ultimos std:: vector rssiHistory;

Konfigurimi

void setup () {Serial.begin (115200); setupDisplay (); // Inicializa ose SD nëse (! SD.filloj (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Cria a redde WiFi, zyrtarizoni serverin ose shërbimin tuaj të konfigurimit të konfigurimit WiiFi (); server.filloj (); waitForClient (); // Espera 3 segundos, limpa a tela e inicializa o Watchdog delay (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }

Konfiguro WiFi

// Cria um Access Point dhe konfigurimi i IPvoid setupWiFi () {display.println ("Krijimi i softAP" + String (SSID)); WiFi. Shkëputje (); Modaliteti WiFi (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" + String (SSID) + "krijuar!"); }

Ekrani i konfigurimit

// Incializa o display, më shumë orientim dhe limpa një 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 ("Në pritje të klientit"); // Aguarda o cliente conectar while (! (Client = server.available ())) {display.print ("."); vonesë (500); } display.println ("Klienti i lidhur"); // Tempo máximo que o kliente deve demorar para responder // antes de dizermos que a conexão foi perdida client.setTimeout (KOHA); }

IRAM_ATTR resetModule dhe setupWatchdog

// funcão que o temporizador irá chamar, para reiniciar o ESP32void IRAM_ATTR resetModule () {ets_printf ("(qen mbrojtës) reiniciar / n"); esp_restart_noos (); // reinicia o chip} void setupWatchdog () {timer = timerBegin (0, 80, e vërtetë); // timerID 0, div 80 // kohëmatësi, kthimi në telefon, ndërprerja e kohës timerAttachInterrupt (kohëmatësi, & resetModule, e vërtetë); // kohëmatësi, tempo (ne), repetição timerAlarmWrite (kohëmatës, 10000000, e vërtetë); timerAlarmEnable (kohëmatësi); // habilita a interrupção}

Lak

void loop () {timerWrite (kohëmatës, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // kontrolloni mundësinë për të lexuar klientin readFromClient (); // lê os dados do cliente sendToClient (); // envia confirmação para o komplot i klientit (); // mostra o gráfico de histórico de rssi log (); // salva um log no cartão SD}

checkConnection

void checkConnection () {// Se o kliente não estiver conectado if (! client.connected ()) {// Limpa a tela e espera pelo cliente display.fillScreen (ST77XX_BLACK); display.println ("Klienti u shkëput"); waitForClient (); }}

readFromClient

void readFromClient () {// Espera at o kliente enviar algo ou desconectar ndërsa (client.connected () &&! client.available ()) {vonesë (100); } // Se chegou aqui e ainda estiver conectado é porque possui algo para receber do kliente if (client.connected ()) {marrë = client.readStringUntil ('\ n'); // Lê o texto que o kliente enviou marrë. hiqni (marrë.gjatësi ()-1); // Hiqni o / n bëni rssi përfundimtare = client.parseInt (); // Lê o rssi que o cliente enviou clearText (); // Limpa o texto display.setCursor (0, 0); // Lëvizni kursorin për tekst për të ardhur për të shfaqur display.println ("RSSI:" + String (rssi)); // Mostra o RSSI pa ekran.println ("Marrë:" + marrë); // Mostra a mensagem recebida do cliente // Shihni një kuantidadë të barras do gráfico passou do limite apagamos o registro mais antigo if (rssiHistory.size () == (DISPLAY_WIDTH - 2*PLOT_MARGIN)/2) {rssiHistory.erase (rssiHistory).filloj ()); } // Adiciona no final do histórico (mais recente) rssiHistory.push_back (rssi); }}

sendToClient

void sendToClient () {// Se o kliente estiver conectado enviamos de volta a mensagem com um OK nëse (client.connected ()) {String dërgimi = marrë + "OK"; klienti.println (dërgimi); }}

komplot

komplot i pavlefshëm () {// 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 (aktualeX, DISPLAY_HEIGHT - vlera, vlera, PLOT_COLOR); aktualeX += 2;}}

clearText dhe log

void clearText () {// Limpa a comrea 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 nuk ka skedarin përfundimtar të skedarit File = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir ose arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("Hapja e skedarit dështoi"); kthim; } // Gravamos uma linha com o tempo desde o boot, ose rssi atual e a mensagem recebida Të dhënat e vargut = String (millis ()) + ";" + Varg (rssi) + ";" + marrë; file.println (të dhëna); file.close (); }

Hapi 9: Stacioni.ino

Ne kemi përfshirë bibliotekat e nevojshme dhe kemi përcaktuar disa parametra.

#include #include #includ #include #includ #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 pa konfigurim për AP #define PORT 80 // Porta do split. Cilësia e portës së të dhënave është se nuk mund të bëni në arkuivos // Tempo de timeout para shqyrtimit të një përfundimi #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // Configuraçemes de cor, #define PLOT_COLOR ST77XX_GREEN #cakto PLOT_MARGIN 20 #përcakto PLOT_SIZE (DISPLAY_HEIGHT - 2*PLOT_MARGIN) // Arquivo de log no SD #define FILE_PATH "/log.csv"

Ne përcaktojmë cilësimet që përfshijnë ekranin dhe Kartën SD.

numërim i gjatë = 0; // Contador de mensagens enviadaslong rssi = 0; // RSSI calculado Vargu i marrë; // Mensagem de confirmação que o AP nos envia // Pixel onde ose gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Përdorni për lidhjen me serverin Foleja e klientit; #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 oso nativos (23, 19 e 18 respectivamente) #define SDCARD_CS 15 // Paraqitja e objektit të shfaqjes Adafruit_ST7735 = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_); hw_timer_t *kohëmatës = NULL; // faz o controle do temporizador (interrupção por tempo) // Shfrytëzoj para guardar os ultimos std:: vector rssiHistory;

Konfigurimi

void setup () {setupDisplay (); // Inicializa ose SD nëse (! SD.filloj (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Conecta nuk ka asnjë pikë hyrjeje jashtë ESP32 dhe lidh serverin 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, më shumë orientim dhe limpa një 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 (); Modaliteti WiFi (WIFI_STA); WiFi.filloj (SSID, PASSWORD); display.println ("Lidhja me" + String (SSID)); // Enquanto não estiver conectado à rede WiFi while (WiFi.status ()! = WL_CONNECTED) {vonesë (500); ekran.print ("."); } display.println (""); display.print ("I lidhur me"); display.println (SSID); }

connectToServer

void connectToServer () {display.println ("Po provon lidhjen e prizës"); // Espera a conexão com o server ndërsa (! Socket.connect (HOST, PORT)) {display.print ("."); vonesë (500); } display.println (); display.println ("I lidhur!"); // Tempo máximo que o kliente deve demorar para responder // antes de dizermos que a conexão foi perdida socket.setTimeout (KOHA); }

IRAM_ATTR resetModule dhe setupWatchdog

// funcão que o temporizador irá chamar, para reiniciar o ESP32void IRAM_ATTR resetModule () {ets_printf ("(qen mbrojtës) reiniciar / n"); esp_restart_noos (); // reinicia o chip} void setupWatchdog () {timer = timerBegin (0, 80, e vërtetë); // timerID 0, div 80 // kohëmatësi, kthimi në telefon, ndërprerja e kohës timerAttachInterrupt (kohëmatësi, & resetModule, e vërtetë); // kohëmatësi, tempo (ne), repetição timerAlarmWrite (kohëmatës, 10000000, e vërtetë); timerAlarmEnable (kohëmatësi); // habilita a interrupção}

lak

void loop () {timerWrite (kohëmatës, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // kontrolloni mundësinë për të kontrolluar serverin serverRSSI (); // verifica o rssi plot (); // mostra o gráfico de histórico de rssi sendToServer (); // envia uma mensagem com um contador para ose server readFromServer (); // espera a confirmação do log server (); // salva nuk regjistrohet pa vonesë në SD (1000); // espera um segundo}

checkConnection

void checkConnection () {// Verifica a conexão com o AP if (WiFi.status ()! = WL_CONNECTED) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("WiFi u shkëput"); setupWiFi (); vonesa (1000); } // verifikimi i një lidhjeje nëse (! socket.connected ()) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("Foleja e shkëputur"); connectToServer (); vonesë (3000); display.fillScreen (ST77XX_BLACK); }}

checkRSSI

void checkRSSI () {// Verifica o RSSI rssi = WiFi. RSSI (); // Limpa o texto e mostra ose RSSI pa shfaqje clearText (); display.setCursor (0, 0); display.print ("RSSI:" + String (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); }

komplot

komplot i pavlefshëm () {// 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 (aktualeX, DISPLAY_HEIGHT - vlera, vlera, PLOT_COLOR); aktualeX += 2;}}

sendToServer

void sendToServer () {// Se estiver conectado com o server if (socket.connected ()) {// Envia um hello com um contador, shumica nuk shfaqet dhe shtohet në kontador Dërgimi i vargut = "Përshëndetje" + String (numërim); display.setCursor (0, 10); display.println ("Dërgimi:" + dërgimi); socket.println (dërgimi); socket.print (String (rssi)); numëroni ++; }}

readFromServer

i pavlefshëm readFromServer () {// Espera ose server në të gjitha anët e desconectar ndërsa (socket.connected () &&! socket.available ()) {vonesë (100); } // Se tem algo para receber if (socket.available ()) {// Faz a leitura, fshini o / n në fund e mostra asnjë ekran nuk është marrë = socket.readStringUntil ('\ n'); marrë. heq (marrë. gjatësi ()-1); display.println ("Marrë:" + marrë); }}

clearText dhe log

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 nuk ka skedarin përfundimtar të skedarit File = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramas uma mensagem de erro if (! File) {Serial.println ("Hapja e skedarit dështoi"); kthim; } // Gravamos uma linha com o tempo desde o boot, ose rssi atual e a mensagem recebida Të dhënat e vargut = String (millis ()) + ";" + Varg (rssi) + ";" + marrë; file.println (të dhëna); file.close (); }

Hapi 10: Skedarët

Shkarkoni skedarët:

PDF

INO

Recommended: