Cov txheej txheem:

ESP32 Nrog Sab Nraud Sab Nraud Ntev Kav hlau txais xov: 10 Kauj Ruam
ESP32 Nrog Sab Nraud Sab Nraud Ntev Kav hlau txais xov: 10 Kauj Ruam

Video: ESP32 Nrog Sab Nraud Sab Nraud Ntev Kav hlau txais xov: 10 Kauj Ruam

Video: ESP32 Nrog Sab Nraud Sab Nraud Ntev Kav hlau txais xov: 10 Kauj Ruam
Video: Simple Programming, Amazing Results: DIY Bluetooth Speaker with #ESP32 and 2 Speakers 2024, Hlis ntuj nqeg
Anonim
Image
Image
Mounting AP Nrog Wrover
Mounting AP Nrog Wrover

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

Sib dhos ntawm STATION Nrog TTGO
Sib dhos ntawm STATION Nrog TTGO

Kauj Ruam 3: RESULT

RESULT
RESULT
RESULT
RESULT
RESULT
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

Archive LOG. CSV
Archive LOG. CSV
Archive LOG. CSV
Archive 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

Adafruit GFX Lub Tsev Qiv Ntawv
Adafruit GFX Lub Tsev Qiv Ntawv

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

Adafruit ST7735 Lub Tsev Qiv Ntawv
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

Configuring daim npav
Configuring daim npav
Configuring daim npav
Configuring 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:

PDF

INO

Pom zoo: