#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Encoder.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Piny
const int pressurePin = A0;
const int compressorPin = 2;
const int releaseValvePin = 4;
const int buttonPin = 3;
const int encoderCLK = 6;
const int encoderDT = 7;
const int encoderSW = 8;
Encoder encoder(encoderCLK, encoderDT);
bool isRunning = false;
bool isVacuumHold = false;
float pressure = 0.0;
int vacuumThreshold = 30; // kPa
int encoderPrev = 0;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 200;
bool lastButtonState = HIGH;
unsigned long startVacuumTime = 0;
unsigned long vacuumHoldDuration = 30000; // ms = 30 sek
void setup() {
pinMode(compressorPin, OUTPUT);
pinMode(releaseValvePin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
pinMode(encoderSW, INPUT_PULLUP);
digitalWrite(compressorPin, LOW);
digitalWrite(releaseValvePin, LOW);
encoder.write(vacuumThreshold * 4); // każdy krok = 0.25
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("System gotowy");
display.display();
}
void loop() {
// Odczyt czujnika ciśnienia
int raw = analogRead(pressurePin);
pressure = map(raw, 102, 922, 0, 100); // MPX5100: 0.5–4.5V → 0–100 kPa
// Obsługa enkodera
int newEnc = encoder.read() / 4;
if (newEnc != encoderPrev) {
encoderPrev = newEnc;
vacuumThreshold = constrain(newEnc, 10, 90); // zakres 10–90 kPa
}
// Obsługa przycisku START
bool currentButtonState = digitalRead(buttonPin);
if (currentButtonState == LOW && lastButtonState == HIGH && millis() - lastDebounceTime > debounceDelay) {
lastDebounceTime = millis();
if (!isRunning && !isVacuumHold) {
isRunning = true;
digitalWrite(compressorPin, HIGH);
digitalWrite(releaseValvePin, LOW);
} else if (isVacuumHold) {
isRunning = false;
isVacuumHold = false;
digitalWrite(compressorPin, LOW);
digitalWrite(releaseValvePin, LOW);
}
}
lastButtonState = currentButtonState;
// Zatrzymanie kompresora po osiągnięciu progu
if (isRunning && pressure <= vacuumThreshold) {
digitalWrite(compressorPin, LOW);
isRunning = false;
isVacuumHold = true;
startVacuumTime = millis();
}
// Auto-opróżnianie po czasie
if (isVacuumHold && millis() - startVacuumTime >= vacuumHoldDuration) {
digitalWrite(releaseValvePin, HIGH);
isVacuumHold = false;
}
// OLED wyświetlanie
display.clearDisplay();
display.setCursor(0, 0);
display.print("Cisnienie: ");
display.print(pressure, 1);
display.println(" kPa");
display.setCursor(0, 15);
display.print("Prog: ");
display.print(vacuumThreshold);
display.println(" kPa");
display.setCursor(0, 30);
display.print("Kompresor: ");
display.println(digitalRead(compressorPin) ? "ON" : "OFF");
display.setCursor(0, 45);
display.print("Zawor: ");
display.println(digitalRead(releaseValvePin) ? "OPEN" : "CLOSED");
display.display();
delay(150);
}