Sommario:
- Passaggio 1: montaggio dell'AP con Wrover
- Fase 2: Assemblaggio di STATION con TTGO
- Passaggio 3: RISULTATO
- Passaggio 4: archivia LOG.CSV
- Passaggio 5: libreria Adafruit GFX
- Passaggio 6: libreria Adafruit ST7735
- Passaggio 7: configurazione delle carte
- Passaggio 8: AP.ino
- Passaggio 9: Station.ino
- Passaggio 10: file
Video: ESP32 con antenna esterna a lunga distanza: 10 passaggi
2024 Autore: John Day | [email protected]. Ultima modifica: 2024-01-30 10:03
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
Passaggio 3: RISULTATO
Distanza massima con 2x antenne esterne: 315 metri
Distanza massima con antenna esterna ed interna: 157 metri
Passaggio 4: archivia 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
Nell'IDE di Arduino, vai su Schizzo-> Includi libreria-> Gestisci librerie…
Installa la libreria Adafruit GFX
Passaggio 6: libreria Adafruit ST7735
Nell'IDE di Arduino, vai su Schizzo-> Includi libreria-> Gestisci librerie…
Installa Adafruit ST7735
Passaggio 7: 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:
IO NO
Consigliato:
Luci del migliore amico a lunga distanza fai-da-te: 4 passaggi (con immagini)
Luci del migliore amico a lunga distanza fai-da-te: ho realizzato luci sincronizzate a lunga distanza conosciute come "Best Friend" lampade. Ciò significa solo che sono mantenuti sincronizzati con il colore corrente dell'altra lampada. Quindi, se dovessi cambiare una lampada in verde, poco dopo l'altra lampada diventerebbe verde
Circuito del sistema di trasmissione a lunga distanza: 6 passaggi
Circuito del sistema di trasmissione a lunga distanza: oggi in questo articolo parleremo di come realizzare un circuito di base del sistema di trasmissione a lunga distanza. Lungo queste linee, lascia che ti dia una rappresentazione concisa del circuito. Come generalmente funziona e come sto parlando alle cose con te al
Antenna esterna per ESP8266: 5 passaggi
Antenna esterna per ESP8266: a volte è necessaria un'antenna esterna per ESP8266. Ad esempio, si desidera installare l'ESP in una scatola metallica per alcune applicazioni esterne o di altro tipo installate nei casi. Oppure hai solo bisogno di una maggiore potenza del segnale. Pertanto è necessario installare
Filtro di segnale Wi-Fi (WokFi) a lunga distanza: 3 passaggi (con immagini)
Filtro segnale Wi-Fi (WokFi) a lunga distanza: in questo tutorial trasformo un comune Thumbdrive WiFi in un robusto extender Wi-Fi! punti in città e connettersi a una rete
Huawei E160X (Vodafone K3565) 3G Dongle Antenna esterna / Involucro: 13 passaggi (con immagini)
Huawei E160X (Vodafone K3565) 3G Dongle Antenna esterna / Involucro: Il dongle K3565 fornito da Vodafone con il suo piano di pagamento a consumo è eccellente, ma purtroppo il connettore dell'antenna esterna è nascosto sotto l'involucro. Ecco come hackerare l'involucro per arrivare a quel connettore nascosto - e per coloro che vogliono