תוכן עניינים:
- שלב 1: הרכבת ה- AP באמצעות Wrover
- שלב 2: הרכבה של STATION עם TTGO
- שלב 3: תוצאות
- שלב 4: העבר את LOG.CSV לארכיון
- שלב 5: ספריית GFX של Adafruit
- שלב 6: ספריית Adafruit ST7735
- שלב 7: הגדרת הכרטיסים
- שלב 8: AP.ino
- שלב 9: Station.ino
- שלב 10: קבצים
וִידֵאוֹ: ESP32 עם אנטנה חיצונית למרחקים ארוכים: 10 שלבים
2024 מְחַבֵּר: John Day | [email protected]. שונה לאחרונה: 2024-01-30 09:15
הנושא של היום נוגע לבדיקת מרחק עם ESP32 עם אנטנה חיצונית. בואו נשתמש היום בשני מודולים: מ- Espressif ו- TTGO. בואו נבדוק את ה- RSSI בין שתי אנטנות ESP32 אלה, ניצור גרף מההיסטוריה ונכתוב יומן ערכים בקובץ.csv.
לאחר מכן יש לנו את ה- ESP32 Wrover כ- AP, ואת ה- ESP32 של TTGO כתחנה. השתמשתי באנטנה שלקחתי מ- TP-Link מעט גדול יותר ונתב אחר המכונה אנטנה 9dbm. לא שמתי לב להבדל בין השניים.
לבסוף, שני בקרי המיקרו מתחברים באמצעות שקע, ובכל שליחת מנות נתונים אנו מדפיסים על גבי תצוגה גרף עם הסורגים המציינים את היחס בין dbm.
שלב 1: הרכבת ה- AP באמצעות Wrover
שלב 2: הרכבה של STATION עם TTGO
שלב 3: תוצאות
מרחק מרבי עם 2x אנטנות חיצוניות: 315 מטר
מרחק מרבי עם אנטנה חיצונית ופנימית: 157 מטר
שלב 4: העבר את LOG. CSV לארכיון
רשמתי את הנתונים בכרטיס SD, עם נתונים במילי, dbm ומחרוזת החבילה.
שלב 5: ספריית GFX של Adafruit
ב- IDE של Arduino, עבור אל סקיצה-> כלול ספרייה-> נהל ספריות …
התקן את ספריית AdFruit GFX
שלב 6: ספריית 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: קבצים
הורד את הקבצים:
INO
מוּמלָץ:
תחנת מזג אוויר HC-12 למרחקים ארוכים וחיישני DHT: 9 שלבים
תחנת מזג אוויר HC-12 למרחקים ארוכי טווח וחיישני DHT: במדריך זה נלמד כיצד ליצור תחנת מזג אוויר למרחקים ארוכים באמצעות שני חיישני dht, מודולים HC12 ותצוגת LCD I2C. צפו בסרטון
אורות החברים הכי טובים למרחקים ארוכים: 4 שלבים (עם תמונות)
DIY אורות החברים הטובים ביותר למרחקים ארוכים: הכנתי אורות מסונכרנים למרחקים ארוכים המכונים " החבר הטוב ביותר " מנורות. זה רק אומר שהם נשמרים מסונכרנים עם הצבע הנוכחי של המנורה השנייה. אז אם היית מחליף מנורה אחת לירוק, זמן קצר לאחר שהמנורה השנייה הייתה הופכת לגריסה
מעגל מערכת הילוכים למרחקים ארוכים: 6 שלבים
מעגל מערכת הילוכים למרחקים ארוכים: היום במאמר זה נדבר על איך לייצר מעגל בסיסי של מערכת הילוכים למרחקים ארוכים. בשורות אלה, הרשה לי לתת לך תיאור תמציתי של המעגל. כמה באופן כללי זה מתפקד ואיך אני מדבר אל הדברים אליך
מסנן אותות Wifi (WokFi) למרחקים ארוכים: 3 שלבים (עם תמונות)
מסננת Wifi Signal (WokFi) למרחקים ארוכים: במדריך זה אני עושה כונן אגודל WiFi משותף למאריך wifi מדושן! 'מסננת הבישול האסיאתית הפראבולית (כופתה) היא המועמדת המושלמת לפרויקט זה. הצלחתי לאסוף עוד 20 גישה נקודות בעיר ולהתחבר לרשת
Huawei E160X (Vodafone K3565) אנטנה חיצונית / מעטפת חיצונית 3G: 13 שלבים (עם תמונות)
Huawei E160X (Vodafone K3565) אנטנת חיצוני / מעטפת חיצונית 3G: Dongle K3565 ש- Vodafone מספקת עם התשלום שלהם תוך כדי תכנון הוא מצוין, אך באופן מתסכל מחבר האנטנה החיצוני מוסתר מתחת למעטפת. הנה איך לפרוץ את המעטפת כדי להגיע למחבר הנסתר הזה - ולמי שרוצה