SERVO HS-645MG

Bonjour tout le monde, merci a tous ceux et celles qui prennent du temps pour répondre et de ce fait font que ce site existe…j’ai déjà eu l’occasion de m’en servir et cela m’a aide énormément. :slight_smile:

Je reviens vers vous dans un autre registre, celui du matériel pur et simple, mais pas si simple pour moi!!!
J’ai automatise un système de chauffage au sol avec sondes(temp extérieure,intérieure etc…), servo sur vanne 4 voies, le tout monte sur Arduino Mega.
Voila le problème:
Mon servo qui active la vanne 4 voies ne cesse de bouger légèrement même si aucune action n’est demandée, ce qui, a terme, me grille le circuit intérieure du dit servo( Ref: HS-645MG); j’en ai déjà grille deux, et j’aimerais savoir ou est l’erreur dans la programmation, si effectivement cela vient de la!!!

J’ai mis le programme en pièce jointe en espérant que ce sera assez clair; si quelqu’un veut bien y jeter un œil, et on pourra partir de la.

Merci d’avance

Serie_7.21.ino (17.3 KB)

hum

pourquoi vous déclarez ces Strings

String Lundi = "Lundi";
String Mardi = "Mardi";
String Mercredi = "Mercredi";
String Jeudi = "Jeudi";
String Vendredi = "Vendredi";
String Samedi = "Samedi";
String Dimanche = "Dimanche";

pour ensuite écrire le texte directement dans le code?

  if ((t.dow) == 1)
  {
    Serial.print("Lundi");
    Serial.print(":");
    lcd.print("Lundi");
  }
  if ((t.dow) == 2)
  {
    Serial.print("Mardi");
    Serial.print(":");
    lcd.print("Mardi");
  }
  if ((t.dow) == 3)
  {
    Serial.print("Mercredi");
    Serial.print(":");
    lcd.print("Mercredi");
  }
  if ((t.dow) == 4)
  {
    Serial.print("Jeudi");
    Serial.print(":");
    lcd.print("Jeudi");
  }
  if ((t.dow) == 5)
  {
    Serial.print("Vendredi");
    Serial.print(":");
    lcd.print("Vendredi");
  }
  if ((t.dow) == 6)
  {
    Serial.print("Samedi");
    Serial.print(":");
    lcd.print("Samedi");
  }
  if ((t.dow) == 7)
  {
    Serial.print("Dimanche");
    Serial.print(":");
    lcd.print("Dimanche");
  }

ce serait plus simple (et de manière plus générale pour nombre de vos opérations) d’utiliser un tableau

const char* semaine[] = {"Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"};

et dans le code simplement mettre (je ne sais pas quelle librairie DS3231 vous avez mais on dirait que t.dow varie entre 1 et 7 suivant ce que vous avez écrit)

  lcd.clear();
  lcd.setCursor(4, 0);
  lcd.print(semaine[t.dow - 1]);
  Serial.print(semaine[t.dow - 1]);
  Serial.print(":");

c’est quand même plus court, non? :slight_smile:

Vos tests sur les heures:

  if ((etatBouton2 == HIGH) && ((t.hour) == 19 || (t.hour) == 20 || (t.hour) == 21 || (t.hour) == 22 ||  (t.hour) == 23 || (t.hour) == 24 || (t.hour) == 0 || (t.hour) == 1 || (t.hour) == 2 || (t.hour) == 3 || (t.hour) == 4 || (t.hour) == 5 || (t.hour) == 6)  )

peuvent se faire plus simplement avec des intervalles:

if ((etatBouton2 == HIGH) && ((t.hour >= 19)  || (t.hour <= 6)))

puisque vous savez que l’heure sera entre 0 et 23

Pourquoi toutes les pins ne sont pas logées à la même enseigne:

int pinRelaisgge = 9; // sur digital 9 pour le pin qui commande le relais pompe garage
int pinRelaism = 10; // sur digital 10 pour le pin qui commande le relais pompe maison
int pinRelaiscff = 11; // sur digital 11 pour le pin qui commande le relais chauffe eau
int pinRelaisch1 = 8; // sur digital 8 pour le pin qui commande le relais pompe chJuju
int pinRelaisBureau = 7; // sur digital 7 pour le pin qui commande le relais pompe bureau
int pinRelaisch2 = 6; // sur digital 6 pour le pin qui commande le relais pompe Ch Parents
int pinBouton1;// thermostat chJuju
int pinBouton2;// thermostat Bureau
int pinBouton3;// thermostat CH Parents

Pour les premières vous donnez le N° de la pin directement à la création de la variable (bonne pratique) mais pas pour les 3 boutons où vous repoussez cela dans le setup().

idéalement comme les N° de pins ne changeront pas il faut les déclarer comme constantes et comme ça tient sur un octet, autant prendre un type uint8_t (ou byte) et donc la bonne déclaration serait:

const byte pinRelaisgge = 9; // sur digital 9 pour le pin qui commande le relais pompe garage
const byte pinRelaism = 10; // sur digital 10 pour le pin qui commande le relais pompe maison
const byte pinRelaiscff = 11; // sur digital 11 pour le pin qui commande le relais chauffe eau
const byte pinRelaisch1 = 8; // sur digital 8 pour le pin qui commande le relais pompe chJuju
const byte pinRelaisBureau = 7; // sur digital 7 pour le pin qui commande le relais pompe bureau
const byte pinRelaisch2 = 6; // sur digital 6 pour le pin qui commande le relais pompe Ch Parents
const byte pinBouton1 = 2;// thermostat chJuju (pourquoi pas pinThermostatChJuJu ?)
const byte pinBouton2 = 3;// thermostat Bureau (pourquoi pas pinThermostatBureau ?)
const byte pinBouton3 = 4;// thermostat CH Parents (pourquoi pas pinThermostatChParents ?)

De plus ce serait plus lisible dans le code de donner aussi un joli nom aux pins des boutons comme vous l’avez fait pour les relais (utiliser votre commentaire pour vous inspirer :slight_smile: )

Sinon pour l’histoire de l’usure prématurée de vos moteurs je pense que c’est parce que (en lisant en diagonale) vous n’implémentez pas d’hystérésis et que lorsque vous êtes proche d’un point de stabilité vous devez osciller en allumant et éteignant en permanence les relais ou servo. il faut modifier les test pour dire par exemple (ici je simplifie)

si la T° est moins de 5°C alors je chauffe
si la T° et plus de 6°C alors je coupe le chauffage

→ en 5°C et 6°C on ne fait rien (on laisse le système dans l’état où il est). donc par exemple s’il fait 0°C vous déclenchez le chauffage, la température monte, mais à 5°C vous ne coupez pas (pas de else) , vous continuez à chauffer jusqu’à 6°C et là la seconde condition se déclenche et vous coupez et la T° va redescendre tranquillement. Comme il fait plus de 5°C, la première condition ne se re-déclenche pas instantanément et donc le système n’est pas constamment sollicité

si vous n’avez qu’un test avec un "sinon"si la T° est moins de 5°C alors je chauffe sinon je coupe le chauffagealors dans l’exemple ci dessus vous chauffez entre 0°C et 5°C où vous coupez le chauffage, et à la lecture suivante - la baisse de T° ou simplement l’erreur de précision fait que vous lisez 4,99° et vous chauffez à nouveau puis vous êtes à nouveau à 5° et vous coupez et vous faites travailler sans arrêt votre servo avec des ordres et contre-ordres à quelques millisecondes d’intervalle.