Innholdsfortegnelse:
- Trinn 1: Montering av AP med Wrover
- Trinn 2: Montering av STATION med TTGO
- Trinn 3: RESULTAT
- Trinn 4: Arkiv LOG.CSV
- Trinn 5: Adafruit GFX -bibliotek
- Trinn 6: Adafruit ST7735 bibliotek
- Trinn 7: Konfigurering av kortene
- Trinn 8: AP.ino
- Trinn 9: Station.ino
- Trinn 10: Filer
Video: ESP32 med ekstern langdistanseantenne: 10 trinn
2024 Forfatter: John Day | [email protected]. Sist endret: 2024-01-30 11:24
Dagens tema gjelder en avstandstest med en ESP32 med ekstern antenne. La oss bruke to moduler i dag: fra Espressif og TTGO. La oss deretter sjekke RSSI mellom disse to ESP32 -antennene, generere en graf fra loggen og skrive en logg over verdiene i en.csv -fil.
Vi har da ESP32 Wrover som AP, og ESP32 til TTGO som stasjon. Jeg brukte en antenne som jeg tok fra en litt større TP-Link og en annen ruter kjent som en 9dbm antenne. Jeg har ikke merket noen forskjell mellom de to.
Til slutt kobler de to mikrokontrollerne seg via en kontakt, og med hver sending av datapakker skriver vi ut en graf med en stolpe som viser forholdet mellom dbm på en skjerm.
Trinn 1: Montering av AP med Wrover
Trinn 2: Montering av STATION med TTGO
Trinn 3: RESULTAT
Maksimal avstand med 2x eksterne antenner: 315 meter
Maksimal avstand med ekstern og intern antenne: 157 meter
Trinn 4: Arkiv LOG. CSV
Jeg registrerte dataene på et SD -kort, med data i millis, dbm og pakkestrengen.
Trinn 5: Adafruit GFX -bibliotek
I Arduino IDE, gå til Skisse-> Inkluder bibliotek-> Administrer biblioteker …
Installer Adafruit GFX Library
Trinn 6: Adafruit ST7735 bibliotek
I Arduino IDE, gå til Sketch-> Include Library-> Manage Libraries …
Installer Adafruit ST7735
Trinn 7: Konfigurering av kortene
Følg med på forskjeller:
Trinn 8: AP.ino
Vi har inkludert de nødvendige bibliotekene og definert noen parametere.
#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 for a conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHTes 128 // Configuration 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.sv"
Vi definerer pinnene, blant andre variabler
// Pinos viser #definere 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 server (qualquer porta válida serve contanto que o cliente use a mesma porta) WiFiServer server (80); // Variável para armazenar o cliente (no caso o ESP32 em modo station) conectado WiFiClient client; // String que recebemos do cliente String received; // RSSI enviado pelo cliente para este ESP32 long rssi = 0; // Faz o control do temporizador (interrupção por tempo) hw_timer_t *timer = NULL; // Utilizado para guardar os ultimos std:: vector rssiHistory;
Oppsett
ugyldig oppsett () {Serial.begin (115200); setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Cria a rede WiFi, offisiell server eller e -server eller klientoppsettWiFi (); server.begin (); waitForClient (); // Espera 3 segundos, limpa a tela e inicializa o Watchdog delay (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }
Sett opp WiFi
// Cria um Access Point e configura o IPvoid setupWiFi () {display.println ("Creating softAP" + String (SSID)); WiFi. Koble fra (); WiFi.mode (WIFI_AP); WiFi.softAPConfig (IPAddress (192, 168, 0, 1), IPAddress (192, 168, 0, 1), IPAddress (255, 255, 255, 0)); WiFi.softAP (SSID, PASSORD); display.println ("softAP" + streng (SSID) + "opprettet!"); }
Oppsett Display
// Incializa o display, muda a orientação e limpa a telavoid setupDisplay () {// Inicializa 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 ("Venter på klient"); // Aguarda o cliente conectar while (! (Client = server.available ())) {display.print ("."); forsinkelse (500); } display.println ("Klient tilkoblet"); // 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 og 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); // timer, tempo (us), repetição timerAlarmWrite (timer, 10000000, true); timerAlarmEnable (timer); // habilita a interrupção}
Løkke
void loop () {timerWrite (timer, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // checa se possui conexão com o cliente readFromClient (); // les oss 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 ("Klient frakoblet"); 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 ()) {received = client.readStringUntil ('\ n'); // Lê o texto que o cliente enviou received.remove (received.length ()-1); // Fjern o / n gjør siste rssi = client.parseInt (); // Lê o rssi que o cliente enviou clearText (); // Limpa o texto display.setCursor (0, 0); // Flytt markøren til tekst for å vise display.println ("RSSI:" + String (rssi)); // Mostra o RSSI no display display.println ("Mottatt:" + mottatt); // 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.begynne()); } // 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 sending = received + "OK"; client.println (sender); }}
plott
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 - verdi, verdi, PLOT_COLOR); currentX += 2;}}
clearText og logg
void clearText () {// Lima arearea com text of 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 ("Kunne ikke åpne filen"); komme tilbake; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + String (rssi) + ";" + mottatt; file.println (data); file.close (); }
Trinn 9: Station.ino
Vi har inkludert de nødvendige bibliotekene og definert noen parametere.
#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 considerar a conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // Configurações de cor, margem e taman #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"
Vi definerer innstillingene som involverer skjermen og SD -kortet.
lang telling = 0; // Contador de mensagens enviadaslong rssi = 0; // RSSI calculado String mottatt; // Mensagem de confirmmação que o AP nos envia // Pixel onde o gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Utilizado for conexão com o server WiFiClient socket; #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 responsável pelo display Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLR,); hw_timer_t *timer = NULL; // faz o control do temporizador (interrupção por tempo) // Utilizado para guardar os ultimos std:: vector rssiHistory;
Oppsett
ugyldig oppsett () {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 e limpa a telavoid setupDisplay () {// Inicializa 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. Begynner (SSID, PASSORD); display.println ("Koble til" + streng (SSID)); // Enquanto não estiver conectado à rede WiFi while (WiFi.status ()! = WL_CONNECTED) {delay (500); display.print ("."); } display.println (""); display.print ("Koblet til"); display.println (SSID); }
connectToServer
void connectToServer () {display.println ("Prøver stikkontakt"); // Espera a conexão com o server while (! Socket.connect (HOST, PORT)) {display.print ("."); forsinkelse (500); } display.println (); display.println ("Tilkoblet!"); // 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 og 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); // timer, tempo (us), repetição timerAlarmWrite (timer, 10000000, true); timerAlarmEnable (timer); // habilita a interrupção}
Løkke
void loop () {timerWrite (timer, 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 for server readFromServer (); // espera a confirmmação do server log (); // salva um log no cartão SD forsinkelse (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 frakoblet"); setupWiFi (); forsinkelse (1000); } // verifica a conexão do socket if (! socket.connected ()) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("Socket frakoblet"); connectToServer (); forsinkelse (3000); display.fillScreen (ST77XX_BLACK); }}
sjekkRSSI
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:" + streng (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); }
plott
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 - verdi, verdi, 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 sending = "Hello" + String (count); display.setCursor (0, 10); display.println ("Sender:" + sending); socket.println (sender); socket.print (String (rssi)); telle ++; }}
readFromServer
void readFromServer () {// Espera até o server 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 received = socket.readStringUntil ('\ n'); mottatt.fjerne (mottatt.lengde ()-1); display.println ("Mottatt:" + mottatt); }}
clearText og logg
void clearText () {// Lima arearea com text of 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 ("Kunne ikke åpne filen"); komme tilbake; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + String (rssi) + ";" + mottatt; file.println (data); file.close (); }
Trinn 10: Filer
Last ned filene:
INO
Anbefalt:
Ekstern VGA / GPU for bærbare datamaskiner som bruker EXP GDC Beast: 15 trinn (med bilder)
Ekstern VGA / GPU for bærbare datamaskiner som bruker EXP GDC Beast: Hei gutter .. Dette er min første opplæring om instrukser. Engelsk er ikke mitt morsmål, så tilgi mine grammatiske feil. Jeg lagde dette basert på min erfaring med å oppgradere min bærbare. Og jeg kommer ikke til å kjede deg med lang introduksjon siden jeg vet nei
Fra gammel bærbar datamaskin til ekstern skjerm med digital TV: 6 trinn
Fra gammel bærbar datamaskin til ekstern skjerm med digital -TV: Har du noen gang lurt på hva du skal gjøre med den gamle bærbare datamaskinen eller skjermen som ligger? I denne instruksen skal jeg vise deg hvordan du gjør din gamle bærbare eller gamle skjerm som ikke har HDMI -porter til en ekstern skjerm med HDMI, AV, kompositt
Frittstående Arduino 3.3V W / ekstern 8 MHz klokke som programmeres fra Arduino Uno gjennom ICSP / ISP (med seriell overvåking!): 4 trinn
Frittstående Arduino 3.3V W / ekstern 8 MHz -klokke som programmeres fra Arduino Uno gjennom ICSP / ISP (med seriell overvåking!): Mål: Å bygge en frittstående Arduino som kjører på 3.3V fra en 8 MHz ekstern klokke. For å programmere den via ISP (også kjent som ICSP, seriell programmering i krets) fra en Arduino Uno (kjører på 5V) For å redigere bootloader-filen og brenne
Installere Windows på ekstern stasjon med Mac -partisjon på Mac: 5 trinn (med bilder)
Installere Windows på ekstern stasjon med Mac -partisjon på Mac: Hvis du har kjøpt noe som en baseline MacBook pro og spart litt penger, men så snart slo med lagringsproblemet når du prøver å installere Windows ved hjelp av Bootcamp Vi vet alle at 128 gb ikke er nok disse, så vi kan ha kjøpt noe
Lag en ekstern harddisk fra gammel ekstern CD/RW: 5 trinn
Lag en ekstern harddisk fra gammel ekstern CD/RW: Ganske rett fremover konvertering av en gammel ekstern cd/rw til en mer nyttig ekstern harddisk. Rekvisita 1-ekstern cd/rw (helst den mer boksete typen) 1-harddisk (må stemme overens med den interne kontakten på stasjonshuset, må formateres/syses) 1-sm