Πίνακας περιεχομένων:
- Βήμα 1: Τοποθέτηση του AP με το Wrover
- Βήμα 2: Συναρμολόγηση του STATION με TTGO
- Βήμα 3: ΑΠΟΤΕΛΕΣΜΑ
- Βήμα 4: Αρχειοθέτηση LOG.CSV
- Βήμα 5: Βιβλιοθήκη Adafruit GFX
- Βήμα 6: Βιβλιοθήκη Adafruit ST7735
- Βήμα 7: Διαμόρφωση των καρτών
- Βήμα 8: AP.ino
- Βήμα 9: Station.ino
- Βήμα 10: Αρχεία
Βίντεο: ESP32 Με εξωτερική κεραία μεγάλης απόστασης: 10 βήματα
2024 Συγγραφέας: John Day | [email protected]. Τελευταία τροποποίηση: 2024-01-30 08:36
Το σημερινό θέμα αφορά μια δοκιμή απόστασης με ESP32 με εξωτερική κεραία. Ας χρησιμοποιήσουμε δύο ενότητες σήμερα: από το Espressif και το TTGO. Ας ελέγξουμε στη συνέχεια το RSSI μεταξύ αυτών των δύο κεραιών ESP32, να δημιουργήσουμε ένα γράφημα από το ιστορικό και να γράψουμε ένα αρχείο καταγραφής των τιμών σε ένα αρχείο.csv.
Έχουμε τότε το ESP32 Wrover ως AP και το ESP32 του TTGO ως Station. Χρησιμοποίησα μια κεραία που πήρα από ένα ελαφρώς μεγαλύτερο TP-Link και έναν άλλο δρομολογητή γνωστό ως κεραία 9dbm. Δεν έχω παρατηρήσει καμία διαφορά μεταξύ των δύο.
Τέλος, οι δύο μικροελεγκτές συνδέονται μέσω υποδοχής και, με κάθε αποστολή πακέτων δεδομένων, εκτυπώνουμε σε μια οθόνη ένα γράφημα με τις ράβδους που υποδεικνύουν την αναλογία dbm.
Βήμα 1: Τοποθέτηση του AP με το Wrover
Βήμα 2: Συναρμολόγηση του STATION με TTGO
Βήμα 3: ΑΠΟΤΕΛΕΣΜΑ
Μέγιστη απόσταση με 2x εξωτερικές κεραίες: 315 μέτρα
Μέγιστη απόσταση με εξωτερική και εσωτερική κεραία: 157 μέτρα
Βήμα 4: Αρχειοθέτηση LOG. CSV
Έχω καταγράψει τα δεδομένα σε μια κάρτα SD, με δεδομένα σε millis, dbm και τη συμβολοσειρά πακέτου.
Βήμα 5: Βιβλιοθήκη Adafruit GFX
Στο Arduino IDE, μεταβείτε στο Sketch-> Include Library-> Manage Libraries…
Εγκαταστήστε τη βιβλιοθήκη Adafruit GFX
Βήμα 6: Βιβλιοθήκη 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: Αρχεία
Κατεβάστε τα αρχεία:
ΕΓΩ ΔΕΝ
Συνιστάται:
Μετεωρολογικός σταθμός μεγάλης απόστασης HC-12 και αισθητήρες DHT: 9 βήματα
Μετεωρολογικός σταθμός μεγάλης εμβέλειας HC-12 και αισθητήρες DHT: Σε αυτό το σεμινάριο θα μάθουμε πώς να φτιάχνουμε έναν απομακρυσμένο μετεωρολογικό σταθμό μεγάλων αποστάσεων χρησιμοποιώντας δύο αισθητήρες dht, μονάδες HC12 και οθόνη LCD I2C. Δείτε το βίντεο
Πώς να ελέγξετε έναν βραχίονα ρομπότ μεγάλης ισχύος 4dof μεγάλης ισχύος με τηλεχειριστήριο Arduino και Ps2;: 4 βήματα
Πώς να ελέγξετε έναν βραχίονα ρομπότ 4dof υψηλής ισχύος μεγάλου μεγέθους με το τηλεχειριστήριο Arduino και Ps2;: αυτό το κιτ χρησιμοποιεί κινητήρα υψηλής ισχύος mg996, χρειάζεται υψηλό ρεύμα, έχουμε δοκιμάσει πολλή ισχύ. Μόνο ο προσαρμογέας 5v 6a θα λειτουργήσει. Και ο arduino δουλεύει και στον βραχίονα ρομπότ 6dof. τέλος: γράψτε αγορά SINONING A store για DIY παιχνίδι
Εσωτερική / Εξωτερική κεραία Bowtie: 5 βήματα
Εσωτερική / Εξωτερική κεραία Bowtie: Πάντα με γοήτευε η τυπική κεραία παπιγιόν και διαπίστωσα ότι είχαν καλές ιδιότητες. οπότε όταν ήμουν στο RadioShack λίγο πριν και είδα 2 από αυτά στο ράφι για $ 5 το καθένα, δεν μπορούσα να συγκρατηθώ και πρόσθεσα 2 στη συλλογή μου κάνοντας 3
Εξωτερική κεραία για ESP8266: 5 βήματα
Εξωτερική κεραία για ESP8266: Μερικές φορές χρειάζεστε εξωτερική κεραία για το ESP8266. Για παράδειγμα, θέλετε να εγκαταστήσετε το ESP σε μεταλλικό κουτί για κάποιες εξωτερικές ή άλλες εφαρμογές που είναι εγκατεστημένες σε θήκες. Or χρειάζεστε μόνο περισσότερη ισχύ σήματος. Γι 'αυτό πρέπει να εγκαταστήσετε
Εξωτερική κεραία Bluetooth για αυξημένο εύρος!: 4 βήματα
Εξωτερική κεραία Bluetooth για αυξημένο εύρος !: wantedθελα να ακούσω κάποιο bluetooth στο τοπικό μου Starbucks! αλλά το εύρος κεραίας στα περισσότερα dongles bluetooth είναι τόσο μικρό. οπότε έπρεπε να αυξήσω το εύρος! Εδώ είναι το επικό μου ταξίδι για να το κάνω. Αυτή η ιδέα φοβερών αναλογιών προέρχεται από αυτόν τον ιστότοπο