#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 d(128, 64, &Wire, -1);
uint8_t st = 0, warn = 0;
unsigned long t = 0;
bool bState = false;
void updateOLED() {
d.clearDisplay();
d.setCursor(0, 0);
d.println(F("=== TRANG THAI ==="));
if (warn) {
d.println(F("CANH BAO KHAN CAP!"));
d.println(F("Xanh/Do: Dang chop"));
} else {
d.print(F("Xanh (D7): ")); d.println((st & 1) ? "ON" : "OFF");
d.print(F("Do (D6): ")); d.println((st & 2) ? "ON" : "OFF");
d.print(F("Tim (D5): ")); d.println((st & 4) ? "ON" : "OFF");
d.print(F("Vang (D4): ")); d.println((st & 8) ? "ON" : "OFF");
}
d.display();
}
void setup() {
for (uint8_t i = 4; i < 8; i++) pinMode(i, OUTPUT);
for (uint8_t i = 10; i <= 13; i++) pinMode(i, INPUT_PULLUP);
pinMode(8, INPUT_PULLUP);
d.begin(SSD1306_SWITCHCAPVCC, 0x3C);
d.setTextSize(1);
d.setTextColor(SSD1306_WHITE);
updateOLED();
}
void loop() {
static uint8_t lastBtn[5] = {HIGH, HIGH, HIGH, HIGH, HIGH};
uint8_t pins[] = {13, 12, 11, 10, 8};
// Đọc trạng thái 5 nút nhấn
for (uint8_t i = 0; i < 5; i++) {
uint8_t val = digitalRead(pins[i]);
if (val == LOW && lastBtn[i] == HIGH) {
if (i == 4) warn = !warn;
else st ^= (1 << i); // Đảo bit trạng thái đèn tương ứng
updateOLED();
delay(30);
}
lastBtn[i] = val;
}
// Điều khiển đèn thực tế
if (warn) {
if (millis() - t >= 300) {
t = millis();
bState = !bState;
digitalWrite(7, bState);
digitalWrite(6, bState);
digitalWrite(5, LOW);
digitalWrite(4, LOW);
}
} else {
for (uint8_t i = 0; i < 4; i++) {
digitalWrite(7 - i, (st & (1 << i)) ? HIGH : LOW);
}
}
}Loading
st-nucleo-c031c6
st-nucleo-c031c6
Loading
ssd1306
ssd1306