תוכן עניינים:

ESP32 עם אנטנה חיצונית למרחקים ארוכים: 10 שלבים
ESP32 עם אנטנה חיצונית למרחקים ארוכים: 10 שלבים

וִידֵאוֹ: ESP32 עם אנטנה חיצונית למרחקים ארוכים: 10 שלבים

וִידֵאוֹ: ESP32 עם אנטנה חיצונית למרחקים ארוכים: 10 שלבים
וִידֵאוֹ: LoRa signal strength check, with and without antenna. #lorawan #arduino #esp32 #syncaiiss 2024, יולי
Anonim
Image
Image
הרכבת ה- AP עם Wrover
הרכבת ה- AP עם Wrover

הנושא של היום נוגע לבדיקת מרחק עם ESP32 עם אנטנה חיצונית. בואו נשתמש היום בשני מודולים: מ- Espressif ו- TTGO. בואו נבדוק את ה- RSSI בין שתי אנטנות ESP32 אלה, ניצור גרף מההיסטוריה ונכתוב יומן ערכים בקובץ.csv.

לאחר מכן יש לנו את ה- ESP32 Wrover כ- AP, ואת ה- ESP32 של TTGO כתחנה. השתמשתי באנטנה שלקחתי מ- TP-Link מעט גדול יותר ונתב אחר המכונה אנטנה 9dbm. לא שמתי לב להבדל בין השניים.

לבסוף, שני בקרי המיקרו מתחברים באמצעות שקע, ובכל שליחת מנות נתונים אנו מדפיסים על גבי תצוגה גרף עם הסורגים המציינים את היחס בין dbm.

שלב 1: הרכבת ה- AP באמצעות Wrover

שלב 2: הרכבה של STATION עם TTGO

הרכבה של STATION עם TTGO
הרכבה של STATION עם TTGO

שלב 3: תוצאות

תוֹצָאָה
תוֹצָאָה
תוֹצָאָה
תוֹצָאָה
תוֹצָאָה
תוֹצָאָה

מרחק מרבי עם 2x אנטנות חיצוניות: 315 מטר

מרחק מרבי עם אנטנה חיצונית ופנימית: 157 מטר

שלב 4: העבר את LOG. CSV לארכיון

ארכיון LOG. CSV
ארכיון LOG. CSV
ארכיון LOG. CSV
ארכיון LOG. CSV

רשמתי את הנתונים בכרטיס SD, עם נתונים במילי, dbm ומחרוזת החבילה.

שלב 5: ספריית GFX של Adafruit

ספריית GFX של Adafruit
ספריית GFX של Adafruit

ב- IDE של Arduino, עבור אל סקיצה-> כלול ספרייה-> נהל ספריות …

התקן את ספריית AdFruit GFX

שלב 6: ספריית Adafruit ST7735

ספריית Adafruit ST7735
ספריית Adafruit ST7735

ב- IDE של Arduino, עבור אל סקיצה-> כלול ספרייה-> נהל ספריות …

התקן את Adafruit ST7735

שלב 7: הגדרת הכרטיסים

הגדרת הקלפים
הגדרת הקלפים
הגדרת הקלפים
הגדרת הקלפים

עקוב אחר הבדלים:

שלב 8: AP.ino

כללנו את הספריות הדרושות והגדרנו כמה פרמטרים.

#include #include #include #include #include #include // Rede que o ESP criará. No Station deve ser igual #define SSID "RSSI_Test" #define PASSWORD "87654321" // Tempo of timeout for a conexão pedida #define TIMEOUT 2000 // Largura e altura to display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHTes // // 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 #define FILE_PATH "/log.sv

אנו מגדירים את הסיכות, בין משתנים אחרים

// פינו אכן מציג #מגדירים 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; // Objeto responsável pelo display Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST); // Criamos um server (שרת התכונה 'server server contanto que o cliente use a mesma porta') שרת WiFiServer (80); // Variável para armazenar o cliente (ללא caso או תחנת ESP32 em modo) conclado WiFiClient client; // String que recebemos do cliente String שהתקבל; // RSSI enviado pelo cliente para este ESP32 long rssi = 0; // Faz o control do temporizador (interrupção por tempo) hw_timer_t *טיימר = NULL; // Utilizado para guardar os ultimos std:: vector rssiHistory;

להכין

הגדרת חלל () {Serial.begin (115200); setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Cria a WiFi WiFi, רשמי שרת ואספקה או התקנת WIFi (); server.begin (); waitForClient (); // Espera 3 segundos, limpa and tela e inicializa o עיכוב של כלב השמירה (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }

הגדר WiFi

// Cria um Point Access e configura או IPvoid setupWiFi () {display.println ("יצירת softAP" + מחרוזת (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, PASSWORD); display.println ("softAP" + מחרוזת (SSID) + "נוצר!"); }

תצוגת הגדרות

// 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 a tela de preto display.fillScreen (ST77XX_BLACK); }

waitForClient

void waitForClient () {display.println ("מחכה ללקוח"); // Aguarda o cliente conectar while (! (Client = server.available ())) {display.print ("."); עיכוב (500); } display.println ("לקוח מחובר"); // Tempo máximo que o cliente deve demorar para responder // antes de dizermos que a conexão foi perdida client.setTimeout (TIMEOUT); }

IRAM_ATTR אפס מודול והתקנה Watchdog

// função que o temporizador irá chamar, para resiniariar of ESP32void IRAM_ATTR resetModule () {ets_printf ("(כלב שמירה) מחזיר / 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 (טיימר, & resetModule, true); // טיימר, קצב (us), repetição timerAlarmWrite (טיימר, 10000000, נכון); timerAlarmEnable (טיימר); // habilita a interrupção}

לוּלָאָה

לולאת חלל () {timerWrite (טיימר, 0); // reseta o temporizador (alimenta o כלב שמירה) checkConnection (); // checa se possui conexão com o cliente readFromClient (); // lê os dados do cliente sendToClient (); // envia confirmmação para o cliente plot (); // mostra o gráfico de histórico de rssi log (); // salva um log no cartão SD}

checkConnection

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 ("הלקוח מנותק"); 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 receber do cliente if (client.connected ()) {received = client.readStringUntil ('\ n'); // Lê o texto que o cliente enviou received.remove (received.length ()-1); // הסר o / n לעשות rssi סופי = client.parseInt (); // Lê o rssi que o cliente enviou clearText (); // Limpa o texto display.setCursor (0, 0); // הזז את הסמן עבור טקסט עבור תצוגה display.println ("RSSI:" + מחרוזת (rssi)); // Mostra o RSSI ללא תצוגה display.println ("התקבל:" + התקבל); // Mostra a mensagem recebida do cliente // See 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.התחל()); } // Adiciona no final do histórico (mais recente) rssiHistory.push_back (rssi); }}

sendToClient

void sendToClient () {// Se o cliente estiver conectado enviamos de volta a mensagem com um OK if (client.connected ()) {String sending = received + "OK"; client.println (שליחה); }}

עלילה

עלילת חלל () {// 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 - ערך, ערך, PLOT_COLOR); currentX += 2;}}

clearText ו- log

void clearText () {// Lima a area com or texto da mensagem vinda do cliente display.fillRect (0, 0, DISPLAY_WIDTH, 2*PLOT_MARGIN, ST77XX_BLACK); } void log () {// Abrimos o arquivo para escrevermos no final file file file = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("פתיחת הקובץ נכשלה"); לַחֲזוֹר; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida נתוני מחרוזת = String (millis ()) + ";" + מחרוזת (rssi) + ";" + קיבל; file.println (נתונים); file.close (); }

שלב 9: Station.ino

כללנו את הספריות הדרושות והגדרנו כמה פרמטרים.

#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 for a consexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // Configurações de cor, margem e taman #הגדר PLOT_COLOR ST77XX_GREEN #הגדר PLOT_MARGIN 20 #הגדר PLOT_SIZE (DISPLAY_HEIGHT - 2*PLOT_MARGIN) // Arquivo de log no SD #define FILE_PATH "/log.csv"

אנו מגדירים את ההגדרות הכוללות את התצוגה ואת כרטיס ה- SD.

ספירה ארוכה = 0; // Contador de mensagens enviadaslong rssi = 0; // מחרוזת חישוב RSSI התקבלה; // Mensagem de confirmmação que o AP nos envia // Pixel onde o gráfico começa horizontalmente int currentX = PLOT_MARGIN; // שימושי עבור שרת WiFiClient שקע; #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ável pelo display Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK,;) hw_timer_t *טיימר = NULL; // faz o control do temporizador (interrupção por tempo) // Utilizado para guardar os ultimos std:: vector rssiHistory;

להכין

הגדרת חלל () {setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Conecta אין נקודת גישה criado pelo outro ESP32 e conecta ao setup serverWiFi (); התחבר לשרת(); // Espera 3 segundos, limpa and tela e inicializa o עיכוב של כלב השמירה (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 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 ("מתחבר ל-" + מחרוזת (SSID)); // Enquanto não estiver conectado à rede WiFi while (WiFi.status ()! = WL_CONNECTED) {delay (500); display.print ("."); } display.println (""); display.print ("מחובר ל"); display.println (SSID); }

התחבר לשרת

void connectToServer () {display.println ("מנסה חיבור שקע"); // Espera comexão com o server while (! Socket.connect (HOST, PORT)) {display.print ("."); עיכוב (500); } display.println (); display.println ("מחובר!"); // Tempo máximo que o cliente deve demorar para responder // antes de dizermos que a conexão foi perdida socket.setTimeout (TIMEOUT); }

IRAM_ATTR אפס מודול והתקנה Watchdog

// função que o temporizador irá chamar, para resiniariar of ESP32void IRAM_ATTR resetModule () {ets_printf ("(כלב שמירה) מחזיר / 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 (טיימר, & resetModule, true); // טיימר, קצב (us), repetição timerAlarmWrite (טיימר, 10000000, נכון); timerAlarmEnable (טיימר); // habilita a interrupção}

לוּלָאָה

לולאת חלל () {timerWrite (טיימר, 0); // reseta o temporizador (alimenta o כלב שמירה) checkConnection (); // checa se possui conexão com o server checkRSSI (); // verifica o rssi עלילה (); // mostra o gráfico de histórico de rssi sendToServer (); // envia uma mensagem com um contador עבור השרת readFromServer (); // espera a confirmmação do log server (); // salva um log no cartão SD delay (1000); // espera um segundo}

checkConnection

void checkConnection () {// Verifica a conexão com או AP if (WiFi.status ()! = WL_CONNECTED) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("WiFi מנותק"); setupWiFi (); עיכוב (1000); } // verifica a conexão do socket if (! socket.connected ()) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("שקע מנותק"); התחבר לשרת(); עיכוב (3000); display.fillScreen (ST77XX_BLACK); }}

checkRSSI

check void RSSI () {// Verifica o RSSI rssi = WiFi. RSSI (); // Limpa o texto e mostra o RSSI ללא תצוגה clearText (); display.setCursor (0, 0); display.print ("RSSI:" + מחרוזת (rssi)); // עיין במאפיינים של הגבלה של אפגמוס או ריסטרו מאיס אנטיגו אם (rssiHistory.size () == (DISPLAY_WIDTH - 2*PLOT_MARGIN)/2) {rssiHistory.erase (rssiHistory.begin ()); } // Adiciona no final do histórico (mais recente) rssiHistory.push_back (rssi); }

עלילה

עלילת חלל () {// 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 - ערך, ערך, 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 sending = "שלום" + מחרוזת (ספירה); display.setCursor (0, 10); display.println ("שליחה:" + שליחה); socket.println (שליחה); socket.print (מחרוזת (rssi)); ספירה ++; }}

readFromServer

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, להסיר או לעשות את התצוגה האחרונה = socket.readStringUntil ('\ n'); received.remove (received.length ()-1); display.println ("התקבל:" + התקבל); }}

clearText ו- log

void clearText () {// Lima a area com or texto da mensagem vinda do cliente display.fillRect (0, 0, DISPLAY_WIDTH, 2*PLOT_MARGIN, ST77XX_BLACK); } void log () {// Abrimos o arquivo para escrevermos no final file file file = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("פתיחת הקובץ נכשלה"); לַחֲזוֹר; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida נתוני מחרוזת = String (millis ()) + ";" + מחרוזת (rssi) + ";" + קיבל; file.println (נתונים); file.close (); }

שלב 10: קבצים

הורד את הקבצים:

PDF

INO

מוּמלָץ: