Sommario:

ESP32 con antenna esterna a lunga distanza: 10 passaggi
ESP32 con antenna esterna a lunga distanza: 10 passaggi

Video: ESP32 con antenna esterna a lunga distanza: 10 passaggi

Video: ESP32 con antenna esterna a lunga distanza: 10 passaggi
Video: Connessione Sim 4g/lte serve una antenna esterna ? forse si ( test LowcostMobile Pannel 4g 5g Mimo ) 2024, Novembre
Anonim
Image
Image
Montaggio dell'AP con Wrover
Montaggio dell'AP con Wrover

L'argomento di oggi riguarda un test a distanza con un ESP32 con antenna esterna. Usiamo oggi due moduli: da Espressif e TTGO. Controlliamo quindi l'RSSI tra queste due antenne ESP32, generiamo un grafico dalla cronologia e scriviamo un registro dei valori in un file.csv.

Abbiamo quindi l'ESP32 Wrover come AP e l'ESP32 di TTGO come stazione. Ho usato un'antenna che ho preso da un TP-Link leggermente più grande e un altro router noto come antenna da 9dbm. Non ho notato alcuna differenza tra i due.

Infine i due microcontrollori si collegano via socket e, ad ogni invio di pacchetti dati, stampiamo su un display un grafico con delle barre che indicano il rapporto di dbm.

Passaggio 1: montaggio dell'AP con Wrover

Fase 2: Assemblaggio di STATION con TTGO

Assemblaggio STATION Con TTGO
Assemblaggio STATION Con TTGO

Passaggio 3: RISULTATO

RISULTATO
RISULTATO
RISULTATO
RISULTATO
RISULTATO
RISULTATO

Distanza massima con 2x antenne esterne: 315 metri

Distanza massima con antenna esterna ed interna: 157 metri

Passaggio 4: archivia LOG. CSV

Archivio LOG. CSV
Archivio LOG. CSV
Archivio LOG. CSV
Archivio LOG. CSV

Ho registrato i dati su una scheda SD, con i dati in millis, dbm e la stringa del pacchetto.

Passaggio 5: libreria Adafruit GFX

Libreria Adafruit GFX
Libreria Adafruit GFX

Nell'IDE di Arduino, vai su Schizzo-> Includi libreria-> Gestisci librerie…

Installa la libreria Adafruit GFX

Passaggio 6: libreria Adafruit ST7735

Libreria Adafruit ST7735
Libreria Adafruit ST7735

Nell'IDE di Arduino, vai su Schizzo-> Includi libreria-> Gestisci librerie…

Installa Adafruit ST7735

Passaggio 7: configurazione delle carte

Configurazione delle carte
Configurazione delle carte
Configurazione delle carte
Configurazione delle carte

Resta sintonizzato per le differenze:

Passaggio 8: AP.ino

Abbiamo incluso le librerie necessarie e definito alcuni parametri.

#include #include #include #include #include #include //Rede que o ESP criará. No Station deve ser igual #define SSID "RSSI_Test" #define PASSWORD "87654321" //Tempo di timeout per considerare una connessione remota #define TIMEOUT 2000 //Largura e impostazione del display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 //Configurazioni di 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"

Definiamo i pin, tra le altre variabili

//Pino visualizza#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 fa SDCard. Os pinos mosi, miso e sck são os nativos (23, 19 e 18 rispettivamente) #define SDCARD_CS 15 //Pixel onde o grafico come orizzontale 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 serve contact que o client use a mesma porta) WiFiServer server(80); //Variável para armazenar o cliente (no case o ESP32 em mode station) conectado WiFiClient client; //String que recebemos do cliente String ricevuto; //RSSI enviado pelo cliente para este ESP32 long rssi = 0; //Faz o controle do temporizador (interrupção por tempo) hw_timer_t *timer = NULL; //Utilizzato per salvare gli ultimi std::vector rssiHistory;

Impostare

void setup(){ Serial.begin(115200); setupDisplay(); //Inizializzazione o SD if (!SD.begin(SDCARD_CS)) { display.println("Errore ao inicializar lib SD!"); } //Cria un nuovo WiFi, inicializa o server e spera 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(); }

Configurazione Wi-Fi

//Cria um Access Point e configura o IPvoid setupWiFi() { display.println("Creating 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) + " creato!"); }

Display di configurazione

//Incializa o display, modifica l'orientamento e limpa su telavoid setupDisplay() { //Incializza o display display.initR(INITR_BLACKTAB); //Rotaciona o conteúdo mostrado display.setRotation(3); //Più dettagli su display.fillScreen(ST77XX_BLACK); }

waitForClient

void waitForClient(){ display.println("In attesa del cliente"); //Aguarda o cliente conectar while(!(client = server.available())) { display.print("."); ritardo (500); } display.println("Cliente connesso"); //Tempo massimo per il cliente deve essere aggiornato per il risponditore //ante per dizermos quando si è verificato un problema con client.setTimeout(TIMEOUT); }

IRAM_ATTR resetModulo e configurazioneWatchdog

//funzione del temporizzatore irá chamar, per reinizializzare o ESP32void IRAM_ATTR resetModule(){ ets_printf("(watchdog) reinizializzare\n"); esp_restart_noos(); //reinicia o chip } void setupWatchdog() { timer = timerBegin(0, 80, true); //timerID 0, div 80 //timer, callback, interruzione del bordo timerAttachInterrupt(timer, &resetModule, true); //timer, tempo (us), repetição timerAlarmWrite(timer, 10000000, true); timerAlarmEnable(timer); //habilita un'interruzione }

Ciclo continuo

void loop() { timerWrite(timer, 0); //reseta o temporizador (alimenta o watchdog) checkConnection(); //checa se possiedi conexão com o cliente readFromClient(); //lê os dados do cliente sendToClient(); //envia confirmação para o cliente plot(); //mostra o grafico storico di rssi log(); //salva um log no cartão SD }

checkConnection

void checkConnection(){ //Se o cliente não estivor conectado if(!client.connected()) { //Limpa a tela espera pelo cliente display.fillScreen(ST77XX_BLACK); display.println("Cliente disconnesso"); waitForClient(); } }

readFromClient

void readFromClient(){ //Espera até o cliente enviar algo ou desconectar while(client.connected() && !client.available()) { delay(100); } //Se chegou aqui e ainda summerer conectado é porque possui algo para receber do cliente if(client.connected()) {ricevuto = client.readStringUntil('\n'); //Lê o texto que o cliente enviou ricevuto.remove(received.length()-1); //Rimuovi o \n do final rssi = client.parseInt(); //Lê o rssi que o cliente enviou clearText(); //Limpa o testo display.setCursor(0, 0); //Sposta il cursore sul testo per visualizzare il display.println("RSSI: " + String(rssi)); //Mostra o RSSI no display display.println("Ricevuto: " + ricevuto); //Mostra a mensagem recebida do cliente //Se a quantidade de barras do gráfico passou do limit apagamos o registro mais antigo if(rssiHistory.size() == (DISPLAY_WIDTH - 2*PLOT_MARGIN)/2) { rssiHistory.erase(rssiHistory.inizio()); } //Adiciona no final do histórico (più recente) rssiHistory.push_back(rssi); } }

invia al cliente

void sendToClient(){ //Se o cliente estivor conectado enviamos de volta a mensagem com um OK if(client.connected()) { Invio stringa = ricevuto + " OK"; client.println(invio); } }

complotto

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 - valore, valore, PLOT_COLOR); currentX += 2; } }

clearText e 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() { //Aprimos 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"); Restituzione; } //Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String(millis()) + ";" + Stringa(rssi) + ";" + ricevuto; file.println(dati); file.close(); }

Passaggio 9: Station.ino

Abbiamo incluso le librerie necessarie e definito alcuni parametri.

#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 che se configurado no setup do AP #define PORT 80 //Porta sever. Qualquer porta válida contanto que seja igual nos dois arquivos //Tempo de timeout per considerare 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 fico ta #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"

Definiamo le impostazioni che coinvolgono il display e la SD Card.

conteggio lungo = 0; //Contador de mensagens enviadaslong rssi = 0; //Calcolato RSSI Stringa ricevuta; //Managem de confirmação que o AP nos envia //Pixel onde o grafico comeca orizzontalmente int currentX = PLOT_MARGIN; //Utilizzato per la connessione con il socket WiFiClient del server; #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 sono nativi (23, 19 e 18 rispettivamente) #define SDCARD_CS 15 //Objeto responsável pelo display Adafruit_ST7735 display = Adafruit_ST7735(DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY); hw_timer_t *timer = NULL; //faz o controle do temporizador (interrupção por tempo) //Utilizado para guardar os ultimos std::vector rssiHistory;

Impostare

void setup(){ setupDisplay(); //Inizializzazione o SD if (!SD.begin(SDCARD_CS)) { display.println("Errore ao inizializzare lib SD!"); } //Collega nessun punto di accesso crea fuori ESP32 e connetti 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(); }

configurazioneDisplay

//Incializa o display, modifica l'orientamento e limpa su telavoid setupDisplay() { //Incializza o display display.initR(INITR_BLACKTAB); //Rotaciona o conteúdo mostrado display.setRotation(1); //Pianta su tela display.fillScreen(ST77XX_BLACK); display.setTextColor(ST77XX_WHITE); }

configurazioneWiFi

//Connetti un AP void setupWiFi() { WiFi.disconnect(); WiFi.mode(WIFI_STA); WiFi.begin(SSID, PASSWORD); display.println("Connessione a " + String(SSID)); //Un momento estivo di connessione al WiFi while (WiFi.status() != WL_CONNECTED) { delay(500); display.print("."); } display.println(""); display.print("Connesso a "); display.println(SSID); }

connectToServer

void connectToServer(){ display.println("Tentativo di connessione socket"); //Sperare una connessione con il server while(!socket.connect(HOST, PORT)) { display.print("."); ritardo (500); } display.println(); display.println("Connesso!"); //Tempo massimo per il cliente deve essere dimostrato per il risponditore //ante per dizermos per la connessione per la perdita socket.setTimeout(TIMEOUT); }

IRAM_ATTR resetModulo e configurazioneWatchdog

//funzione del temporizzatore irá chamar, per reinizializzare o ESP32void IRAM_ATTR resetModule(){ ets_printf("(watchdog) reinizializzare\n"); esp_restart_noos(); //reinicia o chip } void setupWatchdog() { timer = timerBegin(0, 80, true); //timerID 0, div 80 //timer, callback, interruzione del bordo timerAttachInterrupt(timer, &resetModule, true); //timer, tempo (us), repetição timerAlarmWrite(timer, 10000000, true); timerAlarmEnable(timer); //habilita un'interruzione }

ciclo continuo

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 grafico storico di rssi sendToServer(); //inviare un messaggio con un contattore per il server readFromServer(); //spera una conferma per fare il log del server(); //salva um log no cartão SD delay(1000); //espera um secondo }

checkConnection

void checkConnection(){ //Verifica una connessione con AP if(WiFi.status() != WL_CONNECTED) { display.fillScreen(ST77XX_BLACK); display.setCursor(0, 0); display.println("WiFi disconnesso"); setupWiFi(); ritardo(1000); } //verifica una connessione con il socket if(!socket.connected()) { display.fillScreen(ST77XX_BLACK); display.setCursor(0, 0); display.println("Socket disconnesso"); connectToServer(); ritardo (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: " + String(rssi)); //Se una quantità di barras fa grafico passou fa 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 (più recente) rssiHistory.push_back(rssi); }

complotto

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 - valore, valore, PLOT_COLOR); currentX += 2; } }

sendToServer

void sendToServer(){ //Se estater 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("Invio: " + invio); socket.println(invio); socket.print(String(rssi)); contare++; } }

readFromServer

void readFromServer(){ //Speriamo sul server enviar algo o 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 receiver = socket.readStringUntil('\n'); ricevuto.remove(received.length()-1); display.println("Ricevuto: " + ricevuto); } }

clearText e 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() { //Aprimos 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"); Restituzione; } //Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String(millis()) + ";" + Stringa(rssi) + ";" + ricevuto; file.println(dati); file.close(); }

Passaggio 10: file

Scarica i file:

PDF

IO NO

Consigliato: