فهرست مطالب:

ESP32 با آنتن مسافت طولانی خارجی: 10 مرحله
ESP32 با آنتن مسافت طولانی خارجی: 10 مرحله

تصویری: ESP32 با آنتن مسافت طولانی خارجی: 10 مرحله

تصویری: ESP32 با آنتن مسافت طولانی خارجی: 10 مرحله
تصویری: Introduction to M5Stack Core2 ESP32 2" Display Development Module -Robojax 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: نتیجه

نتیجه
نتیجه
نتیجه
نتیجه
نتیجه
نتیجه

حداکثر فاصله با 2 برابر آنتن خارجی: 315 متر

حداکثر فاصله با آنتن خارجی و داخلی: 157 متر

مرحله 4: بایگانی LOG. CSV

بایگانی LOG. CSV
بایگانی LOG. CSV
بایگانی LOG. CSV
بایگانی LOG. CSV

من داده ها را روی یک کارت SD ، با داده ها در میلی ثانیه ، dbm و رشته بسته ثبت کردم.

مرحله 5: کتابخانه Adafruit GFX

کتابخانه Adafruit GFX
کتابخانه Adafruit GFX

در Arduino IDE ، به Sketch-> Include Library-> Manage Libraries بروید…

Adafruit GFX Library را نصب کنید

مرحله 6: کتابخانه Adafruit ST7735

کتابخانه Adafruit ST7735
کتابخانه 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: فایل ها

دانلود فایلها:

PDF

من نه

توصیه شده: