#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#include <AccelStepper.h> // Inclure la bibliothèque pour le moteur pas à pas
LiquidCrystal_I2C lcd(0x27, 16, 2); // Adresse I2C de l'écran LCD
int number = 0;
int restant = 0;
Servo myservo; // Création d'un objet pour contrôler le servomoteur
const int servoPin = 2; // Broche sur laquelle est connecté le servomoteur
const int moteurPin = 10; // Pin de contrôle du moteur continu
const int capteurPin = 3; // Pin du capteur de mouvement
const int stepPin = 7; // Pin step du premier moteur pas à pas
const int dirPin = 8; // Pin dir du premier moteur pas à pas
const int stepPin2 = 5; // Pin step du second moteur pas à pas
const int dirPin2 = 6; // Pin dir du second moteur pas à pas
const int buzzerPin = 9; // Pin du buzzer
const int ledPin = 13; // Pin de la LED
bool retourServo = false; // Variable indiquant si le servomoteur doit revenir à sa position initiale
bool activeLED = false; // Variable indiquant si la LED doit être activée
bool retourMoteur2 = false; // Variable indiquant si le deuxième moteur doit revenir à sa position de départ
bool mouvementDetecte = false; // Variable indiquant si un mouvement a été détecté
unsigned long tempsLED; // Variable pour stocker le temps auquel la LED a été activée
unsigned long tempsDernierMouvement; // Variable pour stocker le temps du dernier mouvement détecté
AccelStepper stepper(1, stepPin, dirPin); // Créer un objet pour le premier moteur pas à pas avec 1 moteur, stepPin sur 7 et dirPin sur 8
AccelStepper stepper2(1, stepPin2, dirPin2); // Créer un objet pour le second moteur pas à pas avec 1 moteur, stepPin2 sur 5 et dirPin2 sur 6
const int STEPS_PER_REVOLUTION = 200; // Nombre de pas par révolution du moteur pas à pas
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','4','7','*'},
{'2','5','8','0'},
{'3','6','9','#'},
{'A','B','C','D'}
};
byte rowPins[ROWS] = {22, 24, 26, 28}; // Broches des lignes du clavier
byte colPins[COLS] = {23, 25, 27, 29}; // Broches des colonnes du clavier
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Valeur : 0");
lcd.setCursor(0, 1);
lcd.print("Restant : 0");
myservo.attach(servoPin); // Attacher le servomoteur à la broche spécifiée
myservo.write(90); // Positionner le servomoteur à 90 degrés au début du cycle
pinMode(moteurPin, OUTPUT); // Définir la broche de contrôle du moteur continu comme sortie
digitalWrite(moteurPin, LOW); // Désactiver le moteur continu au début
pinMode(capteurPin, INPUT); // Définir le capteur de mouvement comme une entrée
pinMode(buzzerPin, OUTPUT); // Définir la broche du buzzer comme une sortie
pinMode(ledPin, OUTPUT); // Définir la broche de la LED comme une sortie
stepper.setMaxSpeed(1000); // Définir la vitesse maximale du moteur pas à pas (en pas par seconde)
stepper.setAcceleration(500); // Définir l'accélération du moteur pas à pas (en pas par seconde carrée)
stepper2.setMaxSpeed(500); // Définir la vitesse maximale du second moteur pas à pas (en pas par seconde)
stepper2.setAcceleration(250); // Définir l'accélération du second moteur pas à pas (en pas par seconde carrée)
}
void loop() {
char key = keypad.getKey();
if (key) {
if (key == 'A') {
restant = number;
digitalWrite(moteurPin, HIGH); // Allumer le moteur continu
// Déterminer le nombre de pas en fonction de la valeur entrée
int steps = 0;
if (number >= 1 && number <= 20) {
steps = 200;
} else if (number >= 21 && number <= 40) {
steps = 400;
} else if (number >= 41 && number <= 61) {
steps = 600;
}
stepper.setMaxSpeed(100); // Définir une vitesse plus lente pour assurer un tour complet sans perte de pas
stepper.setAcceleration(50); // Définir une accélération plus lente pour assurer un mouvement fluide
stepper.moveTo(steps); // Définir la position cible en fonction du nombre de pas requis
while (stepper.distanceToGo() != 0) {
stepper.run();
}
stepper.setCurrentPosition(0); // Réinitialiser la position du moteur pas à pas à zéro
for (int j = 0; j < number; j++) {
myservo.write(0);
lcd.setCursor(9, 0);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Valeur :");
lcd.setCursor(9, 0);
lcd.print(number);
lcd.setCursor(0, 1);
lcd.print("Restant :");
lcd.setCursor(10, 1);
lcd.print(restant);
while(digitalRead(capteurPin) == HIGH) {
// Attendre jusqu'à ce qu'un mouvement soit détecté
tempsDernierMouvement = millis(); // Noter le temps du dernier mouvement détecté
mouvementDetecte = true; // Indiquer qu'un mouvement a été détecté
}
restant--; // Diminuer la valeur restante
delay(50); // Attente d'une seconde entre chaque action
}
digitalWrite(moteurPin, LOW); // Arrêter le moteur continu
retourServo = true; // Indiquer que le servomoteur doit revenir à sa position initiale
myservo.write(90);
lcd.setCursor(9, 0);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Valeur : 0");
lcd.setCursor(0, 1);
lcd.print("Restant : 0");
number = 0;
restant = 0;
// Vérifier si aucun mouvement n'a été détecté pendant 5 secondes
if (mouvementDetecte && millis() - tempsDernierMouvement >= 5000) {
tone(buzzerPin, 1000); // Activer le buzzer à une fréquence de 1000 Hz
delay(1000); // Sonner pendant 1 seconde
noTone(buzzerPin); // Désactiver le buzzer
mouvementDetecte = false; // Réinitialiser la variable
}
} else if (key == 'B') {
digitalWrite(moteurPin, LOW); // Arrêter le moteur continu
retourServo = true; // Indiquer que le servomoteur doit revenir à sa position initiale
lcd.setCursor(9, 0);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Valeur : 0");
lcd.setCursor(0, 1);
lcd.print("Restant : 0");
number = 0;
restant = 0;
} else {
lcd.setCursor(9, 0);
lcd.print(number * 10 + (key - '0'));
number = number * 10 + (key - '0');
}
}
if (retourServo) {
myservo.write(90); // Revenir à la position initiale (90 degrés) à la fin du cycle
retourServo = false; // Réinitialiser la variable pour éviter que le servomoteur ne retourne en boucle à sa position initiale
// Faire avancer le second moteur pas à pas de 200 pas à la fin du cycle
stepper2.setMaxSpeed(100); // Définir une vitesse pour le second moteur pas à pas
stepper2.setAcceleration(50); // Définir une accélération pour le second moteur pas à pas
stepper2.moveTo(200); // Définir la position cible pour le second moteur pas à pas
while (stepper2.distanceToGo() != 0) {
stepper2.run();
}
// Activer la LED pendant 20 secondes
activeLED = true; // Activer la LED
tempsLED = millis(); // Noter le temps actuel
}
// Vérifier si la LED doit être activée
if (activeLED) {
digitalWrite(ledPin, HIGH); // Allumer la LED
// Vérifier si 20 secondes se sont écoulées
if (millis() - tempsLED >= 5000) {
digitalWrite(ledPin, LOW); // Éteindre la LED après 20 secondes
activeLED = false; // Désactiver la LED
retourMoteur2 = true; // Indiquer que le deuxième moteur doit revenir à sa position de départ
}
}
// Vérifier si le deuxième moteur doit revenir à sa position de départ
if (retourMoteur2) {
stepper2.setMaxSpeed(100); // Définir une vitesse pour le second moteur pas à pas
stepper2.setAcceleration(50); // Définir une accélération pour le second moteur pas à pas
stepper2.moveTo(0); // Définir la position cible pour le second moteur pas à pas
while (stepper2.distanceToGo() != 0) {
stepper2.run();
}
retourMoteur2 = false; // Réinitialiser la variable
}
}