Daftar Isi:
- Langkah 1: Memasang AP Dengan Wrover
- Langkah 2: Perakitan STATION Dengan TTGO
- Langkah 3: HASIL
- Langkah 4: Arsipkan LOG.CSV
- Langkah 5: Adafruit GFX Library
- Langkah 6: Perpustakaan Adafruit ST7735
- Langkah 7: Mengonfigurasi Kartu
- Langkah 8: AP.ino
- Langkah 9: Station.ino
- Langkah 10: File
Video: ESP32 Dengan Antena Jarak Jauh Eksternal: 10 Langkah
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:56
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
Langkah 3: HASIL
Jarak maksimum dengan 2x antena eksternal: 315 meter
Jarak maksimum dengan antena eksternal dan internal: 157 meter
Langkah 4: Arsipkan LOG. CSV
Saya merekam data pada kartu SD, dengan data dalam milis, dbm, dan string paket.
Langkah 5: Adafruit GFX Library
Di Arduino IDE, buka Sketch-> Include Library-> Manage Libraries…
Instal Perpustakaan Adafruit GFX
Langkah 6: Perpustakaan Adafruit ST7735
Di Arduino IDE, buka Sketch-> Include Library-> Manage Libraries…
Instal Adafruit ST7735
Langkah 7: 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:
SAYA TIDAK
Direkomendasikan:
Pengendali Jarak Jauh Berbasis LoRa - Kontrol Peralatan Dari Jarak Jauh: 8 Langkah
Pengendali Jarak Jauh Berbasis LoRa | Mengontrol Peralatan Dari Jarak Jauh: Hai, apa kabar, Guys! Akarsh di sini dari CETech. Dalam proyek ini, kita akan membuat remote control yang dapat digunakan untuk mengontrol berbagai instrumen seperti LED, motor atau jika kita berbicara tentang kehidupan kita sehari-hari, kita dapat mengontrol aplikasi rumah kita
Sensor Jarak IR Jarak Jauh: 3 Langkah
Sensor Jarak IR Jarak Jauh: Sensor inframerah adalah Modul terbaik untuk deteksi objek tetapi masalahnya adalah ia bekerja untuk jarak yang sangat pendek. dalam artikel ini, kami akan membagikan bagaimana Anda dapat meningkatkan jangkauan dan faktor-faktor apa yang mempengaruhi jangkauan
Tingkatkan Jarak Efektif pada Pemancar Pemicu Jarak Jauh Flash 'ebay' Dengan Antena: 6 Langkah
Tingkatkan Jarak Efektif pada Pemancar Pemicu Jarak Jauh Flash 'ebay' Dengan Antena: Penggemar kamera dapat membeli pemicu jarak jauh versi murah untuk unit lampu kilat eksternal, mengendalikan unit lampu kilat tipe hot-shoe atau 'studio'. Pemicu ini menderita karena daya pemancar yang rendah dan dengan demikian jarak kontrol efektif yang kecil. ini bulan
Membuat HDD Eksternal Dari CD/RW Eksternal Lama: 5 Langkah
Membuat HDD Eksternal Dari CD/RW Eksternal Lama: Konversi langsung dari cd/rw eksternal lama ke hard drive eksternal yang lebih berguna. Persediaan1-cd/rw eksternal (sebaiknya tipe yang lebih berbentuk kotak)1-hard drive (harus sesuai dengan konektor internal casing drive, perlu diformat/disistem)1-sm
Pelepasan Kabel Jarak Jauh Olympus Evolt E510 (Versi 2 Dengan Fokus Otomatis pada Jarak Jauh): 6 Langkah (dengan Gambar)
Olympus Evolt E510 Remote Cable Release (Versi 2 Dengan Fokus Otomatis pada Remote): Kemarin saya membuat remote satu tombol sederhana untuk Olympus E510 saya. Sebagian besar kamera memiliki tombol pelepas rana (tombol yang Anda tekan untuk mengambil gambar) yang memiliki dua mode. Jika tombol ditekan perlahan, kamera akan fokus otomatis dan mengukur cahaya