Talaan ng mga Nilalaman:
- Hakbang 1: Pag-mount ng AP Sa Wrover
- Hakbang 2: Assembly of STATION Gamit ang TTGO
- Hakbang 3: RESULTA
- Hakbang 4: Archive LOG.CSV
- Hakbang 5: Adafruit GFX Library
- Hakbang 6: Adafruit ST7735 Library
- Hakbang 7: Pag-configure ng mga Card
- Hakbang 8: AP.ino
- Hakbang 9: Station.ino
- Hakbang 10: Mga File
Video: ESP32 Sa Panlabas na Long Distance Antenna: 10 Hakbang
2024 May -akda: John Day | [email protected]. Huling binago: 2024-01-30 13:13
Ang paksa ngayon ay patungkol sa isang pagsubok sa distansya kasama ang isang ESP32 na may Panlabas na Antenna. Gumamit tayo ng dalawang mga module ngayon: mula sa Espressif at TTGO. Suriin natin pagkatapos ang RSSI sa pagitan ng dalawang mga antenas ng ESP32, bumuo ng isang grap mula sa kasaysayan, at magsulat ng isang log ng mga halaga sa isang.csv file.
Pagkatapos ay mayroon kaming ESP32 Wrover bilang AP, at ang ESP32 ng TTGO bilang Station. Gumamit ako ng isang antena na kinuha ko mula sa isang bahagyang mas malaking TP-Link at isa pang router na kilala bilang isang 9dbm antena. Wala akong napansin na pagkakaiba sa dalawa.
Sa wakas, ang dalawang mga microcontroller ay kumonekta sa pamamagitan ng socket at, sa bawat pagpapadala ng mga data packet, naka-print kami sa isang pagpapakita ng isang grap sa mga bar na nagpapahiwatig ng ratio ng dbm.
Hakbang 1: Pag-mount ng AP Sa Wrover
Hakbang 2: Assembly of STATION Gamit ang TTGO
Hakbang 3: RESULTA
Pinakamataas na distansya na may 2x panlabas na mga antena: 315 metro
Pinakamataas na distansya na may panlabas at panloob na antena: 157 metro
Hakbang 4: Archive LOG. CSV
Naitala ko ang data sa isang SD card, na may data sa millis, dbm, at ang package string.
Hakbang 5: Adafruit GFX Library
Sa Arduino IDE, pumunta sa Sketch-> Isama ang Library-> Pamahalaan ang Mga Aklatan…
I-install ang Adafruit GFX Library
Hakbang 6: Adafruit ST7735 Library
Sa Arduino IDE, pumunta sa Sketch-> Isama ang Library-> Pamahalaan ang Mga Aklatan…
I-install ang Adafruit ST7735
Hakbang 7: Pag-configure ng mga Card
Abangan ang mga pagkakaiba:
Hakbang 8: AP.ino
Isinama namin ang mga kinakailangang aklatan at tinukoy ang ilang mga parameter.
#include #include #include #include #include #include // Rede que o ESP criará. Walang Station deve ser igual #define SSID "RSSI_Test" #define PASSWORD "87654321" // Tempo de timeout para isaalang-alang ang isang conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // Configurações de 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"
Tinutukoy namin ang mga pin, bukod sa iba pang mga variable
// Pino do display # 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 at 18 respivamente) #define SDCARD_CS 15 // Pixel onde o 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 server (kwalipikadong porta válida service contanto que o cliente gamitin ang isang mesma porta) WiFiServer server (80); // Variável para armazenar o cliente (walang caso o ESP32 em modo station) conectado WiFiClient client; // String que recebemos do cliente Natanggap ang string; // RSSI enviado pelo cliente para sa iyong ESP32 mahabang rssi = 0; // Faz o controle do temporizador (interrupção por tempo) hw_timer_t * timer = NULL; // Utilizado para guardar os ultimos std:: vector rssiHistory;
Pag-set up
void setup () {Serial.begin (115200); setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Idinagdag ang isang muling pag-WiFi, ang opisyal o server at ang client o 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 (); }
Pag-setup ng WiFi
// Cria um Access Point at i-configure ang IPvoid setupWiFi () {display.println ("Lumilikha ng 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" + String (SSID) + "nilikha!"); }
Display ng Pag-setup
// 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 ("Naghihintay para sa client"); // Aguarda o cliente conectar habang (! (Client = server.available ())) {display.print ("."); pagkaantala (500); } display.println ("Konektado sa kliyente"); // Tempo máximo que o cliente deve demorar para respondder // antes de dizermos que a conexão foi perdida client.setTimeout (TIMEOUT); }
IRAM_ATTR resetModule at setupWatchdog
// função que o temporizador irá chamar, para sa pagpapasok ng 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, totoo); // timer, tempo (us), repetição timerAlarmWrite (timer, 10000000, totoo); timerAlarmEnable (timer); // habilita a interrupção}
Loop
void loop () {timerWrite (timer, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // checa se possui conexão com o cliente readFromClient (); // lê os dados do cliente sendToClient (); // envia confirmação para sa 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 ("Nakakonekta ang kliyente"); waitForClient (); }}
basahinMula sa Kliyente
void readFromClient () {// Espera até o cliente enviar algo ou desconectar habang (client.connected () &&! client.available ()) {pagkaantala (100); } // Se chegou aqui e ainda estiver conectado é porque posui algo para receber do cliente if (client.connected ()) {natanggap = client.readStringUntil ('\ n'); // Lê o texto que o cliente enviou natanggap.katanggal (natanggap.length () - 1); // Alisin o / n gawin ang huling rssi = client.parseInt (); // Lè o rssi que o cliente enviou clearTxt (); // Limpa o texto display.setCursor (0, 0); // Move o cursor do texto para o começo do display display.println ("RSSI:" + String (rssi)); // Mostra o RSSI no display display.println ("Natanggap:" + natanggap); // 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.mula ()); } // 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 kung (client.connected ()) {String nagpapadala = natanggap + "OK"; client.println (nagpapadala); }}
balak
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 (kasalukuyangX, DISPLAY_HEIGHT - halaga, halaga, PLOT_COLOR); kasalukuyangX + = 2;}}
malinaw angTeksto at mag-log
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 walang pangwakas na file ng File = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("Nabigong buksan ang file"); bumalik; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + String (rssi) + ";" + natanggap; file.println (data); file.close (); }
Hakbang 9: Station.ino
Isinama namin ang mga kinakailangang aklatan at tinukoy ang ilang mga parameter.
#include #include #include #include #include #include // Nome da rede que nos conectaremos. Criado pelo AP #define SSID "RSSI_Test" #define PASSWORD "87654321" #define HOST "192.168.0.1" // IP que configure 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 considerar 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 e tamanho do gráf #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"
Tinutukoy namin ang mga setting na kasangkot ang display at ang SD Card.
mahabang bilang = 0; // Contador de mensagens enviadaslong rssi = 0; // RSSI calculado String natanggap; // Mensagem de confirmação que o AP nos envia // Pixel onde o gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Utilizado para sa koneksyon ng server socket ng WiFiClient; #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 at 18 respivamente) #define SDCARD_CS 15 // Objeto responsável pelo display Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLR, DISPLAY_CLK, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_MOSI, DISPLAY_CLK); hw_timer_t * timer = NULL; // faz o controle do temporizador (interrupção por tempo) // Utilizado para guardar os ultimos std:: vector rssiHistory;
Pag-set up
void setup () {setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Conecta walang access point criado pelo outro ESP32 at kumonekta sa isang 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 isang 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 ("Kumokonekta sa" + String (SSID)); // Enquanto não estiver conectado à rede WiFi habang (WiFi.status ()! = WL_CONNected) {pagkaantala (500); display.print ("."); } display.println (""); display.print ("Nakakonekta sa"); display.println (SSID); }
kumonektaToServer
void connectToServer () {display.println ("Sinusubukan ang koneksyon ng socket"); // Espera isang conexão com o server habang (! Socket.connect (HOST, PORT)) {display.print ("."); pagkaantala (500); } display.println (); display.println ("Nakakonekta!"); // Tempo máximo que o cliente deve demorar para respondder // antes de dizermos que a conexão foi perdida socket.setTimeout (TIMEOUT); }
IRAM_ATTR resetModule at setupWatchdog
// função que o temporizador irá chamar, para sa pagpapasok ng 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, totoo); // timer, tempo (us), repetição timerAlarmWrite (timer, 10000000, totoo); timerAlarmEnable (timer); // habilita a interrupção}
loop
void loop () {timerWrite (timer, 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 sa server readFromServer (); // espera a confirmação do server log (); // salva um log no cartão SD pagkaantala (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 ("Nakakonekta ang WiFi"); setupWiFi (); pagkaantala (1000); } // verifica a conexão do socket if (! socket.connected ()) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("Socket disconnected"); connectToServer (); pagkaantala (3000); display.fillScreen (ST77XX_BLACK); }}
checkRSSI
walang bisa ang 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); }
balak
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 (kasalukuyangX, DISPLAY_HEIGHT - halaga, halaga, PLOT_COLOR); kasalukuyangX + = 2;}}
sendToServer
void sendToServer () {// Se estiver conectado com o server if (socket.connected ()) {// Envia um hello com um contador, mostra no display at incrementa o contador String shipping = "Hello" + String (count); display.setCursor (0, 10); display.println ("Pagpapadala:" + pagpapadala); socket.println (pagpapadala); socket.print (String (rssi)); bilangin ++; }}
readFromServer
void readFromServer () {// Espera até o server enviar algo ou desconectar habang (socket.connected () &&! socket.available ()) {pagkaantala (100); } // Se tem algo para receber if (socket.available ()) {// Faz a leitura, alisin o / n gawin ang pangwakas at walang display na natanggap = socket.readStringUntil ('\ n'); natanggap.katanggal (natanggap. haba () - 1); display.println ("Natanggap:" + natanggap); }}
malinaw angTeksto at mag-log
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 walang pangwakas na file ng File = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("Nabigong buksan ang file"); bumalik; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + String (rssi) + ";" + natanggap; file.println (data); file.close (); }
Hakbang 10: Mga File
I-download ang mga file:
INO
Inirerekumendang:
Panloob / Panlabas na Bowtie Antenna: 5 Mga Hakbang
Panloob / Panlabas na Bowtie Antenna: Palagi akong nabighani sa karaniwang antena ng bowtie, at nalaman na mayroon silang magagandang katangian. kaya't nang nasa isang RadioShack ako pabalik at nakita ko ang 2 sa kanila sa rak para sa $ 5 bawat isa, hindi ko mapigilan ang aking sarili at nagdagdag ng 2 sa aking koleksyon na gumagawa ng 3
Panlabas na Antenna para sa ESP8266: 5 Mga Hakbang
Panlabas na Antenna para sa ESP8266: Minsan kailangan mo ng isang panlabas na antena para sa ESP8266. Halimbawa, nais mong mai-install ang ESP sa isang metall box para sa ilang labas o iba pang mga application na na-install sa mga kaso. O kailangan mo lamang ng higit na lakas ng signal. Dahil doon kailangan mong mag-install
Gumawa ng isang Panlabas na HDD Mula sa Lumang Panlabas na CD / RW: 5 Hakbang
Gumawa ng isang Panlabas na HDD Mula sa Lumang Panlabas na CD / RW: Medyo tuwid na pasulong na pag-convert ng isang lumang panlabas na cd / rw sa isang mas kapaki-pakinabang na panlabas na hard drive. Mga supplies1-panlabas na cd / rw (mas mabuti ang mas boxy type) 1-hard drive (dapat na tumugma sa panloob na konektor ng drive case, kailangang mai-format / sysed) 1-sm
Mod ng isang Ricochet Radio Modem upang Kumuha ng isang Panlabas na Antenna: 8 Mga Hakbang
Mod ng isang Ricochet Radio Modem na Kumuha ng isang Panlabas na Antenna: Ang produkto ng isang bago-oras na modelo ng negosyo, ang mga modem ng Ricochet ay mahusay na teknolohiya na may nakakagulat na mababang presyo na tag. Kumikilos sila tulad ng mga regular na modem, ngunit may isang RF layer sa halip na isang linya ng telepono. Bumuo ng iyong sariling server ng pag-access sa pag-access, kontrolin ang isang
Panlabas na Bluetooth Antenna para sa Nadagdagang Saklaw !: 4 Mga Hakbang
Panlabas na Bluetooth Antenna para sa Nadagdagang Saklaw !: Nais kong makinig sa ilang bluetooth sa aking lokal na Starbucks! ngunit ang saklaw ng antena sa karamihan ng mga Bluetooth dongle ay napakaikli. kaya kailangan kong dagdagan ang saklaw! Narito ang aking mahabang paglalakbay sa mahabang tula upang magawa ito. Ang ideya ng kahanga-hangang mga sukat ay mula sa site na ito