ዝርዝር ሁኔታ:

ESP32 ከውጭ ረጅም ርቀት አንቴና ጋር - 10 ደረጃዎች
ESP32 ከውጭ ረጅም ርቀት አንቴና ጋር - 10 ደረጃዎች

ቪዲዮ: ESP32 ከውጭ ረጅም ርቀት አንቴና ጋር - 10 ደረጃዎች

ቪዲዮ: ESP32 ከውጭ ረጅም ርቀት አንቴና ጋር - 10 ደረጃዎች
ቪዲዮ: ESP32 Tutorial 38 - Controling RGB LED from your mobile phone | SunFounder's ESP32 IoT Learnig kit 2024, ሀምሌ
Anonim
Image
Image
AP ን ከ Wrover ጋር መጫን
AP ን ከ Wrover ጋር መጫን

የዛሬው ርዕስ የርቀት ሙከራን ከ ESP32 ጋር ከውጭ አንቴና ጋር ይመለከታል። ዛሬ ሁለት ሞጁሎችን እንጠቀም - ከኤስፕሬሲፍ እና ከ TTGO። ከዚያ በእነዚህ ሁለት የ ESP32 አንቴናዎች መካከል RSSI ን እንፈትሽ ፣ ከታሪክ ግራፍ አምጣ እና በ.csv ፋይል ውስጥ የእሴቶችን ምዝግብ እንፃፍ።

ከዚያ ESP32 Wrover እንደ AP ፣ እና የ TTGO ESP32 እንደ ጣቢያ አለን። እኔ በትንሹ ከትልቁ TP-Link እና 9dbm አንቴና በመባል ከሚታወቅ ሌላ ራውተር የወሰድኩትን አንቴና ተጠቅሜያለሁ። በሁለቱ መካከል ምንም ልዩነት አላስተዋልኩም።

በመጨረሻም ፣ ሁለቱ የማይክሮ መቆጣጠሪያዎች በሶኬት በኩል ይገናኛሉ እና በእያንዳንዱ የውሂብ እሽጎች በመላክ የዲቢቢውን ጥምርታ ከሚያመለክቱ አሞሌዎች ጋር ግራፍ በማተም ላይ እናተምታለን።

ደረጃ 1: AP ን ከ Wrover ጋር መጫን

ደረጃ 2 የ STATION ስብሰባ ከ TTGO ጋር

የ STATION ስብሰባ ከ TTGO ጋር
የ STATION ስብሰባ ከ TTGO ጋር

ደረጃ 3 ፦ ውጤት

ውጤት
ውጤት
ውጤት
ውጤት
ውጤት
ውጤት

በ 2x ውጫዊ አንቴናዎች ከፍተኛው ርቀት 315 ሜትር

በውጫዊ እና ውስጣዊ አንቴና ያለው ከፍተኛ ርቀት 157 ሜትር

ደረጃ 4: LOG. CSV ን በማህደር ያስቀምጡ

መዝገብ ቤት LOG. CSV
መዝገብ ቤት LOG. CSV
መዝገብ ቤት LOG. CSV
መዝገብ ቤት LOG. CSV

መረጃውን በ SD ካርድ ላይ ፣ በሚሊስ ፣ በዲቢኤም እና በጥቅሉ ሕብረቁምፊ ውስጥ አስገብቻለሁ።

ደረጃ 5: Adafruit GFX ቤተ -መጽሐፍት

Adafruit GFX ቤተ -መጽሐፍት
Adafruit GFX ቤተ -መጽሐፍት

በአርዱዲኖ አይዲኢ ውስጥ ወደ Sketch-> ቤተ-መጽሐፍት አካትት-> ቤተ-መጽሐፍቶችን ያቀናብሩ…

Adafruit GFX ቤተ -መጽሐፍትን ይጫኑ

ደረጃ 6: Adafruit ST7735 ቤተ -መጽሐፍት

Adafruit ST7735 ቤተ -መጽሐፍት
Adafruit ST7735 ቤተ -መጽሐፍት

በአርዱዲኖ አይዲኢ ውስጥ ወደ Sketch-> ቤተ-መጽሐፍት አካትት-> ቤተ-መጽሐፍቶችን ያቀናብሩ…

Adafruit ST7735 ን ይጫኑ

ደረጃ 7 ካርዶቹን በማዋቀር ላይ

ካርዶችን በማዋቀር ላይ
ካርዶችን በማዋቀር ላይ
ካርዶችን በማዋቀር ላይ
ካርዶችን በማዋቀር ላይ

ልዩነቶችን ይከታተሉ -

ደረጃ 8 AP.ino

አስፈላጊዎቹን ቤተ -መጻሕፍት አካትተናል እና አንዳንድ መመዘኛዎችን ገለጥን።

#ያካትቱ #ያካትቱ #ያካትቱ ምንም ጣቢያ deve ser igual #define SSID "RSSI_Test" #define PASSWORD "87654321" // Tempo de timeout para ግምት of conexão pedida #define TIMEOUT 2000 // Largura e altura do display #defiine DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // መግለጫ cor, margem e tamanho do gráfico #define PLOT_COLOR ST77XX_GREEN #define PLOT_MARGIN 20 #definine PLOT_SIZE (ማሳያ_ከፍታ - 2*PLOT_MARGIN) // አርኪቮ ዴ ሎግ ኖ ኤስዲ #ጥራት ፊይል "/ፋይል"/ፋይል።

ከሌሎች ተለዋዋጮች መካከል ፒኖችን እንገልፃለን

// ፒኖዎች ያሳያሉ #DISPLAY_DC 12 // A0 #defiine DISPLAY_CS 13 // CS #define DISPLAY_MOSI 14 // SDA #defiine DISPLAY_CLK 27 // SCK #defiine 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 ማሳያ = Adafruit_ST7735 (DISPLAY_CS ፣ DISPLAY_DC ፣ DISPLAY_MOSI ፣ DISPLAY_CLK ፣ DISPLAY_RST) ፤ // Criamos um አገልጋይ (ብቃት ያለው ፖርታ ቫላዳ ለደንበኛ አገልግሎት የሚውል ፖስታን ይጠቀማል) የ WiFi አገልጋይ አገልጋይ (80); // Variável para armazenar o client (ምንም caso o ESP32 em modo station) conectado WiFiClient client; // String que recebemos ደንበኛ ያደርጋሉ ሕብረቁምፊ ደርሷል ፤ // RSSI enviado pelo cliente para este ESP32 long rssi = 0; // Faz o controle 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 ((SD. } // ሲሪያን ዋይፋይ ፣ በአገልጋዩ ወይም በአገልጋዩ ኮንቴክታር ማዋቀር WiFi (); 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 («softAP መፍጠር» + String (SSID)); WiFi. ግንኙነት ያቋርጡ (); 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" + String (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

ባዶ waitForClient () {display.println («ደንበኛን በመጠበቅ ላይ»); // አግአርዳ ወይም የደንበኛ ግንኙነት (((ደንበኛ = አገልጋይ አለ ())) {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 ESP32 IRAM_ATTR resetModule () {ets_printf ("(watchdog) reiniciar / n"); esp_restart_noos (); // reinicia o ቺፕ} ባዶ ማዋቀርWatchdog () {timer = timerBegin (0 ፣ 80 ፣ እውነት) ፤ // timerID 0 ፣ div 80 // ሰዓት ቆጣሪ ፣ መልሶ መደወያ ፣ interrupção de borda timerAttachInterrupt (ሰዓት ቆጣሪ ፣ እና ዳግም ሞዱል ፣ እውነት); // ሰዓት ቆጣሪ ፣ ቴምፕ (እኛ) ፣ repetição timerAlarmWrite (ሰዓት ቆጣሪ ፣ 10000000 ፣ እውነት); ሰዓት ቆጣሪ ማንቂያ (ሰዓት ቆጣሪ); // habilita a interrupção}

ሉፕ

ባዶነት loop () {timerWrite (ሰዓት ቆጣሪ ፣ 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // checa se possui conexão com o ደንበኛ readFromClient (); // lê os dados ደንበኛ sendToClient (); // envia confirmação para o የደንበኛ ሴራ (); // mostra o gráfico de histórico de rssi log (); // salva um log no cartão SD}

ቼክ ግንኙነት

ባዶ ቼክ ግንኙነት () {// Se o cliente não estiver conectado ((client.connected ()) {// Limpa a tela e espera pelo cliente display.fillScreen (ST77XX_BLACK); display.println ("ደንበኛ ተቋርጧል"); waitForClient (); }}

ከደንበኛ ያንብቡ

ባዶነት ማንበብFromClient () {// Espera até o cliente enviar algo ou desconectar while (client.connected () &&! client.available ()) {delay (100); } // ደንበኛ ከሆነ (ደንበኛ) ከተገናኘ ()) {ተቀብሏል = client.readStringUntil ('\ n')) // Lê o texto que o ደንበኛ enviou received.remove (የተቀበለው. ርዝመት ()-1); // አስወግድ o / n የመጨረሻ rssi = client.parseInt (); // Lê o rssi que o ደንበኛ enviou clearText (); // ሊምፓ ወይም ቴክቶ ማሳያ። // ጠቋሚውን ወደ ቴክስቶ para para ወደ መጥተው ማሳያ ማሳያ ማሳያ ("RSSI:" + String (rssi))) ይውሰዱ; // Mostra o RSSI ምንም ማሳያ display.println ("ተቀበለ:" + ተቀብሏል); // አብዛኛው ሰው ምንጊዜም ከደንበኛ ጋር ይገናኛል // አንድ መጠነ -ልኬት ወደ ባራስ እስከ ግሪሲኮ ድረስ ሊወስደው ይችላል (rssiHistory.size () == (DISPLAY_WIDTH - 2*PLOT_MARGIN)/2) {rssiHistoryHeraory (rssi.ጀማሪ ()); } // Adiciona የመጨረሻ ታሪክ የለውም (mais recente) rssiHistory.push_back (rssi); }}

sendToClient

void sendToClient () {// Se o cliente estiver conectado enviamos de volta a mensagem com um OK ከሆነ (client.connected ()) {ሕብረቁምፊ መላክ = ተቀብሏል + "እሺ"; client.println (መላክ); }}

ሴራ

ባዶ ባዶ ሴራ () {// ኮሎካ ኖ ፖንቶ ኢንፊሻል ኢ ሊምፓሞስ ኦ ግራግራፎ የአሁኑ ኤክስ = PLOT_MARGIN; display.fillRect (PLOT_MARGIN ፣ 2*PLOT_MARGIN ፣ DISPLAY_WIDTH - 2*PLOT_MARGIN ፣ DISPLAY_HEIGHT - 2*PLOT_MARGIN ፣ ST77XX_BLACK); // ፓራ ካዳ በጀግንነት ሂስቶሪኮ ፋሲሞስ ወይም ካላኩሎ ታማንሆ ዳ ባራ ዶ ግራካፎ ፣ 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 እና መዝገብ

ባዶ ባዶ ጽሑፍ () {// Limpa a área com o texto da mensagem vinda do cliente display.fillRect (0, 0, DISPLAY_WIDTH ፣ 2*PLOT_MARGIN ፣ ST77XX_BLACK); } ባዶ ባዶ መዝገብ () {// Abrimos o arquivo para escrevermos no final dele ፋይል ፋይል = SD.open (FILE_PATH ፣ FILE_APPEND) ፤ // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! ፋይል) {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 #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 conterar a conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // Configurações t corho, margem #ጥራት PLOT_COLOR ST77XX_GREEN #ጥራት PLOT_MARGIN 20 #መግለፅ PLOT_SIZE (ማሳያ_ከፍታ - 2*PLOT_MARGIN) // አርኪቮ ዴ ሎግ የለም ኤስዲ #ፍቺ_ፓት "/log.csv"

ማሳያውን እና ኤስዲ ካርዱን የሚያካትቱ ቅንብሮችን እንገልፃለን።

ረጅም ቆጠራ = 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; // ለአገልጋዩ WiFi አገልጋይ ሶኬት; #መግለፅ DISPLAY_DC 12 // A0 #ገላጭ DISPLAY_CS 13 // CS #define 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) #define SDCARD_CS 15 // Objeto responsável pelo display Adafruit_ST7735 display = Adafruit_ST7735 (ማሳያ_ሲኤስ ፣ DISPLAY_DC ፣ DISPLAY_MOSI ፣ DISPLAY_MOSI ፣ DISPLAY) hw_timer_t *ሰዓት ቆጣሪ = NULL; // faz o controle do temporizador (interrupção por tempo) // Utilizado para guardar os ultimos std:: vector rssiHistory;

አዘገጃጀት

ባዶነት ማዋቀር () {setupDisplay (); // Inicializa o SD ((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 (); }

ማዋቀር ማሳያ

// 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); }

ማዋቀር WiFi

// Conecta ao AP void setupWiFi () {WiFi.disconnect (); WiFi.mode (WIFI_STA); WiFi.begin (SSID ፣ PASSWORD); display.println ("ከ" + String (SSID) ጋር መገናኘት); // Enquanto não estiver conectado à rede WiFi (WiFi.status ()! = WL_CONNECTED) {መዘግየት (500); display.print ("."); } display.println (""); display.print ("ተገናኝቷል"); display.println (SSID); }

connectToServer

ባዶነት connectToServer () {display.println ("የሶኬት ግንኙነትን በመሞከር ላይ"); // (! መዘግየት (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 ESP32 IRAM_ATTR resetModule () {ets_printf ("(watchdog) reiniciar / n"); esp_restart_noos (); // reinicia o ቺፕ} ባዶ ማዋቀርWatchdog () {timer = timerBegin (0 ፣ 80 ፣ እውነት) ፤ // timerID 0 ፣ div 80 // ሰዓት ቆጣሪ ፣ መልሶ መደወያ ፣ interrupção de borda timerAttachInterrupt (ሰዓት ቆጣሪ ፣ እና ዳግም ሞዱል ፣ እውነት); // ሰዓት ቆጣሪ ፣ ቴምፕ (እኛ) ፣ repetição timerAlarmWrite (ሰዓት ቆጣሪ ፣ 10000000 ፣ እውነት); ሰዓት ቆጣሪ ማንቂያ (ሰዓት ቆጣሪ); // habilita a interrupção}

loop

ባዶነት loop () {timerWrite (ሰዓት ቆጣሪ ፣ 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // checa se possui conexão com o አገልጋይ checkRSSI (); // verifica o rssi ሴራ (); // 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 መዘግየት (1000); // espera um segundo}

ቼክ ግንኙነት

ባዶ ቼክ ግንኙነት () {// Verifica a conexão com o AP ከሆነ (WiFi.status ()! = WL_CONNECTED) {display.fillScreen (ST77XX_BLACK) ፤ display.setCursor (0, 0); display.println ("WiFi ተቋርጧል"); setupWiFi (); መዘግየት (1000); } // ((socket.connected ()) {display.fillScreen (ST77XX_BLACK) ከሆነ ሶኬትን ያድርጉ። display.setCursor (0, 0); display.println ("ሶኬት ተቋርጧል"); connectToServer (); መዘግየት (3000); display.fillScreen (ST77XX_BLACK); }}

checkRSSI

ባዶ checkRSSI () {// Verifica o RSSI rssi = WiFi. RSSI (); // ሊምፓ ወይም ቴክቶ ኢስትራ ወይም RSSI ምንም ማሳያ የለም ጽሑፍ (); display.setCursor (0, 0); display.print ("RSSI:" + String (rssi)); // (rssiHistory.size () == (DISPLAY_WIDTH - 2*PLOT_MARGIN)/2) {rssiHistory.erase (rssiHistory.begin ()))። } // Adiciona የመጨረሻ ታሪክ የለውም (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); // ፓራ ካዳ በጀግንነት ሂስቶሪኮ ፋሲሞስ ወይም ካላኩሎ ታማንሆ ዳ ባራ ዶ ግራካፎ ፣ 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 () {// Se estiver conectado com o server (socket.connected ()) {// Envia um hello com um contador, mostra no display e incrementa o contadora string string መላክ = "Hello" + String (count); display.setCursor (0, 10); display.println ("መላክ:" + መላክ); socket.println (መላክ); socket.print (ሕብረቁምፊ (rssi)); ቆጠራ ++; }}

ከአገልጋይ ያንብቡ

ባዶ ንባብ ከ Server () {// Espera até o server enviar algo ou desconectar ሳለ (socket.connected () &&! socket.available ()) {መዘግየት (100); } // ካለ (socket.available ()) {// Faz a leitura ፣ የመጨረሻውን አስወግድ ምንም ማሳያ አልደረሰም = socket.readStringUntil ('\ n'); ተቀብሏል። display.println ("ተቀብሏል:" + ተቀብሏል); }}

ClearText እና መዝገብ

ባዶ ባዶ ጽሑፍ () {// Limpa a área com o texto da mensagem vinda do cliente display.fillRect (0, 0, DISPLAY_WIDTH ፣ 2*PLOT_MARGIN ፣ ST77XX_BLACK); } ባዶ ባዶ መዝገብ () {// Abrimos o arquivo para escrevermos no final dele ፋይል ፋይል = SD.open (FILE_PATH ፣ FILE_APPEND) ፤ // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! ፋይል) {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 - ፋይሎች

ፋይሎቹን ያውርዱ ፦

ፒዲኤፍ

INO

የሚመከር: