Kazalo:

ESP32 z zunanjo anteno na dolge razdalje: 10 korakov
ESP32 z zunanjo anteno na dolge razdalje: 10 korakov

Video: ESP32 z zunanjo anteno na dolge razdalje: 10 korakov

Video: ESP32 z zunanjo anteno na dolge razdalje: 10 korakov
Video: Использование Melexis MLX90614 Инфракрасный термометр с Arduino 2024, November
Anonim
Image
Image
Montaža AP z Wroverjem
Montaža AP z Wroverjem

Današnja tema se nanaša na preskus na daljavo z ESP32 z zunanjo anteno. Danes uporabimo dva modula: iz Espressifa in TTGO. Nato preverimo RSSI med tema dvema antenama ESP32, ustvarimo graf iz zgodovine in zapišemo dnevnik vrednosti v datoteko.csv.

Nato imamo ESP32 Wrover kot AP in ESP32 TTGO kot postajo. Uporabil sem anteno, ki sem jo vzel iz nekoliko večjega TP-Link in drugega usmerjevalnika, znanega kot 9dbm antena. Nisem opazil nobene razlike med obema.

Nazadnje se dva mikrokrmilnika povežeta prek vtičnice in ob vsakem pošiljanju podatkovnih paketov natisnemo graf s črtami, ki označujejo razmerje dbm.

1. korak: Namestitev dostopne točke z Wroverjem

2. korak: Montaža postaje s TTGO

Montaža postaje s TTGO
Montaža postaje s TTGO

3. korak: REZULTAT

REZULTAT
REZULTAT
REZULTAT
REZULTAT
REZULTAT
REZULTAT

Največja razdalja z 2x zunanjimi antenami: 315 metrov

Največja razdalja z zunanjo in notranjo anteno: 157 metrov

4. korak: Arhivirajte LOG. CSV

Arhiv LOG. CSV
Arhiv LOG. CSV
Arhiv LOG. CSV
Arhiv LOG. CSV

Podatke sem zabeležil na kartico SD s podatki v milisah, dbm in nizom paketa.

5. korak: Knjižnica Adafruit GFX

Knjižnica Adafruit GFX
Knjižnica Adafruit GFX

V Arduino IDE pojdite na Sketch-> Include Library-> Manage Libraries …

Namestite knjižnico Adafruit GFX

6. korak: Knjižnica Adafruit ST7735

Knjižnica Adafruit ST7735
Knjižnica Adafruit ST7735

V Arduino IDE pojdite na Sketch-> Include Library-> Manage Libraries …

Namestite Adafruit ST7735

7. korak: Konfiguriranje kartic

Konfiguriranje kartic
Konfiguriranje kartic
Konfiguriranje kartic
Konfiguriranje kartic

Spremljajte razlike:

8. korak: AP.ino

Vključili smo potrebne knjižnice in določili nekatere 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 para consurar a conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // konfiguracija 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.

Med drugimi spremenljivkami definiramo zatiče

// 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 o gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Objeto responvel pelo display Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST); // Criamos um strežnik (qualquer porta válida služi contanto que ali cliente using a mesma porta) strežnik WiFiServer (80); // Variável para armazenar o cliente (brez caso o ESP32 em modo station) povezanega odjemalca WiFiClient; // String que recebemos do cliente Niz prejet; // RSSI enviado pelo cliente para este ESP32 long rssi = 0; // Faz o controle do temporizador (interrupção por tempo) hw_timer_t *timer = NULL; // Utilizado para guardar os ultimos std:: vector rssiHistory;

Nastaviti

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, inicializacijo strežnika in espero o povezavi strank 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 (); }

Nastavite WiFi

// Cria um Access Point in konfiguracija o nastavitvi IPvoidWiFi () {display.println ("Ustvarjanje softAP" + niz (SSID)); WiFi.disconnect (); WiFi.mode (WIFI_AP); WiFi.softAPConfig (naslov IP (192, 168, 0, 1), naslov IP (192, 168, 0, 1), naslov IP (255, 255, 255, 0)); WiFi.softAP (SSID, GESO); display.println ("softAP" + niz (SSID) + "ustvarjeno!"); }

Zaslon za nastavitev

// Vključitev zaslona, usmeritev in omejitev v izogib postavitviDisplay () {// Inicializacija prikaza zaslona.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 ("Čakanje na odjemalca"); // Aguarda o cliente conectar while (! (Client = server.available ())) {display.print ("."); zamuda (500); } display.println ("Odjemalec povezan"); // 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 in setupWatchdog

// função que o temporizador irá chamar, para reiniciar or 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 (časovnik); // habilita a interrupção}

Zanka

void loop () {timerWrite (timer, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // checa se possui conexão com o cliente readFromClient (); // lê os dados do cliente 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 ("Odjemalec odklopljen"); waitForClient (); }}

readFromClient

void readFromClient () {// Espera até o cliente omenila 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 ()) {prejeto = client.readStringUntil ('\ n'); // Lê o texto que o cliente enviou joined.remove (prejeto.length ()-1); // Odstrani o / n dokončno rssi = client.parseInt (); // Lê o rssi que o cliente enviou clearText (); // Limpa o texto display.setCursor (0, 0); // Premakni kurzor do besedila ali pride do prikaza display.println ("RSSI:" + String (rssi)); // Mostra o RSSI brez prikaza display.println ("Prejeto:" + prejeto); // Mostra a mensagem recebida do cliente // Se an 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.začeti()); } // Adiciona no final do histórico (mais recente) rssiHistory.push_back (rssi); }}

sendToClient

void sendToClient () {// Se o cliente estiver connectado enviamos de volta a mensagem com um OK if (client.connected ()) {Pošiljanje niza = prejeto + "V redu"; client.println (pošiljanje); }}

zaplet

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 - vrednost, vrednost, PLOT_COLOR); currentX += 2;}}

clearText in dnevnik

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); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("Failed to open file"); vrnitev; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + Niz (rssi) + ";" + prejeto; file.println (podatki); file.close (); }

9. korak: Station.ino

Vključili smo potrebne knjižnice in določili nekatere 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 configudo no setup to AP #define PORT 80 // Porta do sever. Qualquer porta válida contanto que seja igual nos dois arquivos // Tempo de timeout para consurar a conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // Configurações de corho, margem grško #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"

Določimo nastavitve, ki vključujejo zaslon in kartico SD.

dolgo štetje = 0; // Contador de mensagens enviadaslong rssi = 0; // RSSI Calculado Niz prejet; // Mensagem de confirmmação que o AP nos envia // Pixel onde o gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Uporabite para conexão com ali strežniško vtičnico WiFiClient; #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 responvel pelo display Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_CLK, hw_timer_t *timer = NULL; // faz o controle do temporizador (interrupção por tempo) // Utilizado para guardar os ultimos std:: vector rssiHistory;

Nastaviti

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 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

// Vključitev zaslona, usmeritev in omejitev v izogib postavitviDisplay () {// Inicializacija prikaza zaslona.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.začetek (SSID, GESO); display.println ("Povezovanje z" + niz (SSID)); // Enquanto não estiver conectado à rede WiFi medtem while (WiFi.status ()! = WL_CONNECTED) {delay (500); display.print ("."); } display.println (""); display.print ("Povezano z"); display.println (SSID); }

connectToServer

void connectToServer () {display.println ("Poskus vmesniške povezave"); // Espera conexão com o strežnik while (! Socket.connect (HOST, PORT)) {display.print ("."); zamuda (500); } display.println (); display.println ("Povezano!"); // 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 in setupWatchdog

// função que o temporizador irá chamar, para reiniciar or 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 (časovnik); // habilita a interrupção}

zanka

void loop () {timerWrite (timer, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // checa se possui conexão com o preverjanju strežnikaRSSI (); // verifica o rssi plot (); // mostra o gráfico de histórico de rssi sendToServer (); // en uma uma messagem com um contador za strežnik readFromServer (); // espera a confirmmação do log server (); // salva um log no cartão SD zakasnitev (1000); // espera um segundo}

checkConnection

void checkConnection () {// Preveri povezavo s točko AP, če (WiFi.status ()! = WL_CONNECTED) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("WiFi odklopljen"); setupWiFi (); zamuda (1000); } // preveri vtičnico conexão do if (! socket.connected ()) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("Vtičnica odklopljena"); connectToServer (); zamuda (3000); display.fillScreen (ST77XX_BLACK); }}

checkRSSI

void checkRSSI () {// Verifica o RSSI rssi = WiFi. RSSI (); // Limpa o texto e mostra ali RSSI brez prikaza clearText (); display.setCursor (0, 0); display.print ("RSSI:" + niz (rssi)); // Se an 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); }

zaplet

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 - vrednost, vrednost, PLOT_COLOR); currentX += 2;}}

sendToServer

void sendToServer () {// Se evisver conectado com o server if (socket.connected ()) {// Envia um hello com um contador, mostra no display e incrementa o contador String send = "Hello" + String (count); display.setCursor (0, 10); display.println ("Pošiljanje:" + pošiljanje); socket.println (pošiljanje); socket.print (String (rssi)); count ++; }}

readFromServer

void readFromServer () {// Espera até o strežniku, ki vsebuje algo ali 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 display = socket.readStringUntil ('\ n'); prejeto.odstraniti (prejeto.dolžina ()-1); display.println ("Prejeto:" + prejeto); }}

clearText in dnevnik

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); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("Failed to open file"); vrnitev; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + Niz (rssi) + ";" + prejeto; file.println (podatki); file.close (); }

10. korak: Datoteke

Prenesite datoteke:

PDF

JAZ NE

Priporočena: