สารบัญ:
- ขั้นตอนที่ 1: ติดตั้ง AP ด้วย Wrover
- ขั้นตอนที่ 2: การประกอบ STATION ด้วย TTGO
- ขั้นตอนที่ 3: ผลลัพธ์
- ขั้นตอนที่ 4: เก็บถาวร LOG.CSV
- ขั้นตอนที่ 5: ไลบรารี Adafruit GFX
- ขั้นตอนที่ 6: ห้องสมุด Adafruit ST7735
- ขั้นตอนที่ 7: การกำหนดค่าการ์ด
- ขั้นตอนที่ 8: AP.ino
- ขั้นตอนที่ 9: Station.ino
- ขั้นตอนที่ 10: ไฟล์
วีดีโอ: ESP32 พร้อมเสาอากาศระยะไกลภายนอก: 10 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:06
หัวข้อของวันนี้เกี่ยวกับการทดสอบระยะทางด้วย ESP32 พร้อมเสาอากาศภายนอก ลองใช้สองโมดูลวันนี้: จาก Espressif และ TTGO จากนั้น มาตรวจสอบ RSSI ระหว่างเสาอากาศ ESP32 ทั้งสองนี้ สร้างกราฟจากประวัติ และเขียนบันทึกของค่าในไฟล์.csv
จากนั้นเราก็มี ESP32 Wrover เป็น AP และ ESP32 ของ TTGO เป็นสถานี ฉันใช้เสาอากาศที่เอามาจาก TP-Link ที่ใหญ่กว่าเล็กน้อยและเราเตอร์อีกตัวที่เรียกว่าเสาอากาศ 9dbm ฉันไม่ได้สังเกตเห็นความแตกต่างระหว่างคนทั้งสอง
สุดท้าย ไมโครคอนโทรลเลอร์สองตัวเชื่อมต่อผ่านซ็อกเก็ต และด้วยการส่งแพ็กเก็ตข้อมูลแต่ละครั้ง เราพิมพ์กราฟที่มีแถบแสดงอัตราส่วนของ dbm บนจอแสดงผล
ขั้นตอนที่ 1: ติดตั้ง AP ด้วย Wrover
ขั้นตอนที่ 2: การประกอบ STATION ด้วย TTGO
ขั้นตอนที่ 3: ผลลัพธ์
ระยะทางสูงสุดด้วยเสาอากาศภายนอก 2x: 315 เมตร
ระยะห่างสูงสุดกับเสาอากาศภายนอกและภายใน: 157 เมตร
ขั้นตอนที่ 4: เก็บถาวร LOG. CSV
ฉันบันทึกข้อมูลลงในการ์ด SD โดยมีข้อมูลเป็นมิลลิวินาที dbm และสตริงแพ็กเกจ
ขั้นตอนที่ 5: ไลบรารี Adafruit GFX
ใน Arduino IDE ให้ไปที่ Sketch-> Include Library-> Manage Libraries…
ติดตั้ง Adafruit GFX Library
ขั้นตอนที่ 6: ห้องสมุด Adafruit ST7735
ใน Arduino IDE ให้ไปที่ Sketch-> Include Library-> Manage Libraries…
ติดตั้ง Adafruit ST7735
ขั้นตอนที่ 7: การกำหนดค่าการ์ด
คอยติดตามความแตกต่าง:
ขั้นตอนที่ 8: AP.ino
เราได้รวมไลบรารีที่จำเป็นและกำหนดพารามิเตอร์บางอย่าง
#รวม #รวม #รวม #รวม #รวม #รวม // Rede que o ESP criará ไม่มีสถานีที่ใช้สร้าง #define SSID "RSSI_Test" #define PASSWORD "87654321" //Tempo de timeout paraพิจารณา a conexão pedida #define TIMEOUT 2000 //Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 //Configuraç 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"
เรากำหนดพินท่ามกลางตัวแปรอื่น ๆ
// Pinos ทำ 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 ทำ SDCard Os pinos mosi, miso e sck são os nativos (23, 19 e 18 เคารพ) #define SDCARD_CS 15 //Pixel onde o gráfico começa horizontalmente int currentX = PLOT_MARGIN; //Objeto responsável pelo display Adafruit_ST7735 display = Adafruit_ST7735(DISPLAY_CS, DISPLAY_DC, DISPLAY_MOSI, DISPLAY_CLK, DISPLAY_RST); //เซิร์ฟเวอร์ Criamos um (qualquer porta válida ให้บริการ contanto que o cliente ใช้ mesma porta) เซิร์ฟเวอร์ WiFiServer (80); //Variável para armazenar o cliente (ไม่มีสถานี caso o ESP32 em modo) ไคลเอนต์ conectado WiFiClient; //String que recebemos ทำ cliente String ได้รับ; // RSSI enviado pelo ลูกค้าสำหรับ este ESP32 ยาว rssi = 0; //Faz o controle do temporizador (interrupção por tempo) hw_timer_t *ตัวจับเวลา = NULL; //Utilizado para guardar os ultimos std::vector rssiHistory;
ติดตั้ง
การตั้งค่าเป็นโมฆะ () { Serial.begin (115200); setupDisplay(); // เริ่มต้นหรือ SD ถ้า (!SD.begin (SDCARD_CS)) { display.println ("Erro ao inicializar lib SD!"); } //Cria a rede WiFi, เริ่มต้นหรือเซิร์ฟเวอร์ e espera o cliente conectar setupWiFi (); เซิร์ฟเวอร์.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 e configura o IPvoid setupWiFi () { display.println ("กำลังสร้าง softAP" + String (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, รหัสผ่าน); display.println("softAP" + String(SSID) + " สร้างแล้ว!"); }
ตั้งค่าจอแสดงผล
//Incializa o display, muda a orientação e limpa a telavoid setupDisplay () { //Incializa o แสดง display.initR (INITR_BLACKTAB); //Rotaciona หรือ conteúdo Mostrado display.setRotation(3); // Pinta a tela de preto display.fillScreen(ST77XX_BLACK); }
waitForClient
เป็นโมฆะ 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 Responseer //antes de dizermos que a conexão foi perdida client.setTimeout(TIMEOUT); //กำหนดระยะเวลา }
IRAM_ATTR รีเซ็ตโมดูลและตั้งค่าWatchdog
// função que o temporizador irá chamar, para reiniciar o ESP32void IRAM_ATTR resetModule(){ ets_printf("(watchdog) reiniciar\n"); esp_restart_noos(); // reinicia o ชิป } เป็นโมฆะ setupWatchdog () { timer = timerBegin (0, 80, จริง); //timerID 0, div 80 //timer, callback, interrupção de borda timerAttachInterrupt (ตัวจับเวลา, &resetModule, จริง); //ตัวจับเวลา, จังหวะ (เรา), repetição timerAlarmWrite (ตัวจับเวลา, 10000000, จริง); timerAlarmEnable (จับเวลา); //habilita a interrupção }
ห่วง
วงเป็นโมฆะ () { timerWrite (ตัวจับเวลา, 0); //รีเซ็ต o temporizador (alimenta o watchdog) checkConnection (); //checa se possui conexão com o ลูกค้า readFromClient(); // ระบบปฏิบัติการ ทำ cliente sendToClient(); //envia Confirmação para o ลูกค้าพล็อต (); //mostra o gráfico de histórico de rssi บันทึก (); //salva um log no cartão SD }
ตรวจสอบการเชื่อมต่อ
เป็นโมฆะ 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
เป็นโมฆะ 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 ทำ cliente if (client.connected ()) { ได้รับ = client.readStringUntil ('\ n'); // Lê o texto que o ลูกค้า enviou ได้รับ.remove(received.length()-1); //เอาออก o \n ทำ rssi สุดท้าย = client.parseInt(); // Lê o rssi que o ลูกค้า enviou clearText(); //ลิมปาหรือ texto display.setCursor(0, 0); // เลื่อนเคอร์เซอร์ไปที่ texto para o começo do display display.println("RSSI:" + String(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 ทำ histórico (mais lateste) rssiHistory.push_back(rssi); } }
sendToClient
ถือเป็นโมฆะ sendToClient () { // Se o cliente estiver conectado enviamos de volta a mensagem com um OK if (client.connected ()) { การส่งสตริง = ได้รับ + " ตกลง"; client.println(กำลังส่ง); } }
พล็อต
พล็อตโมฆะ () {// 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 สำหรับ (int i = 0; i -120 ? map(rssiHistory, -120, 0, 0, PLOT_SIZE): 0; display.drawFastVLine(currentX, DISPLAY_HEIGHT - ค่า, ค่า, PLOT_COLOR); currentX += 2; } }
clearText และบันทึก
เป็นโมฆะ clearText(){ //Limpa a área com o texto da mensagem vinda do cliente display.fillRect(0, 0, DISPLAY_WIDTH, 2*PLOT_MARGIN, ST77XX_BLACK); } บันทึกเป็นโมฆะ () { //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 ("ไม่สามารถเปิดไฟล์ได้"); กลับ; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = สตริง (มิลลิวินาที ()) + ";" + สตริง (rssi) + ";" + ได้รับ; file.println (ข้อมูล); ไฟล์.close(); }
ขั้นตอนที่ 9: Station.ino
เราได้รวมไลบรารีที่จำเป็นและกำหนดพารามิเตอร์บางอย่าง
#รวม #รวม #รวม #รวม #รวม #รวม //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 ไม่มีการตั้งค่าสำหรับ AP #define PORT 80 //Porta ทำเซิร์ฟเวอร์ Qualquer porta válida contanto que seja igual nos dois arquivos //Tempo de timeout paraพิจารณา a conexão pedida #define TIMEOUT 2000 //Largura e altura do display #define DISPLAY_WIDTH 160 #define DISPLAY_HEIGHT 128 // กำหนดค่าส่วนบุคคล #define PLOT_COLOR ST77XX_GREEN #define PLOT_MARGIN 20 #define PLOT_SIZE (DISPLAY_HEIGHT - 2*PLOT_MARGIN) // ไม่พบบันทึกใน SD #define FILE_PATH "/log.csv"
เรากำหนดการตั้งค่าที่เกี่ยวข้องกับการแสดงผลและการ์ด SD
นับยาว = 0; //Contador de mensagens enviadaslong rssi = 0; // RSSI calculado String ได้รับ; //Mensagem de Confirmação que o AP nos envia //Pixel onde o gráfico começa แนวนอน int ปัจจุบันX = PLOT_MARGIN; //Utilizado para conexão com o เซิร์ฟเวอร์ WiFiClient 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 ทำ SDCard ระบบปฏิบัติการ pinos mosi, miso e sck são os nativos (23, 19 e 18 เคารพ) #define SDCARD_CS 15 //Objeto responsável pelo display Adafruit_ST7735 display = 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;
ติดตั้ง
การตั้งค่าเป็นโมฆะ () { setupDisplay (); // เริ่มต้นหรือ SD ถ้า (!SD.begin (SDCARD_CS)) { display.println ("Erro ao inicializar lib SD!"); } //Conecta ไม่มีจุดเชื่อมต่อ criado pelo outro ESP32 และเซิร์ฟเวอร์ conecta ao setupWiFi (); เชื่อมต่อไปยังเซิร์ฟเวอร์ (); //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 () { //Incializa o แสดง display.initR (INITR_BLACKTAB); //Rotaciona หรือ conteúdo Mostrado display.setRotation(1); // Pinta a tela de branco display.fillScreen (ST77XX_BLACK); display.setTextColor(ST77XX_WHITE); }
setupWiFi
// Conecta ao AP เป็นโมฆะ setupWiFi () { WiFi.disconnect (); WiFi.mode(WIFI_STA); WiFi.begin(SSID, รหัสผ่าน); 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 () { display.println ("กำลังพยายามเชื่อมต่อซ็อกเก็ต"); // Espera a conexão com o เซิร์ฟเวอร์ในขณะที่ (!socket.connect (HOST, PORT)) { display.print ("."); ล่าช้า (500); } display.println(); display.println("เชื่อมต่อแล้ว!"); //เพิ่มความเร็วให้กับผู้ใช้ก่อนการสาธิตสำหรับตัวช่วยตอบสนอง //การจำกัดเวลาในการใช้งาน socket.setTimeout(TIMEOUT); }
IRAM_ATTR รีเซ็ตโมดูลและตั้งค่าWatchdog
// função que o temporizador irá chamar, para reiniciar o ESP32void IRAM_ATTR resetModule(){ ets_printf("(watchdog) reiniciar\n"); esp_restart_noos(); // reinicia o ชิป } เป็นโมฆะ setupWatchdog () { timer = timerBegin (0, 80, จริง); //timerID 0, div 80 //timer, callback, interrupção de borda timerAttachInterrupt (ตัวจับเวลา, &resetModule, จริง); //ตัวจับเวลา, จังหวะ (เรา), repetição timerAlarmWrite (ตัวจับเวลา, 10000000, จริง); timerAlarmEnable (จับเวลา); //habilita a interrupção }
ห่วง
วงเป็นโมฆะ () { timerWrite (ตัวจับเวลา, 0); // reseta o temporizador (alimenta o watchdog) ตรวจสอบการเชื่อมต่อ (); //checa se possui conexão com หรือเซิร์ฟเวอร์ checkRSSI(); // การยืนยันหรือพล็อต rssi (); //mostra หรือ gráfico de histórico de rssi sendToServer(); //envia uma mensagem com um contador para o เซิร์ฟเวอร์ readFromServer (); //espera ยืนยันการทำบันทึกเซิร์ฟเวอร์ (); // salva um log ไม่มีความล่าช้าของ cartão SD (1000); //espera อืม เซกุนโด }
ตรวจสอบการเชื่อมต่อ
ถือเป็นโมฆะ checkConnection () { // Verifica a conexão com o AP if (WiFi.status () != WL_CONNECTED) { display.fillScreen (ST77XX_BLACK); display.setCursor(0, 0); display.println("ยกเลิกการเชื่อมต่อ WiFi"); ตั้งค่า WiFi(); ล่าช้า (1000); } // ยืนยันซ็อกเก็ตถ้า (!socket.connected ()) { display.fillScreen (ST77XX_BLACK); display.setCursor(0, 0); display.println("ซ็อกเก็ตถูกตัดการเชื่อมต่อ"); เชื่อมต่อไปยังเซิร์ฟเวอร์ (); ล่าช้า (3000); display.fillScreen (ST77XX_BLACK); } }
ตรวจสอบRSSI
ตรวจสอบเป็นโมฆะ RSSI () { // Verifica o RSSI rssi = WiFi. RSSI (); // Limpa o texto e mostra o RSSI ไม่แสดง 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 ทำ histórico (mais lateste) rssiHistory.push_back(rssi); }
พล็อต
พล็อตโมฆะ () {// 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 สำหรับ (int i = 0; i -120 ? map(rssiHistory, -120, 0, 0, PLOT_SIZE): 0; display.drawFastVLine(currentX, DISPLAY_HEIGHT - ค่า, ค่า, PLOT_COLOR); currentX += 2; } }
sendToServer
เป็นโมฆะ sendToServer () { // Se estiver conectado com o เซิร์ฟเวอร์ if (socket.connected ()) { //Envia um สวัสดี com um contador, Mostra ไม่แสดง e เพิ่มหรือ contador การส่งสตริง = "สวัสดี" + สตริง (นับ); display.setCursor(0, 10); display.println("กำลังส่ง: " + กำลังส่ง); socket.println (กำลังส่ง); socket.print(สตริง(rssi)); นับ++; } }
readFromServer
เป็นโมฆะ readFromServer () { // Espera até o เซิร์ฟเวอร์ enviar algo ou desconectar ในขณะที่ (socket.connected () && !socket.available ()) { ล่าช้า (100); } //Se tem algo para receber if(socket.available()) { //Faz a leitura, remove o \n do final e mostra no displayจะได้รับ = socket.readStringUntil('\n'); ได้รับ.remove(received.length()-1); display.println("ได้รับ: " + ได้รับ); } }
clearText และบันทึก
ถือเป็นโมฆะ clearText(){ //Limpa a área com o texto da mensagem vinda do cliente display.fillRect(0, 0, DISPLAY_WIDTH, 2*PLOT_MARGIN, ST77XX_BLACK); } บันทึกเป็นโมฆะ () { //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 ("ไม่สามารถเปิดไฟล์ได้"); กลับ; } // Gravamos uma linha com o tempo desde o boot, o rssi atual e a mensagem recebida String data = สตริง (มิลลิวินาที ()) + ";" + สตริง (rssi) + ";" + ได้รับ; file.println (ข้อมูล); ไฟล์.close(); }
ขั้นตอนที่ 10: ไฟล์
ดาวน์โหลดไฟล์:
ไฟล์ PDF
ฉันไม่
แนะนำ:
สถานีตรวจอากาศระดับมืออาชีพโดยใช้ ESP8266 และ ESP32 DIY: 9 ขั้นตอน (พร้อมรูปภาพ)
สถานีตรวจอากาศระดับมืออาชีพโดยใช้ ESP8266 และ ESP32 DIY: LineaMeteoStazione เป็นสถานีตรวจอากาศที่สมบูรณ์แบบซึ่งสามารถเชื่อมต่อกับเซ็นเซอร์ระดับมืออาชีพจาก Sensirion รวมถึงส่วนประกอบ Davis Instrument (Rain Gauge, เครื่องวัดความเร็วลม) โปรเจ็กต์นี้มีจุดมุ่งหมายเพื่อเป็นสถานีตรวจอากาศแบบ DIY แต่ต้องใช้
ความแรงของสัญญาณ ESP32 TTGO WiFi: 8 ขั้นตอน (พร้อมรูปภาพ)
ความแรงของสัญญาณ WiFi ESP32 TTGO: ในบทช่วยสอนนี้ เราจะเรียนรู้วิธีแสดงความแรงของสัญญาณเครือข่าย WiFi โดยใช้บอร์ด ESP32 TTGO ดูวิดีโอ
ESP32 Bluetooth Tutorial - วิธีใช้ Bluetooth ในตัวของ ESP32: 5 ขั้นตอน
ESP32 Bluetooth Tutorial | วิธีใช้ Bluetooth ในตัวของ ESP32: สวัสดีทุกคน เนื่องจากบอร์ด ESP32 มาพร้อมกับ WiFi & บลูทูธทั้งคู่ แต่สำหรับโปรเจ็กต์ส่วนใหญ่ เรามักจะใช้แค่ Wifi เราไม่ได้ใช้บลูทูธ ดังนั้นในคำแนะนำนี้ ฉันจะแสดงให้เห็นว่าการใช้บลูทูธของ ESP32 & สำหรับโครงการพื้นฐานของคุณ
เริ่มต้นใช้งาน ESP32 CAM - สตรีมวิดีโอโดยใช้ ESP CAM ผ่าน Wifi - โครงการกล้องรักษาความปลอดภัย ESP32: 8 ขั้นตอน
เริ่มต้นใช้งาน ESP32 CAM | สตรีมวิดีโอโดยใช้ ESP CAM ผ่าน Wifi | โครงการกล้องรักษาความปลอดภัย ESP32: วันนี้เราจะเรียนรู้วิธีใช้บอร์ด ESP32 CAM ใหม่นี้ และวิธีที่เราสามารถเข้ารหัสและใช้เป็นกล้องรักษาความปลอดภัยและรับการสตรีมวิดีโอผ่าน wifi
เริ่มต้นใช้งาน ESP32 - การติดตั้งบอร์ด ESP32 ใน Arduino IDE - ESP32 Blink Code: 3 ขั้นตอน
เริ่มต้นใช้งาน ESP32 | การติดตั้งบอร์ด ESP32 ใน Arduino IDE | รหัสการกะพริบของ ESP32: ในคำแนะนำนี้ เราจะดูวิธีการเริ่มทำงานกับ esp32 และวิธีการติดตั้งบอร์ด esp32 ลงใน Arduino IDE และเราจะตั้งโปรแกรม esp 32 เพื่อเรียกใช้โค้ดกะพริบโดยใช้ arduino ide