#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_BMP280.h> // BMP280 szenzor könyvtár
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
Adafruit_BMP280 bmp; // BMP280 objektum
int currentStateCLK;
int lastStateCLK;
unsigned long lastButtonPress = 0;
int leds[] = {5, 6, 7};
unsigned int menu = 0;
int ledStatus[5] = {0};
int timer = 1000;
void setup() {
Serial.begin(9600);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.display();
pinMode(2, INPUT);
pinMode(3, INPUT);
pinMode(4, INPUT_PULLUP);
for (int i = 0; i < 3; i++) {
pinMode(leds[i], OUTPUT);
}
menu = 0;
if (!bmp.begin(0x76)) { // BMP280 címe (0x76 vagy 0x77 lehet)
Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
while (1);
}
updateMenu();
}
void loop() {
currentStateCLK = digitalRead(2);
if (currentStateCLK != lastStateCLK && currentStateCLK == 1) {
if (digitalRead(3) != currentStateCLK) {
menu--;
updateMenu();
} else {
menu++;
updateMenu();
}
}
lastStateCLK = currentStateCLK;
int btnState = digitalRead(4);
if (btnState == LOW) {
if (millis() - lastButtonPress > 50) {
executeAction();
updateMenu();
}
lastButtonPress = millis();
}
delay(1);
}
void printlcd() {
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(20, 0);
display.println("LAMPA");
display.display();
}
void updateMenu() {
switch (menu) {
case 0:
menu = 1;
break;
case 1:
printlcd();
display.setCursor(0, 30);
display.setTextSize(2);
display.println(" Led 1>");
display.display();
break;
case 2:
printlcd();
display.setCursor(0, 30);
display.setTextSize(2);
display.println("<Led 2>");
display.display();
break;
case 3:
printlcd();
display.setCursor(0, 30);
display.setTextSize(2);
display.println("<Led 3>");
display.display();
break;
case 4:
printlcd();
display.setCursor(0, 50);
display.setTextSize(2);
display.println("<All ON>");
display.display();
break;
case 5:
printlcd();
display.setCursor(0, 50);
display.setTextSize(2);
display.println("<All OFF>");
display.display();
break;
case 6:
printTemperatureAndPressure();
break;
case 7:
menu = 0;
break;
}
}
void executeAction() {
switch (menu) {
case 1:
action(0);
break;
case 2:
action(1);
break;
case 3:
action(2);
break;
case 5:
for (int i = 0; i < 3; i++) {
ledStatus[i] = 0;
digitalWrite(leds[i], ledStatus[i]);
}
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.println("> All LEDs OFF...");
display.display();
delay(timer);
break;
case 4:
for (int i = 0; i < 3; i++) {
ledStatus[i] = 1;
digitalWrite(leds[i], ledStatus[i]);
}
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
display.println("> All LEDs ON...");
display.display();
delay(timer);
break;
}
}
void action(int ledIndex) {
if (ledStatus[ledIndex] != 0) {
ledStatus[ledIndex] = 0;
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(2);
display.println("> LED OFF.");
display.display();
digitalWrite(leds[ledIndex], ledStatus[ledIndex]);
delay(timer);
} else {
ledStatus[ledIndex] = 1;
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(2);
display.println("> LED ON.");
display.display();
digitalWrite(leds[ledIndex], ledStatus[ledIndex]);
delay(timer);
}
}
void printTemperatureAndPressure() {
float temperature = bmp.readTemperature();
float pressure = bmp.readPressure() / 100.0F; // Pascal-ról hektopascalra konvertálás
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.print("Temperature: ");
display.print(temperature);
display.print(" C");
display.setCursor(0, 20);
display.print("Pressure: ");
display.print(pressure);
display.print(" hPa");
display.display();
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" C");
Serial.print("Pressure: ");
Serial.print(pressure);
Serial.println(" hPa");
delay(1000); // 1 másodperc várakozás, majd vissza a főmenübe
menu = 0;
updateMenu();
}