Cov txheej txheem:
- Kauj Ruam 1: Mount AP nrog Wrover
- Kauj Ruam 2: Kev Sib Dhos ntawm STATION Nrog TTGO
- Kauj Ruam 3: RESULT
- Kauj Ruam 4: Khaws LOG.CSV
- Kauj Ruam 5: Adafruit GFX Library
- Kauj Ruam 6: Adafruit ST7735 Lub Tsev Qiv Ntawv
- Kauj Ruam 7: Kho Daim Npav
- Kauj ruam 8: AP.ino
- Kauj Ruam 9: Station.ino
- Kauj ruam 10: Cov ntaub ntawv
Video: ESP32 Nrog Sab Nraud Sab Nraud Ntev Kav hlau txais xov: 10 Kauj Ruam
2024 Tus sau: John Day | [email protected]. Kawg hloov kho: 2024-01-30 09:27
Cov ncauj lus niaj hnub no txhawj xeeb txog kev ntsuas nrug nrog ESP32 nrog Tus Kheej Sab Nraud. Cia peb siv ob qhov qauv niaj hnub no: los ntawm Espressif thiab TTGO. Cia peb mam li txheeb xyuas RSSI ntawm ob lub ESP32 tus kav hlau txais xov, tsim kab teeb los ntawm keeb kwm, thiab sau ib lub cav ntawm qhov tseem ceeb hauv.csv cov ntaub ntawv.
Tom qab ntawd peb muaj ESP32 Wrover li AP, thiab ESP32 ntawm TTGO ua Chaw Nres Tsheb. Kuv siv tus kav hlau txais xov uas kuv coj los ntawm TP-Txuas me me loj dua thiab lwm lub router hu ua 9dbm kav hlau txais xov. Kuv tsis tau pom muaj qhov sib txawv ntawm ob.
Thaum kawg, ob lub microcontrollers txuas ntawm lub qhov (socket) thiab, nrog txhua qhov xa cov ntaub ntawv pob, peb luam tawm ntawm cov duab teeb nrog cov kab uas qhia qhov sib piv ntawm dbm.
Kauj Ruam 1: Mount AP nrog Wrover
Kauj Ruam 2: Kev Sib Dhos ntawm STATION Nrog TTGO
Kauj Ruam 3: RESULT
Qhov siab tshaj nrug nrog 2x tus kav hlau sab nrauv: 315 meters
Qhov siab tshaj nrug nrog tus kav hlau txais xov sab nraud thiab sab hauv: 157 meters
Kauj Ruam 4: Khaws LOG. CSV
Kuv kaw cov ntaub ntawv ntawm daim npav SD, nrog cov ntaub ntawv hauv millis, dbm, thiab pob ntawv pob.
Kauj Ruam 5: Adafruit GFX Library
Hauv Arduino IDE, mus rau Sketch-> Xws li Tsev Kawm Ntawv-> Tswj Cov Tsev Qiv Ntawv …
Nruab Adafruit GFX Library
Kauj Ruam 6: Adafruit ST7735 Lub Tsev Qiv Ntawv
Hauv Arduino IDE, mus rau Sketch-> Xws li Tsev Kawm Ntawv-> Tswj Cov Tsev Qiv Ntawv …
Nruab Adafruit ST7735
Kauj Ruam 7: Kho Daim Npav
Nyob twj ywm rau qhov sib txawv:
Kauj ruam 8: AP.ino
Peb tau suav nrog cov tsev qiv ntawv tsim nyog thiab txhais qee yam tsis.
#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 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 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.csv"
Peb txhais cov pins, ntawm lwm qhov sib txawv
// 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 responsável pelo display Adafruit_ST7735 zaub = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST); // Criamos um neeg rau zaub mov (muaj peev xwm ua kom tau txais txiaj ntsig zoo rau cov neeg siv khoom siv mesma porta) WiFiServer server (80); // Variável para armazenar o cliente (tsis muaj caso o ESP32 em modo station) conectado WiFiClient tus thov kev pab; // String que recebemos do cliente Txoj hlua tau txais; // RSSI enviado pelo cliente para este ESP32 ntev rssi = 0; // Faz o controle do temporizador (interrupção por tempo) hw_timer_t *timer = NULL; // Utilizado para guardar os ultimos std:: vector rssiHistory;
Teeb
teeb tsa tsis muaj dab tsi () {Serial.begin (115200); setupDisplay (); // Inicializa o SD yog (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Rov ua dua WiFi, ua haujlwm ntawm tus neeg rau zaub mov thiab tus neeg siv khoom siv teeb tsa teeb tsaWiFi (); server.begin (); waitForClient (); // Espera 3 segundos, limpa a tela e inicializa o Watchdog ncua (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }
Teeb WiFi
// Cria um Access Point e teeb tsa o IPvoid setupWiFi () {display.println ("Tsim softAP" + String (SSID)); WiFi.disconnect (); WiFi.mode (WIFI_AP); WiFi.softAPConfig (IPAddress (192, 168, 0, 1), IPAddress (192, 168, 0, 1), IPAddress (255, 255, 255, 255, 0)); WiFi.softAP (SSID, PASSWORD); display.println ("softAP" + String (SSID) + "tsim!"); }
Teeb Zaub
// Incializa o tso saib, ua raws li qhov xav tau thiab teeb tsa telavoid teeb tsaDisplay () {// Ua raws li cov lus tso tawm display.initR (INITR_BLACKTAB); // Rotaciona o conteúdo mostrado display.setRotation (3); // Pinta a tela de preto display.fillScreen (ST77XX_BLACK); }
tosForClient
tsis muaj dab tsi waitForClient () {display.println ("Tos cov neeg siv khoom"); // Aguarda o cliente conectar thaum (! (Client = server.available ())) {display.print ("."); ncua (500); } display.println ("Client txuas nrog"); // Tempo máximo que o cliente deve demorar para responder // antes de dizermos que a conexão foi perdida client.setTimeout (TIMEOUT); }
IRAM_ATTR pib dua Module thiab teeb tsaWatchdog
// 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, tseeb); // timerID 0, div 80 // timer, callback, interrupção de borda timerAttachInterrupt (timer, & resetModule, tseeb); // timer, tempo (peb), repetição timerAlarmWrite (timer, 10000000, tseeb); timerAlarmEnable (timer); // tau txais kev sib tham}
Loop
lub voj void () {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 confirmação para o cov neeg siv khoom phiaj (); // mostra o gráfico de histórico de rssi cav (); // salva um log no cartão SD}
kos Txuas
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 ("Client disconnected"); waitForClient (); }}
readFromClient
void readFromClient () {// Espera até o cliente enviar algo ou desconectar while (client.connected () &&! client.available ()) {ncua (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 tau txais. Tshem tawm (tau txais.length ()-1); // Tshem tawm / n ua qhov kawg rssi = client.parseInt (); // Lê o rssi que o cliente enviou clearText (); // Limpa o texto display.setCursor (0, 0); // Txav mus rau tus cursor ua cov ntawv rau ntawm qhov chaw tuaj tso saib display.println ("RSSI:" + String (rssi)); // Mostra o RSSI tsis muaj zaub display.println ("Tau txais:" + tau txais); // 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. pib ()); } // Adiciona tsis muaj qhov kawg ua histórico (mais recente) rssiHistory.push_back (rssi); }}
xaToClient
void sendToClient () {// Se o cliente estiver conectado enviamos de volta a mensagem com um OK yog (client.connected ()) {String xa = tau txais + "OK"; client.println (xa); }}
zaj lus
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 - tus nqi, tus nqi, PLOT_COLOR); currentX += 2;}}
clearText thiab cav
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 tsis muaj qhov kawg dele File file = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro yog (! File) {Serial.println ("Failed to open file"); rov qab; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + Txoj hlua (rssi) + ";" + tau txais; file.println (cov ntaub ntawv); file.close (); cov. }
Kauj Ruam 9: Station.ino
Peb tau suav nrog cov tsev qiv ntawv tsim nyog thiab txhais qee yam tsis.
#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. Txuj ci tseem ceeb 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 tamanho #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"
Peb txhais cov teeb tsa uas cuam tshuam nrog cov zaub thiab SD Card.
ntev suav = 0; // Contador de mensagens enviadaslong rssi = 0; // RSSI calculado String tau txais; // Mensagem de confirmação que o AP nos envia // Pixel onde o gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Siv cov khoom siv sib txuas com o server WiFiClient lub qhov (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_CLK,) hw_timer_t *timer = NULL; // faz o controle do temporizador (interrupção por tempo) // Utilizado para guardar os ultimos std:: vector rssiHistory;
Teeb
void teeb () {setupDisplay (); // Inicializa o SD yog (! SD.begin (SDCARD_CS)) {display.println ("Erro ao inicializar lib SD!"); } // Conecta tsis muaj qhov nkag mus criado pelo outro ESP32 e conecta ao server setupWiFi (); txuasToServer (); // Espera 3 segundos, limpa a tela e inicializa o Watchdog ncua (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }
setupDisplay
// Incializa o tso saib, ua raws li qhov xav tau thiab teeb tsa telavoid teeb tsaDisplay () {// Ua raws li cov lus tso tawm 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 ("Txuas rau" + Txoj hlua (SSID)); // Enquanto não estiver conectado à rede WiFi thaum (WiFi.status ()! = WL_CONNECTED) {ncua (500); display.print ("."); } display.println (""); display.print ("Txuas nrog"); display.println (SSID); }
txuasToServer
tsis muaj qhov txuas connectToServer () {display.println ("Sim qhov txuas txuas"); // Espera conexão com o server thaum (! Socket.connect (HOST, PORT)) {display.print ("."); ncua (500); } display.println (); display.println ("Txuas nrog!"); // 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 thiab 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, tseeb); // timerID 0, div 80 // timer, callback, interrupção de borda timerAttachInterrupt (timer, & resetModule, tseeb); // timer, tempo (peb), repetição timerAlarmWrite (timer, 10000000, tseeb); timerAlarmEnable (timer); // tau txais kev sib tham}
voj
lub voj void () {timerWrite (timer, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // checa se possui conexão com o server serverRSSI (); // verifica o rssi cov phiaj (); // 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 cav (); // salva um log no cartão SD ncua (1000); // ua raws li kev cai}
kos Txuas
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 txuas"); setupWiFi (); ncua (1000); } // verifica conexão do socket yog (! socket.connected ()) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("Socket disconnected"); txuasToServer (); ncua (3000); display.fillScreen (ST77XX_BLACK); }}
checkRSSI
void checkRSSI () {// Verifica o RSSI rssi = WiFi. RSSI (); // Limpa o texto e mostra o RSSI tsis muaj zaub clearText (); display.setCursor (0, 0); display.print ("RSSI:" + Txoj hlua (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 tsis muaj qhov kawg ua histórico (mais recente) rssiHistory.push_back (rssi); }
zaj lus
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 - tus nqi, tus nqi, PLOT_COLOR); currentX += 2;}}
xaToServer
void sendToServer () {// Se estiver conectado com o server if (socket.connected ()) {// Envia um nyob zoo com um contador, mostra no display e incrementa o contador String xa = "Nyob zoo" + String (suav); display.setCursor (0, 10); display.println ("Xa:" + xa); socket.println (xa); socket.print (Txoj hlua (rssi)); suav ++; }}
readFromServer
void readFromServer () {// Espera até o server enviar algo ou desconectar while (socket.connected () &&! socket.available ()) {ncua (100); } // Se tem algo para receber yog (socket.available ()) {// Ua tsaug, tshem tawm o / n ua qhov kawg e feem ntau tsis muaj zaub tau txais = socket.readStringUntil ('\ n'); tau txais.remove (tau txais.length ()-1); display.println ("Tau txais:" + tau txais); }}
clearText thiab cav
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 tsis muaj qhov kawg dele File file = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro yog (! File) {Serial.println ("Failed to open file"); rov qab; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = String (millis ()) + ";" + Txoj hlua (rssi) + ";" + tau txais; file.println (cov ntaub ntawv); file.close (); cov. }
Kauj ruam 10: Cov ntaub ntawv
Rub tawm cov ntawv:
INO
Pom zoo:
E.T. - UHF TV Kav hlau txais xov sab hauv tsev: 12 Kauj Ruam (nrog Duab)
E.T. - UHF TV Kav hlau txais xov sab hauv: Yog tias koj tsis tuaj yeem siv lub kav hlau txais xov TV sab nraum zoo koj yuav raug kaw nrog "pob ntseg luav". Lawv siv me me, ua hauv lub kav hlau txais xov kom tau txais UHF tshaj tawm, thaum cov xov tooj cua tsom iav tsuas yog siv los txais VHF tshaj tawm. Feem ntau ntawm cov digital terrestrial t
BIQUAD Kav hlau txais xov Sab hauv, Ua los ntawm tooj liab thiab Ntoo rau Txais Txais HDTV Raws Hauv UHF Band (CHANNELS 14-51): 7 Cov Kauj Ruam
BIQUAD Kav hlau txais xov Sab hauv, Ua los ntawm tooj liab thiab Ntoo rau Txais Txais HDTV Raws Hauv UHF Band (CHANNELS 14-51): Hauv khw muaj ntau yam antennas rau TV. Cov neeg nyiam tshaj plaws raws li kuv tus qauv yog: UDA-YAGIS, Dipole, Dipole nrog cov duab ci, Thaj thiab Logarithmic antennas. Nyob ntawm qhov xwm txheej, qhov nrug deb ntawm kev kis tus kab mob
Ua Sab Nraud HDD Los Ntawm Sab Nraud Sab Nraud CD/RW: 5 Kauj Ruam
Ua Sab Nraud HDD Los Ntawm Sab Nraud Sab Nraud CD/RW: Zoo nkauj ncaj nraim rau kev hloov pauv ntawm lub qub sab nraud cd/rw mus rau qhov muaj txiaj ntsig sab nraud nyuaj tsav. Cov khoom siv 1-sab nraud cd/rw (tshwj xeeb tshaj yog cov boxy ntau dua) 1-hard drive (yuav tsum sib phim nrog cov txuas sab hauv ntawm cov ntaub ntawv tsav tsheb, yuav tsum tau ua qauv/sysed) 1-sm
Sab nraud Bluetooth Kav hlau txais xov kom nce ntau ntxiv!: 4 Cov Kauj Ruam
Sab nraud Bluetooth Kav hlau txais xov kom nce ntau ntxiv!: Kuv xav mloog hauv qee qhov bluetooth ntawm kuv lub zos Starbucks! tab sis cov kav hlau txais xov ntau ntawm feem ntau bluetooth dongles yog luv heev. yog li kuv yuav tsum nce qhov ntau! Nov yog kuv txoj kev taug kev los ua qhov no lub tswv yim ntawm qhov txaus ntshai yog los ntawm qhov chaw no
Huawei E160X (Vodafone K3565) 3G Dongle Sab Nrauv Kav hlau txais xov / Casing: 13 Kauj Ruam (nrog Duab)
Huawei E160X (Vodafone K3565) 3G Dongle External Antenna / Casing: Lub K3565 dongle uas Vodafone muab nrog lawv cov nyiaj them raws li koj txoj kev npaj yog zoo heev, tab sis tsis txaus siab sab nrauv lub kav hlau txais xov txuas tau zais hauv qab qhov casing. Nov yog yuav ua li cas txhawm rau txhawm rau kom tau txais qhov txuas txuas ntawd - thiab rau cov uas xav