جدول المحتويات:
- الخطوة 1: تركيب نقطة الوصول باستخدام Wrover
- الخطوة 2: تجميع المحطة مع TTGO
- الخطوة 3: النتيجة
- الخطوة 4: أرشفة LOG.CSV
- الخطوة 5: مكتبة Adafruit GFX
- الخطوة 6: مكتبة Adafruit ST7735
- الخطوة 7: تكوين البطاقات
- الخطوة 8: AP.ino
- الخطوة 9: Station.ino
- الخطوة 10: الملفات
فيديو: ESP32 مع هوائي خارجي لمسافات طويلة: 10 خطوات
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-01-30 07:40
موضوع اليوم يتعلق باختبار المسافة مع 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: الملفات
قم بتنزيل الملفات:
بي دي إف
انا لا
موصى به:
مسجل بيانات GPS يمكنك صنعه بنفسك في مسار القيادة / المشي لمسافات طويلة: 11 خطوة (بالصور)
DIY Data Logger for You Next Drive / Hiking Trail: هذا هو مسجل بيانات GPS الذي يمكنك استخدامه لأغراض متعددة ، على سبيل المثال إذا كنت تريد تسجيل محرك الأقراص الطويل الذي قضيته خلال عطلة نهاية الأسبوع للتحقق من ألوان الخريف. أو لديك مسار مفضل تزوره خلال الخريف كل عام وأنت
دائرة نظام النقل لمسافات طويلة: 6 خطوات
دائرة نظام النقل لمسافات طويلة: سنتحدث اليوم في هذه المقالة عن كيفية إنشاء دائرة أساسية لنظام النقل لمسافات طويلة. على هذا المنوال ، اسمحوا لي أن أقدم لكم تصويرًا موجزًا للدائرة. كيف يعمل هذا بشكل عام وكيف أتحدث إلى الأشياء لك
هوائي ربطة داخلي / خارجي: 5 خطوات
هوائي بووتي داخلي / خارجي: لطالما كنت مفتونًا بهوائي ربطة العنق القياسي ، ووجدت أن له خصائص جيدة. لذلك عندما كنت في RadioShack لفترة من الوقت ورأيت 2 منهم على الرف مقابل 5 دولارات لكل منهما ، لم أستطع مساعدة نفسي وأضفت 2 إلى مجموعتي مما جعل 3
هوائي خارجي لـ ESP8266: 5 خطوات
هوائي خارجي لـ ESP8266: تحتاج أحيانًا إلى هوائي خارجي لـ ESP8266 ، على سبيل المثال ، تريد تثبيت ESP في صندوق معدني لبعض التطبيقات الخارجية أو التطبيقات الأخرى التي يتم تثبيتها في حالات. أو تحتاج فقط إلى مزيد من قوة الإشارة. لذلك تحتاج إلى تثبيت
قم بعمل قرص صلب خارجي من قرص مضغوط خارجي قديم / RW: 5 خطوات
قم بعمل محرك أقراص ثابت خارجي من قرص مضغوط خارجي قديم / RW: تحويل مباشر جدًا لقرص CD / rw خارجي قديم إلى محرك أقراص ثابت خارجي أكثر فائدة. المستلزمات: 1-cd / rw خارجي (يفضل النوع الأكثر صندوقًا) محرك أقراص صلبة واحد (يجب أن يتطابق مع الموصل الداخلي لحافظة محرك الأقراص ، ويلزم تنسيقه / ضبطه) 1-sm