Bonjour,
J'ai un projet qui utilise plusieurs servo moteurs pour ouvrir ou fermer des vannes. Une de ces vannes s'est bloquée ce qui a fait chauffer le servo moteur et a détruit la carte Arduino
Je recherche une solution pour limiter voire annuler la commande du servo moteur en cas de blocage
Quelles seraient vos suggestions pour améliorer mon projet
Je vous joins l'intégralité du code pour vous aider à comprendre mon besoin
/**
Code opérationnel avec les adresses des anciennes sondes de T°
Exemple de code pour lire plusieurs capteurs DS18B20 sur un même bus 1-Wire via leur adresse unique sans délai.
Version avec les sondes Laboratoires
Modification de la durée totale d'ouverture avec une fermeture impérative avant de reprendre une prise de T°
*/
#include "Servo.h" //inclure la bibliothèque Servomoteur
/* Dépendance pour le bus 1-Wire */
#include <OneWire.h>
#include <LiquidCrystal_I2C.h> // inclure la bibliothèque I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); // adresse i2c , nombre de colonnes, nombre de lignes de l'écran
int PinModeManuel = 4; //Bleu
int PinServoEst = 7; // Vert
int PinServoOuest = 8; // Jaune
int PinServoNord = 12; // Orange
/* Broche du bus 1-Wire */
const byte BROCHE_ONEWIRE = 3;
/* Adresses des capteurs de température */
const byte SENSOR_ADDRESS_1[] = { 0x28, 0xBA, 0xC5, 0x99, 0x5F, 0x20, 0x01, 0xEF }; //28 7D 21 16 B0 23 06 3D Piscine
const byte SENSOR_ADDRESS_2[] = { 0x28, 0xF6, 0xD2, 0x13, 0x37, 0x20, 0x01, 0x88 }; //28 5C 69 04 B0 23 06 54 Est
const byte SENSOR_ADDRESS_3[] = { 0x28, 0x64, 0x09, 0x80, 0x5C, 0x20, 0x01, 0x74 }; //28 F3 18 25 B0 23 06 73 Ouest
const byte SENSOR_ADDRESS_4[] = { 0x28, 0x58, 0xE0, 0xDB, 0x5F, 0x20, 0x01, 0x65 }; //28 3F 82 3E A2 23 06 32 nord
/* Création de l'objet OneWire pour manipuler le bus 1-Wire */
OneWire ds(BROCHE_ONEWIRE);
Servo servoEst; // création de l'objet "servoEst"
Servo servoOuest; // création de l'objet "servoOuest"
Servo servoNord; // création de l'objet "servoNord"
/**
Fonction de démarrage de la prise de mesure de la température via un capteur DS18B20.
*/
void startTemperatureMeasure(const byte addr[]) {
// addr[] : Adresse du module 1-Wire détecté
/* Reset le bus 1-Wire et sélectionne le capteur */
ds.reset();
ds.select(addr);
/* Lance une prise de mesure de température et attend la fin de la mesure */
ds.write(0x44, 1);
}
/**
Fonction de récupération de la prise de mesure de la température via un capteur DS18B20.
*/
float readTemperatureMeasure(const byte addr[]) {
byte data[9];
// data[] : Données lues depuis le scratchpad
// addr[] : Adresse du module 1-Wire détecté
/* Reset le bus 1-Wire, sélectionne le capteur et envoie une demande de lecture du scratchpad */
ds.reset();
ds.select(addr);
ds.write(0xBE);
/* Lecture du scratchpad */
for (byte i = 0; i < 9; i++) {
data[i] = ds.read();
}
/* Calcul de la température en degré Celsius */
return ((data[1] << 8) | data[0]) * 0.0625;
}
/** Fonction setup() **/
void setup() {
/* Initialisation du port série */
Serial.begin(115200);
/* Ecran LCD */
lcd.init(); // initialisation du LCD
lcd.backlight(); // active le rétroéclairage
pinMode(PinModeManuel, INPUT);
pinMode(PinServoEst, INPUT);
pinMode(PinServoOuest, INPUT);
pinMode(PinServoNord, INPUT);
servoEst.attach(6); // attache le servo au pin spécifié (bleu)
servoOuest.attach(9); // attache le servo au pin spécifié (jaune)
servoNord.attach(11); // attache le servo au pin spécifié (noir)
}
/** Fonction loop() **/
void loop() {
float temperature[4];
/* Lit les températures des quatre capteurs */
startTemperatureMeasure(SENSOR_ADDRESS_1);
startTemperatureMeasure(SENSOR_ADDRESS_2);
startTemperatureMeasure(SENSOR_ADDRESS_3);
startTemperatureMeasure(SENSOR_ADDRESS_4);
delay(800);
temperature[0] = readTemperatureMeasure(SENSOR_ADDRESS_1);
temperature[1] = readTemperatureMeasure(SENSOR_ADDRESS_2);
temperature[2] = readTemperatureMeasure(SENSOR_ADDRESS_3);
temperature[3] = readTemperatureMeasure(SENSOR_ADDRESS_4);
/* Affiche les températures */
Serial.print(F("Temperatures : "));
Serial.print(temperature[0], 2);
Serial.write(176); // Caractère degré
Serial.print(F("C, "));
Serial.print(temperature[1], 2);
Serial.write(176); // Caractère degré
Serial.print(F("C, "));
Serial.print(temperature[2], 2);
Serial.write(176); // Caractère degré
Serial.println('C');
/* Affiche les températures sur l'écran lcd */
lcd.setCursor(0, 0); // mettre le curseur à la première colonne, première ligne
lcd.print("P="); // Piscine
lcd.print(temperature[0], 0);
lcd.print((char)223); // symbole °
lcd.setCursor(0, 1); // mettre le curseur à la première colonne, deuxième ligne
lcd.print("E="); // plage EST
lcd.print(temperature[1], 0);
lcd.print((char)223); // symbole °
lcd.setCursor(8, 1); // mettre le curseur à la huitième colonne, deuxième ligne
lcd.print("O="); // plage Ouest
lcd.print(temperature[2], 0);
lcd.print((char)223); // symbole °
lcd.setCursor(8, 0); // mettre le curseur à la huitième colonne, première ligne
lcd.print("N="); // plage Nord
lcd.print(temperature[3], 0);
lcd.print((char)223); // symbole °
// servoEst.write(0);
//servoOuest.write(0);
//servoNord.write(0);
if(digitalRead(PinModeManuel)== HIGH){
lcd.setCursor(6, 0); // mettre le curseur à la sixième colonne, première ligne
lcd.print("M"); // mode Manuel
if(digitalRead(PinServoEst)== HIGH){
servoEst.write(0); // Ouverture Vanne Est
lcd.setCursor(6, 1); // mettre le curseur à la sixième colonne, première ligne
lcd.print("O"); // Vanne Ouverte
}
else{
servoEst.write(80); // Fermeture Vanne Est
lcd.setCursor(6, 1); //
lcd.print("F"); // Vanne Fermée
}
if(digitalRead(PinServoOuest)== HIGH){
servoOuest.write(0); // Ouverture Vanne Ouest
lcd.setCursor(14, 1); // mettre le curseur à la quatorzième colonne, première ligne
lcd.print("O"); // Vanne Ouverte
}
else{
servoOuest.write(80); // Fermeture Vanne Ouest
lcd.setCursor(14, 1); //
lcd.print("F"); // Vanne Fermée
}
if(digitalRead(PinServoNord)== HIGH){
servoNord.write(0); // Ouverture Vanne Nord
lcd.setCursor(14, 0); // mettre le curseur à la quatorzième colonne, première ligne
lcd.print("O"); // Vanne Ouverte
}
else{
servoNord.write(80); // Fermeture Vanne Nord
lcd.setCursor(14, 0); //
lcd.print("F"); // Vanne Fermée
}
}
else
{ lcd.setCursor(6, 0); //
lcd.print("A"); // Mode automatique
{
{
servoEst.write(0); // Vanne Est Ouverte
lcd.setCursor(6, 1); // mettre le curseur à la sixième colonne, première ligne
lcd.print("O"); // Vanne Ouverte
servoOuest.write(0); // Vanne Ouest Ouverte
lcd.setCursor(14, 1); // mettre le curseur à la quatorzième colonne, première ligne
lcd.print("O"); // Vanne Ouverte
servoNord.write(0); // Vanne Nord Ouverte
lcd.setCursor(14, 0); // mettre le curseur à la quatorzième colonne, première ligne
lcd.print("O"); // Vanne Ouverte
}
delay(15000); // délai d'ouverture des vannes pour avoir la T° de l'eau des plages 15000 pour les essais sinon 60000
{ if((temperature[0])<(temperature[1])){
servoEst.write(0); // Ouverture Vanne Est
lcd.setCursor(6, 1); // mettre le curseur à la sixième colonne, première ligne
lcd.print("O"); // Vanne Ouverte
}
else{servoEst.write(80); // Fermeture Vanne Est
lcd.setCursor(6, 1); //
lcd.print("F"); // Vanne Fermée
}
if((temperature[0])<(temperature[2])){
servoOuest.write(0); // Ouverture Vanne Ouest
lcd.setCursor(14, 1); // mettre le curseur à la quatorzième colonne, première ligne
lcd.print("O"); // Vanne Ouverte
}
else {servoOuest.write(80); // Fermeture Vanne Ouest
lcd.setCursor(14, 1); //
lcd.print("F"); // Vanne Fermée
}
if((temperature[0])<(temperature[3])){
servoNord.write(0); // Ouverture Vanne Nord
lcd.setCursor(14, 0); // mettre le curseur à la quatorzième colonne, première ligne
lcd.print("O"); // Vanne Ouverte
}
else {servoNord.write(80); // Fermeture Vanne Nord
lcd.setCursor(14, 0); //
lcd.print("F"); // Vanne Fermée
}
}
}
delay(30000); // Délai d'attente avant la fermeture de toutes les vannes 30000 pour les essais sinon 600000
servoEst.write(80); // Fermeture Vanne Est
servoOuest.write(80); // Fermeture Vanne Ouest
servoNord.write(80); // Fermeture Vanne Nord
delay(10000); // Délai d'attente avant la prochaine prise de T°
}
}