Სარჩევი:
- ნაბიჯი 1: AP– ის დამონტაჟება Wrover– ით
- ნაბიჯი 2: STATION– ის შეკრება TTGO– სთან ერთად
- ნაბიჯი 3: შედეგი
- ნაბიჯი 4: არქივი LOG.CSV
- ნაბიჯი 5: ადაფრუტის GFX ბიბლიოთეკა
- ნაბიჯი 6: ადაფრუტის ST7735 ბიბლიოთეკა
- ნაბიჯი 7: ბარათების კონფიგურაცია
- ნაბიჯი 8: AP.ino
- ნაბიჯი 9: Station.ino
- ნაბიჯი 10: ფაილები
ვიდეო: ESP32 გარე საქალაქთაშორისო ანტენით: 10 ნაბიჯი
2024 ავტორი: John Day | [email protected]. ბოლოს შეცვლილი: 2024-01-30 10:19
დღევანდელი თემა ეხება დისტანციურ გამოცდას ESP32– ით გარე ანტენით. მოდით გამოვიყენოთ ორი მოდული დღეს: Espressif– დან და TTGO– დან. მოდით შევამოწმოთ RSSI ამ ორ ESP32 ანტენას შორის, შევქმნათ გრაფიკი ისტორიიდან და დავწეროთ მნიშვნელობების ჟურნალი.csv ფაილში.
შემდეგ ჩვენ გვაქვს ESP32 Wrover როგორც AP, და ESP32 of TTGO როგორც სადგური. მე გამოვიყენე ანტენა, რომელიც ავიღე ოდნავ უფრო დიდი TP-Link და სხვა როუტერიდან, რომელიც ცნობილია როგორც 9 დბმ ანტენა. მე არ შემიმჩნევია რაიმე განსხვავება ამ ორს შორის.
დაბოლოს, ორი მიკროკონტროლერი დაკავშირებულია სოკეტის საშუალებით და მონაცემთა პაკეტების ყოველი გაგზავნისას ჩვენ ვბეჭდავთ ეკრანზე დიაგრამას გრაფებით, რომელიც მიუთითებს dbm- ის თანაფარდობას.
ნაბიჯი 1: AP– ის დამონტაჟება Wrover– ით
ნაბიჯი 2: STATION– ის შეკრება TTGO– სთან ერთად
ნაბიჯი 3: შედეგი
მაქსიმალური მანძილი 2x გარე ანტენებით: 315 მეტრი
მაქსიმალური მანძილი გარე და შიდა ანტენით: 157 მეტრი
ნაბიჯი 4: არქივი LOG. CSV
მონაცემები ჩავწერე SD ბარათზე, მონაცემები მილიში, დბმ -ში და პაკეტის სტრიქონში.
ნაბიჯი 5: ადაფრუტის GFX ბიბლიოთეკა
Arduino IDE– ში გადადით ჩანახატზე-> ბიბლიოთეკის ჩართვა-> ბიბლიოთეკების მართვა…
დააინსტალირეთ Adafruit GFX ბიბლიოთეკა
ნაბიჯი 6: ადაფრუტის ST7735 ბიბლიოთეკა
Arduino IDE– ში გადადით ჩანახატზე-> ბიბლიოთეკის ჩართვა-> ბიბლიოთეკების მართვა…
დააინსტალირეთ Adafruit ST7735
ნაბიჯი 7: ბარათების კონფიგურაცია
დაელოდეთ განსხვავებებს:
ნაბიჯი 8: AP.ino
ჩვენ შევიტანეთ საჭირო ბიბლიოთეკები და განვსაზღვრეთ რამდენიმე პარამეტრი.
#ჩართეთ #ჩართეთ #ჩართეთ #ჩართეთ #ჩართეთ #ჩართეთ // Rede que o ESP criará. No Station deve ser igual #define SSID "RSSI_Test" #define PASSWORD "87654321" // დრო დროის გასვლისთვის, რომელიც ითვალისწინებს დადგენას TIMEOUT 2000 // Largura e altura do #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 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 #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) #განსაზღვრეთ SDCARD_CS 15 // Pixel onde or gráfico começa horizontalmente int currentX = PLOT_MARGIN; // Objeto responsável pelo ჩვენება Adafruit_ST7735 ჩვენება = Adafruit_ST7735 (DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST); // Criamos um სერვერი (quaquer porta válida ემსახურება მომხმარებელს გამოიყენოს mesma porta) WiFiServer სერვერი (80); // კლიენტის კლიენტის კლიენტი (არ არის გათვალისწინებული ESP32 და მოდური სადგური); // String que recebemos do cliente სიმებიანი მიღებული; // RSSI enviado pelo cliente for este ESP32 long rssi = 0; // Faz o controle do temporizador (interrupção por tempo) hw_timer_t *ქრონომეტრი = NULL; // Utilizado para guardar os ultimos std:: vector rssiHistory;
Აწყობა
void setup () {Serial.begin (115200); setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Ero ao inicializar lib SD!"); } // Cri a rede WiFi, ოფიციალური სერვერი და სერვერი და კლიენტი 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 (); }
WiFi– ის დაყენება
// Cria um Access Point და კონფიგურაცია IPvoid setupWiFi () {display.println ("softAP შექმნა" + სიმებიანი (SSID)); WiFi. გათიშვა (); 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" + სიმებიანი (SSID) + "შექმნილია!"); }
ეკრანის დაყენება
// Incializa o display, muda a orientação e limpa a telavoid setupDisplay () {// Inicializa or 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 conexão foi perdida client.setTimeout (TIMEOUT); }
IRAM_ATTR გადატვირთვა მოდული და 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 // ქრონომეტრი, გამოძახება, ინტერფეისის შეზღუდვა timerAttachInterrupt (ტაიმერი, & გადატვირთვამოდული, ჭეშმარიტი); // ტაიმერი, ტემპი (us), repetição timerAlarmWrite (ტაიმერი, 10000000, ჭეშმარიტი); timerAlarmEnable (ტაიმერი); // habilita a interrupção}
მარყუჟი
void loop () {timerWrite (ტაიმერი, 0); // რესეტა ო ტემპორიზადორი (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 ou 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 მიღებული. ამოღება (მიღებული. სიგრძე ()-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 ჩვენების გარეშე 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 არ არის საბოლოო ფაილი ფაილის ფაილი = 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 // Tempo de timeout para consrar a conexão pedida #define TIMEOUT 2000 // Largura e altura do display #define DISPLAY_WIDTH 160 #განსაზღვრეთ DISPLAY_HEIGHT 128 // კონფიგურაცია, #განსაზღვრეთ 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 rssiHistory;
Აწყობა
void setup () {setupDisplay (); // Inicializa o SD if (! SD.begin (SDCARD_CS)) {display.println ("Ero 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
// ჩვენება, ჩვენება, რომელიც ორიენტირებულია ტელავოიდურ კონფიგურაციაზე ჩვენება () {// გამოცხადება 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)); // შეუსაბამოდ შეაერთეთ WiFi გადააკეთეთ WiFi ხოლო (WiFi.status ()! = WL_CONNECTED) {დაგვიანებით (500); ჩვენება. ბეჭდვა ("."); } display.println (""); display.print ("დაკავშირებულია"); display.println (SSID); }
connectToServer
void connectToServer () {display.println ("სოკეტის კავშირის მცდელობა"); // Espera 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 გადატვირთვა მოდული და 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 // ქრონომეტრი, გამოძახება, ინტერფეისის შეზღუდვა timerAttachInterrupt (ტაიმერი, & გადატვირთვამოდული, ჭეშმარიტი); // ტაიმერი, ტემპი (us), repetição timerAlarmWrite (ტაიმერი, 10000000, ჭეშმარიტი); timerAlarmEnable (ტაიმერი); // habilita a interrupção}
მარყუჟი
void loop () {timerWrite (ტაიმერი, 0); // რესეტა ო ტემპორიზადორი (alimenta o watchdog) checkConnection (); // შეამოწმეთ სერვერის შემოწმება RSSSI (); // 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 confirmação do server server (); // 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 do 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 ეკრანის გარეშე clearText (); display.setCursor (0, 0); display.print ("RSSI:" + სიმებიანი (rssi)); // Se 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 and incrementa o contador სიმებიანი გაგზავნა = "გამარჯობა" + სიმებიანი (რაოდენობა); display.setCursor (0, 10); display.println ("გაგზავნა:" + გაგზავნა); socket.println (გაგზავნა); სოკეტი. ბეჭდვა (სიმებიანი (rssi)); დათვლა ++; }}
წაიკითხეთ სერვერიდან
void readFromServer () {// Espera até or server enviar alou or desconectar while (socket.connected () &&! socket.available ()) {delay (100); } // Se tem algo para receber if (socket.available ()) {// Faz a leitura, remove o / n do the final e mostra no display stand = socket.readStringUntil ('\ n'); მიღებული. ამოღება (მიღებული. სიგრძე ()-1); display.println ("მიღებული:" + მიღებული); }}
clearText და ჟურნალი
void clearText () {// Limpa a área 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 არ არის საბოლოო ფაილი ფაილის ფაილი = 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: ფაილები
ჩამოტვირთეთ ფაილები:
ინო
გირჩევთ:
გასაოცარი წვრილმანი მზის ენერგიით გარე გარე ნათურა: 9 ნაბიჯი
გასაოცარი წვრილმანი მზის ენერგიაზე მომუშავე გარე ნათურა: გამარჯობა! ამ ინსტრუქციებში შეგიძლიათ გაიგოთ როგორ ავაშენოთ იაფი და მარტივი მზის ენერგიაზე მომუშავე LED ნათურა! ის იტვირთება ბატარეის დღის განმავლობაში და ანათებს ძალიან ნათელ COB LED ღამით! უბრალოდ მიყევით ნაბიჯებს! Შენ შეგიძლია ამის გაკეთება! ეს მართლაც ადვილი და სახალისოა! ეს არის
გარე პროგრამისთვის პროგრამირებადი გარე განათება: 4 ნაბიჯი
გარე პროგრამული უზრუნველყოფის გარე განათება: ეს პროექტი გეხმარებათ გარე გარე მონიტორის ან ტელევიზიის გარემოს განათების დაყენებაში, რომელიც საშუალებას გაძლევთ გააკონტროლოთ ქვემოთ ჩამოთვლილი ნებისმიერი ბრაუზერი, რომელსაც აქვს ბრაუზერი და დაკავშირებულია თქვენს როუტერთან. LED ფერი მოციმციმე სიხშირე DJ ეფექტს აყენებს განსხვავებებს
საქალაქთაშორისო გადამცემი სისტემის წრე: 6 ნაბიჯი
საქალაქთაშორისო გადამცემი სისტემის წრე: დღეს ამ სტატიაში ჩვენ ვისაუბრებთ იმაზე, თუ როგორ უნდა გავაკეთოთ ძირითადი საქალაქთაშორისო გადამცემი სისტემის წრე. ამ ხაზების გასწვრივ, ნება მომეცით შემოგთავაზოთ მიკროსქემის მოკლე აღწერა. საერთოდ როგორ ფუნქციონირებს ეს და როგორ გესაუბრები შენთვის
Raspberry Pi Zero Wifi წვდომის წერტილი პერსონალური PCB ანტენით: 6 ნაბიჯი (სურათებით)
Raspberry Pi Zero Wifi Access Point Custom PCB Antenna: რას ვაკეთებთ ჩვენ? მოდით დავშალოთ. რა არის Raspberry Pi Zero (Rπ0)? Raspberry Pi Zero არის პატარა კომპიუტერი. ეს არის Raspberry Pi ერთჯერადი დაფის კომპიუტერის უფრო პატარა ვერსია
შექმენით გარე მყარი დისკი ძველი გარე CD/RW– დან: 5 ნაბიჯი
შექმენით გარე მყარი დისკი ძველი გარე CD/RW– დან: ძველი გარე cd/rw– ის საკმაოდ პირდაპირ გადატანა უფრო სასარგებლო გარე მყარ დისკზე. მომარაგება 1-გარე cd/rw (სასურველია უფრო ყუთის ტიპი) 1-მყარი დისკი (უნდა შეესაბამებოდეს დისკის შიდა კონექტორს, უნდა იყოს ფორმატირებული/სისტემური) 1 სმ