جدول المحتويات:
2025 مؤلف: John Day | [email protected]. آخر تعديل: 2025-01-13 06:56
موضوع اليوم يتعلق باختبار المسافة مع ESP32 مع هوائي خارجي. دعنا نستخدم وحدتين اليوم: من Espressif و TTGO. دعنا بعد ذلك نتحقق من RSSI بين هذين الهوائيين ESP32 ، وننشئ رسمًا بيانيًا من المحفوظات ، ونكتب سجلًا للقيم في ملف.csv.
لدينا بعد ذلك ESP32 Wrover كـ AP ، و ESP32 لـ TTGO كمحطة. لقد استخدمت هوائيًا أخذته من TP-Link أكبر قليلاً وجهاز توجيه آخر معروف باسم هوائي 9dbm. لم ألحظ أي فرق بين الاثنين.
أخيرًا ، يتصل اثنان من المتحكمات الدقيقة عبر المقبس ، ومع كل إرسال لحزم البيانات ، نقوم بطباعة رسم بياني على الشاشة مع الأشرطة التي تشير إلى نسبة dbm.
الخطوة 1: تركيب نقطة الوصول باستخدام Wrover
الخطوة 2: تجميع المحطة مع TTGO
الخطوة 3: النتيجة
المسافة القصوى مع 2x الهوائيات الخارجية: 315 متر
المسافة القصوى مع الهوائي الخارجي والداخلي: 157 متر
الخطوة 4: أرشفة LOG. CSV
لقد سجلت البيانات على بطاقة SD ، مع البيانات بالمللي ، ديسيبل ، وسلسلة الحزمة.
الخطوة 5: مكتبة Adafruit GFX
في Arduino IDE ، انتقل إلى Sketch-> Include Library-> Manage Libraries…
قم بتثبيت مكتبة Adafruit GFX
الخطوة 6: مكتبة Adafruit ST7735
في Arduino IDE ، انتقل إلى Sketch-> Include Library-> Manage Libraries…
قم بتثبيت Adafruit ST7735
الخطوة 7: تكوين البطاقات
ترقبوا الاختلافات:
الخطوة 8: AP.ino
لقد قمنا بتضمين المكتبات الضرورية وحددنا بعض المعلمات.
# تضمين # تضمين # تضمين # تضمين # تضمين # تضمين // Rede que o ESP criará. No Station deve ser igual #define SSID "RSSI_Test" #define PASSWORD "87654321" // Tempo de timeout para allowar a conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 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"
نحدد الدبابيس ، من بين المتغيرات الأخرى
// Pinos do display # حدد 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çaorizontalmente 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 (Qualquer porta válida يخدم contanto que o cliente يستخدم mesma porta) خادم WiFiServer (80) ؛ // Variável para armazenar o cliente (لا يوجد caso o ESP32 em modo station) conectado WiFiClient Client ؛ // String que recebemos do cliente String المستلمة ؛ // RSSI enviado pelo cliente para este ESP32 long rssi = 0 ؛ // Faz oControl do temporizador (interrupção por tempo) hw_timer_t * timer = 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 rede 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 () ، }
إعداد WiFi
// Cria um Access Point e configura o IPvoid setupWiFi () {display.println ("Creating softAP" + String (SSID)) ؛ WiFi.disconnect () ؛ WiFi.mode (WIFI_AP) ؛ WiFi.softAPConfig (عنوان IP (192 ، 168 ، 0 ، 1) ، IPAddress (192 ، 168 ، 0 ، 1) ، IPAddress (255 ، 255 ، 255 ، 0)) ؛ WiFi.softAP (SSID ، كلمة المرور) ؛ display.println ("softAP" + String (SSID) + "تم إنشاؤه!") ؛ }
عرض الإعداد
// Incializa o display ، muda a orientação e limpa a telavoid setupDisplay () {// Inicializa o display.initR (INITR_BLACKTAB) ؛ // Rotaciona o conteúdo mostrado display.setRotation (3) ؛ // Pinta a tela de preto display.fillScreen (ST77XX_BLACK) ؛ }
انتظر العميل
void waitForClient () {display.println ("Waiting for client") ؛ // 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 الوحدة والإعداد
// função que o temporizador irá chamar، para reiniciar o ESP32void IRAM_ATTR resetModule () {ets_printf ("(watchdog) reiniciar / n")؛ esp_restart_noos () ، // renicia 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)، repetição timerAlarmWrite (timer، 10000000، true) ؛ timerAlarmEnable (مؤقت) ؛ // habilita a interrupção}
حلقة
حلقة باطلة () {timerWrite (مؤقت ، 0) ؛ // reseta o temporizador (alimenta o watchdog) checkConnection () ؛ // checa se prosui 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}
تفقد الإتصال
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 () باطل {// Espera até o cliente enviar algo ou desconectar while (client.connected () &&! client.available ()) {delay (100)؛ } // Se chegou aqui e ainda estiver conectado é porque likui algo para Receber do cliente if (client.connected ()) {تلقي = client.readStringUntil ('\ n')؛ // Lê o texto que o cliente enviouived.remove (Received.length () - 1) ؛ // إزالة o / n do final rssi = client.parseInt () ؛ // Lê o rssi que o cliente enviou clearText () ؛ // Limpa o texto display.setCursor (0 ، 0) ؛ // حرك المؤشر قم بعمل النص للفقرة o começo قم بعرض display.println ("RSSI:" + String (rssi)) ؛ // Mostra o RSSI بدون عرض display.println ("مستلم:" + مستلم) ؛ // Mostra a mensagem recebida do cliente // Se 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.erase (rssiHistory.erase (rssiHistory.erase.يبدأ())؛ } // Adiciona no final do histórico (mais recente) rssiHistory.push_back (rssi) ؛ }}
SendToClient
باطل sendToClient () {// Se o cliente estiver conectado enviamos de volta a mensagem com um OK if (client.connected ()) {String send = Receiver + "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 - value، value، PLOT_COLOR)؛ currentX + = 2؛}}
clearText وسجل
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 no final dele File file = SD.open (FILE_PATH، FILE_APPEND) ؛ // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! file) {Serial.println ("Failed to open file")؛ إرجاع؛ } // Gravamos uma linha com o tempo desde o boot، o rssi atual e a mensagem recebida String data = String (millis ()) + "؛" + سلسلة (rssi) + "؛" + تلقى ؛ file.println (بيانات) ؛ file.close () ؛ }
الخطوة 9: Station.ino
لقد قمنا بتضمين المكتبات الضرورية وحددنا بعض المعلمات.
# تضمين # تضمين # تضمين # تضمين # تضمين # تضمين // 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 para allowar 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 #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"
نحدد الإعدادات التي تتضمن العرض وبطاقة SD.
عدد طويل = 0 ؛ // Contador de mensagens enviadaslong rssi = 0 ؛ // تسلم RSSI calculado String ؛ // Mensagem de Confirmação que o AP nos envia // Pixel onde o gráfico começaorizontalmente 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_CRST) ؛ hw_timer_t * timer = NULL ؛ // faz oControl 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 no access point criado pelo outro ESP32 e conecta ao server setupWiFi ()؛ اتصل بالخادم()؛ // Espera 3 segundos، limpa a tela e inicializa o Watchdog delay (3000) ؛ display.fillScreen (ST77XX_BLACK) ، display.setCursor (0، 0)؛ setupWatchdog () ، }
الإعداد
// Incializa o display ، muda a orientação e limpa a telavoid setupDisplay () {// Inicializa o 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 ، كلمة المرور) ؛ display.println ("Connecting to" + String (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 ("trying socket connection") ؛ // Espera a conexã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 الوحدة والإعداد
// função que o temporizador irá chamar، para reiniciar o ESP32void IRAM_ATTR resetModule () {ets_printf ("(watchdog) reiniciar / n")؛ esp_restart_noos () ، // renicia 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)، repetição timerAlarmWrite (timer، 10000000، true) ؛ timerAlarmEnable (مؤقت) ؛ // habilita a interrupção}
حلقة
حلقة باطلة () {timerWrite (مؤقت ، 0) ؛ // reseta o temporizador (alimenta o watchdog) checkConnection () ؛ // checa se prosui 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 server log () ؛ // salva um log no cartão SD delay (1000) ؛ // espera um segundo}
تفقد الإتصال
void checkConnection () {// Verifica a conexão com o 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
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 registro mais antigo if (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 - value، value، 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 ("إرسال:" + إرسال) ؛ socket.println (إرسال) ؛ socket.print (سلسلة (rssi)) ؛ العد ++ ؛ }}
readFromServer
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، remove o / n do final e mostra no display Received = socket.readStringUntil ('\ n')؛ تم استلامه (تم استلامه الطول () - 1) ؛ display.println ("مستلم:" + مستلم) ؛ }}
نص واضح وسجل
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 no final dele File file = SD.open (FILE_PATH، FILE_APPEND) ؛ // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! file) {Serial.println ("Failed to open file")؛ إرجاع؛ } // Gravamos uma linha com o tempo desde o boot، o rssi atual e a mensagem recebida String data = String (millis ()) + "؛" + سلسلة (rssi) + "؛" + تلقى ؛ file.println (بيانات) ؛ file.close () ؛ }
الخطوة 10: الملفات
قم بتنزيل الملفات:
بي دي إف
انا لا