Բովանդակություն:
- Քայլ 1. AP- ի տեղադրում Wrover- ով
- Քայլ 2. STATION- ի հավաքում TTGO- ի հետ
- Քայլ 3: ԱՐԴՅՈՆՔ
- Քայլ 4: Արխիվացնել LOG.CSV- ն
- Քայլ 5. Adafruit GFX գրադարան
- Քայլ 6: Adafruit ST7735 գրադարան
- Քայլ 7: Քարտերի կազմաձևում
- Քայլ 8: AP.ino
- Քայլ 9: Station.ino
- Քայլ 10: Ֆայլեր
Video: ESP32 Արտաքին միջքաղաքային ալեհավաքով `10 քայլ
2024 Հեղինակ: John Day | [email protected]. Վերջին փոփոխված: 2024-01-30 09:49
Այսօրվա թեման վերաբերում է ESP32- ով արտաքին ալեհավաքով հեռավորության փորձարկմանը: Եկեք այսօր օգտագործենք երկու մոդուլ `Espressif- ից և TTGO- ից: Եկեք այնուհետև ստուգենք RSSI- ն այս երկու ESP32 ալեհավաքների միջև, գեներացնենք պատմությունից գրաֆիկ և արժեքների մատյան գրենք.csv ֆայլում:
Այնուհետև մենք ունենք ESP32 Wrover- ը որպես AP, իսկ TSP- ի ESP32- ը ՝ որպես կայան: Ես օգտագործել եմ մի ալեհավաք, որը վերցրել եմ մի փոքր ավելի մեծ TP-Link- ից և մեկ այլ երթուղիչից, որը հայտնի է որպես 9 դԲմ ալեհավաք: Ես երկուսի միջև որևէ տարբերություն չեմ նկատել:
Ի վերջո, երկու միկրոկառավարիչները միանում են վարդակից և տվյալների փաթեթների յուրաքանչյուր ուղարկումով մենք ցուցադրման վրա տպում ենք գրաֆիկ `գավազանով, որը ցույց է տալիս dbm- ի հարաբերակցությունը:
Քայլ 1. AP- ի տեղադրում Wrover- ով
Քայլ 2. STATION- ի հավաքում TTGO- ի հետ
Քայլ 3: ԱՐԴՅՈՆՔ
Առավելագույն հեռավորությունը 2x արտաքին ալեհավաքներով `315 մետր
Արտաքին և ներքին ալեհավաքով առավելագույն հեռավորությունը `157 մետր
Քայլ 4: Արխիվացնել LOG. CSV- ն
Ես տվյալները գրանցել եմ SD քարտի վրա ՝ տվյալները միլիլներով, դԲմ -ով և փաթեթի տողով:
Քայլ 5. Adafruit GFX գրադարան
Arduino IDE- ում գնացեք Sketch-> Include Library-> Manage Libraries…
Տեղադրեք Adafruit GFX գրադարանը
Քայլ 6: Adafruit ST7735 գրադարան
Arduino IDE- ում գնացեք Sketch-> Include Library-> Manage Libraries…
Տեղադրեք Adafruit ST7735
Քայլ 7: Քարտերի կազմաձևում
Շարունակեք հետևել տարբերություններին.
Քայլ 8: AP.ino
Մենք ներառել ենք անհրաժեշտ գրադարանները և սահմանել որոշ պարամետրեր:
#ներառել #ներառել #ներառել #ներառել #ներառել #ներառել // Rede que o ESP criará: No Station deve ser igual #define SSID "RSSI_Test" #define PASSWORD "87654321" // poամանակի ընդմիջում ՝ հաշվի առնելով #սահմանել TIMEOUT 2000 // Լարագուրա և բարձրություն ցուցադրել #սահմանել DISPLAY_WIDTH 160 #սահմանել DISPLAY_HEIGHT 128 // սահմանել DISPLAY_HEIGHT 128 cor, margem e tamanho do gráfico #սահմանել PLOT_COLOR ST77XX_GREEN #սահմանել PLOT_MARGIN 20 #սահմանել PLOT_SIZE (DISPLAY_HEIGHT - 2*PLOT_MARGIN) // Arquivo de log no SD #define FILE_pATH "/
Մենք սահմանում ենք կապերը, ի թիվս այլ փոփոխականների
// Պինոները ցուցադրում են #սահմանել DISPLAY_DC 12 // A0 #սահմանել DISPLAY_CS 13 // CS #սահմանել DISPLAY_MOSI 14 // SDA #սահմանել DISPLAY_CLK 27 // SCK #սահմանել DISPLAY_RST 0 // Pino do SDCard: Os pinos mosi, miso e sck são os nativos (23, 19 e 18 respectivamente) #սահմանել SDCARD_CS 15 // Pixel onde or gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Objeto responsável pelo display Adafruit_ST7735 ցուցադրում = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST); // Criamos um սերվեր (որակյալ պորտալի ծառայությունը մատուցվում է այն դեպքում, երբ հաճախորդները օգտվում են մեմմա պորտից) WiFiServer սերվեր (80); // Հաճախորդի կամ սպառողի տարբերակներ (առանց ESP32 կամ մոդո կայան) WiFi WiFi հաճախորդի միացում; // String que recebemos do cliente Լարը ստացել է; // RSSI միջնորդ հաճախորդների համար ESP32 երկար rssi = 0; // Faz o controle do temporizador (interrupção por tempo) hw_timer_t *ժամանակաչափ = NULL; // Utilizado para guardar os ultimos std:: vector rssi Պատմություն;
Կարգավորում
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- ի, պաշտոնական սերվերի և espera կամ հաճախորդների կոնտակտային setupWiFi (); server.begin (); waitForClient (); // Espera 3 segundos, limpa a tela e inicializa o Watchdog ուշացում (3000); display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); setupWatchdog (); }
Կարգավորեք WiFi- ը
// Cria um Access Point և IPvoid setupWiFi () {display.println ("SoftAP- ի ստեղծում" + լարային (SSID)); WiFi.d անջատել (); 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" + String (SSID) + "ստեղծված է"); }
Կարգավորման ցուցադրում
// 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 («Սպասում ենք հաճախորդին»); // Aguarda o cliente conectar while (! (Client = server.available ())) {display.print ("."); ուշացում (500); } display.println ("Հաճախորդը միացված է"); // 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 և 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, ճշմարիտ); // timerID 0, div 80 // ժմչփ, հետադարձ զանգ, ընդհատում timerAttachInterrupt (ժամաչափ, & resetModule, true); // ժամանակաչափ, տեմպ (մեզ), repetição timerAlarmWrite (ժամանակաչափ, 10000000, ճշմարիտ); timerAlarmEnable (ժամաչափ); // habilita a interrupção}
Օղակ
void loop () {timerWrite (ժամանակաչափ, 0); // վերակայում 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 () {// Se o cliente não estiver conectado if (! client.connected ()) {// Limpa a tela e espera pelo cliente display.fillScreen (ST77XX_BLACK); display.println («Հաճախորդն անջատված է»); waitForClient (); }}
readFromClient
void readFromClient () {// Espera até o cliente enviar algo or desconectar while (client.connected () &&! client.available ()) {հետաձգում (100); } // Se chegou aqui e ainda estiver conectado é porque possui algo para receber do cliente if (client.connected ()) {Ստացվել = client.readStringUntil ('\ n'); // Lê o texto que o cliente enviou wergirtել. Հեռացնել (ստացել է. Երկարությունը ()-1); // Հեռացնել / n անել վերջնական rssi = client.parseInt (); // Lê o rssi que o cliente enviou clearText (); // Limpa o texto display.setCursor (0, 0); // Տեղափոխել կուրսորը տեքստում կամ ցուցադրել display.println ("RSSI:" + Լար (rssi)); // Mostra o RSSI no display display.println ("Ստացվել է." + Ստացվել է); // 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). սկսել ()); } // 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 ()) {Լարերի ուղարկումը = ստացված + "OK"; client.println (ուղարկում); }}
սյուժե
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 (ընթացիկ X, DISPLAY_HEIGHT - արժեք, արժեք, PLOT_COLOR); ընթացիկ X += 2;}}
clearText և տեղեկամատյան
void clearText () {// Limpa a area 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 no final dele File file = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! Ֆայլ) {Serial.println ("Չհաջողվեց բացել ֆայլը"); վերադարձ; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida Լարային տվյալներ = Լար (millis ()) + ";" + Լար (rssi) + ";" + ստացված; file.println (տվյալներ); file.close (); }
Քայլ 9: Station.ino
Մենք ներառել ենք անհրաժեշտ գրադարանները և սահմանել որոշ պարամետրեր:
#ներառել #ներառել #ներառել #ներառել #ներառել #ներառել // Nome da rede que nos conectaremos. Criado pelo AP #սահմանել 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 // poամանակի ընդմիջում ՝ հաշվի առնելով առաջադրանքը #սահմանել TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #սահմանել DISPLAY_HEIGHT 128 // configuraçemes de cor, #սահմանել PLOT_COLOR ST77XX_GREEN #սահմանել PLOT_MARGIN 20 #սահմանել PLOT_SIZE (DISPLAY_HEIGHT - 2*PLOT_MARGIN) // Arquivo de log no SD #define FILE_PATH "/log.csv"
Մենք սահմանում ենք այն պարամետրերը, որոնք ներառում են էկրանը և SD քարտը:
երկար հաշվարկ = 0; // Contador de mensagens enviadaslong rssi = 0; // RSSI calculado Լարը ստացվել է; // Mensagem de confirmação que o AP nos envia // Pixel onde or gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Օգտագործել սերվերի WiFiClient վարդակից; #սահմանել DISPLAY_DC 12 // A0 #սահմանել DISPLAY_CS 13 // CS #սահմանել DISPLAY_MOSI 14 // SDA #սահմանել DISPLAY_CLK 27 // SCK #սահմանել DISPLAY_RST 0 // Pino do SDCard: Os pinos mosi, miso e sck são os nativos (23, 19 e 18 respectivamente) #սահմանել SDCARD_CS 15 // Առարկայի պատասխանի մակարդակի ցուցադրում Adafruit_ST7735 ցուցադրում = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_; hw_timer_t *ժամանակաչափ = NULL; // faz o controle do temporizador (interrupção por tempo) // Utilizado para guardar os ultimos std:: vector rssi Պատմություն;
Կարգավորում
void setup () {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 ուշացում (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.begin (SSID, PASSWORD); display.println («Միացում» + լարային (SSID)); // Enquanto não estiver conectado à rede WiFi while (WiFi.status ()! = WL_CONNECTED) {հետաձգում (500); display.print ("."); } display.println (""); display.print («Միացված է»); display.println (SSID); }
connectToServer
void connectToServer () {display.println («Փորձում եմ վարդակից միացում»); // Espera a conexão com o server while (! Socket.connect (HOST, PORT)) {display.print ("."); ուշացում (500); } display.println (); display.println ("Միացված է"); // 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 և 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, ճշմարիտ); // timerID 0, div 80 // ժմչփ, հետադարձ կապ, ընդհատում timerAttachInterrupt (ժամաչափ, & resetModule, true); // ժամանակաչափ, տեմպ (մեզ), repetição timerAlarmWrite (ժամանակաչափ, 10000000, ճշմարիտ); timerAlarmEnable (ժամաչափ); // habilita a interrupção}
հանգույց
void loop () {timerWrite (ժամանակաչափ, 0); // reseta o temporizador (alimenta o watchdog) checkConnection (); // ստուգեք ձեր հնարավորությունները սերվերի 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 անել սերվերի գրանցամատյան (); // salva um log no cartão SD ուշացում (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- ն անջատված է»); setupWiFi (); ուշացում (1000); } // verifica a conexão անել socket if (! socket.connected ()) {display.fillScreen (ST77XX_BLACK); display.setCursor (0, 0); display.println ("վարդակից անջատված է"); connectToServer (); ուշացում (3000); display.fillScreen (ST77XX_BLACK); }}
checkRSSI
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:" + Լար (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); }
սյուժե
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 (ընթացիկ X, DISPLAY_HEIGHT - արժեք, արժեք, PLOT_COLOR); ընթացիկ X += 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 Լարերի ուղարկումը = "Բարև" + Լար (հաշվարկ); display.setCursor (0, 10); display.println ("Ուղարկում." + ուղարկում); socket.println (ուղարկելով); socket.print (լարային (rssi)); հաշվել ++; }}
readFromServer- ից
void readFromServer () {// Espera até կամ սերվերը կարող է անջատվել կամ անջատել, մինչդեռ (socket.connected () &&! socket.available ()) {հետաձգում (100); } // Se tem algo para receber if (socket.available ()) {// Faz a leitura, remove o / n to the final e mostra no display found = socket.readStringUntil ('\ n'); ստացել. հեռացնել (ստացել. երկարություն ()-1); display.println ("Ստացվել է." + ստացվել է); }}
clearText և տեղեկամատյան
void clearText () {// Limpa a area 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 no final dele File file = SD.open (FILE_PATH, FILE_APPEND); // Se não conseguimos abrir o arquivo mostramos uma mensagem de erro if (! Ֆայլ) {Serial.println ("Չհաջողվեց բացել ֆայլը"); վերադարձ; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida Լարային տվյալներ = Լար (millis ()) + ";" + Լար (rssi) + ";" + ստացված; file.println (տվյալներ); file.close (); }
Քայլ 10: Ֆայլեր
Ներբեռնեք ֆայլերը.
ԻՆՈ
Խորհուրդ ենք տալիս:
DIY միջքաղաքային լավագույն ընկերոջ լույսեր. 4 քայլ (նկարներով)
DIY միջքաղաքային լավագույն ընկերների լույսեր. լամպեր: Դա պարզապես նշանակում է, որ դրանք համաժամեցված են մյուս լամպի ներկայիս գույնի հետ: Այսպիսով, եթե դուք փոխեիք մեկ լամպը կանաչ, ապա մյուս լամպից կարճ ժամանակ անց նա կդառնար գրի
Միջքաղաքային փոխանցման համակարգի միացում `6 քայլ
Երկար հեռավորությունների փոխանցման համակարգի միացում. Այսօր այս հոդվածում մենք կխոսենք այն մասին, թե ինչպես կարելի է կատարել հիմնական հեռավորությունների հաղորդման համակարգի միացում: Այս գծերի համաձայն, թույլ տվեք ձեզ ներկայացնել սխեմայի հակիրճ պատկերը: Ընդհանրապես, ինչպես է դա գործում և ինչպես եմ ես ձեզ հետ խոսում իրերի մասին
Raspberry Pi Zero Wifi մուտքի կետ ՝ անհատական PCB ալեհավաքով. 6 քայլ (նկարներով)
Raspberry Pi Zero Wifi Access Point With Custom PCB ալեհավաք. Ի՞նչ ենք մենք պատրաստում: Այս ձեռնարկի վերնագիրը պարունակում է բազմաթիվ տեխնիկական պայմաններ: Եկեք այն քանդենք: Ի՞նչ է Raspberry Pi Zero (Rπ0): Raspberry Pi Zero- ն փոքրիկ համակարգիչ է: Այն Raspberry Pi- ի մեկ տախտակի համակարգչի ավելի փոքր տարբերակն է
Բարձրացրեք արդյունավետ հեռավորությունը «ebay» Flash Remote Trigger հաղորդիչի վրա `ալեհավաքով: 6 քայլ
Բարձրացրեք արդյունավետ հեռավորությունը «ebay» ֆլեշ հեռակառավարման ազդանշանի վրա ալեհավաքով. Ֆոտոխցիկի սիրահարները կարող են ձեռք բերել արտաքին ֆլեշ սարքերի հեռակառավարման ազդանշանների էժան տարբերակներ ՝ վերահսկելով թե՛ տաք կոշիկի, թե՛ «ստուդիայի» տեսակի ֆլեշ սարքերը: Այս գործարկիչները տառապում են հաղորդիչի ցածր հզորությունից և, հետևաբար, փոքր արդյունավետ կառավարման հեռավորությունից: Այս ամիս
Ստեղծեք արտաքին HDD հին արտաքին CD/RW- ից ՝ 5 քայլ
Ստեղծեք արտաքին HDD հին արտաքին CD/RW- ից. Հին արտաքին cd/rw- ի բավականին ուղիղ փոխակերպում ավելի օգտակար արտաքին կոշտ սկավառակի: Սարքավորումներ 1-արտաքին cd/rw (գերադասելի է ավելի տուփի տեսակը) 1-կոշտ սկավառակ (պետք է համապատասխանի սկավառակի ներքին միակցիչին, անհրաժեշտ է ձևաչափել/ներդնել) 1 սմ