Bonjour M'sieur Dames .
Je vous écris pour m'aider à résoudre un problème de que j'ai sur un panneau de contrôle que j'ai bricolé , pour donner des éléments de contexte , il s'agit d'une machine destinée à mélanger des détergents pour ensuite les mettre en bouteille , eh oui , ont s'amuse comme ont peut , bref , lorsque j'active le relais grace au switch en A1 , le cycle se fait une première fois , et au second , patatra ! l'écran m'affiche des symboles Egypto/Cyrilliques ( maudits Russes ! ils sont pugnaces ! ) et puis ensuite écran bleu , je reboot , et puis rebelotte ! j'ai encore le Kremlin sur le dos !
Petit listing du matériel :
Arduino Uno
Un gros interrupteur industriel en 32A ( j'avais que ça sous la main ) en 2phases , 2 neutres .
3 interrupteurs profesionnels ( NO/NC )
Un module relais *2
2 Switch NO
Un shield arduino pour eviter de pourrir la carte
Un transformatueur JJ-72 ACDC 220/5,1V 2A
Un petit ventilo en 5v DC
Un timer/relais type XY-J02
3 paquets de cigarettes et beaucoup de café
Passons au schéma :
Puis au photos :
N'oublions pas un peut de code sinon nous nous sentirions orphelins :
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Encoder.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // Adresse I2C de l'écran LCD
const int switchPin = 5; // Broche du bouton de l'encodeur (SW)
const int encoderDT = 8; // Broche DT de l'encodeur
const int encoderCLK = 6; // Broche CLK de l'encodeur
const int relayPin = 4; // Broche du relais
const int externalSwitchPin = A2; // Broche pour le bouton externe
float selectedVolume = 0.250; // Volume initial
int dispensingCount = 0; // Nombre de distributions effectuées
float flowRate = 5.0; // Débit de la pompe par défaut (en litres par minute)
unsigned long buttonPressStartTime = 0; // Temps de début de l'appui sur le bouton
Encoder encoder(encoderDT, encoderCLK);
int lastEncoderValue = 0;
unsigned long lastDebounceTime = 0;
unsigned long debounceTime = 50; // Temps d'anti-rebond, ajustez selon les besoins
void setup() {
Wire.begin(); // Initialiser la communication I2C
lcd.begin(16, 2);
lcd.backlight(); // Activer le rétroéclairage
pinMode(switchPin, INPUT_PULLUP);
pinMode(relayPin, OUTPUT);
pinMode(externalSwitchPin, INPUT_PULLUP);
digitalWrite(relayPin, HIGH); // Démarrer en position OFF (inverse)
// Initialiser le temps de début de l'appui sur le bouton
buttonPressStartTime = millis();
updateLCD();
}
void loop() {
int encoderValue = encoder.read();
unsigned long currentTime = millis();
if (currentTime - lastDebounceTime > debounceTime) {
// Vérifier si l'encodeur a été tourné
if (encoderValue != lastEncoderValue) {
// Si l'encodeur a été tourné dans le sens des aiguilles d'une montre
if (encoderValue > lastEncoderValue) {
selectedVolume += 0.005;
}
// Si l'encodeur a été tourné dans le sens inverse des aiguilles d'une montre
else {
selectedVolume -= 0.005;
}
// Limiter la plage du volume entre 0.05 et 3.00
selectedVolume = constrain(selectedVolume, 0.05, 3.00);
// Mettre à jour l'écran LCD
updateLCD();
lastEncoderValue = encoderValue;
}
// Vérifier si le bouton de l'encodeur a été enfoncé
if (digitalRead(switchPin) == LOW || digitalRead(externalSwitchPin) == LOW) {
// Vérifier si l'appui est maintenu pendant au moins 2 secondes
if (currentTime - buttonPressStartTime >= 2000) {
configureFlowRate();
}
} else {
// Réinitialiser le temps de début si le bouton n'est pas enfoncé
buttonPressStartTime = currentTime;
}
// Vérifier si le bouton externe est enfoncé
if (digitalRead(externalSwitchPin) == LOW) {
dispenseWater();
// Attendre que le bouton soit relâché pour éviter les rebonds
while (digitalRead(externalSwitchPin) == LOW) {
// Attendre
}
}
lastDebounceTime = currentTime;
}
}
void updateLCD() {
// Afficher le volume sélectionné et le nombre de distributions sur l'écran LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Volume: ");
lcd.print(selectedVolume, 3); // Afficher 3 décimales
lcd.print(" L");
lcd.setCursor(0, 1);
lcd.print("Quantite: ");
lcd.print(dispensingCount);
}
void configureFlowRate() {
// Activer le relais au début du calibrage
digitalWrite(relayPin, LOW); // Inversé ici (position ON)
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" CALIBRAGE ");
// Attendre que le bouton soit pressé
while (digitalRead(switchPin) == HIGH && digitalRead(externalSwitchPin) == HIGH) {
// Attendre
}
// Enregistrer le temps de début
unsigned long startTime = micros();
// Attendre que le bouton soit relâché
while (digitalRead(switchPin) == LOW || digitalRead(externalSwitchPin) == LOW) {
// Attendre
}
// Enregistrer le temps de fin
unsigned long endTime = micros();
// Calculer la durée en microsecondes
unsigned long duration = endTime - startTime;
// Convertir la durée en secondes avec 2 décimales
float seconds = duration / 1000000.0;
// Calculer le débit en litres par minute
flowRate = selectedVolume / (seconds / 60.0);
// Afficher le débit sur l'écran LCD
lcd.setCursor(0, 1);
lcd.print("Temps: ");
lcd.print(seconds, 2);
lcd.print(" s");
lcd.setCursor(0, 0);
lcd.print("Debit: ");
lcd.print(flowRate, 2); // Afficher 2 décimales
lcd.print(" L/min");
// Attendre que le bouton soit relâché
while (digitalRead(switchPin) == LOW || digitalRead(externalSwitchPin) == LOW) {
// Attendre
}
// Attendre une courte période pour éviter les rebonds
delay(5000);
// Désactiver le relais à la fin du calibrage
digitalWrite(relayPin, HIGH); // Inversé ici (position OFF)
// Revenir à l'affichage principal
updateLCD();
}
void dispenseWater() {
// Calculer la quantité à distribuer en fonction du volume et du débit de la pompe
float dispensingQuantity = selectedVolume / flowRate;
// Activer le relais pour démarrer la distribution
digitalWrite(relayPin, LOW); // Inversé ici (position ON)
delay(dispensingQuantity * 60 * 1000); // Convertir la quantité en millisecondes
digitalWrite(relayPin, HIGH); // Inversé ici (position OFF)
// Incrémenter le nombre de distributions
dispensingCount++;
// Mettre à jour l'écran LCD
updateLCD();
}
Je vous remercie pour l'attention que vous porterez à mon message .
LaPruneChauve









