Mục lục:
- Bước 1: Gắn AP với Wrover
- Bước 2: Lắp ráp TRẠM VỚI TTGO
- Bước 3: KẾT QUẢ
- Bước 4: Lưu trữ LOG.CSV
- Bước 5: Thư viện Adafruit GFX
- Bước 6: Thư viện Adafruit ST7735
- Bước 7: Định cấu hình thẻ
- Bước 8: AP.ino
- Bước 9: Station.ino
- Bước 10: Tập tin
Video: ESP32 với ăng ten khoảng cách dài bên ngoài: 10 bước
2024 Tác giả: John Day | [email protected]. Sửa đổi lần cuối: 2024-01-30 13:34
Chủ đề của ngày hôm nay liên quan đến kiểm tra khoảng cách với ESP32 với Ăng-ten ngoài. Hãy sử dụng hai mô-đun ngày hôm nay: từ Espressif và TTGO. Sau đó, hãy kiểm tra RSSI giữa hai ăng-ten ESP32 này, tạo biểu đồ từ lịch sử và ghi nhật ký các giá trị trong tệp.csv.
Sau đó, chúng tôi có ESP32 Wrover dưới dạng AP và ESP32 của TTGO dưới dạng Trạm. Tôi đã sử dụng một ăng-ten mà tôi lấy từ TP-Link lớn hơn một chút và một bộ định tuyến khác được gọi là ăng-ten 9dbm. Tôi không nhận thấy bất kỳ sự khác biệt nào giữa hai điều này.
Cuối cùng, hai bộ vi điều khiển kết nối qua socket và với mỗi lần gửi gói dữ liệu, chúng tôi in trên màn hình một biểu đồ với các thanh biểu thị tỷ lệ dbm.
Bước 1: Gắn AP với Wrover
Bước 2: Lắp ráp TRẠM VỚI TTGO
Bước 3: KẾT QUẢ
Khoảng cách tối đa với 2x ăng-ten bên ngoài: 315 mét
Khoảng cách tối đa với ăng ten bên ngoài và bên trong: 157 mét
Bước 4: Lưu trữ LOG. CSV
Tôi đã ghi dữ liệu trên thẻ SD, với dữ liệu tính bằng mili, dbm và chuỗi gói.
Bước 5: Thư viện Adafruit GFX
Trong Arduino IDE, đi tới Sketch-> Bao gồm Thư viện-> Quản lý Thư viện…
Cài đặt Thư viện GFX Adafruit
Bước 6: Thư viện Adafruit ST7735
Trong Arduino IDE, đi tới Sketch-> Bao gồm Thư viện-> Quản lý Thư viện…
Cài đặt Adafruit ST7735
Bước 7: Định cấu hình thẻ
Hãy theo dõi sự khác biệt:
Bước 8: AP.ino
Chúng tôi đã bao gồm các thư viện cần thiết và xác định một số tham số.
#include #include #include #include #include #include // Rede que o ESP criará. No Station deve ser igual #define SSID "RSSI_Test" #define MẬT KHẨU "87654321" // Tempo de timeout para coirar a conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHTes de Configuraçes 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"
Chúng tôi xác định các chân, trong số các biến khác
// 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 ngangmente int currentX = PLOT_MARGIN; // Objeto responseável pelo display Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST); // Máy chủ Criamos um (máy chủ đủ điều kiện porta válida phục vụ contanto que o cliente sử dụng cổng mesma) Máy chủ WiFiServer (80); // Variável para armazenar o cliente (no caso o ESP32 em modo station) conectado WiFiClient client; // Chuỗi que Collectbemos do cliente Đã nhận được chuỗi; // RSSI enviado pelo cliente para este ESP32 long rssi = 0; // Faz o controlle do temporizador (ngắt quãng theo nhịp độ) hw_timer_t * timer = NULL; // Utilizado para Guardar os ulos std:: vector rssiHistory;
Cài đặt
void setup () {Serial.begin (115200); setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Cria a red WiFi, inicializa o server e espera o cliente conectar 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 (); }
Thiết lập WiFi
// Cria um Access Point e configura o IPvoid setupWiFi () {display.println ("Tạo 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, MẬT KHẨU); display.println ("softAP" + String (SSID) + "đã tạo!"); }
Thiết lập Hiển thị
// 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 một tela de preto display.fillScreen (ST77XX_BLACK); }
waitForClient
void waitForClient () {display.println ("Đang chờ máy khách"); // Aguarda o cliente conectar while (! (Client = server.available ())) {display.print ("."); chậm trễ (500); } display.println ("Máy khách được kết nối"); // Tempo máximo que o cliente deve demorar para responseer // antes de dizermos que a conexão foi perdida client.setTimeout (TIMEOUT); }
IRAM_ATTR resetModule và 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, interrupção de borda timerAttachInterrupt (timer, & resetModule, true); // timer, tempo (us), repeattição timerAlarmWrite (timer, 10000000, true); timerAlarmEnable (hẹn giờ); // habilita a interrupção}
Vòng
void loop () {timerWrite (timer, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // checa se ridui 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}
kiểm tra kết nối
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 ("Máy khách đã ngắt kết nối"); waitForClient (); }}
readFromClient
void readFromClient () {// Espera até o cliente enviar algo ou desconectar while (client.connected () &&! client.available ()) {delay (100); } // Se chegou aqui e ainda estiver conectado é porque Possui algo para Collectber do cliente if (client.connected ()) {got = client.readStringUntil ('\ n'); // Lê o texto que o cliente enviou gone.remove (accept.length () - 1); // Xóa o / n do final rssi = client.parseInt (); // Lê o rssi que o cliente enviou clearText (); // Limpa o texto display.setCursor (0, 0); // Di chuyển con trỏ o do texto para o começo do display display.println ("RSSI:" + String (rssi)); // Mostra o RSSI không hiển thị display.println ("Đã nhận:" + đã nhận); // Mostra a mensagem96 do cliente // Se a quantidade de barras do gráfico passou do limite apagamos o registerro mais antigo if (rssiHistory.size () == (DISPLAY_WIDTH - 2 * PLOT_MARGIN) / 2) {rssiHistory.erase (rssiHistory.bắt đầu()); } // Adiciona no final do histórico (mais neare) rssiHistory.push_back (rssi); }}
sendToClient
void sendToClient () {// Se o cliente estiver conectado enviamos de volta a mensagem com um OK if (client.connected ()) {Chuỗi gửi = nhận + "OK"; client.println (đang gửi); }}
âm mưu
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 - giá trị, giá trị, PLOT_COLOR); currentX + = 2;}}
clearText và nhật ký
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 không có lần xóa cuối cùng nào File file = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("Không mở được tệp"); trở lại; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem Collectbida String data = String (millis ()) + ";" + Chuỗi (rssi) + ";" + nhận được; file.println (dữ liệu); file.close (); }
Bước 9: Station.ino
Chúng tôi đã bao gồm các thư viện cần thiết và xác định một số tham số.
#include #include #include #include #include #include // Nome da red 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 Thoughtrar a conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // Configurações de cor, margem e tamo #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"
Chúng tôi xác định các cài đặt liên quan đến màn hình và Thẻ SD.
đếm dài = 0; // Contador de mensagens enviadaslong rssi = 0; // Chuỗi RSSI Calculado đã nhận; // Mensagem de confirmação que o AP nos envia // Pixel onde o gráfico começa ngangmente 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 responseável pelo display Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST); hw_timer_t * timer = NULL; // faz o Controlle do temporizador (interrupção por tempo) // Utilizado para Guardar os ulos std:: vector rssiHistory;
Cài đặt
void setup () {setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Conecta không có điểm truy cập criado pelo outro ESP32 e conecta ao server setupWiFi (); kết nối với máy chủ(); // Espera 3 segundos, limpa a tela e inicializa o Watchdog delay (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }
setupDisplay
// 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 cámco display.fillScreen (ST77XX_BLACK); display.setTextColor (ST77XX_WHITE); }
setupWiFi
// Conecta ao AP void setupWiFi () {WiFi.disconnect (); WiFi.mode (WIFI_STA); WiFi.begin (SSID, MẬT KHẨU); display.println ("Đang kết nối với" + Chuỗi (SSID)); // Enquanto não estiver conectado à đổi WiFi while (WiFi.status ()! = WL_CONNECTED) {delay (500); display.print ("."); } display.println (""); display.print ("Đã kết nối với"); display.println (SSID); }
kết nối với máy chủ
void connectToServer () {display.println ("Đang thử kết nối ổ cắm"); // Espera a conexão com o server while (! Socket.connect (HOST, PORT)) {display.print ("."); chậm trễ (500); } display.println (); display.println ("Đã kết nối!"); // Tempo máximo que o cliente deve demorar para responseer // antes de dizermos que a conexão foi perdida socket.setTimeout (TIMEOUT); }
IRAM_ATTR resetModule và 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, interrupção de borda timerAttachInterrupt (timer, & resetModule, true); // timer, tempo (us), repeattição timerAlarmWrite (timer, 10000000, true); timerAlarmEnable (hẹn giờ); // habilita a interrupção}
vòng
void loop () {timerWrite (timer, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // checa se Possui conexão com o server checkRSSI (); // verifyfica 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 server log (); // salva um log no cartão SD delay (1000); // espera um segundo}
kiểm tra kết nối
void checkConnection () {// Verifica a conexão com o AP if (WiFi.status ()! = WL_CONNECTED) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("Đã ngắt kết nối WiFi"); setupWiFi (); chậm trễ (1000); } // verifyfica a conexão do socket if (! socket.connected ()) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("Đã ngắt kết nối ổ cắm"); kết nối với máy chủ(); chậm trễ (3000); display.fillScreen (ST77XX_BLACK); }}
kiểm traRSSI
void checkRSSI () {// Verifica o RSSI rssi = WiFi. RSSI (); // Limpa o texto e mostra o RSSI no display clearText (); display.setCursor (0, 0); display.print ("RSSI:" + String (rssi)); // Se a quantidade de barras do gráfico passou do limite apagamos o registerro mais antigo if (rssiHistory.size () == (DISPLAY_WIDTH - 2 * PLOT_MARGIN) / 2) {rssiHistory.erase (rssiHistory.begin ()); } // Adiciona no final do histórico (mais neare) rssiHistory.push_back (rssi); }
âm mưu
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 - giá trị, giá trị, PLOT_COLOR); currentX + = 2;}}
sendToServer
void sendToServer () {// Se estiver 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 ("Đang gửi:" + đang gửi); socket.println (đang gửi); socket.print (Chuỗi (rssi)); tính ++; }}
readFromServer
void readFromServer () {// Espera até o server enviar algo ou desconectar while (socket.connected () &&! socket.available ()) {delay (100); } // Se tem algo paravenueber if (socket.available ()) {// Faz a leitura, remove o / n do final e mostra no display nothing = socket.readStringUntil ('\ n'); nhận được.remove (nhận được.length () - 1); display.println ("Đã nhận:" + đã nhận); }}
clearText và nhật ký
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 không có lần xóa cuối cùng nào File file = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("Không mở được tệp"); trở lại; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem Collectbida String data = String (millis ()) + ";" + Chuỗi (rssi) + ";" + nhận được; file.println (dữ liệu); file.close (); }
Bước 10: Tập tin
Tải xuống các tệp:
NS
Đề xuất:
Đo khoảng cách khoảng cách với cảm biến cử chỉ APDS9960: 6 bước
Đo khoảng cách bằng cảm biến cử chỉ APDS9960: Trong hướng dẫn này, chúng ta sẽ học cách đo khoảng cách bằng cảm biến cử chỉ APDS9960, arduino và Visuino. Hãy xem video
Ăng-ten bên ngoài cho ESP8266: 5 bước
Ăng-ten bên ngoài cho ESP8266: Đôi khi bạn cần một ăng-ten ngoài cho ESP8266. Ví dụ: bạn muốn cài đặt ESP vào hộp siêu tốc cho một số ứng dụng bên ngoài hoặc ứng dụng khác được cài đặt trong các trường hợp. Hoặc bạn chỉ cần một cường độ tín hiệu lớn hơn. Vì vậy, bạn cần cài đặt
Tăng khoảng cách hiệu quả trên bộ phát kích hoạt từ xa Flash 'ebay' với ăng ten: 6 bước
Tăng Khoảng cách Hiệu quả trên Bộ phát Kích hoạt Từ xa Flash 'ebay' Có Ăng-ten: Những người yêu thích máy ảnh có thể mua các phiên bản kích hoạt từ xa rẻ tiền cho các thiết bị flash ngoài, điều khiển các thiết bị flash kiểu 'studio' hoặc hot-shoe. Các bộ kích hoạt này bị ảnh hưởng bởi công suất máy phát thấp và do đó khoảng cách điều khiển hiệu quả nhỏ. Tháng này
Tạo ổ cứng ngoài từ CD / RW bên ngoài cũ: 5 bước
Tạo ổ cứng ngoài từ CD / RW bên ngoài cũ: Chuyển đổi khá dễ dàng từ cd / rw bên ngoài cũ sang ổ cứng ngoài hữu ích hơn. Nguồn cung cấp 1-bên ngoài cd / rw (tốt nhất là loại hình hộp hơn) 1 ổ cứng (phải khớp với đầu nối bên trong của hộp ổ đĩa, cần được định dạng / sysed) 1-sm
Ăng-ten Bluetooth bên ngoài để tăng phạm vi !: 4 bước
Ăng-ten Bluetooth bên ngoài để tăng phạm vi!: Tôi muốn nghe trên một số thiết bị bluetooth tại cửa hàng Starbucks địa phương của tôi! nhưng phạm vi ăng-ten trên hầu hết các dongle bluetooth quá ngắn. vì vậy tôi đã phải tăng phạm vi! Đây là hành trình hoành tráng của tôi để làm điều đó. Ý tưởng về tỷ lệ tuyệt vời này là từ trang web này