Isi kandungan:

ESP32 Dengan Antena Jarak Jauh Luaran: 10 Langkah
ESP32 Dengan Antena Jarak Jauh Luaran: 10 Langkah

Video: ESP32 Dengan Antena Jarak Jauh Luaran: 10 Langkah

Video: ESP32 Dengan Antena Jarak Jauh Luaran: 10 Langkah
Video: #291 External antennas and ESP32 Long-Range mode 2024, November
Anonim
Image
Image
Memasang AP Dengan Wrover
Memasang AP Dengan Wrover

Topik hari ini adalah mengenai ujian jarak jauh dengan ESP32 dengan Antena Luaran. Mari gunakan dua modul hari ini: dari Espressif dan TTGO. Mari kita periksa RSSI antara kedua antena ESP32 ini, hasilkan grafik dari sejarah, dan tulis log nilai dalam fail.csv.

Kami kemudian mempunyai ESP32 Wrover sebagai AP, dan ESP32 dari TTGO sebagai Stesen. Saya menggunakan antena yang saya ambil dari TP-Link yang sedikit lebih besar dan penghala lain yang dikenali sebagai antena 9dbm. Saya tidak melihat perbezaan antara keduanya.

Akhirnya, kedua mikrokontroler terhubung melalui soket dan, dengan setiap penghantaran paket data, kami mencetak pada paparan grafik dengan bar yang menunjukkan nisbah dbm.

Langkah 1: Memasang AP Dengan Wrover

Langkah 2: Perhimpunan STATION Bersama TTGO

Perhimpunan STATION Bersama TTGO
Perhimpunan STATION Bersama TTGO

Langkah 3: HASIL

HASIL
HASIL
HASIL
HASIL
HASIL
HASIL

Jarak maksimum dengan 2x antena luaran: 315 meter

Jarak maksimum dengan antena luaran dan dalaman: 157 meter

Langkah 4: Arkib LOG. CSV

Arkib LOG. CSV
Arkib LOG. CSV
Arkib LOG. CSV
Arkib LOG. CSV

Saya merekodkan data pada kad SD, dengan data dalam milis, dbm, dan rentetan paket.

Langkah 5: Adafruit GFX Library

Perpustakaan Adafruit GFX
Perpustakaan Adafruit GFX

Di Arduino IDE, pergi ke Sketch-> Include Library-> Manage Libraries…

Pasang Adafruit GFX Library

Langkah 6: Perpustakaan Adafruit ST7735

Perpustakaan Adafruit ST7735
Perpustakaan Adafruit ST7735

Dalam Arduino IDE, pergi ke Sketch-> Include Library-> Manage Libraries…

Pasang Adafruit ST7735

Langkah 7: Mengkonfigurasi Kad

Mengkonfigurasi Kad
Mengkonfigurasi Kad
Mengkonfigurasi Kad
Mengkonfigurasi Kad

Nantikan perbezaan:

Langkah 8: AP.ino

Kami telah memasukkan perpustakaan yang diperlukan dan menentukan beberapa parameter.

#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 untuk mempertimbangkan conexão pedida #define TIMEOUT 2000 // Largura e altura memaparkan #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // Configura 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 # tentukan FILE_PATH "/log.csv

Kami menentukan pin, antara pemboleh ubah lain

// 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; // Paparkan paparan responsovel Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST); // Pelayan Criamos um (qualquer porta válida melayani contanto que o cliente menggunakan mesma porta) Pelayan WiFiServer (80); // Variável para armazenar o cliente (no caso o ESP32 em modo station) conectado WiFiClient client; // String que recebemos do String pelanggan diterima; // RSSI enviado pelo cliente para este ESP32 panjang rssi = 0; // Faz o controle do temporizador (interrupção por tempo) hw_timer_t * timer = NULL; // Utilizado para guardar os ultimos std:: vektor rssiHistory;

Persediaan

persediaan tidak sah () {Serial.begin (115200); persediaanDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Cria a rede WiFi, inicializa o server e espera o cliente conectar setupWiFi (); pelayan.begin (); waitForClient (); // Espera 3 segundos, limpa a tela e inicializa o Watchdog delay (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); persediaanWatchdog (); }

Sediakan 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, KATA LALUAN); display.println ("softAP" + String (SSID) + "dibuat!"); }

Paparan Persediaan

// 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); // Pinta paparan tela de preto.fillScreen (ST77XX_BLACK); }

waitForClient

batal waitForClient () {display.println ("Menunggu pelanggan"); // Aguarda o cliente conectar sambil (! (Client = server.available ())) {display.print ("."); kelewatan (500); } display.println ("Pelanggan disambungkan"); // Tempo máximo que o cliente deve demorar para responder // antes de dizermos que a conexão juga perdida client.setTimeout (TIMEOUT); }

IRAM_ATTR resetModule dan setupWatchdog

// função que o temporizador irá chamar, para reiniciar o ESP32void IRAM_ATTR resetModule () {ets_printf ("(pengawas) reiniciar / n"); esp_restart_noos (); // reinicia o chip} kekosongan persediaanWatchdog () {timer = timerBegin (0, 80, true); // timerID 0, div 80 // timer, callback, interrupção de borda timerAttachInterrupt (pemasa, & resetModule, benar); // pemasa, tempo (kami), repetição timerAlarmWrite (pemasa, 10000000, benar); timerAlarmEnable (pemasa); // habilita a interrupção}

Gelung

gelung void () {timerWrite (pemasa, 0); // reseta o temporizador (alimenta o pengawas) 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}

semakConnection

batal checkConnection () {// Se o cliente não estiver conectado if (! client.connected ()) {// Limpa a tela e espera pelo cliente display.fillScreen (ST77XX_BLACK); display.println ("Pelanggan terputus"); waitForClient (); }}

bacaFromClient

batal readFromClient () {// Espera até o cliente enviar algo ou desconectar semasa (client.connected () &&! client.available ()) {delay (100); } // Se chegou aqui e ainda estiver conectado por porque possui algo para receiver do cliente if (client.connected ()) {diterima = client.readStringUntil ('\ n'); // Lê o texto que o cliente enviou diterima.hapus (diterima.length () - 1); // Keluarkan o / n do rssi = client.parseInt akhir (); // Lê o rssi que o cliente enviou clearText (); // Limpa o texto display.setCursor (0, 0); // Gerakkan kursor do texto para o começo do display display.println ("RSSI:" + String (rssi)); // Mostra o RSSI no display display.println ("Diterima:" + diterima); // Mostra a mensagem recebida do cliente // Se 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 (rssiHistory).begin ()); } // Adiciona no final do histórico (mais terkini) rssiHistory.push_back (rssi); }}

hantarToClient

batal sendToClient () {// Se o cliente estiver conectado enviamos de volta a mensagem com um OK jika (client.connected ()) {String pengiriman = diterima + "OK"; client.println (menghantar); }}

plot

plot kosong () {// 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 untuk (int i = 0; i -120? Map (rssiHistory , -120, 0, 0, PLOT_SIZE): 0; display.drawFastVLine (currentX, DISPLAY_HEIGHT - nilai, nilai, PLOT_COLOR); currentX + = 2;}}

clearText dan log

kosongkanTeks () {// Limpa a área com o texto da mensagem vinda do cliente display.fillRect (0, 0, DISPLAY_WIDTH, 2 * PLOT_MARGIN, ST77XX_BLACK); } log kosong () {// Abrimos o arquivo para escrevermos no final dele Fail fail = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("Gagal membuka fail"); kembali; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (milis ()) + ";" + Rentetan (rssi) + ";" + diterima; file.println (data); fail.tutup (); }

Langkah 9: Station.ino

Kami telah memasukkan perpustakaan yang diperlukan dan menentukan beberapa parameter.

#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 tidak ada persediaan AP #define PORT 80 // Porta do sever. Qualquer porta válida contanto que seja igual nos dois arquivos // Tempo de timeout untuk mempertimbangkan conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // Configurações de cor, margemf #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"

Kami menentukan tetapan yang melibatkan paparan dan Kad SD.

kiraan panjang = 0; // Contador de mensagens enviadaslong rssi = 0; // RSSI calculado String diterima; // Mensagem de confirmação que o AP nos envia // Pixel onde o gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Utilizado para conexão com o server WiFiClient socket; #define DISPLAY_DC 12 // A0 #define DISPLAY_CS 13 // CS #define DISPLAY_MOSI 14 // SDA #define DISPLAY_CLK 27 // SCK # tentukan 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_CLK, DISPLAY_CLK) hw_timer_t * pemasa = NULL; // faz o controle do temporizador (interrupção por tempo) // Utilizado para guardar os ultimos std:: vektor rssiHistory;

Persediaan

batal persediaan () {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 setup serverWiFi (); connectToServer (); // Espera 3 segundos, limpa a tela e inicializa o Watchdog delay (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); persediaanWatchdog (); }

persediaanDisplay

// 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); }

persediaanWiFi

// Conecta ao AP batal setupWiFi () {WiFi.disconnect (); WiFi.mode (WIFI_STA); WiFi.begin (SSID, KATA LALUAN); display.println ("Menyambung ke" + String (SSID)); // Enquanto não estiver conectado à rede WiFi sementara (WiFi.status ()! = WL_CONNECTED) {kelewatan (500); display.print ("."); } display.println (""); display.print ("Bersambung ke"); display.println (SSID); }

sambungToServer

batal connectToServer () {display.println ("Mencuba sambungan soket"); // Espera a conexão com o server sementara (! Socket.connect (HOST, PORT)) {display.print ("."); kelewatan (500); } paparan.println (); display.println ("Bersambung!"); // Tempo máximo que o cliente deve demorar para responder // antes de dizermos que a conexão juga perdida socket.setTimeout (TIMEOUT); }

IRAM_ATTR resetModule dan setupWatchdog

// função que o temporizador irá chamar, para reiniciar o ESP32void IRAM_ATTR resetModule () {ets_printf ("(pengawas) reiniciar / n"); esp_restart_noos (); // reinicia o chip} kekosongan persediaanWatchdog () {timer = timerBegin (0, 80, true); // timerID 0, div 80 // timer, callback, interrupção de borda timerAttachInterrupt (pemasa, & resetModule, benar); // pemasa, tempo (kami), repetição timerAlarmWrite (pemasa, 10000000, benar); timerAlarmEnable (pemasa); // habilita a interrupção}

gelung

gelung void () {timerWrite (pemasa, 0); // reseta o temporizador (alimenta o pengawas) 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 confirmação do log pelayan (); // salva um log no cartão SD delay (1000); // espera um segundo}

semakConnection

batal checkConnection () {// Verifica a conexão com o AP if (WiFi.status ()! = WL_CONNECTED) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("WiFi terputus"); persediaanWiFi (); kelewatan (1000); } // verifica a conexão do socket if (! socket.connected ()) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("Soket terputus"); connectToServer (); kelewatan (3000); display.fillScreen (ST77XX_BLACK); }}

semakRSSI

batal semakRSSI () {// Verifica o RSSI rssi = WiFi. RSSI (); // Limpa o texto e mostra o RSSI tiada paparan clearText (); display.setCursor (0, 0); display.print ("RSSI:" + Rentetan (rssi)); // Se 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 terkini) rssiHistory.push_back (rssi); }

plot

plot kosong () {// 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 untuk (int i = 0; i -120? Map (rssiHistory , -120, 0, 0, PLOT_SIZE): 0; display.drawFastVLine (currentX, DISPLAY_HEIGHT - nilai, nilai, PLOT_COLOR); currentX + = 2;}}

hantarToServer

batal sendToServer () {// Se pelayan conectado com o server sekiranya (socket.connected ()) {// Envia um hello com um contador, mostra no display e incrementa o contador String pengiriman = "Hello" + String (count); display.setCursor (0, 10); display.println ("Menghantar:" + menghantar); socket.println (menghantar); socket.print (Rentetan (rssi)); kira ++; }}

bacaFromServer

batal readFromServer () {// Espera até o server enviar algo ou desconectar semasa (socket.connected () &&! socket.available ()) {delay (100); } // Se tem algo para penerima jika (socket.available ()) {// Faz a leitura, keluarkan o / n buat final e mostra tidak ada paparan yang diterima = socket.readStringUntil ('\ n'); diterima.hapus (diterima. panjang () - 1); display.println ("Diterima:" + diterima); }}

clearText dan log

kosongkanTeks () {// Limpa a área com o texto da mensagem vinda do cliente display.fillRect (0, 0, DISPLAY_WIDTH, 2 * PLOT_MARGIN, ST77XX_BLACK); } log kosong () {// Abrimos o arquivo para escrevermos no final dele Fail fail = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("Gagal membuka fail"); kembali; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (milis ()) + ";" + Rentetan (rssi) + ";" + diterima; file.println (data); fail.tutup (); }

Langkah 10: Fail

Muat turun fail:

PDF

INO

Disyorkan: