Satura rādītājs:
- 1. solis: AP uzstādīšana ar Wrover
- 2. solis: STATION montāža ar TTGO
- 3. solis: REZULTĀTS
- 4. darbība: arhivējiet LOG.CSV
- 5. darbība: Adafruit GFX bibliotēka
- 6. darbība: bibliotēka Adafruit ST7735
- 7. darbība: karšu konfigurēšana
- 8. darbība: AP.ino
- 9. solis: Station.ino
- 10. darbība: faili
Video: ESP32 ar ārējo tālsatiksmes antenu: 10 soļi
2024 Autors: John Day | [email protected]. Pēdējoreiz modificēts: 2024-01-30 10:56
Šodienas tēma attiecas uz distances pārbaudi ar ESP32 ar ārējo antenu. Šodien izmantosim divus moduļus: no Espressif un TTGO. Pēc tam pārbaudīsim RSSI starp šīm divām ESP32 antenām, ģenerēsim diagrammu no vēstures un ierakstīsim vērtību žurnālu.csv failā.
Pēc tam mums ir ESP32 Wrover kā AP un TTGO ESP32 kā stacija. Es izmantoju antenu, kuru paņēmu no nedaudz lielāka TP-Link un cita maršrutētāja, kas pazīstams kā 9 dB antena. Es neesmu pamanījis atšķirību starp abiem.
Visbeidzot, divi mikrokontrolleri izveido savienojumu, izmantojot kontaktligzdu, un ar katru datu pakešu nosūtīšanu mēs displejā izdrukājam grafiku ar joslām, kas norāda dbm attiecību.
1. solis: AP uzstādīšana ar Wrover
2. solis: STATION montāža ar TTGO
3. solis: REZULTĀTS
Maksimālais attālums ar 2x ārējām antenām: 315 metri
Maksimālais attālums ar ārējo un iekšējo antenu: 157 metri
4. darbība: arhivējiet LOG. CSV
Es ierakstīju datus SD kartē, datus milis, dbm un iepakojuma virknē.
5. darbība: Adafruit GFX bibliotēka
Arduino IDE dodieties uz Skice-> Iekļaut bibliotēku-> Pārvaldīt bibliotēkas …
Instalējiet Adafruit GFX bibliotēku
6. darbība: bibliotēka Adafruit ST7735
Arduino IDE dodieties uz Skice-> Iekļaut bibliotēku-> Pārvaldīt bibliotēkas …
Instalējiet Adafruit ST7735
7. darbība: karšu konfigurēšana
Sekojiet līdzi atšķirībām:
8. darbība: AP.ino
Mēs esam iekļāvuši nepieciešamās bibliotēkas un definējuši dažus parametrus.
#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 conrarar a conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEURIGHT 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
Starp citiem mainīgajiem mēs definējam tapas
// 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. un 18. cien.) #Define SDCARD_CS 15 // Pixel onde or gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Objeto atbildes līmeņa pelo displejs Adafruit_ST7735 displejs = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST); // Criamos um server (qualquer porta válida serve contanto que o cliente utilize a mesma porta) WiFiServer server (80); // Variável para armazenar o cliente (no caso vai ESP32 em modo station) ar WiFiClient klientu; // String que recebemos do cliente String saņēma; // RSSI enviado pelo cliente para este ESP32 long rssi = 0; // Faz o controle do temporizador (interruptção por tempo) hw_timer_t *timer = NULL; // Utilizado para guardar os ultimos std:: vector rssiHistory;
Uzstādīt
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, inicializa o server e espera or cliente 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 (); }
Iestatiet WiFi
// Cria um Access Point e configura o IPvoid setupWiFi () {display.println ("SoftAP izveide" + virkne (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" + virkne (SSID) + "izveidots!"); }
Iestatīšanas displejs
// 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 a tela de preto display.fillScreen (ST77XX_BLACK); }
waitForClient
void waitForClient () {display.println ("Gaida klientu"); // Aguarda o cliente conectar while (! (Client = server.available ())) {display.print ("."); kavēšanās (500); } display.println ("Klients pievienots"); // 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 ("(sargsuns) reiniciar / n"); esp_restart_noos (); // reinicia o chip} void setupWatchdog () {timer = timerBegin (0, 80, true); // timerID 0, div 80 // taimeris, atzvanīšana, pārtraukums timerAttachInterrupt (taimeris, & resetModule, true); // taimeris, temps (us), repetição timerAlarmWrite (taimeris, 10000000, true); timerAlarmEnable (taimeris); // habilita a interrupção}
Cilpa
void loop () {timerWrite (taimeris, 0); // reseta o temporizador (alimenta o 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 () {// Skatiet klienta tiesības, ja (! client.connected ()) {// Limpa a tela e espera pelo cliente display.fillScreen (ST77XX_BLACK); display.println ("Klients atvienots"); 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 ()) {saņēmis = client.readStringUntil ('\ n'); // Lê o texto que o cliente enviou got.remove (saņēmis.garums ()-1); // Noņemt o / n do final rssi = client.parseInt (); // Lê o rssi que o cliente enviou clearText (); // Limpa vai teksta displejs.setCursor (0, 0); // Pārvietot vai pārvietot kursoru, lai parādītu displeja displeju.println ("RSSI:" + String (rssi)); // Mostra o RSSI nav displeja displeja.println ("Saņemts:" + saņemts); // 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.sākt ()); } // Adiciona no final do histórico (mais recente) rssiHistory.push_back (rssi); }}
sendToClient
void sendToClient () {// Skatiet klienta estiver conectado enviamos de volta a mensagem com um OK if (client.connected ()) {String sent = saņēma + "OK"; client.println (sūtīšana); }}
sižets
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 - vērtība, vērtība, PLOT_COLOR); currentX += 2;}}
clearText un žurnāls
void clearText () {// Ierobežojums un teksta daļa, lai parādītu klientu displeju.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 ("Neizdevās atvērt failu"); atgriešanās; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + Stīga (rssi) + ";" + saņēma; file.println (dati); file.close (); }
9. solis: Station.ino
Mēs esam iekļāvuši nepieciešamās bibliotēkas un definējuši dažus parametrus.
#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 harkita a conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // Configurações de de cor do mar, 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ēs definējam iestatījumus, kas saistīti ar displeju un SD karti.
garš skaitlis = 0; // Contador de mensagens enviadaslong rssi = 0; // RSSI calculado String saņemts; // Mensagem de confirmação que o AP nos envia // Pixel onde vai gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Utilizado para conexão com vai servera WiFiClient ligzda; #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. un 18. cien.) #Define SDCARD_CS 15 // Objekta atbilde pelo displejs Adafruit_ST7735 display = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CL hw_timer_t *taimeris = NULL; // faz o controle do temporizador (interruptção por tempo) // Utilizado para guardar os ultimos std:: vector rssiHistory;
Uzstādīt
void setup () {setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Conecta nav piekļuves punkta 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 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 ("Savienojuma izveide ar" + virkne (SSID)); // Enquanto não estiver conectado à rede WiFi while (WiFi.status ()! = WL_CONNECTED) {delay (500); display.print ("."); } display.println (""); display.print ("Savienots ar"); display.println (SSID); }
connectToServer
void connectToServer () {display.println ("Mēģina izveidot savienojumu"); // Espera a conexão com o server while (! Socket.connect (HOST, PORT)) {display.print ("."); kavēšanās (500); } display.println (); display.println ("Savienots!"); // 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 ("(sargsuns) reiniciar / n"); esp_restart_noos (); // reinicia o chip} void setupWatchdog () {timer = timerBegin (0, 80, true); // timerID 0, div 80 // taimeris, atzvanīšana, pārtraukums timerAttachInterrupt (taimeris, & resetModule, true); // taimeris, temps (us), repetição timerAlarmWrite (taimeris, 10000000, true); timerAlarmEnable (taimeris); // habilita a interrupção}
cilpa
void loop () {timerWrite (taimeris, 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 kavēšanās (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 atvienots"); setupWiFi (); kavēšanās (1000); } // verifica a conexão do socket if (! socket.connected ()) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("Atvienota kontaktligzda"); connectToServer (); kavēšanās (3000); display.fillScreen (ST77XX_BLACK); }}
checkRSSI
void checkRSSI () {// Verifica vai RSSI rssi = WiFi. RSSI (); // Limpa o texto e mostra o RSSI no display clearText (); display.setCursor (0, 0); display.print ("RSSI:" + virkne (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); }
sižets
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 - vērtība, vērtība, PLOT_COLOR); currentX += 2;}}
sendToServer
void sendToServer () {// Skatiet servera savienojumu, ja (socket.connected ()) {// Envia um hello com um contador, mostra no display and pieaugums o contador String sent = "Sveiki" + String (count); display.setCursor (0, 10); display.println ("Sūta:" + sūtīšana); socket.println (sūtīšana); socket.print (String (rssi)); skaitīt ++; }}
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 saņēma = socket.readStringUntil ('\ n'); saņēmis.noņemt (saņēmis.garums ()-1); display.println ("Saņemts:" + saņemts); }}
clearText un žurnāls
void clearText () {// Ierobežojums un teksta daļa, lai parādītu klientu displeju.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 ("Neizdevās atvērt failu"); atgriešanās; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + Stīga (rssi) + ";" + saņēma; file.println (dati); file.close (); }
10. darbība: faili
Lejupielādējiet failus:
ES NĒ
Ieteicams:
DIY tālsatiksmes labāko draugu gaismas: 4 soļi (ar attēliem)
DIY tālsatiksmes labāko draugu gaismas: es izveidoju sinhronizētas tālsatiksmes gaismas, kas pazīstamas kā "Labākais draugs"; lampas. Tas nozīmē tikai to, ka tie tiek sinhronizēti ar citas lampas pašreizējo krāsu. Tātad, ja jūs mainītu vienu lampu zaļā krāsā, neilgi pēc tam, kad otra lampiņa kļūtu gaiša
Tālsatiksmes pārvades sistēmas ķēde: 6 soļi
Tālsatiksmes pārvades sistēmas ķēde: Šodien šajā rakstā mēs runāsim par to, kā izveidot pamata tālsatiksmes pārvades sistēmas ķēdi. Šajā sakarā ļaujiet man sniegt īsu ķēdes attēlojumu. Cik vispārīgi tas darbojas un kā es runāju ar jums
Gaisa kvalitātes monitors ar MQ135 un ārējo temperatūras un mitruma sensoru virs MQTT: 4 soļi
Gaisa kvalitātes monitors ar MQ135 un ārējo temperatūras un mitruma sensoru virs MQTT: tas ir paredzēts pārbaudes nolūkiem
Kā pievienot ārējo bibliotēku Arduino: 3 soļi
Kā pievienot ārējo bibliotēku Arduino: Bibliotēka nodrošina papildu funkcijas mūsu izveidotajai skicei. Šīs funkcijas var palīdzēt mums vienkāršot skices. Mēs varam izmantot daudzas bibliotēkas. Arduino IDE noklusējuma bibliotēka vai ārējā bibliotēka, ko izveidojis kāds vai kopiena. Šajā
Pievienojiet ārējo cieto disku Android viedtālrunim: 7 soļi
Savienojiet ārējo cieto disku ar Android viedtālruni: mūsdienās daudzi viedtālruņi ar Android OS atbalsta " OTG " un ir iespējams pieslēgt daudz dažādu aparatūru, taču ne viss ir tik vienkārši, kā izskatās no pirmā acu uzmetiena. Dažreiz pat USB zibatmiņas disks nedarbosies ar viedtālruni