فهرست مطالب:
- مرحله 1: نصب AP با Wrover
- مرحله 2: مونتاژ STATION با 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 08:55
موضوع امروز مربوط به آزمایش از راه دور با ESP32 با آنتن خارجی است. بیایید امروز از دو ماژول استفاده کنیم: از Espressif و TTGO. بیایید سپس RSSI را بین این دو آنتن ESP32 بررسی کنیم ، یک نمودار از تاریخ ایجاد کنیم و یک گزارش از مقادیر را در یک فایل.csv بنویسیم.
سپس ESP32 Wrover را به عنوان AP و ESP32 TTGO را به عنوان ایستگاه داریم. من از یک آنتن که از TP-Link کمی بزرگتر و روتر دیگری که به آنتن 9dbm معروف است ، استفاده کردم. من هیچ تفاوتی بین این دو متوجه نشده ام.
سرانجام ، دو میکروکنترلر از طریق سوکت به هم متصل می شوند و با ارسال هر بسته اطلاعاتی ، یک نمودار با نوارهایی که نسبت dbm را نشان می دهند ، روی صفحه چاپ می کنیم.
مرحله 1: نصب AP با Wrover
مرحله 2: مونتاژ STATION با TTGO
مرحله 3: نتیجه
حداکثر فاصله با 2 برابر آنتن خارجی: 315 متر
حداکثر فاصله با آنتن خارجی و داخلی: 157 متر
مرحله 4: بایگانی LOG. CSV
من داده ها را روی یک کارت SD ، با داده ها در میلی ثانیه ، dbm و رشته بسته ثبت کردم.
مرحله 5: کتابخانه Adafruit GFX
در Arduino IDE ، به Sketch-> Include Library-> Manage Libraries بروید…
Adafruit GFX Library را نصب کنید
مرحله 6: کتابخانه Adafruit ST7735
در Arduino IDE ، به Sketch-> Include Library-> Manage Libraries بروید…
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 de timeout para conmarrarar conexão pedida #define TIMEOUT 2000 // Largura e altura do #define DISPLAY_WIDTH 160 #defura DISPLAY_HEIGHT 128 // تعریف cor، margem e tamanho do gráfico #تعریف PLOT_COLOR ST77XX_GREEN #تعریف PLOT_MARGIN 20 #تعریف PLOT_SIZE (DISPLAY_HEIGHT - 2*PLOT_MARGIN) // Arquivo de log no SD #define FILE_PATH "/
ما پین ها را در بین سایر متغیرها تعریف می کنیم
// پینوها #تعریف DISPLAY_DC 12 // A0 #تعریف DISPLAY_CS 13 // CS #تعریف DISPLAY_MOSI 14 // SDA #تعریف DISPLAY_CLK 27 // SCK #تعریف DISPLAY_RST 0 // Pino do SDCard Os pinos mosi، miso e sck são os nativos (23، 19 e 18 respectivamente) #تعریف SDCARD_CS 15 // Pixel onde or 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 (quaquer porta válida به منظور استفاده از مشتری یا استفاده از یک portma mesma) سرور WiFiServer (80) ؛ // Variável para armazenar o cliente (no caso o ESP32 em modo station) conectado WiFiClient client؛ // String que recebemos do cliente String دریافت؛ // RSSI enviado pelo cliente for este ESP32 long rssi = 0؛ // Faz o controle do temporizador (interrupção por tempo) hw_timer_t *timer = NULL؛ // Utilizado para guardar os ultimos std:: vector rssiHistory؛
برپایی
void setup () {Serial.begin (115200)؛ setupDisplay ()؛ // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!")؛ } // Cria a rede WiFi، inicializa or server و 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 و پیکربندی IPvoid setupWiFi () {display.println ("ایجاد 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 ، 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 clienteve deve demorar para responder // antes de dizermos que a conexão foi perdida client.setTimeout (TIMEOUT)؛ }
IRAM_ATTR resetModule و setWatchdog
// 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)؛ // تایمر ، سرعت (ما) ، repetição timerAlarmWrite (تایمر ، 10000000 ، درست) ؛ timerAlarmEnable (تایمر) ؛ // habilita a interrupção}
حلقه
void loop () {timerWrite (تایمر ، 0) ؛ // reseta o temporizador (alimenta o watchdog) checkConnection ()؛ // checa se possui conexão com o cliente readFromClient ()؛ // اما 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}
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 ()) {تاخیر (100)؛ } // Se chegou aqui e ainda estiver conectado é porque possui algo para receber do cliente if (client.connected ()) {دریافت = client.readStringUntil ('\ n')؛ // Lê o texto que o cliente enviou wergirt. حذف (دریافت شده. طول ()-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 no 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).شروع())؛ } // 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 ()) {ارسال پیام = دریافت + "OK"؛ client.println (ارسال) ؛ }}
طرح
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 - مقدار ، مقدار ، PLOT_COLOR) ؛ currentX += 2؛}}
clearText و log
void clearText () {// Limpa a comrea 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 dele final 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 data = String (millis ()) + "؛" + رشته (rssi) + "؛" + دریافت شد ؛ file.println (داده) ؛ file.close ()؛ }
مرحله 9: Station.ino
ما کتابخانه های لازم را وارد کرده و برخی پارامترها را تعریف کرده ایم.
#شامل #شامل #شامل #شامل #شامل #شامل #شامل // Nome da rede que nos conectaremos. Criado pelo AP #تعریف 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 consrar a conexão pedida #definine TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #تعریف DISPLAY_HEIGHT 128 // configuraçemes de cor، #تعریف 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 calculado رشته دریافت شد؛ // Mensagem de confirmação que o AP nos envia // Pixel onde or gráfico cameça horizontalmente int currentX = PLOT_MARGIN؛ // سوکت WiFi سرور WiFiClient؛ #تعریف DISPLAY_DC 12 // A0 #تعریف DISPLAY_CS 13 // CS #تعریف DISPLAY_MOSI 14 // SDA #تعریف DISPLAY_CLK 27 // SCK #تعریف DISPLAY_RST 0 // Pino do SDCard Os pinos mosi، miso e sck são os nativos (23، 19 e 18 respectivamente) #SDCARD_CS 15 را تعریف کنید // نمایش هدف اصلی نمایش Adafruit_ST7735 = Adafruit_ST7735 (DISPLAY_CS، DISPLAY_DC، DISPLAY_MOSI، DISPLAY_؛ hw_timer_t *تایمر = NULL ؛ // faz o controle do temporizador (interrupção por tempo) // Utilizado para guardar os ultimos std:: vector rssiHistory؛
برپایی
void setup () {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 ()؛ connectToServer ()؛ // 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 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) {تاخیر (500) ؛ display.print (".")؛ } display.println ("")؛ display.print ("متصل به") ؛ display.println (SSID) ؛ }
connectToServer
void connectToServer () {display.println ("تلاش برای اتصال سوکت") ؛ // 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 resetModule و setWatchdog
// 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)؛ // تایمر ، سرعت (ما) ، repetição timerAlarmWrite (تایمر ، 10000000 ، درست) ؛ timerAlarmEnable (تایمر) ؛ // habilita a interrupção}
حلقه
حلقه خالی () {timerWrite (تایمر ، 0) ؛ // reseta o temporizador (alimenta o watchdog) checkConnection ()؛ // checa se possui 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 log server ()؛ // salva um log no cartão SD delay (1000)؛ // espera um segundo}
checkConnection
void checkConnection () {// Verifica a conexão com o AP if (WiFi.status ()! = WL_CONNECTED) {display.fillScreen (ST77XX_BLACK) ؛ display.setCursor (0 ، 0) ؛ display.println ("وای فای قطع شده است")؛ setupWiFi ()؛ تاخیر (1000) ؛ } // verifica a conexão do socket if (! socket.connected ()) {display.fillScreen (ST77XX_BLACK) ؛ display.setCursor (0 ، 0) ؛ display.println ("سوکت قطع شده است")؛ connectToServer ()؛ تاخیر (3000) ؛ display.fillScreen (ST77XX_BLACK) ؛ }}
checkRSSI
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:" + رشته (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)؛ }
طرح
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 - مقدار ، مقدار ، 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 = "Hello" + String (count)؛ display.setCursor (0 ، 10) ؛ display.println ("ارسال:" + ارسال) ؛ socket.println (ارسال) ؛ socket.print (رشته (rssi)) ؛ شمارش ++ ؛ }}
readFromServer
void readFromServer () {// Espera até o server enviar algo or desconectar while (socket.connected () &&! socket.available ()) {تاخیر (100) ؛ } // Se tem algo para receber if (socket.available ()) {// Faz a leitura، o / n do the final e mostra هیچ نمایش دریافت نشده را حذف کنید = socket.readStringUntil ('\ n')؛ دریافت. حذف (دریافت شده. طول ()-1) ؛ display.println ("دریافت:" + دریافت)؛ }}
clearText و log
void clearText () {// Limpa a comrea 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 dele final 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 data = String (millis ()) + "؛" + رشته (rssi) + "؛" + دریافت شد ؛ file.println (داده) ؛ file.close ()؛ }
مرحله 10: فایل ها
دانلود فایلها:
من نه
توصیه شده:
آنتن داخلی و خارجی Bowtie: 5 مرحله
آنتن داخلی / بیرونی Bowtie Antenna: من همیشه شیفته آنتن استاندارد پاپیونی بودم و دریافتم که آنها ویژگی های خوبی دارند. بنابراین وقتی مدتی قبل در RadioShack بودم و 2 عدد از آنها را روی قفسه با قیمت 5 دلار دیدم ، نتوانستم خودم را نگه دارم و 2 عدد را به مجموعه خود اضافه کردم و 3 کردم
آنتن خارجی برای ESP8266: 5 مرحله
آنتن خارجی برای ESP8266: گاهی اوقات شما به یک آنتن خارجی برای ESP8266 نیاز دارید. به عنوان مثال می خواهید ESP را در یک جعبه فلزی برای برخی از برنامه های خارجی یا سایر برنامه ها نصب کنید که در موارد نصب شده است. یا فقط به قدرت سیگنال بیشتری نیاز دارید. بنابراین باید نصب کنید
یک هارد دیسک خارجی از CD/RW خارجی خارجی تهیه کنید: 5 مرحله
ایجاد یک هارد دیسک خارجی از CD/RW خارجی خارجی: تبدیل مستقیم یک cd/rw خارجی قدیمی به یک هارد اکسترنال مفیدتر. لوازم 1-cd/rw خارجی (ترجیحا نوع جعبه ای تر) 1 هارد دیسک (باید با اتصال داخلی قاب درایو مطابقت داشته باشد ، باید قالب بندی شود)
Wifi Signal Strainer (WokFi) مسافت طولانی: 3 مرحله (همراه با تصاویر)
Wifi Signal Strainer (WokFi) مسافت طولانی: در این آموزش من یک WiFi Thumbdrive معمولی را به یک وای فای تقویت کننده تبدیل می کنم! 'صافی سهموی آشپزی آسیایی (پیراشکی) کاندیدای مناسبی برای این پروژه است. من توانستم 20 دسترسی بیشتر برای نقاط شهر و اتصال به شبکه جهانی
مودم رادیویی Ricochet برای برداشتن آنتن خارجی: 8 مرحله
مودم رادیویی Ricochet برای استفاده از آنتن خارجی: مودم های Ricochet محصول یک مدل تجاری قبل از زمان خود هستند ، فناوری فوق العاده ای با برچسب قیمت شگفت آور کم هستند. آنها دقیقاً مانند مودم های معمولی عمل می کنند ، اما به جای خط تلفن ، از لایه RF استفاده می کنند. سرور دسترسی شماره گیری خود را بسازید ، یک