Sisällysluettelo:
- Vaihe 1: Tukiaseman asennus Wroverin avulla
- Vaihe 2: ASEMAN asentaminen TTGO: n kanssa
- Vaihe 3: TULOS
- Vaihe 4: Arkistoi LOG.CSV
- Vaihe 5: Adafruit GFX -kirjasto
- Vaihe 6: Adafruit ST7735 -kirjasto
- Vaihe 7: Korttien määrittäminen
- Vaihe 8: AP.ino
- Vaihe 9: Station.ino
- Vaihe 10: Tiedostot
Video: ESP32 ulkoisella pitkän matkan antennilla: 10 vaihetta
2024 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2024-01-30 09:02
Tämän päivän aihe koskee etätestiä ESP32: lla ulkoisella antennilla. Käytämme tänään kahta moduulia: Espressifistä ja TTGO: sta. Tarkistetaan sitten RSSI näiden kahden ESP32 -antennin välillä, luodaan kaavio historiasta ja kirjoitetaan loki arvoista.csv -tiedostoon.
Meillä on sitten ESP32 Wrover AP: na ja TTGO: n ESP32 asemana. Käytin antennia, jonka otin hieman isommasta TP-Linkistä ja toisesta reitittimestä, joka tunnetaan 9 dBm: n antennina. En ole huomannut eroa näiden kahden välillä.
Lopuksi kaksi mikro -ohjainta muodostavat yhteyden pistorasian kautta ja jokaisen datapakettien lähetyksen yhteydessä tulostamme näytölle kaavion, jossa on palkit, jotka ilmaisevat dbm -suhteen.
Vaihe 1: Tukiaseman asennus Wroverin avulla
Vaihe 2: ASEMAN asentaminen TTGO: n kanssa
Vaihe 3: TULOS
Suurin etäisyys 2x ulkoisella antennilla: 315 metriä
Suurin etäisyys ulkoisen ja sisäisen antennin kanssa: 157 metriä
Vaihe 4: Arkistoi LOG. CSV
Tallensin tiedot SD -kortille, tiedot millisekunteina, dbm ja paketin merkkijono.
Vaihe 5: Adafruit GFX -kirjasto
Siirry Arduino IDE: ssä Sketch-> Include Library-> Manage Libraries…
Asenna Adafruit GFX -kirjasto
Vaihe 6: Adafruit ST7735 -kirjasto
Siirry Arduino IDE: ssä Sketch-> Include Library-> Manage Libraries…
Asenna Adafruit ST7735
Vaihe 7: Korttien määrittäminen
Pysy kuulolla eroista:
Vaihe 8: AP.ino
Olemme sisällyttäneet tarvittavat kirjastot ja määrittäneet joitain parametreja.
#include #include #include #include #include #include // Rede que o ESP criará. No Station deve ser igual #define SSID "RSSI_Test" #define SALASANA "87654321" // Tempo de timeout para conrarara a conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEURIS 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_PATH "/log.cs
Määritämme nastat muiden muuttujien joukossa
// Pinos näyttävät #määrittävät 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 or gráfico começaa horizontalmente int currentX = PLOT_MARGIN; // Objektivastaus pelonäyttö Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST); // Criamos um -palvelin (laadukas portti vaihtoehtona palvella contanto que tai asiakas käyttää mesma -porttia) WiFiServer -palvelin (80); // Variável para armazenar o cliente (no caso o ESP32 em modo station), jossa on WiFiClient -asiakas; // String que recebemos do cliente Merkkijono vastaanotettu; // RSSI enviado pelo cliente para este ESP32 long rssi = 0; // Faz o controle do temporizador (keskeytys tempo) hw_timer_t *timer = NULL; // Utilizado para guardar os ultimos std:: vector rssiHistory;
Perustaa
void setup () {Serial.begin (115200); setupDisplay (); // Inicializa tai SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Luo Wi -Fi, aloita tai palvelin ja espera tai asiakasyhteys setupWiFi (); server.begin (); waitForClient (); // Espera 3 segmenttiä, limpa a tela e inicializa o Watchdog delay (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }
Määritä WiFi
// Cria um Access Point ja IPvoid setupWiFi () {display.println ("SoftAP: n luominen" + merkkijono (SSID)); WiFi. Irrota (); WiFi.mode (WIFI_AP); WiFi.softAPConfig (IPAddress (192, 168, 0, 1), IPAddress (192, 168, 0, 1), IPAddress (255, 255, 255, 0)); WiFi.softAP (SSID, SALASANA); display.println ("softAP" + merkkijono (SSID) + "luotu!"); }
Asetusnäyttö
// Incializa o display, muda a orientação e limpa a telavoid setupDisplay () {// Inicializa o display display.initR (INITR_BLACKTAB); // Rotaciona o conteúdo mostrado display.setRotation (3); // Pinta tela de preto display.fillScreen (ST77XX_BLACK); }
waitForClient
void waitForClient () {display.println ("Odotetaan asiakasta"); // Aguarda o cliente conectar while (! (Client = server.available ())) {display.print ("."); viive (500); } display.println ("Asiakas yhdistetty"); // 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 and 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); // ajastin, tempo (us), repetição timerAlarmWrite (ajastin, 10000000, tosi); timerAlarmEnable (ajastin); // habilita a interrupção}
Silmukka
void loop () {timerWrite (ajastin, 0); // reseta o temporizador (alimenta tai watchdog) checkConnection (); // checa se possui conexão com o cliente readFromClient (); // lê 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 ("Asiakas katkaistu"); 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 ()) {got = client.readStringUntil ('\ n'); // Lê o texto que o cliente enviou gavo.remove (vastaanotettu.pituus ()-1); // Poista o / n tee lopullinen rssi = client.parseInt (); // Lê o rssi que o cliente enviou clearText (); // Limpa tai texto display.setCursor (0, 0); // Siirrä kohdistinta tekstin mukaan tai tule näyttöön.println ("RSSI:" + Jono (rssi)); // Mostra tai RSSI ilman näyttöä.println ("Vastaanotettu:" + vastaanotettu); // Mostra a mensagem recebida do cliente // Katso quantidade de barras do gráfico passou do limite apagamos o registerro mais antigo if (rssiHistory.size () == (DISPLAY_WIDTH - 2*PLOT_MARGIN)/2) {rssiHistory.erase (rssiHistory.alkaa()); } // Näyttö ei lopullista historiaa (mais recente) rssiHistory.push_back (rssi); }}
sendToClient
void sendToClient () {// Jos asiakas on estiver conectado enviamos de volta a mensagem com um OK if (client.connected ()) {Jono lähetys = vastaanotettu + "OK"; client.println (lähetys); }}
juoni
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 - arvo, arvo, PLOT_COLOR); currentX += 2;}}
clearText ja log
void clearText () {// Limpa ja alue com tai 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 Tiedostotiedosto = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("Tiedoston avaaminen epäonnistui"); palata; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + Jono (rssi) + ";" + vastaanotettu; tiedosto.println (data); file.close (); }
Vaihe 9: Station.ino
Olemme sisällyttäneet tarvittavat kirjastot ja määrittäneet joitain parametreja.
#Sisällytä #Sisällytä #Sisällytä #Sisällytä #Sisällytä #Sisällytä // Nome da rede que nos conectaremos. Criado pelo AP #define SSID "RSSI_Test" #define SALASANA "87654321" #define HOST "192.168.0.1" // IP que foi configurarado 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 harkitsee a conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // Configurações de cor, mar do e #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"
Määritämme näytön ja SD -kortin asetukset.
pitkä luku = 0; // Contador de mensagens enviadaslong rssi = 0; // RSSI calculado Merkkijono vastaanotettu; // Mensagem de confirmação que o AP nos envia // Pixel onde tai gráfico começaa horizontalmente int currentX = PLOT_MARGIN; // Yhteyden käyttö palvelimen WiFiClient -pistorasiaan; #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 // Objektiivinen vastaus pelonäyttö Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CL hw_timer_t *ajastin = NULL; // faz o controle do temporizador (interrupção por tempo) // Utilizado para guardar os ultimos std:: vector rssiHistory;
Perustaa
void setup () {setupDisplay (); // Inicializa tai SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Conecta ei tukiasemaa criado pelo outro ESP32 e conecta ao server setupWiFi (); connectToServer (); // Espera 3 segmenttiä, 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 e limpa a telavoid setupDisplay () {// Inicializa o display display.initR (INITR_BLACKTAB); // Rotaciona o conteúdo mostrado display.setRotation (1); // Pinta tela de branco display.fillScreen (ST77XX_BLACK); display.setTextColor (ST77XX_WHITE); }
Wi -Fi -asetukset
// Conecta ao AP void setupWiFi () {WiFi.disconnect (); WiFi.mode (WIFI_STA); WiFi.binin (SSID, SALASANA); display.println ("Yhdistäminen" + merkkijono (SSID)); // Enquanto não estiver conectado à rede WiFi while (WiFi.status ()! = WL_CONNECTED) {delay (500); display.print ("."); } display.println (""); display.print ("Yhdistetty"); display.println (SSID); }
connectToServer
void connectToServer () {display.println ("Yritetään pistorasiayhteyttä"); // Esperaa yhteyspalvelin, kun (! Socket.connect (HOST, PORT)) {display.print ("."); viive (500); } display.println (); display.println ("Yhdistetty!"); // 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 and 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); // ajastin, tempo (us), repetição timerAlarmWrite (ajastin, 10000000, tosi); timerAlarmEnable (ajastin); // habilita a interrupção}
silmukka
void loop () {timerWrite (ajastin, 0); // reseta o temporizador (alimenta tai 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 or server readFromServer (); // espera a confirmação do server log (); // salva um log no cartão SD delay (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 katkaistu"); setupWiFi (); viive (1000); } // verifica a conexão do socket if (! socket.connected ()) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("Pistorasia irrotettu"); connectToServer (); viive (3000); display.fillScreen (ST77XX_BLACK); }}
checkRSSI
void checkRSSI () {// Verifica tai RSSI rssi = WiFi. RSSI (); // Limpa o texto e mostra o RSSI no display clearText (); display.setCursor (0, 0); display.print ("RSSI:" + Jono (rssi)); // Katso kvantidide de barras do gráfico passou do limite apagamos o registerro anti anti if if (rssiHistory.size () == (DISPLAY_WIDTH - 2*PLOT_MARGIN)/2) {rssiHistory.erase (rssiHistory.begin ()); } // Näyttö ei lopullista historiaa (mais recente) rssiHistory.push_back (rssi); }
juoni
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 - arvo, arvo, PLOT_COLOR); currentX += 2;}}
sendToServer
void sendToServer () {// Katso palvelimen yhteys, jos (socket.connected ()) {// Envia um hei com um contador, mostra no display e lisäykset tai contador String send = "Hei" + String (count); display.setCursor (0, 10); display.println ("Lähetetään:" + lähetetään); socket.println (lähetys); socket.print (Jono (rssi)); laskea ++; }}
readFromServer
void readFromServer () {// Espera até tai palvelin enviar algo ou 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 gavo = socket.readStringUntil ('\ n'); vastaanotettu.poista (vastaanotettu.pituus ()-1); display.println ("Vastaanotettu:" + vastaanotettu); }}
clearText ja log
void clearText () {// Limpa ja alue com tai 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 Tiedostotiedosto = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! File) {Serial.println ("Tiedoston avaaminen epäonnistui"); palata; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + Jono (rssi) + ";" + vastaanotettu; tiedosto.println (data); file.close (); }
Vaihe 10: Tiedostot
Lataa tiedostot:
INO
Suositeltava:
DIY pitkän matkan paras ystävävalot: 4 vaihetta (kuvilla)
DIY Long Distance Best Friend Lights: Tein pitkän matkan synkronoidut valot, jotka tunnetaan nimellä "Paras ystävä". lamput. Tämä tarkoittaa vain sitä, että ne pidetään synkronoituna toisen lampun nykyisen värin kanssa. Joten jos vaihdat yhden lampun vihreäksi, pian sen jälkeen toinen lamppu muuttuu vihreäksi
Pitkän matkan voimansiirtojärjestelmän piiri: 6 vaihetta
Pitkän matkan siirtojärjestelmäpiiri: Tänään tässä artikkelissa puhumme siitä, kuinka tehdä pitkän kantaman lähetysjärjestelmän peruspiiri. Näillä linjoilla haluan antaa teille lyhyen kuvauksen piiristä. Kuinka yleisesti tämä toimii ja miten puhun teille al
ARDUINO: SERVO -MOOTTORIN KÄYTTÄMINEN ULKOISELLA TEHOLLA: 5 vaihetta
ARDUINO: PALVELIMOOTTORIN KÄYTTÄMINEN ULKOISELLA TEHOLLA: Tämä ohje on kirjallinen versio "Arduino: Servomoottorin käyttämisestä ulkoisella teholla" Äskettäin lataamani YouTube -video. Suosittelen lämpimästi tarkistamaan sen. Käy YouTube -kanavalla
Virta matkapuhelimelle/matkapuhelimelle ulkoisella akulla tai verkkovirralla: 3 vaihetta
Kytke virta matkapuhelimeen/matkapuhelimeen ulkoisella akulla tai verkkovirralla: Johdanto. Tämä idea toimii vain puhelimien tai tablettien kanssa, jos akku on irrotettava. Napaisuuden tarkkailu on tietysti tärkeää. Varo vahingoittamasta laitettasi huolimattomuudesta. Jos olet epävarma kyvystäsi tehdä tämä
Raspberry Pi Zero Wifi -yhteyspiste mukautetulla PCB -antennilla: 6 vaihetta (kuvilla)
Raspberry Pi Zero Wifi -yhteyspiste mukautetulla PCB -antennilla: Mitä teemme? Tämän opetusohjelman otsikossa on paljon teknisiä termejä. Hajotetaan se. Mikä on Raspberry Pi Zero (Rπ0)? Raspberry Pi Zero on pieni tietokone. Se on pienempi versio Raspberry Pi -levytietokoneesta