Kazalo:
- 1. korak: Namestitev dostopne točke z Wroverjem
- 2. korak: Montaža postaje s TTGO
- 3. korak: REZULTAT
- 4. korak: Arhivirajte LOG.CSV
- 5. korak: Knjižnica Adafruit GFX
- 6. korak: Knjižnica Adafruit ST7735
- 7. korak: Konfiguriranje kartic
- 8. korak: AP.ino
- 9. korak: Station.ino
- 10. korak: Datoteke
Video: ESP32 z zunanjo anteno na dolge razdalje: 10 korakov
2024 Avtor: John Day | [email protected]. Nazadnje spremenjeno: 2024-01-30 12:05
Današnja tema se nanaša na preskus na daljavo z ESP32 z zunanjo anteno. Danes uporabimo dva modula: iz Espressifa in TTGO. Nato preverimo RSSI med tema dvema antenama ESP32, ustvarimo graf iz zgodovine in zapišemo dnevnik vrednosti v datoteko.csv.
Nato imamo ESP32 Wrover kot AP in ESP32 TTGO kot postajo. Uporabil sem anteno, ki sem jo vzel iz nekoliko večjega TP-Link in drugega usmerjevalnika, znanega kot 9dbm antena. Nisem opazil nobene razlike med obema.
Nazadnje se dva mikrokrmilnika povežeta prek vtičnice in ob vsakem pošiljanju podatkovnih paketov natisnemo graf s črtami, ki označujejo razmerje dbm.
1. korak: Namestitev dostopne točke z Wroverjem
2. korak: Montaža postaje s TTGO
3. korak: REZULTAT
Največja razdalja z 2x zunanjimi antenami: 315 metrov
Največja razdalja z zunanjo in notranjo anteno: 157 metrov
4. korak: Arhivirajte LOG. CSV
Podatke sem zabeležil na kartico SD s podatki v milisah, dbm in nizom paketa.
5. korak: Knjižnica Adafruit GFX
V Arduino IDE pojdite na Sketch-> Include Library-> Manage Libraries …
Namestite knjižnico Adafruit GFX
6. korak: Knjižnica Adafruit ST7735
V Arduino IDE pojdite na Sketch-> Include Library-> Manage Libraries …
Namestite Adafruit ST7735
7. korak: Konfiguriranje kartic
Spremljajte razlike:
8. korak: AP.ino
Vključili smo potrebne knjižnice in določili nekatere parametre.
#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 consurar a conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // konfiguracija 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.
Med drugimi spremenljivkami definiramo zatiče
// Pinos 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 e 18 respectivamente) #define SDCARD_CS 15 // Pixel onde o gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Objeto responvel pelo display Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST); // Criamos um strežnik (qualquer porta válida služi contanto que ali cliente using a mesma porta) strežnik WiFiServer (80); // Variável para armazenar o cliente (brez caso o ESP32 em modo station) povezanega odjemalca WiFiClient; // String que recebemos do cliente Niz prejet; // RSSI enviado pelo cliente para este 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;
Nastaviti
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, inicializacijo strežnika in espero o povezavi strank 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 (); }
Nastavite WiFi
// Cria um Access Point in konfiguracija o nastavitvi IPvoidWiFi () {display.println ("Ustvarjanje softAP" + niz (SSID)); WiFi.disconnect (); WiFi.mode (WIFI_AP); WiFi.softAPConfig (naslov IP (192, 168, 0, 1), naslov IP (192, 168, 0, 1), naslov IP (255, 255, 255, 0)); WiFi.softAP (SSID, GESO); display.println ("softAP" + niz (SSID) + "ustvarjeno!"); }
Zaslon za nastavitev
// Vključitev zaslona, usmeritev in omejitev v izogib postavitviDisplay () {// Inicializacija prikaza zaslona.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 ("Čakanje na odjemalca"); // Aguarda o cliente conectar while (! (Client = server.available ())) {display.print ("."); zamuda (500); } display.println ("Odjemalec povezan"); // 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 in setupWatchdog
// função que o temporizador irá chamar, para reiniciar or 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); // timer, tempo (us), repetição timerAlarmWrite (timer, 10000000, true); timerAlarmEnable (časovnik); // habilita a interrupção}
Zanka
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 confirmmaçã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 ("Odjemalec odklopljen"); waitForClient (); }}
readFromClient
void readFromClient () {// Espera até o cliente omenila 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 ()) {prejeto = client.readStringUntil ('\ n'); // Lê o texto que o cliente enviou joined.remove (prejeto.length ()-1); // Odstrani o / n dokončno rssi = client.parseInt (); // Lê o rssi que o cliente enviou clearText (); // Limpa o texto display.setCursor (0, 0); // Premakni kurzor do besedila ali pride do prikaza display.println ("RSSI:" + String (rssi)); // Mostra o RSSI brez prikaza display.println ("Prejeto:" + prejeto); // Mostra a mensagem recebida do cliente // Se an 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.začeti()); } // Adiciona no final do histórico (mais recente) rssiHistory.push_back (rssi); }}
sendToClient
void sendToClient () {// Se o cliente estiver connectado enviamos de volta a mensagem com um OK if (client.connected ()) {Pošiljanje niza = prejeto + "V redu"; client.println (pošiljanje); }}
zaplet
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 - vrednost, vrednost, PLOT_COLOR); currentX += 2;}}
clearText in dnevnik
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 ("Failed to open file"); vrnitev; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + Niz (rssi) + ";" + prejeto; file.println (podatki); file.close (); }
9. korak: Station.ino
Vključili smo potrebne knjižnice in določili nekatere parametre.
#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 configudo no setup to AP #define PORT 80 // Porta do sever. Qualquer porta válida contanto que seja igual nos dois arquivos // Tempo de timeout para consurar a conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // Configurações de corho, margem grško #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"
Določimo nastavitve, ki vključujejo zaslon in kartico SD.
dolgo štetje = 0; // Contador de mensagens enviadaslong rssi = 0; // RSSI Calculado Niz prejet; // Mensagem de confirmmação que o AP nos envia // Pixel onde o gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Uporabite para conexão com ali strežniško vtičnico 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 e 18 respectivamente) #define SDCARD_CS 15 // Objeto responvel pelo display Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_CLK, hw_timer_t *timer = NULL; // faz o controle do temporizador (interrupção por tempo) // Utilizado para guardar os ultimos std:: vector rssiHistory;
Nastaviti
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
// Vključitev zaslona, usmeritev in omejitev v izogib postavitviDisplay () {// Inicializacija prikaza zaslona.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.začetek (SSID, GESO); display.println ("Povezovanje z" + niz (SSID)); // Enquanto não estiver conectado à rede WiFi medtem while (WiFi.status ()! = WL_CONNECTED) {delay (500); display.print ("."); } display.println (""); display.print ("Povezano z"); display.println (SSID); }
connectToServer
void connectToServer () {display.println ("Poskus vmesniške povezave"); // Espera conexão com o strežnik while (! Socket.connect (HOST, PORT)) {display.print ("."); zamuda (500); } display.println (); display.println ("Povezano!"); // 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 in setupWatchdog
// função que o temporizador irá chamar, para reiniciar or 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); // timer, tempo (us), repetição timerAlarmWrite (timer, 10000000, true); timerAlarmEnable (časovnik); // habilita a interrupção}
zanka
void loop () {timerWrite (timer, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // checa se possui conexão com o preverjanju strežnikaRSSI (); // verifica o rssi plot (); // mostra o gráfico de histórico de rssi sendToServer (); // en uma uma messagem com um contador za strežnik readFromServer (); // espera a confirmmação do log server (); // salva um log no cartão SD zakasnitev (1000); // espera um segundo}
checkConnection
void checkConnection () {// Preveri povezavo s točko AP, če (WiFi.status ()! = WL_CONNECTED) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("WiFi odklopljen"); setupWiFi (); zamuda (1000); } // preveri vtičnico conexão do if (! socket.connected ()) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("Vtičnica odklopljena"); connectToServer (); zamuda (3000); display.fillScreen (ST77XX_BLACK); }}
checkRSSI
void checkRSSI () {// Verifica o RSSI rssi = WiFi. RSSI (); // Limpa o texto e mostra ali RSSI brez prikaza clearText (); display.setCursor (0, 0); display.print ("RSSI:" + niz (rssi)); // Se an 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); }
zaplet
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 - vrednost, vrednost, PLOT_COLOR); currentX += 2;}}
sendToServer
void sendToServer () {// Se evisver 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 ("Pošiljanje:" + pošiljanje); socket.println (pošiljanje); socket.print (String (rssi)); count ++; }}
readFromServer
void readFromServer () {// Espera até o strežniku, ki vsebuje algo ali 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 display = socket.readStringUntil ('\ n'); prejeto.odstraniti (prejeto.dolžina ()-1); display.println ("Prejeto:" + prejeto); }}
clearText in dnevnik
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 ("Failed to open file"); vrnitev; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + Niz (rssi) + ";" + prejeto; file.println (podatki); file.close (); }
10. korak: Datoteke
Prenesite datoteke:
JAZ NE
Priporočena:
Začetek uporabe brezžičnih senzorjev temperature in vibracij na dolge razdalje: 7 korakov
Kako začeti z brezžičnimi senzorji temperature in vibracij na dolge razdalje: Včasih so vibracije vzrok resnih težav v mnogih aplikacijah. Od gredi in ležajev strojev do zmogljivosti trdega diska vibracije povzročijo poškodbe stroja, zgodnjo zamenjavo, nizko zmogljivost in močno vplivajo na natančnost. Spremljanje
Vezje prenosnega sistema na dolge razdalje: 6 korakov
Vezje sistema za prenos na dolge razdalje: Danes bomo v tem članku govorili o tem, kako narediti osnovno vezje sistema za prenos na dolge razdalje. V zvezi s tem naj vam na kratko predstavim vezje. Kako na splošno to deluje in kako vam govorim o vseh stvareh
Esp32-Ubidots-Wireless-temperatura in vlažnost na dolge razdalje: 6 korakov
Esp32-Ubidots-Wireless-temperatura in vlažnost na dolge razdalje: V tej vadnici bomo merili različne podatke o temperaturi in vlažnosti s senzorjem za temperaturo in vlago. Naučili se boste tudi, kako te podatke poslati Ubidotsu. Tako ga lahko analizirate od kjer koli za različne aplikacije
ThingSpeak, ESP32 in brezžična temperatura in vlažnost na dolge razdalje: 5 korakov
ThingSpeak, ESP32 in dolgoročna brezžična temperatura in vlažnost: V tej vadnici bomo merili različne podatke o temperaturi in vlažnosti s senzorjem za temperaturo in vlago. Naučili se boste tudi, kako te podatke poslati v ThingSpeak. Tako ga lahko analizirate od kjer koli za različne aplikacije
Spremenite radijski modem Ricochet za zunanjo anteno: 8 korakov
Radijski modem Ricochet za zunanjo anteno: Produkt nekdanjega poslovnega modela, modemi Ricochet so odlična tehnologija s presenetljivo nizko ceno. Delujejo tako kot običajni modemi, vendar z RF plastjo namesto telefonske linije. Zgradite lasten strežnik za dostop prek klica, nadzirajte