#include <ESP32Servo.h>
#include <Adafruit_NeoPixel.h>
#include <esp_sleep.h> // Bibliothèque pour le deep sleep
#define BUTTON_PIN1 35 // Bouton pour activer/désactiver le mode de sélection
#define BUTTON_PIN2 34 // Bouton pour basculer entre les modes et activer le deep sleep
#define SERVO_PIN1 4
#define PIXEL_PIN1 18 // NeoPixel
#define POT_PIN 13
#define NUMPIXELS 2
#define SLIDER_PIN 33
Servo servo1;
Adafruit_NeoPixel pixels(NUMPIXELS, PIXEL_PIN1, NEO_GRB + NEO_KHZ800);
int pos1 = 0; // Position pour servo1
bool isSelectMode = false;
bool isLEDMode = true; // Commence par le mode LED
bool isServo1Mode = false; // Mode pour servo1
int lastPotValue = 0; // Dernière valeur lue du potentiomètre
bool ledState = false; // Etat de la LED pour le clignotement
uint32_t selectedColor = pixels.Color(255, 0, 0); // Couleur sélectionnée, initialement rouge
void setup() {
Serial.begin(115200);
servo1.attach(SERVO_PIN1);
pixels.begin();
pixels.setBrightness(50);
pinMode(BUTTON_PIN1, INPUT_PULLUP);
pinMode(BUTTON_PIN2, INPUT_PULLUP);
pinMode(POT_PIN, INPUT);
pinMode(SLIDER_PIN, INPUT_PULLUP); // Configuration du bouton glissière pour le deep sleep
Serial.println("Setup complet - En attente d'interaction...");
}
void loop() {
int potValue = analogRead(POT_PIN); // Lit la valeur du potentiomètre
int mappedColor = map(potValue, 0, 4095, 0, 255); // Cartographie la valeur à l'index de couleur
int variation = potValue - lastPotValue; // Calcule la variation depuis la dernière lecture
lastPotValue = potValue; // Met à jour la dernière valeur lue
// Affiche la valeur et la variation du potentiomètre
Serial.print("Valeur du potentiomètre: ");
Serial.print(potValue);
Serial.print(", Variation: ");
Serial.println(variation);
// Logique pour basculer entre les modes
if (digitalRead(BUTTON_PIN1) == LOW) {
isSelectMode = !isSelectMode;
Serial.println(isSelectMode ? "Mode de sélection activé" : "Mode de sélection désactivé");
delay(200); // Anti-rebond
}
if (digitalRead(BUTTON_PIN2) == LOW) {
if (isLEDMode) {
isLEDMode = false;
isServo1Mode = true;
Serial.println("Mode Servo 1");
} else {
isServo1Mode = false;
isLEDMode = true;
Serial.println("Mode LED");
}
isSelectMode = false; // Sort du mode de sélection
delay(200); // Anti-rebond
}
if (isSelectMode && isLEDMode) {
// Mode de sélection de couleur avec clignotement
Serial.println("Sélection de la couleur...");
if (ledState) {
selectedColor = Wheel(mappedColor); // Met à jour la couleur sélectionnée
pixels.setPixelColor(0, selectedColor);
} else {
pixels.clear(); // Éteint la LED
}
ledState = !ledState; // Inverse l'état de la LED
pixels.show();
delay(500); // Attends 500ms pour le clignotement
} else if (isLEDMode) {
// Mode LED sans clignotement
pixels.setPixelColor(0, selectedColor); // Affiche la couleur sélectionnée sans clignoter
pixels.show();
} else if (isServo1Mode) {
// Mode de contrôle du premier servo
pos1 = map(potValue, 0, 4095, 0, 180); // Cartographie la valeur à la position du servo1
servo1.write(pos1);
Serial.print("Position du servo 1: ");
Serial.println(pos1);
}
// Vérifie si le bouton glissière pour le deep sleep est activé
if (digitalRead(SLIDER_PIN) == LOW) {
Serial.println("Entrer en mode Deep Sleep...");
pixels.clear(); // Éteint la LED
pixels.show();
delay(100); // Attend un court instant pour laisser le temps à l'affichage de se mettre à jour
esp_deep_sleep_start(); // Entre en mode deep sleep
}
}
// Fonction pour générer un cercle chromatique
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if (WheelPos < 85) {
return pixels.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
if (WheelPos < 170) {
WheelPos -= 85;
return pixels.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
WheelPos -= 170;
return pixels.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}