Mục lục:

ESP32 với ăng ten khoảng cách dài bên ngoài: 10 bước
ESP32 với ăng ten khoảng cách dài bên ngoài: 10 bước

Video: ESP32 với ăng ten khoảng cách dài bên ngoài: 10 bước

Video: ESP32 với ăng ten khoảng cách dài bên ngoài: 10 bước
Video: [micropython với ESP32] hướng dẫn sử dụng cảm biến khoảng cách HC-SR04 bằng micropython ESP32 2024, Tháng bảy
Anonim
Image
Image
Gắn AP với Wrover
Gắn AP với Wrover

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

Lắp ráp TRẠM VỚI TTGO
Lắp ráp TRẠM VỚI TTGO

Bước 3: KẾT QUẢ

KẾT QUẢ
KẾT QUẢ
KẾT QUẢ
KẾT QUẢ
KẾT QUẢ
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

Lưu trữ LOG. CSV
Lưu trữ LOG. CSV
Lưu trữ LOG. CSV
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

Thư viện GFX Adafruit
Thư viện GFX Adafruit

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

Thư viện Adafruit ST7735
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ẻ

Cấu hình thẻ
Cấu hình thẻ
Cấu hình thẻ
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:

PDF

NS

Đề xuất: