Πίνακας περιεχομένων:

ESP32 Με εξωτερική κεραία μεγάλης απόστασης: 10 βήματα
ESP32 Με εξωτερική κεραία μεγάλης απόστασης: 10 βήματα

Βίντεο: ESP32 Με εξωτερική κεραία μεγάλης απόστασης: 10 βήματα

Βίντεο: ESP32 Με εξωτερική κεραία μεγάλης απόστασης: 10 βήματα
Βίντεο: ESP32 Tutorial 2 - What's ESP32, Camera Extension Board, unboxing SunFounder's ESP32 IoT Learnig kit 2024, Ιούλιος
Anonim
Image
Image
Τοποθέτηση του AP με το Wrover
Τοποθέτηση του AP με το Wrover

Το σημερινό θέμα αφορά μια δοκιμή απόστασης με ESP32 με εξωτερική κεραία. Ας χρησιμοποιήσουμε δύο ενότητες σήμερα: από το Espressif και το TTGO. Ας ελέγξουμε στη συνέχεια το RSSI μεταξύ αυτών των δύο κεραιών ESP32, να δημιουργήσουμε ένα γράφημα από το ιστορικό και να γράψουμε ένα αρχείο καταγραφής των τιμών σε ένα αρχείο.csv.

Έχουμε τότε το ESP32 Wrover ως AP και το ESP32 του TTGO ως Station. Χρησιμοποίησα μια κεραία που πήρα από ένα ελαφρώς μεγαλύτερο TP-Link και έναν άλλο δρομολογητή γνωστό ως κεραία 9dbm. Δεν έχω παρατηρήσει καμία διαφορά μεταξύ των δύο.

Τέλος, οι δύο μικροελεγκτές συνδέονται μέσω υποδοχής και, με κάθε αποστολή πακέτων δεδομένων, εκτυπώνουμε σε μια οθόνη ένα γράφημα με τις ράβδους που υποδεικνύουν την αναλογία dbm.

Βήμα 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, με δεδομένα σε millis, dbm και τη συμβολοσειρά πακέτου.

Βήμα 5: Βιβλιοθήκη Adafruit GFX

Βιβλιοθήκη Adafruit GFX
Βιβλιοθήκη Adafruit GFX

Στο Arduino IDE, μεταβείτε στο Sketch-> Include Library-> Manage Libraries…

Εγκαταστήστε τη βιβλιοθήκη Adafruit GFX

Βήμα 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 accountrar a conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // defura DISPLAY_HEIGHT 128 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_cATH "/

Ορίζουμε τις ακίδες, μεταξύ άλλων μεταβλητών

// Τα Pinos εμφανίζουν #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 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 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST); // Διακομιστής Criamos um (ποιοτικό porta válida εξυπηρετεί τον πελάτη χρησιμοποιώντας μια portma mesma) WiFiServer server (80); // Παραλλαγή για τον πελάτη ή τον πελάτη (δεν υπάρχει σταθμός ESP32 em modo) συνδεδεμένος πελάτης WiFiClient; // String que recebemos do cliente Η συμβολοσειρά ελήφθη. // RSSI enviado pelo client για την 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, επίσημος διακομιστής ή διακομιστής ή πελάτης 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 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) + "δημιουργήθηκε!"); }

Οθόνη ρύθμισης

// Incializa o display, muda a orientação και 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 cliente deve demorar para responder // antes de dizermos que a conexão foi perdida client.setTimeout (TIMEOUT); }

IRAM_ATTR resetModule και setupWatchdog

// 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); // χρονόμετρο, τέμπο (us), repetição timerAlarmWrite (χρονόμετρο, 10000000, true); 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 ()) {delay (100); } // Se chegou aqui e ainda estiver conectado é porque possui algo para receber do cliente if (client.connected ()) {Receed = client.readStringUntil ('\ n'); // Lê o texto que o cliente enviou λάβει.αφαίρεση (ελήφθη. Μήκος ()-1); // Κατάργηση του / n τελικό rssi = client.parseInt (); // Lê o rssi que o cliente enviou clearText (); // Limpa o texto display.setCursor (0, 0); // Μετακίνηση δρομέα για κείμενο για προβολή display.println ("RSSI:" + String (rssi)); // Mostra o RSSI χωρίς οθόνη 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.erase).να αρχίσει()); } // 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 ()) {String στέλνοντας = ελήφθη + "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 á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 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 ("Απέτυχε το άνοιγμα του αρχείου"); ΕΠΙΣΤΡΟΦΗ; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + String (rssi) + ";" + ελήφθη? file.println (δεδομένα); file.close (); }

Βήμα 9: Station.ino

Έχουμε συμπεριλάβει τις απαραίτητες βιβλιοθήκες και ορίσαμε ορισμένες παραμέτρους.

#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 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 accountrar a conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // Configuraçemes de cor, #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"

Ορίζουμε τις ρυθμίσεις που περιλαμβάνουν την οθόνη και την κάρτα SD.

μεγάλη καταμέτρηση = 0; // Contador de mensagens enviadaslong rssi = 0; // RSSI calculado Ελήφθη συμβολοσειρά. // Mensagem de confirmação que o AP nos envia // Pixel onde o gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Χρήση για σύνδεση με διακομιστή WiFi Υποδοχή πελάτη. #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 e 18 respectivamente) #define SDCARD_CS 15 // Objeto respondável pelo display Adafruit_ST7735 display = 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 και 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 ("Σύνδεση σε" + String (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 και setupWatchdog

// 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); // χρονόμετρο, τέμπο (us), repetição timerAlarmWrite (χρονόμετρο, 10000000, true); timerAlarmEnable (χρονόμετρο); // habilita a interrupção}

βρόχος

void loop () {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 server log (); // salva um log no cartão SD καθυστέρηση (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 ("WiFi αποσυνδέθηκε"); 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:" + 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); }

οικόπεδο

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 στέλνοντας = "Hello" + String (count); display.setCursor (0, 10); display.println ("Αποστολή:" + αποστολή); socket.println (αποστολή); socket.print (String (rssi)); μετρά ++; }}

readFromServer

void readFromServer () {// Espera até διακομιστή και προηγουμένως αποσυνδεθείτε ενώ (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 Received = socket.readStringUntil ('\ n'); έλαβε. αφαίρεση (έλαβε. μήκος ()-1). display.println ("Λήφθηκε:" + ελήφθη); }}

clearText και 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 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 ("Απέτυχε το άνοιγμα του αρχείου"); ΕΠΙΣΤΡΟΦΗ; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + String (rssi) + ";" + ελήφθη? file.println (δεδομένα); file.close (); }

Βήμα 10: Αρχεία

Κατεβάστε τα αρχεία:

PDF

ΕΓΩ ΔΕΝ

Συνιστάται: