Daftar Isi:

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

Video: ESP32 Dengan Antena Jarak Jauh Eksternal: 10 Langkah

Video: ESP32 Dengan Antena Jarak Jauh Eksternal: 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 menyangkut uji jarak dengan ESP32 dengan Antena Eksternal. Mari kita gunakan dua modul hari ini: dari Espressif dan TTGO. Mari kita periksa RSSI antara dua antena ESP32 ini, buat grafik dari histori, dan tulis log nilai dalam file.csv.

Kami kemudian memiliki ESP32 Wrover sebagai AP, dan ESP32 dari TTGO sebagai Station. Saya menggunakan antena yang saya ambil dari TP-Link yang sedikit lebih besar dan router lain yang dikenal sebagai antena 9dbm. Saya belum melihat perbedaan antara keduanya.

Akhirnya, kedua mikrokontroler terhubung melalui soket dan, dengan setiap pengiriman paket data, kami mencetak pada layar grafik dengan batang yang menunjukkan rasio dbm.

Langkah 1: Memasang AP Dengan Wrover

Langkah 2: Perakitan STATION Dengan TTGO

Perakitan STATION Dengan TTGO
Perakitan STATION Dengan TTGO

Langkah 3: HASIL

HASIL
HASIL
HASIL
HASIL
HASIL
HASIL

Jarak maksimum dengan 2x antena eksternal: 315 meter

Jarak maksimum dengan antena eksternal dan internal: 157 meter

Langkah 4: Arsipkan LOG. CSV

Arsip LOG. CSV
Arsip LOG. CSV
Arsip LOG. CSV
Arsip LOG. CSV

Saya merekam data pada kartu SD, dengan data dalam milis, dbm, dan string paket.

Langkah 5: Adafruit GFX Library

Perpustakaan Adafruit GFX
Perpustakaan Adafruit GFX

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

Instal Perpustakaan Adafruit GFX

Langkah 6: Perpustakaan Adafruit ST7735

Perpustakaan Adafruit ST7735
Perpustakaan Adafruit ST7735

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

Instal Adafruit ST7735

Langkah 7: Mengonfigurasi Kartu

Mengonfigurasi Kartu
Mengonfigurasi Kartu
Mengonfigurasi Kartu
Mengonfigurasi Kartu

Tetap disini untuk perbedaan:

Langkah 8: AP.ino

Kami telah menyertakan pustaka yang diperlukan dan menetapkan 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 dan altura yang ditampilkan #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 //Konfigurasi DISPLAY_HEIGHT 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.csv"

Kami mendefinisikan pin, di antara variabel lainnya

//Pino menampilkan#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 melakukan 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 datangça horizontalmente int currentX = PLOT_MARGIN; //Objeto respon pelo tampilan Adafruit_ST7735 display = Adafruit_ST7735(DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST); //Server criamos um (qualquer porta válida serve contanto que o cliente menggunakan mesma porta) WiFiServer server(80); //Variável para armazenar o klien (tidak ada caso o ESP32 em modo station) conectado klien WiFiClient; //String que recebemos apakah klien String diterima; //RSSI enviado pelo client para este ESP32 long rssi = 0; //Faz o controle do temporizador (mengganggu tempo) hw_timer_t *timer = NULL; //Utilizado para guardar os ultimos std::vector rssiHistory;

Mempersiapkan

void setup(){ Serial.begin(115200); setupTampilan(); //Inisialisasi o SD if (!SD.begin(SDCARD_CS)) { display.println("Erro ao inicializar lib SD!"); } //Cria rede WiFi, inisialisasi server dan espera atau konfigurasi konektar klienWiFi(); server.mulai(); tungguUntukKlien(); //Espera 3 segundos, limpa a tela e inicializa o Watchdog delay(3000); display.fillScreen(ST77XX_BLACK); display.setCursor(0, 0); setupWatchdog(); }

Siapkan WiFi

//Cria um Access Point dan konfigurasi IPvoid setupWiFi() { display.println("Membuat softAP" + String(SSID)); WiFi.putuskan(); 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" + String(SSID) + " dibuat!"); }

Pengaturan Tampilan

//Incializa o display, muda a orientação e limpa a telavoid setupDisplay() { //Inicializa o display display.initR(INITR_BLACKTAB); //Rotaciona atau conteúdo sebagian besar tampilan.setRotation(3); //Pinta a tela de preto display.fillScreen(ST77XX_BLACK); }

tungguUntukKlien

void waitForClient(){ display.println("Menunggu klien"); //Aguarda o klien conectar while(!(klien = server.available())) { display.print("."); penundaan (500); } display.println("Klien terhubung"); //Memaksimalkan waktu untuk klien mengembangkan demorar untuk responden //mempersiapkan pilihan untuk menyelesaikan klien.setTimeout(TIMEOUT); }

IRAM_ATTR resetModul dan 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, interrupo de borda timerAttachInterrupt(timer, &resetModule, true); //timer, tempo (kami), repetisi timerAlarmWrite(timer, 10000000, true); timerAlarmEnable(pengatur waktu); //habilita a interupo }

Lingkaran

void loop() { timerWrite(timer, 0); //reset atau temporizador (alimenta atau anjing penjaga) checkConnection(); //checa se possui conexão com o klien readFromClient(); //l os dados melakukan klien sendToClient(); //envia konfirmasi untuk plot klien(); //kebanyakan dan grafik dari histórico de rssi log(); //salva um log no cartão SD }

periksaKoneksi

void checkConnection(){ //Se o klien dan estiver conectado if(!client.connected()) { //Limpa a tela dan espera pelo klien display.fillScreen(ST77XX_BLACK); display.println("Klien terputus"); tungguUntukKlien(); } }

bacaDariKlien

void readFromClient(){ //Espera até o client 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()) { diterima = client.readStringUntil('\n'); //L o texto que o klien enviu accept.remove(received.length()-1); //Hapus o \n lakukan final rssi = client.parseInt(); //L o rssi que o klien enviu clearText(); //Limpa atau tampilan teks.setCursor(0, 0); //Memindahkan kursor melakukan texto para o começo melakukan display display.println("RSSI: " + String(rssi)); //Sebagian besar RSSI tidak ada tampilan display.println("Diterima: " + diterima); //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).mulai()); } //Adiciona no final do histórico (mais recente) rssiHistory.push_back(rssi); } }

kirimKeKlien

void sendToClient(){ //Se o client estiver conectado enviamos de volta a mensagem com um OK if(client.connected()) { String pengiriman = diterima + " OK"; klien.println(mengirim); } }

merencanakan

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

clearText dan log

void clearText(){ //Limpa a area com o texto da mensagem vinda lakukan tampilan klien.fillRect(0, 0, DISPLAY_WIDTH, 2*PLOT_MARGIN, ST77XX_BLACK); } void log() { //Abrimos atau 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("Gagal membuka file"); kembali; } //Gravamos uma linha com o tempo desde o boot, or rssi atual e a mensagem recebida String data = String(millis()) + ";" + String(rssi) + ";" + diterima; file.println(data); file.tutup(); }

Langkah 9: Station.ino

Kami telah menyertakan pustaka yang diperlukan dan menetapkan 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 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 mempertimbangkan conexão pedida #define TIMEOUT 2000 //Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 //Configuraes de cor, margees de cor, #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 pengaturan yang melibatkan tampilan dan Kartu SD.

hitungan panjang = 0; //Contador de mensagens enviadaslong rssi = 0; //RSSI calculado String diterima; //Mensagem de konfirmasi o AP no envia //Pixel onde o gráfico datangç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 #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 respons pelo tampilan Adafruit_ST7735 display = Adafruit_ST7735(DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLRST); DISPLAY_CLRST); hw_timer_t *timer = NULL; //faz o controle do temporizador (interrupo por tempo) //Menggunakan untuk penjaga os ultimos std::vector rssiHistory;

Mempersiapkan

void pengaturan(){ setupDisplay(); //Inisialisasi o SD if (!SD.begin(SDCARD_CS)) { display.println("Erro ao inicializar lib SD!"); } //Conecta no access point criado pelo outro ESP32 dan conecta ao server setupWiFi(); sambungkan ke server(); //Espera 3 segundos, limpa a tela e inicializa o Watchdog delay(3000); display.fillScreen(ST77XX_BLACK); display.setCursor(0, 0); setupWatchdog(); }

pengaturanTampilan

//Incializa o display, muda a orientação e limpa a telavoid setupDisplay() { //Inicializa o display display.initR(INITR_BLACKTAB); //Rotaciona atau conteúdo sebagian besar tampilan.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.begin(SSID, PASSWORD); display.println("Menghubungkan ke " + String(SSID)); //Enquanto estiver conectado rede WiFi saat (WiFi.status() != WL_CONNECTED) { delay(500); tampilan.print("."); } tampilan.println(""); display.print("Terhubung ke "); tampilan.println(SSID); }

sambungkan ke server

void connectToServer(){ display.println("Mencoba koneksi soket"); //Espera a conexão com o server while(!socket.connect(HOST, PORT)) { display.print("."); penundaan (500); } tampilan.println(); display.println("Terhubung!"); //Memaksimalkan tempo klien untuk mendemonstrasikan demo untuk para responder //mempersiapkan pilihan untuk koneksi perdida socket.setTimeout(TIMEOUT); }

IRAM_ATTR resetModul dan 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, interrupo de borda timerAttachInterrupt(timer, &resetModule, true); //timer, tempo (kami), repetisi timerAlarmWrite(timer, 10000000, true); timerAlarmEnable(pengatur waktu); //habilita a interupo }

lingkaran

void loop() { timerWrite(timer, 0); //reset atau temporizador (alimenta atau anjing penjaga) checkConnection(); //checa se possui conexão com o server checkRSSI(); //verifikasi atau plot rssi(); //sebagian besar grafik de histórico de rssi sendToServer(); //envia uma mensagem com um contador para o server readFromServer(); //espera a konfirmasi untuk melakukan log server(); //salva um log no cartão SD delay(1000); //espera um segundo }

periksaKoneksi

void checkConnection(){ //Memverifikasi conexão com o AP if(WiFi.status() != WL_CONNECTED) { display.fillScreen(ST77XX_BLACK); display.setCursor(0, 0); display.println("WiFi terputus"); setupWiFi(); penundaan (1000); } //memverifikasi koneksi socket if(!socket.connected()) { display.fillScreen(ST77XX_BLACK); display.setCursor(0, 0); display.println("Socket terputus"); sambungkan ke server(); penundaan(3000); display.fillScreen(ST77XX_BLACK); } }

cekRSSI

void checkRSSI(){ //Verifikasi atau RSSI rssi = WiFi. RSSI(); //Limpa o texto e paling o RSSI tidak ada tampilan 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); }

merencanakan

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

kirimKeServer

void sendToServer(){ //Se estiver conectado com o server if(socket.connected()) { //Envia um hello com um contador, paling tidak ada tampilan dan penambahan contador String send = "Hello " + String(count); display.setCursor(0, 10); display.println("Mengirim: " + mengirim); socket.println(mengirim); socket.print(String(rssi)); menghitung++; } }

bacaDariServer

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, hapus o \n lakukan paling akhir tidak ada tampilan yang diterima = socket.readStringUntil('\n'); diterima.remove(diterima.panjang()-1); display.println("Diterima: " + diterima); } }

clearText dan log

void clearText(){ //Limpa a area com o texto da mensagem vinda lakukan tampilan klien.fillRect(0, 0, DISPLAY_WIDTH, 2*PLOT_MARGIN, ST77XX_BLACK); } void log() { //Abrimos atau 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("Gagal membuka file"); kembali; } //Gravamos uma linha com o tempo desde o boot, or rssi atual e a mensagem recebida String data = String(millis()) + ";" + String(rssi) + ";" + diterima; file.println(data); file.tutup(); }

Langkah 10: File

Unduh file:

PDF

SAYA TIDAK

Direkomendasikan: