#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Định nghĩa chân cho LED
#define RED_LED 5
#define GREEN_LED 4
#define BLUE_LED 2
// Định nghĩa màn hình OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Hàm quét I2C để tìm địa chỉ
void scanI2C() {
byte error, address;
int nDevices = 0;
Serial.println("Quet I2C de tim dia chi thiet bi...");
for (address = 1; address < 127; address++) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("Thiet bi tim thay tai dia chi 0x");
if (address < 16) Serial.print("0");
Serial.println(address, HEX);
nDevices++;
} else if (error == 4) {
Serial.print("Loi tai dia chi 0x");
if (address < 16) Serial.print("0");
Serial.println(address, HEX);
}
}
if (nDevices == 0) Serial.println("Khong tim thay thiet bi I2C!");
else Serial.println("Quet I2C hoan tat.");
}
// Hàm vẽ biểu tượng cảm xúc vui với LED xanh lá
void drawHappyFace() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Happy!");
display.drawCircle(64, 32, 20, SSD1306_WHITE); // Đầu
display.fillCircle(54, 25, 3, SSD1306_WHITE); // Mắt trái
display.fillCircle(74, 25, 3, SSD1306_WHITE); // Mắt phải
display.drawLine(54, 40, 74, 40, SSD1306_WHITE); // Miệng cười
display.display();
digitalWrite(GREEN_LED, HIGH); // Xanh lá
digitalWrite(RED_LED, LOW); // Tắt đỏ
digitalWrite(BLUE_LED, LOW); // Tắt xanh dương
Serial.println("Hien thi cam xuc vui voi mau xanh la");
}
// Hàm vẽ biểu tượng cảm xúc buồn với LED xanh dương
void drawSadFace() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Sad...");
display.drawCircle(64, 32, 20, SSD1306_WHITE); // Đầu
display.fillCircle(54, 25, 3, SSD1306_WHITE); // Mắt trái
display.fillCircle(74, 25, 3, SSD1306_WHITE); // Mắt phải
display.drawLine(54, 45, 74, 45, SSD1306_WHITE); // Miệng buồn
display.display();
digitalWrite(BLUE_LED, HIGH); // Xanh dương
digitalWrite(RED_LED, LOW); // Tắt đỏ
digitalWrite(GREEN_LED, LOW); // Tắt xanh lá
Serial.println("Hien thi cam xuc buon voi mau xanh duong");
}
// Hàm vẽ biểu tượng cảm xúc tức giận với LED đỏ
void drawAngryFace() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Angry!");
display.drawCircle(64, 32, 20, SSD1306_WHITE); // Đầu
display.fillCircle(54, 25, 3, SSD1306_WHITE); // Mắt trái
display.fillCircle(74, 25, 3, SSD1306_WHITE); // Mắt phải
display.drawLine(45, 40, 64, 45, SSD1306_WHITE); // Mày trái
display.drawLine(45, 40, 64, 45, SSD1306_WHITE); // Mày phải
display.display();
digitalWrite(RED_LED, HIGH); // Đỏ
digitalWrite(GREEN_LED, LOW); // Tắt xanh lá
digitalWrite(BLUE_LED, LOW); // Tắt xanh dương
Serial.println("Hien thi cam xuc tuc gian voi mau do");
}
// Hàm vẽ biểu tượng cảm xúc ngạc nhiên với LED trắng (RGB)
void drawSurprisedFace() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Surprised!");
display.drawCircle(64, 32, 20, SSD1306_WHITE); // Đầu
display.drawCircle(54, 25, 5, SSD1306_WHITE); // Mắt trái to
display.drawCircle(74, 25, 5, SSD1306_WHITE); // Mắt phải to
display.drawCircle(64, 42, 4, SSD1306_WHITE); // Miệng tròn
display.display();
digitalWrite(RED_LED, HIGH); // Đỏ
digitalWrite(GREEN_LED, HIGH); // Xanh lá
digitalWrite(BLUE_LED, HIGH); // Xanh dương (trắng)
Serial.println("Hien thi cam xuc ngac nhien voi mau trang");
}
// Hàm vẽ biểu tượng cảm xúc yêu với LED hồng
void drawLoveFace() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Love!");
display.drawCircle(64, 32, 20, SSD1306_WHITE); // Đầu
display.fillCircle(54, 25, 3, SSD1306_WHITE); // Mắt trái
display.fillCircle(74, 25, 3, SSD1306_WHITE); // Mắt phải
display.drawLine(60, 40, 8, 8, SSD1306_WHITE); // Hình trái tim (cần thư viện hỗ trợ, nếu không dùng drawLine)
display.display();
digitalWrite(RED_LED, HIGH); // Đỏ
digitalWrite(GREEN_LED, LOW); // Tắt xanh lá
digitalWrite(BLUE_LED, HIGH); // Xanh dương yếu (hồng)
Serial.println("Hien thi cam xuc yeu voi mau hong");
}
// Hàm vẽ biểu tượng cảm xúc bình yên với LED lục
void drawPeaceFace() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Peace!");
display.drawCircle(64, 32, 20, SSD1306_WHITE); // Đầu
display.fillCircle(54, 25, 3, SSD1306_WHITE); // Mắt trái
display.fillCircle(74, 25, 3, SSD1306_WHITE); // Mắt phải
display.drawLine(54, 40, 74, 40, SSD1306_WHITE); // Miệng thẳng
display.display();
digitalWrite(GREEN_LED, HIGH); // Xanh lá
digitalWrite(BLUE_LED, HIGH); // Xanh dương
digitalWrite(RED_LED, LOW); // Tắt đỏ (lục)
Serial.println("Hien thi cam xuc binh yen voi mau luc");
}
void setup() {
// Khởi tạo Serial để debug
Serial.begin(115200);
Serial.println("Khoi dong chuong trinh...");
// Khởi tạo chân LED
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(BLUE_LED, OUTPUT);
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, LOW);
digitalWrite(BLUE_LED, LOW);
Serial.println("Cac chan LED da duoc khoi tao");
// Khởi tạo I2C với SDA = GPIO 6, SCL = GPIO 7
Wire.begin(D9, D10);
Serial.println("I2C da duoc khoi tao voi SDA = D9, SCL = D10");
// Quét I2C để tìm địa chỉ
scanI2C();
// Khởi tạo màn hình OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("Khong the khoi tao OLED voi dia chi 0x3C, thu dia chi 0x3D...");
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3D)) {
Serial.println("Khong the khoi tao OLED voi ca hai dia chi! Kiem tra ket noi I2C.");
while (1); // Dừng nếu không kết nối được
}
}
Serial.println("OLED da duoc khoi tao thanh cong!");
// Xóa màn hình và hiển thị ban đầu
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Starting...");
display.display();
}
void loop() {
drawHappyFace();
delay(2000);
drawSadFace();
delay(2000);
drawAngryFace();
delay(2000);
drawSurprisedFace();
delay(2000);
drawLoveFace();
delay(2000);
drawPeaceFace();
delay(2000);
}Loading
xiao-esp32-s3
xiao-esp32-s3