Đôi lời:
Chào các bạn, đây là bài viết đầu tiên trong chuỗi các dự án nhỏ với ESP32.
Về ESP32, nó là một dòng Vi điều khiển của Espressif Systems, được tích hợp sẵn Wifi và Bluetooth, rất phù hợp để ta làm các ứng dụng IoT, và nhiều hơn thế nữa.
Trong seri này, mình muốn tập trung khám phá các tính năng của Vi điều khiển này, qua Mạch Vietduino Wifi BLE ESP32 (Arduino Compatible).
Mục tiêu:
Làm một ứng dụng nhỏ – một bộ thiết bị quét Wifi ở khu vực xung quanh và hiển thị tên Wifi lên màn hình Oled.
Chuẩn bị phần cứng:
- Mạch Vietduino Wifi BLE ESP32 (link sản phẩm).
- Màn Hình Oled 0.96 Inch (link sản phẩm).
- Cáp USB Type C (link sản phẩm).
Chuẩn bị phần mềm:
- Cài đặt IDE Arduino vào máy tính (hướng dẫn).
- Cài đặt Driver CH340 vào máy tính (hướng dẫn).
- Cài đặt gói thư viện ESP32 vào IDE Arduino (hướng dẫn).
- Thêm thư viện Adafruit_SSD1306 vào IDE Arduino (hướng dẫn).
Các bước thực hiện.
Bước 1:
- Kết nối màn hình Oled với bo mạch ESP32.
Tip: hàn rào cắm như hình để kết nối dễ dàng hơn.
- Dùng cáp USB-typeC để kết nối bo mạch với máy tính.
Bước 2:
- Mở phần mềm Arduino lên, tạo 1 dự án mới (File → New) và cấu hình như hình dưới đây.
Note: chọn đúng cổng COM (có thể mở Device Manager để xác nhận chắc hơn).
Tip: chọn Upload Speed = 921600 (để tăng tốc độ nạp code vào bo mạch).
- Copy đoạn code sau vào file dự án của bạn.
/* ----------------------------------------------------------- */ /* LIBRARY */ /* ----------------------------------------------------------- */ #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include "WiFi.h" /* ----------------------------------------------------------- */ /* DEFINE */ /* ----------------------------------------------------------- */ #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) #define SCREEN_ADDRESS 0x3C // /* ----------------------------------------------------------- */ /* OBJECT */ /* ----------------------------------------------------------- */ Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); /* ----------------------------------------------------------- */ /* CONFIG */ /* ----------------------------------------------------------- */ void setup() { Serial.begin(115200); // Set WiFi to station mode and disconnect from an AP if it was previously connected. WiFi.mode(WIFI_STA); WiFi.disconnect(); delay(100); Serial.println("Setup done"); // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1306 allocation failed")); for (;;) ; // Don't proceed, loop forever } // Clear the buffer display.clearDisplay(); display.setRotation(2); // Rotate the screen vertically display.setTextSize(1); // Normal 1:1 pixel scale display.setTextColor(SSD1306_WHITE); // Draw white text display.setCursor(0, 0); // Start at top-left corner display.cp437(true); // Use full 256 char 'Code Page 437' font } /* ----------------------------------------------------------- */ /* MAIN */ /* ----------------------------------------------------------- */ void loop() { Serial.println(F("Scan start")); //// Oled //// display.clearDisplay(); display.setCursor(0, 0); display.println(F("Scan start")); display.display(); // WiFi.scanNetworks will return the number of networks found. int n = WiFi.scanNetworks(); Serial.println("Scan done"); //// Oled //// display.clearDisplay(); display.setCursor(0, 0); display.println(F("Scan done")); display.display(); delay(500); if (n == 0) { Serial.println(F("no networks found")); //// Oled //// display.println(F("no networks found")); display.display(); } else { Serial.print(n); Serial.println(F(" networks found")); //// Oled //// display.clearDisplay(); display.setCursor(0, 0); display.print(n); display.println(F(" networks found")); display.display(); Serial.println(F("Nr | SSID | RSSI | CH | Encryption")); for (int i = 0; i < n; ++i) { // Print SSID and RSSI for each network found Serial.printf("%2d", i + 1); Serial.print(" | "); Serial.printf("%-32.32s", WiFi.SSID(i).c_str()); Serial.print(" | "); Serial.printf("%4d", WiFi.RSSI(i)); Serial.print(" | "); Serial.printf("%2d", WiFi.channel(i)); Serial.print(" | "); //// Oled //// display.print(i + 1); display.print(F(". ")); display.println(WiFi.SSID(i).c_str()); display.display(); switch (WiFi.encryptionType(i)) { case WIFI_AUTH_OPEN: Serial.print("open"); break; case WIFI_AUTH_WEP: Serial.print("WEP"); break; case WIFI_AUTH_WPA_PSK: Serial.print("WPA"); break; case WIFI_AUTH_WPA2_PSK: Serial.print("WPA2"); break; case WIFI_AUTH_WPA_WPA2_PSK: Serial.print("WPA+WPA2"); break; case WIFI_AUTH_WPA2_ENTERPRISE: Serial.print("WPA2-EAP"); break; case WIFI_AUTH_WPA3_PSK: Serial.print("WPA3"); break; case WIFI_AUTH_WPA2_WPA3_PSK: Serial.print("WPA2+WPA3"); break; case WIFI_AUTH_WAPI_PSK: Serial.print("WAPI"); break; default: Serial.print("unknown"); } Serial.println(); delay(10); } } Serial.println(""); // Delete the scan result to free memory for code below. WiFi.scanDelete(); // Wait a bit before scanning again. delay(5000); }
Bước 3:
- Nạp chương trình và xem kết quả hiển thị trên màn hình Oled.
Bạn cũng có thể mở cổng Serial Monitor (115200 baud) xem thông tin chi tiết hơn.
(video)