Parasites sur ArduinoUno et sa farandole de relais sur son coulis de LCD

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

Bonsoir laprunechauve

Est ce que ces 2 connexions
image

sont soudées ou simplement enfichées dans le PCB?

Est ce que ton relais a une diode de protection? As tu un lien sur le produit?

A+
Cordialement
jpbbricole

Bonsoir JP , Oui en effet , tout est soudé , les connexions sont bonnes , voici une image du modèle de relais que j'utilise :

Comme tes différents organes de commande sont inductifs (électrovanne, pompe, etc.) je pense qu'un petit snubber sur chacun ne ferait pas de mal.

Chapitre 4. En courant alternatif

Bonjour messieurs et avant tout merci pour votre aide , très intéressant ton billet HBachetti , j'avais eut un problème similaire sur un petit moteur qui me faisait coller le relais , j'avais réglé le soucis grâce a ce montage :

Mais la je t'avoue que je me sentais un peut perdu et je ne trouvais pas de solution ...
Dans tous les cas , j'essaye ce truc après en avoir compris toutes les subtilités et je reviens vers vous ...

Merci encore messieurs

Oui, mais seulement avec un moteur continu. En alternatif la diode cramerait instantanément.

Oui oui , totalement , j'avais oublié la précision , c'est une doseuse pour les échantillons ( moins de 1L )

Je suis un immonde pourceau, un véritable scélérat d'oubli, j'ai totalement négligé de remercier l'illustre héros de l'ombre qui m'a permis de résoudre mon problème. En définitive, j'ai résolu ma mésaventure avec un condensateur polyester 630V L394J et une résistance bobinée de 15W. Hélas, la machine a quitté mon champ de vision, et les photos du montage se sont évaporées. Je suis dans l'incapacité de me rappeler l'identité du génie des actions charitables, ce bienfaiteur suprême, ce sauveur incontesté, qui a été mon phare dans la tempête ! Je tiens donc à exprimer mes plus profonds remerciements et à implorer votre pardon pour cet oubli monumental. Votre grandeur ne sera jamais assez reconnue !

390 nF est une valeur importante, mais le courant qui le traverse ne devrait pas dépasser 7mA, si la résistance a une valeur de 100Ω.
La puissance dissipée par la résistance sera de 5 mW.

Pour des raisons de sécurité il aurait été préférable d'utiliser un condensateur polypropylène X2, comme dit dans mon article.

Qui que quoi comment?

630V pour un condensateur, 15W pour une résistance, mais pour mettre où, comment, combien de Farrads et de Ohms?

Ça peut servir à la communauté de le savoir!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.