#include <LiquidCrystal_I2C.h>
// Définition des broches
const int stepper_enable_pin = 7;
const int stepper_step_pin = 6;
const int stepper_dir_pin = 5;
const int pot_in = A0;
const int dir_pot_in = A1; // Broche pour le potentiomètre de direction
const int left_limit_switch_pin = 2; // Bouton poussoir pour fin de course gauche
const int right_limit_switch_pin = 3; // Bouton poussoir pour fin de course droit
const int button_on_pin = 8; // Broche pour le bouton poussoir ON
const int button_off_pin = 9; // Broche pour le bouton poussoir OFF
#define UNE_SECONDE 1000
LiquidCrystal_I2C lcd(0x27, 20, 4); // Adresse de l'écran LCD et dimensions
bool motor_and_screen_on = false; // État initial: moteur et écran éteints
const int rail_length_steps = 2000; // Nombre total de pas pour parcourir toute la longueur du rail (ajustez selon votre moteur)
const int center_position_steps = rail_length_steps / 2; // Position centrale en pas
const int max_position_steps = rail_length_steps; // Position maximale en pas correspondant à 1 mètre
int current_position_steps = 0; // Position actuelle du chariot en pas
unsigned long startTime = 0; // Temps de début du mouvement
void setup() {
Serial.begin(115200);
// Configuration des broches
pinMode(stepper_enable_pin, OUTPUT);
pinMode(stepper_step_pin, OUTPUT);
pinMode(stepper_dir_pin, OUTPUT);
pinMode(left_limit_switch_pin, INPUT_PULLUP); // Configurer le bouton de fin de course gauche en entrée avec pull-up
pinMode(right_limit_switch_pin, INPUT_PULLUP); // Configurer le bouton de fin de course droit en entrée avec pull-up
pinMode(button_on_pin, INPUT_PULLUP); // Configurer le bouton ON en entrée avec pull-up
pinMode(button_off_pin, INPUT_PULLUP); // Configurer le bouton OFF en entrée avec pull-up
digitalWrite(stepper_enable_pin, LOW); // Activer le moteur
digitalWrite(stepper_step_pin, LOW);
// Initialisation de l'écran LCD
lcd.init();
lcd.backlight();
// Message de bienvenue
lcd.setCursor(6, 0); // Position centrée pour "Bonjour"
lcd.print("Bonjour");
delay(UNE_SECONDE * 3);
lcd.clear();
}
void moveToCenter() {
int steps_to_center = center_position_steps - current_position_steps;
if (steps_to_center > 0) {
digitalWrite(stepper_dir_pin, HIGH); // Déplacer vers la droite
} else {
digitalWrite(stepper_dir_pin, LOW); // Déplacer vers la gauche
steps_to_center = -steps_to_center; // Prendre la valeur absolue des pas à parcourir
}
for (int i = 0; i < steps_to_center; i++) {
digitalWrite(stepper_step_pin, HIGH);
delayMicroseconds(100); // Ajuster selon la vitesse souhaitée
digitalWrite(stepper_step_pin, LOW);
delayMicroseconds(1000); // Ajuster selon la vitesse souhaitée
}
current_position_steps = center_position_steps; // Mettre à jour la position actuelle
}
void loop() {
// Vérifier l'état des boutons poussoirs
if (digitalRead(button_on_pin) == LOW) {
motor_and_screen_on = true;
startTime = millis(); // Démarrer le temps de fonctionnement
} else if (digitalRead(button_off_pin) == LOW) {
motor_and_screen_on = false;
moveToCenter(); // Déplacer au centre avant d'éteindre
lcd.clear();
lcd.setCursor(6, 0); // Position centrée pour "Au revoir"
lcd.print("Au revoir");
delay(UNE_SECONDE * 3); // Attendre avant d'éteindre l'écran
lcd.noBacklight(); // Éteindre le rétroéclairage de l'écran
lcd.clear(); // Effacer l'écran LCD
}
if (motor_and_screen_on) {
digitalWrite(stepper_enable_pin, LOW); // Activer le moteur
lcd.backlight(); // Allumer le rétroéclairage de l'écran
int pot_value = analogRead(pot_in);
int dir_pot_value = analogRead(dir_pot_in); // Lire la valeur du potentiomètre de direction
int motor_speed = map(pot_value, 0, 1023, 0, 100); // Mappage de la valeur du potentiomètre en pourcentage de vitesse (0-100)
// Définir la direction en fonction de la valeur du potentiomètre de direction
if (dir_pot_value < 512) {
digitalWrite(stepper_dir_pin, LOW); // Déplacer vers la gauche
} else {
digitalWrite(stepper_dir_pin, HIGH); // Déplacer vers la droite
}
// Vérifier les capteurs de fin de course et ajuster la direction
if (digitalRead(left_limit_switch_pin) == LOW) {
digitalWrite(stepper_dir_pin, HIGH); // Changer la direction vers la droite
} else if (digitalRead(right_limit_switch_pin) == LOW) {
digitalWrite(stepper_dir_pin, LOW); // Changer la direction vers la gauche
}
// Mettre à jour la position actuelle du chariot avant d'avancer
if (digitalRead(stepper_dir_pin) == HIGH) {
if (current_position_steps + motor_speed > max_position_steps) {
motor_speed = max_position_steps - current_position_steps; // Limiter la vitesse pour ne pas dépasser la position maximale
digitalWrite(stepper_dir_pin, LOW); // Inverser la direction après avoir atteint la fin
}
current_position_steps += motor_speed;
} else {
if (current_position_steps - motor_speed < 0) {
motor_speed = current_position_steps; // Limiter la vitesse pour ne pas aller en dessous de 0
digitalWrite(stepper_dir_pin, HIGH); // Inverser la direction après avoir atteint le début
}
current_position_steps -= motor_speed;
}
// Boucle pour faire avancer le moteur
for (int i = 0; i < motor_speed; i++) {
digitalWrite(stepper_step_pin, HIGH);
delayMicroseconds(100); // Ajuster selon la vitesse souhaitée
digitalWrite(stepper_step_pin, LOW);
delayMicroseconds(1000); // Ajuster selon la vitesse souhaitée
}
// Conversion de la position actuelle en mètres (rail de 1 mètre)
float position_meters = (1.0 * current_position_steps) / rail_length_steps;
// Calculer le temps de fonctionnement en secondes
unsigned long elapsedTime = (millis() - startTime) / 1000;
// Affichage des informations sur l'écran LCD
lcd.setCursor(0, 0);
lcd.print("Vitesse moteur:");
lcd.setCursor(0, 1);
lcd.print(motor_speed);
lcd.print(" % ");
lcd.setCursor(0, 2);
lcd.print("Position: ");
lcd.print(position_meters, 2); // Afficher la position avec 2 décimales
lcd.print(" m");