Isi kandungan:
- Langkah 1: Memasang AP Dengan Wrover
- Langkah 2: Perhimpunan STATION Bersama TTGO
- Langkah 3: HASIL
- Langkah 4: Arkib LOG.CSV
- Langkah 5: Adafruit GFX Library
- Langkah 6: Perpustakaan Adafruit ST7735
- Langkah 7: Mengkonfigurasi Kad
- Langkah 8: AP.ino
- Langkah 9: Station.ino
- Langkah 10: Fail
Video: ESP32 Dengan Antena Jarak Jauh Luaran: 10 Langkah
2024 Pengarang: John Day | [email protected]. Diubah suai terakhir: 2024-01-30 11:10
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
Langkah 3: HASIL
Jarak maksimum dengan 2x antena luaran: 315 meter
Jarak maksimum dengan antena luaran dan dalaman: 157 meter
Langkah 4: Arkib LOG. CSV
Saya merekodkan data pada kad SD, dengan data dalam milis, dbm, dan rentetan paket.
Langkah 5: Adafruit GFX Library
Di Arduino IDE, pergi ke Sketch-> Include Library-> Manage Libraries…
Pasang Adafruit GFX Library
Langkah 6: Perpustakaan Adafruit ST7735
Dalam Arduino IDE, pergi ke Sketch-> Include Library-> Manage Libraries…
Pasang Adafruit ST7735
Langkah 7: 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:
INO
Disyorkan:
Esp32-Ubidots-Wireless-jarak jarak jauh-dan-kelembapan: 6 Langkah
Esp32-Ubidots-Wireless-jarak jarak jauh-dan-kelembapan: Dalam tutorial ini, kita akan mengukur data suhu dan kelembapan yang berbeza menggunakan sensor Temp dan kelembapan. Anda juga akan belajar bagaimana menghantar data ini ke Ubidots. Supaya anda dapat menganalisisnya dari mana sahaja untuk aplikasi yang berbeza
Pengumpan Tumbuhan Automatik WiFi Dengan Takungan - Persediaan Penanaman Dalaman / Luaran - Tumbuhan Air Secara Automatik Dengan Pemantauan Jauh: 21 Langkah
Pengumpan Tanaman Automatik WiFi Dengan Takungan - Persediaan Penanaman Dalaman / Luaran - Tumbuhan Air Secara Automatik Dengan Pemantauan Jauh: Dalam tutorial ini kita akan menunjukkan cara mengatur sistem pengumpan tanaman dalaman / luaran khusus yang menyiram tanaman secara automatik dan dapat dipantau dari jarak jauh menggunakan platform Adosia
Tingkatkan Jarak Berkesan pada Pemancar Pemicu Jauh Flash 'ebay' Dengan Antena: 6 Langkah
Meningkatkan Jarak Berkesan pada Pemancar Pemicu Jauh Flash 'ebay' Dengan Antena: Penyokong kamera dapat membeli versi pemicu jarak jauh yang murah untuk unit denyar luaran, mengendalikan unit flash jenis kasut panas atau 'studio'. Pencetus ini menderita daya pemancar yang rendah dan jarak kawalan efektif yang kecil. Ini
Buat HDD Luaran Dari CD Luaran Lama / RW: 5 Langkah
Buat HDD luaran Dari CD / RW luaran lama: Penukaran lurus ke hadapan cd / rw luaran lama ke cakera keras luaran yang lebih berguna. Bekalan 1-cd / rw luaran (lebih baik jenis yang lebih kotak) pemacu 1-keras (mesti sepadan dengan penyambung dalaman kes pemacu, perlu diformat / sysed) 1-sm
Huawei E160X (Vodafone K3565) 3G Dongle Antena / Sarung Luaran: 13 Langkah (dengan Gambar)
Huawei E160X (Vodafone K3565) 3G Dongle Antenna External / Casing: Dongle K3565 yang disediakan oleh Vodafone dengan bayaran mereka semasa anda pergi adalah sangat baik, tetapi dengan kecewa penyambung antena luaran tersembunyi di bawah selongsong. Inilah cara meretas casing untuk mendapatkan penyambung tersembunyi itu - dan bagi mereka yang ingin