Përmbajtje:
- Hapi 1: Montimi i AP me Wrover
- Hapi 2: Montimi i STACIONIT Me TTGO
- Hapi 3: REZULTATI
- Hapi 4: Arkivoni LOG.CSV
- Hapi 5: Biblioteka Adafruit GFX
- Hapi 6: Biblioteka Adafruit ST7735
- Hapi 7: Konfigurimi i Kartave
- Hapi 8: AP.ino
- Hapi 9: Stacioni.ino
- Hapi 10: Skedarët
Video: ESP32 Me antenë të jashtme me distancë të gjatë: 10 hapa
2024 Autor: John Day | [email protected]. E modifikuara e fundit: 2024-01-30 12:21
Tema e sotme ka të bëjë me një test në distancë me një ESP32 me Antenë të Jashtme. Le të përdorim dy module sot: nga Espressif dhe TTGO. Le të kontrollojmë RSSI midis këtyre dy antenave ESP32, të krijojmë një grafik nga historia dhe të shkruajmë një regjistër të vlerave në një skedar.csv.
Ne pastaj kemi ESP32 Wrover si AP, dhe ESP32 të TTGO si Stacion. Kam përdorur një antenë që kam marrë nga një TP-Link pak më e madhe dhe një ruter tjetër i njohur si një antenë 9dbm. Unë nuk kam vënë re ndonjë ndryshim midis të dyve.
Së fundi, dy mikrokontrolluesit lidhen përmes prizës dhe, me çdo dërgim të paketave të të dhënave, ne shtypim në një ekran një grafik me shufrat që tregojnë raportin e dbm.
Hapi 1: Montimi i AP me Wrover
Hapi 2: Montimi i STACIONIT Me TTGO
Hapi 3: REZULTATI
Distanca maksimale me 2 antena të jashtme: 315 metra
Distanca maksimale me antenë të jashtme dhe të brendshme: 157 metra
Hapi 4: Arkivoni LOG. CSV
I regjistrova të dhënat në një kartë SD, me të dhëna në milis, dbm dhe vargun e paketës.
Hapi 5: Biblioteka Adafruit GFX
Në Arduino IDE, shkoni te Sketch-> Include Library-> Manage Bibliotekat …
Instaloni Bibliotekën Adafruit GFX
Hapi 6: Biblioteka Adafruit ST7735
Në Arduino IDE, shkoni te Sketch-> Include Library-> Manage Bibliotekat …
Instaloni Adafruit ST7735
Hapi 7: Konfigurimi i Kartave
Ndiqni dallimet:
Hapi 8: AP.ino
Ne kemi përfshirë bibliotekat e nevojshme dhe kemi përcaktuar disa parametra.
#përfshi #përfshi #përfshi #përfshi #përfshi #përfshi // Rede que o ERI criará. No Station deve ser igual #define SSID "RSSI_Test" #define PASSWORD "87654321" // Kohëzgjatja e kohës për të marrë parasysh #define TIMEOUT 2000 // Largura e altura do të shfaq #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 #përcakto PLOT_SIZE (DISPLAY_HEIGHT - 2*PLOT_MARGIN) // Arquivo de log no SD #define FILE_cATH "/
Ne përcaktojmë kunjat, midis ndryshoreve të tjera
// Pinot shfaqin #përcaktojnë DISPLAY_DC 12 // A0 #përcakto 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 ose 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 server (cilësia e portës së shërbimit shërben nëse klienti përdor një mesmë portë) Serveri WiFiServer (80); // Ndryshimi për armatosjen e klientit (pa rast në stacionin ESP32 në modo) lidh klientin WiFiClient; // String que recebemos do cliente Vargu i marrë; // RSSI siguron klientët e tjerë për këtë ESP32 të gjatë rssi = 0; // Faz o controle do temporizador (interrupção por tempo) hw_timer_t *timer = NULL; // Përdorni për guardar os ultimos std:: vector rssiHistory;
Konfigurimi
void setup () {Serial.begin (115200); setupDisplay (); // Inicializa ose SD nëse (! SD.filloj (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Cria a redde WiFi, zyrtarizoni serverin ose shërbimin tuaj të konfigurimit të konfigurimit WiiFi (); server.filloj (); waitForClient (); // Espera 3 segundos, limpa a tela e inicializa o Watchdog delay (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }
Konfiguro WiFi
// Cria um Access Point dhe konfigurimi i IPvoid setupWiFi () {display.println ("Krijimi i softAP" + String (SSID)); WiFi. Shkëputje (); Modaliteti WiFi (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) + "krijuar!"); }
Ekrani i konfigurimit
// Incializa o display, më shumë orientim dhe limpa një 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 ("Në pritje të klientit"); // Aguarda o cliente conectar while (! (Client = server.available ())) {display.print ("."); vonesë (500); } display.println ("Klienti i lidhur"); // Tempo máximo que o kliente deve demorar para responder // antes de dizermos que a conexão foi perdida client.setTimeout (KOHA); }
IRAM_ATTR resetModule dhe setupWatchdog
// funcão que o temporizador irá chamar, para reiniciar o ESP32void IRAM_ATTR resetModule () {ets_printf ("(qen mbrojtës) reiniciar / n"); esp_restart_noos (); // reinicia o chip} void setupWatchdog () {timer = timerBegin (0, 80, e vërtetë); // timerID 0, div 80 // kohëmatësi, kthimi në telefon, ndërprerja e kohës timerAttachInterrupt (kohëmatësi, & resetModule, e vërtetë); // kohëmatësi, tempo (ne), repetição timerAlarmWrite (kohëmatës, 10000000, e vërtetë); timerAlarmEnable (kohëmatësi); // habilita a interrupção}
Lak
void loop () {timerWrite (kohëmatës, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // kontrolloni mundësinë për të lexuar klientin readFromClient (); // lê os dados do cliente sendToClient (); // envia confirmação para o komplot i klientit (); // mostra o gráfico de histórico de rssi log (); // salva um log no cartão SD}
checkConnection
void checkConnection () {// Se o kliente não estiver conectado if (! client.connected ()) {// Limpa a tela e espera pelo cliente display.fillScreen (ST77XX_BLACK); display.println ("Klienti u shkëput"); waitForClient (); }}
readFromClient
void readFromClient () {// Espera at o kliente enviar algo ou desconectar ndërsa (client.connected () &&! client.available ()) {vonesë (100); } // Se chegou aqui e ainda estiver conectado é porque possui algo para receber do kliente if (client.connected ()) {marrë = client.readStringUntil ('\ n'); // Lê o texto que o kliente enviou marrë. hiqni (marrë.gjatësi ()-1); // Hiqni o / n bëni rssi përfundimtare = client.parseInt (); // Lê o rssi que o cliente enviou clearText (); // Limpa o texto display.setCursor (0, 0); // Lëvizni kursorin për tekst për të ardhur për të shfaqur display.println ("RSSI:" + String (rssi)); // Mostra o RSSI pa ekran.println ("Marrë:" + marrë); // Mostra a mensagem recebida do cliente // Shihni një kuantidadë të barras do gráfico passou do limite apagamos o registro mais antigo if (rssiHistory.size () == (DISPLAY_WIDTH - 2*PLOT_MARGIN)/2) {rssiHistory.erase (rssiHistory).filloj ()); } // Adiciona no final do histórico (mais recente) rssiHistory.push_back (rssi); }}
sendToClient
void sendToClient () {// Se o kliente estiver conectado enviamos de volta a mensagem com um OK nëse (client.connected ()) {String dërgimi = marrë + "OK"; klienti.println (dërgimi); }}
komplot
komplot i pavlefshëm () {// 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 (aktualeX, DISPLAY_HEIGHT - vlera, vlera, PLOT_COLOR); aktualeX += 2;}}
clearText dhe log
void clearText () {// Limpa a comrea 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 nuk ka skedarin përfundimtar të skedarit File = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir ose arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("Hapja e skedarit dështoi"); kthim; } // Gravamos uma linha com o tempo desde o boot, ose rssi atual e a mensagem recebida Të dhënat e vargut = String (millis ()) + ";" + Varg (rssi) + ";" + marrë; file.println (të dhëna); file.close (); }
Hapi 9: Stacioni.ino
Ne kemi përfshirë bibliotekat e nevojshme dhe kemi përcaktuar disa parametra.
#include #include #includ #include #includ #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 pa konfigurim për AP #define PORT 80 // Porta do split. Cilësia e portës së të dhënave është se nuk mund të bëni në arkuivos // Tempo de timeout para shqyrtimit të një përfundimi #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 #cakto PLOT_MARGIN 20 #përcakto PLOT_SIZE (DISPLAY_HEIGHT - 2*PLOT_MARGIN) // Arquivo de log no SD #define FILE_PATH "/log.csv"
Ne përcaktojmë cilësimet që përfshijnë ekranin dhe Kartën SD.
numërim i gjatë = 0; // Contador de mensagens enviadaslong rssi = 0; // RSSI calculado Vargu i marrë; // Mensagem de confirmação que o AP nos envia // Pixel onde ose gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Përdorni për lidhjen me serverin Foleja e klientit; #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 oso nativos (23, 19 e 18 respectivamente) #define SDCARD_CS 15 // Paraqitja e objektit të shfaqjes Adafruit_ST7735 = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_); hw_timer_t *kohëmatës = NULL; // faz o controle do temporizador (interrupção por tempo) // Shfrytëzoj para guardar os ultimos std:: vector rssiHistory;
Konfigurimi
void setup () {setupDisplay (); // Inicializa ose SD nëse (! SD.filloj (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Conecta nuk ka asnjë pikë hyrjeje jashtë ESP32 dhe lidh serverin 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, më shumë orientim dhe limpa një 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 (); Modaliteti WiFi (WIFI_STA); WiFi.filloj (SSID, PASSWORD); display.println ("Lidhja me" + String (SSID)); // Enquanto não estiver conectado à rede WiFi while (WiFi.status ()! = WL_CONNECTED) {vonesë (500); ekran.print ("."); } display.println (""); display.print ("I lidhur me"); display.println (SSID); }
connectToServer
void connectToServer () {display.println ("Po provon lidhjen e prizës"); // Espera a conexão com o server ndërsa (! Socket.connect (HOST, PORT)) {display.print ("."); vonesë (500); } display.println (); display.println ("I lidhur!"); // Tempo máximo que o kliente deve demorar para responder // antes de dizermos que a conexão foi perdida socket.setTimeout (KOHA); }
IRAM_ATTR resetModule dhe setupWatchdog
// funcão que o temporizador irá chamar, para reiniciar o ESP32void IRAM_ATTR resetModule () {ets_printf ("(qen mbrojtës) reiniciar / n"); esp_restart_noos (); // reinicia o chip} void setupWatchdog () {timer = timerBegin (0, 80, e vërtetë); // timerID 0, div 80 // kohëmatësi, kthimi në telefon, ndërprerja e kohës timerAttachInterrupt (kohëmatësi, & resetModule, e vërtetë); // kohëmatësi, tempo (ne), repetição timerAlarmWrite (kohëmatës, 10000000, e vërtetë); timerAlarmEnable (kohëmatësi); // habilita a interrupção}
lak
void loop () {timerWrite (kohëmatës, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // kontrolloni mundësinë për të kontrolluar serverin serverRSSI (); // verifica o rssi plot (); // mostra o gráfico de histórico de rssi sendToServer (); // envia uma mensagem com um contador para ose server readFromServer (); // espera a confirmação do log server (); // salva nuk regjistrohet pa vonesë në 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 u shkëput"); setupWiFi (); vonesa (1000); } // verifikimi i një lidhjeje nëse (! socket.connected ()) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("Foleja e shkëputur"); connectToServer (); vonesë (3000); display.fillScreen (ST77XX_BLACK); }}
checkRSSI
void checkRSSI () {// Verifica o RSSI rssi = WiFi. RSSI (); // Limpa o texto e mostra ose RSSI pa shfaqje 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); }
komplot
komplot i pavlefshëm () {// 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 (aktualeX, DISPLAY_HEIGHT - vlera, vlera, PLOT_COLOR); aktualeX += 2;}}
sendToServer
void sendToServer () {// Se estiver conectado com o server if (socket.connected ()) {// Envia um hello com um contador, shumica nuk shfaqet dhe shtohet në kontador Dërgimi i vargut = "Përshëndetje" + String (numërim); display.setCursor (0, 10); display.println ("Dërgimi:" + dërgimi); socket.println (dërgimi); socket.print (String (rssi)); numëroni ++; }}
readFromServer
i pavlefshëm readFromServer () {// Espera ose server në të gjitha anët e desconectar ndërsa (socket.connected () &&! socket.available ()) {vonesë (100); } // Se tem algo para receber if (socket.available ()) {// Faz a leitura, fshini o / n në fund e mostra asnjë ekran nuk është marrë = socket.readStringUntil ('\ n'); marrë. heq (marrë. gjatësi ()-1); display.println ("Marrë:" + marrë); }}
clearText dhe 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 nuk ka skedarin përfundimtar të skedarit File = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramas uma mensagem de erro if (! File) {Serial.println ("Hapja e skedarit dështoi"); kthim; } // Gravamos uma linha com o tempo desde o boot, ose rssi atual e a mensagem recebida Të dhënat e vargut = String (millis ()) + ";" + Varg (rssi) + ";" + marrë; file.println (të dhëna); file.close (); }
Hapi 10: Skedarët
Shkarkoni skedarët:
INO
Recommended:
HC-12 Stacioni i motit në distancë me rreze të gjatë dhe sensorët DHT: 9 hapa
HC-12 Stacioni i motit me distanca të largëta dhe sensorët DHT: Në këtë tutorial ne do të mësojmë se si të bëjmë një stacion moti në distancë të largët duke përdorur dy sensorë dht, module HC12 dhe Ekran LCD I2C. Shikoni videon
IoT- Ubidots- ESP32+Sensori me rreze të gjatë-Wireless-Dhe-Temperatura: 7 hapa
IoT- Ubidots- ESP32+Sensori me rreze të gjatë-Wireless-Dhe-Temperatura: Dridhja është me të vërtetë një lëvizje-ose-lëkundje-e makinave dhe përbërësve në pajisjet e motorizuara. Dridhja në sistemin industrial mund të jetë një simptomë ose motiv i një sherri, ose mund të shoqërohet me funksionimin e përditshëm. Për shembull, osci
Krijoni një HDD të Jashtme Nga CD/RW e Jashtme e Vjetër: 5 Hapa
Krijoni një HDD të Jashtme Nga CD/RW e Jashtme e Vjetër: Shndërrim mjaft i drejtpërdrejtë i një cd/rw të vjetër të jashtëm në një hard disk të jashtëm më të dobishëm. Furnizimet 1-cd/rw e jashtme (mundësisht lloji më i kutisë) 1-hard disk (duhet të përputhet me lidhësin e brendshëm të kutisë së diskut, duhet të jetë i formatuar/sistemuar) 1-sm
Modifikoni një modem radio Ricochet për të marrë një antenë të jashtme: 8 hapa
Modifikoni një Modem Radio Rikoshet për të marrë një Antenë të Jashtme: Produkt i një modeli biznesi të kohës së tij të parë, modemët Ricochet janë teknologji e shkëlqyer me një çmim çuditërisht të ulët. Ato veprojnë njësoj si modemët e zakonshëm, por me një shtresë RF në vend të një linje telefonike. Ndërtoni serverin tuaj të hyrjes me dial, kontrolloni një
Antenë e jashtme Bluetooth për një gamë të shtuar !: 4 hapa
Antenë e jashtme Bluetooth për një gamë të shtuar !: Doja të dëgjoja ndonjë bluetooth në Starbucks -in tim lokal! por diapazoni i antenës në shumicën e dongleve bluetooth është aq i shkurtër. kështu që më duhej të rrisja gamën! Këtu është udhëtimi im epik për ta bërë këtë. Kjo ide e përmasave të mrekullueshme është nga kjo faqe në internet