#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RotaryEncoder.h>
#include <ESP32Servo.h>
// Définir la taille de l'écran OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// Définir les broches pour l'écran OLED
#define OLED_RESET -1
#define OLED_I2C_ADDRESS 0x3C // Adresse I2C de l'écran OLED
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Définir les broches pour l'encodeur rotatif et les boutons
#define ENCODER_CLK 18
#define ENCODER_DT 19
#define SELECT_PIN 10
#define BACK_PIN 9
// Définir les broches pour les servos
#define SERVO_EAU 8
#define SERVO_ORANGE 7
#define SERVO_CITRON 6
#define SERVO_MENTHE 5
// Définir les servos pour les pompes
Servo servoEau;
Servo servoOrange;
Servo servoCitron;
Servo servoMenthe;
// Paramètres de l'encodeur rotatif
RotaryEncoder encoder(ENCODER_CLK, ENCODER_DT);
String boissons[] = {"Eau", "Orange", "Citron", "Menthe"};
int currentSelection = 0;
bool isConfirming = false;
int lastEncoderState = LOW;
void setup() {
Serial.begin(115200);
// Initialiser l'écran OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, OLED_I2C_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.display();
// Initialiser les broches
pinMode(SELECT_PIN, INPUT_PULLUP);
pinMode(BACK_PIN, INPUT_PULLUP);
// Initialiser les servos
servoEau.attach(SERVO_EAU);
servoOrange.attach(SERVO_ORANGE);
servoCitron.attach(SERVO_CITRON);
servoMenthe.attach(SERVO_MENTHE);
encoder.setPosition(0); // Initialiser la position de l'encodeur
displayMenu();
}
void loop() {
encoder.tick(); // Lire la position actuelle de l'encodeur
int encoderState = digitalRead(ENCODER_CLK);
// Vérifier si l'encodeur a été tourné
if (encoderState != lastEncoderState) {
if (digitalRead(ENCODER_DT) != encoderState) {
currentSelection++;
if (currentSelection >= 4) currentSelection = 0; // Retour au début si fin de liste
} else {
currentSelection--;
if (currentSelection < 0) currentSelection = 3; // Retour à la fin si début de liste
}
displayMenu();
}
lastEncoderState = encoderState;
// Gérer la sélection
if (digitalRead(SELECT_PIN) == LOW) {
isConfirming = true;
displayConfirm();
distribuerBoisson();
delay(1000); // Debounce et durée d'activation
isConfirming = false;
displayMenu();
}
// Gérer le retour
if (digitalRead(BACK_PIN) == LOW && isConfirming) {
isConfirming = false;
displayMenu();
delay(500); // Debounce
}
}
void displayMenu() {
display.clearDisplay();
display.setCursor(0, 0);
for (int i = 0; i < 4; i++) {
if (i == currentSelection) {
display.print("> "); // Indiquer la sélection
} else {
display.print(" ");
}
display.println(boissons[i]);
}
display.display();
}
void displayConfirm() {
display.clearDisplay();
display.setCursor(0, 0);
display.println("Confirmer?");
display.println(boissons[currentSelection]);
display.println("Select/Back");
display.display();
}
void distribuerBoisson() {
display.clearDisplay();
display.setCursor(0, 0);
display.println("Distribution de:");
display.println(boissons[currentSelection]);
display.display();
// Fonction pour activer les pompes en fonction du choix
switch (currentSelection) {
case 0: // Eau
servoEau.write(90); // Exemple de position
delay(4000); // Durée d'activation
servoEau.write(0); // Éteindre la pompe
break;
case 1: // Orange
servoEau.write(90); // Eau
servoOrange.write(90); // Orange
delay(1000); // Ajuster en fonction de la dilution
servoEau.write(0);
servoOrange.write(0);
break;
case 2: // Citron
servoEau.write(90); // Eau
servoCitron.write(90); // Citron
delay(1000); // Ajuster en fonction de la dilution
servoEau.write(0);
servoCitron.write(0);
break;
case 3: // Menthe
servoEau.write(90); // Eau
servoMenthe.write(90); // Menthe
delay(1000); // Ajuster en fonction de la dilution
servoEau.write(0);
servoMenthe.write(0);
break;
}
}