/*
******************************************
* Module de réglage *
* des courses *
* de sero-moteur *
* *
* Application => réglage des angles *
* des aiguillages *
* Lecture des valeurs sur écran LCD I2C *
******************************************
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! Licence d’utilisation – Philippe Guenet !
! !
! Ce code est librement téléchargeable pour un usage personnel et non commercial. !
! !
! Toute utilisation commerciale, professionnelle ou rémunérée est interdite. !
! !
! La redistribution, la copie publique ou l’intégration dans un autre projet !
! sont interdites. !
! !
! Aucune modification ou adaptation n’est autorisée sans l’accord écrit préalable !
! de l’auteur. !
! !
! L’auteur conserve tous les droits de propriété intellectuelle sur ce code. !
! !
! L’auteur ne saurait être tenu responsable d’aucun dommage résultant de !
! l’utilisation de ce code. !
! !
! L’utilisation du code vaut acceptation de ces conditions. !
! !
! © Philippe Guenet – Tous droits réservés - [email protected] - https://wgnt-train.fr !
! !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
*/
//#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
// Définition des broches
const int potPin = A1;
const int buttonPin = 2;
const int servoPin = 9;
const int ledPin = 13;
// Définition des constantes pour les angles
const int angleMini = 500;
const int angleMaxi = 2500;
const int angleMilieu = (angleMini + angleMaxi) / 2;
// Initialisation du LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); // Adresse I2C et dimensions du LCD
Servo monServo;
// Variables pour le mode "hold" et le clignotement de la LED
bool holdMode = false;
unsigned long lastBlinkMillis = 0;
const unsigned long BLINK_INTERVAL = 300;
bool ledState = LOW;
// Variables pour la gestion des rebonds du bouton
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 10;
int lastButtonState = HIGH;
int buttonState;
// Variable pour stocker la dernière valeur d'angle affichée
int lastDisplayedAngle = -1;
void setup() {
Serial.begin(9600);
// Initialisation du LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Servo Ready");
// Initialisation du bouton
pinMode(buttonPin, INPUT_PULLUP);
// Initialisation du servomoteur
monServo.attach(servoPin);
// Initialisation de la LED
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
// Position initiale du servo
monServo.writeMicroseconds(angleMilieu);
lastDisplayedAngle = angleMilieu;
afficherAngle(angleMilieu);
delay(500);
}
void loop() {
// Lecture de l'état du bouton
int reading = digitalRead(buttonPin);
// Gestion des rebonds
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != buttonState) {
buttonState = reading;
if (buttonState == LOW) {
holdMode = !holdMode;
if (holdMode) {
monServo.writeMicroseconds(angleMilieu);
afficherAngle(angleMilieu);
lastBlinkMillis = millis();
ledState = HIGH;
digitalWrite(ledPin, ledState);
} else {
ledState = LOW;
digitalWrite(ledPin, ledState);
}
}
}
}
lastButtonState = reading;
// Clignotement de la LED en mode hold
if (holdMode) {
unsigned long now = millis();
if (now - lastBlinkMillis >= BLINK_INTERVAL) {
lastBlinkMillis = now;
ledState = !ledState;
digitalWrite(ledPin, ledState);
}
monServo.writeMicroseconds(angleMilieu);
// Mise à jour de l'affichage uniquement si nécessaire
if (lastDisplayedAngle != angleMilieu) {
afficherAngle(angleMilieu);
lastDisplayedAngle = angleMilieu;
}
} else {
// Mode normal : lecture du potentiomètre
int potValue = analogRead(potPin);
int servoValue = map(potValue, 0, 1023, angleMini, angleMaxi);
monServo.writeMicroseconds(servoValue);
// Mise à jour de l'affichage uniquement si nécessaire
if (lastDisplayedAngle != servoValue) {
afficherAngle(servoValue);
lastDisplayedAngle = servoValue;
}
}
delay(100);
}
void afficherAngle(int angle) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Angle : ");
lcd.setCursor(10,0);
lcd.print(angle);
}