[Programmateur journalier] Detection d'un signal sortie d'un reveil activation pompe piscine

hello
prg testé et fait ce que j'ai compris de ce que tu veux
il faudra remettre tes codes pour le lcd en ligne 4 et 65
une fois le prg téléversé, regarde le moniteur en 115200 bauds
sur le lcd, j'ai également fait afficher la tempo ( sera à virer )
j'ai également fait clignoter un bit de vie qui te permet de savoir si le µ est fonctionnel

#include <OneWire.h> //Librairie du bus OneWire
#include <DallasTemperature.h> //Librairie du capteur
#include <LiquidCrystal_I2C.h>
//LiquidCrystal_I2C lcd(0x3F, 16, 2); //l adresse 0x27 est a changé en fonction de votre écran
LiquidCrystal_I2C lcd(0x27, 16, 2);
OneWire oneWire(10); //Bus One Wire sur la pin 10 de l'arduino
DallasTemperature sensors(&oneWire); //Utilistion du bus Onewire pour les capteurs
DeviceAddress sensorDeviceAddress; //Vérifie la compatibilité des capteurs avec la librairie

unsigned long temp[31] [2] = {
  {   40,    17000},//température et temporisation associée
  {   39,    16500},//température et temporisation associée
  {   38,    16000},//température et temporisation associée
  {   37,    15500},//température et temporisation associée
  {   36,    15000},//température et temporisation associée
  {   35,    13500},//température et temporisation associée
  {   34,    13000},//température et temporisation associée
  {   33,    12500},//température et temporisation associée
  {   32,    12000},//température et temporisation associée
  {   31,    11500},//température et temporisation associée
  {   30,    11000},//température et temporisation associée
  {   29,    10500},//température et temporisation associée
  {   28,    10000},//température et temporisation associée
  {   27,    9500},//température et temporisation associée
  {   26,    9000},//température et temporisation associée
  {   25,    8500},//température et temporisation associée
  {   24,    8000},//température et temporisation associée
  {   23,    7500},//température et temporisation associée
  {   22,    7000},//température et temporisation associée
  {   21,    6500},//température et temporisation associée
  {   20,    6000},//température et temporisation associée
  {   19,    5500},//température et temporisation associée
  {   18,    5000},//température et temporisation associée
  {   17,    4500},//température et temporisation associée
  {   16,    4000},//température et temporisation associée
  {   15,    3500},//température et temporisation associée
  {   14,    3000},//température et temporisation associée
  {   13,    2500},//température et temporisation associée
  {   12,    2000},//température et temporisation associée
  {   11,    1500},//température et temporisation associée
  {   10,    1000} //température et temporisation associée
};
const byte relais         = 4;     // Pin du relais4 pour temperature entre 16 et 24°C
const byte impulsion      = 14;
float temperature         = 0.0;    // temperature en Celsius
unsigned long tempo_pompe = 0;
unsigned long deb_tempo   = 0;
unsigned long deb_impulsion  = 0;
unsigned long duree_impulsion = 0;
boolean flag_impulsion    = false;
boolean flag_premiere_impulsion = false;
boolean flag_deuxieme_impulsion = false;
boolean flag_tempo_pompe_en_cours     = false;
boolean premier_passage   = false;
byte bit_vie = 0;
unsigned long tempo_vie = 0;
void setup(void)
{
  PORTD  |= 0b00010000; //UNO uniquement port D à HIGH.
  DDRD   |= 0b00010000; //UNO uniquement port D en sortie sauf RX. 1 = sortie
  Serial.begin(115200); //Permet la communication en serial
  sensors.begin(); //Activation des capteurs
  sensors.getAddress(sensorDeviceAddress, 0); //Demande l'adresse du capteur à l'index 0 du bus
  sensors.setResolution(sensorDeviceAddress, 12); //Résolutions possibles: 9,10,11,12
  lcd.begin();                      // initialize the lcd
  //lcd.init();                      // initialize the lcd
  lcd.backlight();
  tempo_vie = millis();
  Serial.println(F("fin setup"));
}

void loop()
{
  vie();
  temperature_eau();
  if ((analogRead(impulsion) > 650) && (flag_impulsion == false))
  { //1ere impulsion à la mise sous tension
    Serial.println(F("1ere impulsion parasite"));
    delay(1000);                        //prise en compte neutralisée pendant 1 seconde
    flag_impulsion = true;
  }
  else                                  //il est l'heure et ce n'est pas la 1ere impulsion
  {
    if ((analogRead(impulsion) > 650) && (flag_impulsion == true) && (premier_passage == false))
    {
      Serial.println(F("1ere impulsion validée de la journée "));
      premier_passage = true;          //1er passage de la journée
      deb_tempo  = millis();            //armement de la tempo de pompe

      init_tempo_pompe();                    //init de la durée de la tempo
      //impulsion_relais();
    }
  }
  if ((millis() - deb_tempo) < tempo_pompe)
  { lcd.setCursor(0, 1); lcd.print((millis() - deb_tempo));
    if (!flag_premiere_impulsion)
    { flag_deuxieme_impulsion = false;
      Serial.println(F("1ere impulsion ON par relais telerupteur "));
      deb_impulsion = millis(); impulsion_relais(); flag_premiere_impulsion = true;
    }
  }
  else                                 //tempo pompe terminée
  {
    if ((flag_premiere_impulsion) && (!flag_deuxieme_impulsion))
    { flag_premiere_impulsion = false;
      Serial.println(F("deuxieme impulsion OFF par relais telerupteur "));
      deb_impulsion = millis(); impulsion_relais(); flag_deuxieme_impulsion = true;
    }
    flag_tempo_pompe_en_cours = false;
    premier_passage = false;
  }

}

void init_tempo_pompe()
{
  if (flag_tempo_pompe_en_cours == false)        //si pas de temporisation en cours
  {
    for (byte f = 0; f <= 30; f++)
    {
      if ((int(temperature)) == temp[f][0])     //recherche plage temperature
      {
        tempo_pompe = temp[f][1];      //init de la durée correspondante
        flag_tempo_pompe_en_cours = true;        //armement du flag de temporisation en cours
        Serial.print(tempo_pompe); Serial.println("\t");
      }
      if (flag_tempo_pompe_en_cours) {
        break;
      }
    }
  }
}
void impulsion_relais()
{
  if ((millis() - deb_impulsion) < duree_impulsion)
  {
    digitalWrite(relais,  LOW);        //relais activé
  }
  else
  {
    digitalWrite(relais, HIGH);        //relais désactivé
  }
}
void temperature_eau()
{
  sensors.requestTemperatures(); //Demande la température aux capteurs
  temperature = sensors.getTempCByIndex(0);  // lire temperature en Celsius
  lcd.setCursor(0, 0);
  lcd.print("Temp eau piscine : ");
  lcd.setCursor(1, 1);
  lcd.setCursor(6, 1);
  lcd.print(sensors.getTempCByIndex(0));
  lcd.print(" C ");
  Serial.print(sensors.getTempCByIndex(0)); Serial.println("\t");
}
void vie()
{
  if ((millis() - tempo_vie) > 1000) {
    tempo_vie = millis(); bit_vie++;
    if (bit_vie % 2) {
      lcd.setCursor(15, 1);
      lcd.print("*");
    } else {
      lcd.setCursor(15, 1);
      lcd.print("O"); bit_vie = 0;
    }
  }
}

la version precedente ne gere pas correctement le relais d'impulsion
voici la correction

#include <OneWire.h> //Librairie du bus OneWire
#include <DallasTemperature.h> //Librairie du capteur
#include <LiquidCrystal_I2C.h>
//LiquidCrystal_I2C lcd(0x3F, 16, 2); //l adresse 0x27 est a changé en fonction de votre écran
LiquidCrystal_I2C lcd(0x27, 16, 2);
OneWire oneWire(10); //Bus One Wire sur la pin 10 de l'arduino
DallasTemperature sensors(&oneWire); //Utilistion du bus Onewire pour les capteurs
DeviceAddress sensorDeviceAddress; //Vérifie la compatibilité des capteurs avec la librairie

unsigned long temp[31] [2] = {
  {   40,    17000},//température et temporisation associée
  {   39,    16500},//température et temporisation associée
  {   38,    16000},//température et temporisation associée
  {   37,    15500},//température et temporisation associée
  {   36,    15000},//température et temporisation associée
  {   35,    13500},//température et temporisation associée
  {   34,    13000},//température et temporisation associée
  {   33,    12500},//température et temporisation associée
  {   32,    12000},//température et temporisation associée
  {   31,    11500},//température et temporisation associée
  {   30,    11000},//température et temporisation associée
  {   29,    10500},//température et temporisation associée
  {   28,    10000},//température et temporisation associée
  {   27,    9500},//température et temporisation associée
  {   26,    9000},//température et temporisation associée
  {   25,    8500},//température et temporisation associée
  {   24,    8000},//température et temporisation associée
  {   23,    7500},//température et temporisation associée
  {   22,    7000},//température et temporisation associée
  {   21,    6500},//température et temporisation associée
  {   20,    6000},//température et temporisation associée
  {   19,    5500},//température et temporisation associée
  {   18,    5000},//température et temporisation associée
  {   17,    4500},//température et temporisation associée
  {   16,    4000},//température et temporisation associée
  {   15,    3500},//température et temporisation associée
  {   14,    3000},//température et temporisation associée
  {   13,    2500},//température et temporisation associée
  {   12,    2000},//température et temporisation associée
  {   11,    1500},//température et temporisation associée
  {   10,    1000} //température et temporisation associée
};
const byte relais         = 4;     // Pin du relais4 pour temperature entre 16 et 24°C
const byte impulsion      = 14;
float temperature         = 0.0;    // temperature en Celsius
unsigned long tempo_pompe = 0;
unsigned long deb_tempo   = 0;
unsigned long deb_impulsion  = 0;
unsigned long duree_impulsion = 2000;
boolean flag_impulsion    = false;
boolean flag_premiere_impulsion = false;
boolean flag_deuxieme_impulsion = false;
boolean flag_tempo_pompe_en_cours     = false;
boolean premier_passage   = false;
byte bit_vie = 0;
unsigned long tempo_vie = 0;
void setup(void)
{
  PORTD  |= 0b00010000; //UNO uniquement port D à HIGH.
  DDRD   |= 0b00010000; //UNO uniquement port D en sortie sauf RX. 1 = sortie
  Serial.begin(115200); //Permet la communication en serial
  sensors.begin(); //Activation des capteurs
  sensors.getAddress(sensorDeviceAddress, 0); //Demande l'adresse du capteur à l'index 0 du bus
  sensors.setResolution(sensorDeviceAddress, 12); //Résolutions possibles: 9,10,11,12
  lcd.begin();                      // initialize the lcd
  //lcd.init();                      // initialize the lcd
  lcd.backlight();
  tempo_vie = millis();
  Serial.println(F("fin setup"));
}

void loop()
{
  vie();
  temperature_eau();
  impulsion_relais();
  if ((analogRead(impulsion) > 650) && (flag_impulsion == false))
  { //1ere impulsion à la mise sous tension
    Serial.println(F("1ere impulsion parasite"));
    delay(1000);                        //prise en compte neutralisée pendant 1 seconde
    flag_impulsion = true;
  }
  else                                  //il est l'heure et ce n'est pas la 1ere impulsion
  {
    if ((analogRead(impulsion) > 650) && (flag_impulsion == true) && (premier_passage == false))
    {
      Serial.println(F("1ere impulsion validée de la journée "));
      premier_passage = true;          //1er passage de la journée
      deb_tempo  = millis();            //armement de la tempo de pompe

      init_tempo_pompe();                    //init de la durée de la tempo
      //impulsion_relais();
    }
  }
  if ((millis() - deb_tempo) < tempo_pompe)
  { lcd.setCursor(0, 1); lcd.print((millis() - deb_tempo));
    if (!flag_premiere_impulsion)
    { flag_deuxieme_impulsion = false;
      Serial.println(F("1ere impulsion ON par relais telerupteur "));
      deb_impulsion = millis(); impulsion_relais(); flag_premiere_impulsion = true;
    }
  }
  else                                 //tempo pompe terminée
  {
    if ((flag_premiere_impulsion) && (!flag_deuxieme_impulsion))
    { 
      flag_premiere_impulsion = false;
      Serial.println(F("deuxieme impulsion OFF par relais telerupteur "));
      deb_impulsion = millis(); impulsion_relais(); flag_deuxieme_impulsion = true;
    }
    flag_tempo_pompe_en_cours = false;
    premier_passage = false;
  }

}

void init_tempo_pompe()
{
  if (flag_tempo_pompe_en_cours == false)        //si pas de temporisation en cours
  {
    for (byte f = 0; f <= 30; f++)
    {
      if ((int(temperature)) == temp[f][0])     //recherche plage temperature
      {
        tempo_pompe = temp[f][1];      //init de la durée correspondante
        flag_tempo_pompe_en_cours = true;        //armement du flag de temporisation en cours
        Serial.print(tempo_pompe); Serial.println("\t");
      }
      if (flag_tempo_pompe_en_cours) {
        break;
      }
    }
  }
}
void impulsion_relais()
{
  if ((millis() - deb_impulsion) < duree_impulsion)
  {
    digitalWrite(relais,  LOW);        //relais activé
    Serial.println("relais impulsion activé");
  }
  else
  {
    digitalWrite(relais, HIGH);        //relais désactivé
    Serial.println("relais impulsion desactivé");
  }
}
void temperature_eau()
{
  sensors.requestTemperatures(); //Demande la température aux capteurs
  temperature = sensors.getTempCByIndex(0);  // lire temperature en Celsius
  lcd.setCursor(0, 0);
  lcd.print("Temp eau piscine : ");
  lcd.setCursor(1, 1);
  lcd.setCursor(6, 1);
  lcd.print(sensors.getTempCByIndex(0));
  lcd.print(" C ");
  Serial.print(sensors.getTempCByIndex(0)); Serial.println("\t");
}
void vie()
{
  if (flag_tempo_pompe_en_cours)
  {
    if ((millis() - tempo_vie) > 1000)
    {
      tempo_vie = millis(); bit_vie++;
      if (bit_vie % 2)
      {
        lcd.setCursor(15, 1);
        lcd.print("T");
      } else
      {
        lcd.setCursor(15, 1);
        lcd.print("P"); bit_vie = 0;
      }
    }
  }

  else
  {
    if ((millis() - tempo_vie) > 1000)
    {
      tempo_vie = millis(); bit_vie++;
      if (bit_vie % 2) {
        lcd.setCursor(15, 1);
        lcd.print("*");
      } else {
        lcd.setCursor(15, 1);
        lcd.print("O"); bit_vie = 0;
      }
    }
  }
}


mes tests:
uno, afficheur lcd, une sonde ds1821,un fil pour faire les impulsions entre GND et A0
le moniteur en 115200 bauds
au debut, je fais une 1ere impulsion "parasite" comme tu nous l'avais dis au debut du post.
puis une nouvelle impulsion effectue une impulsion de 2 secondes via le relais, et déclenche la
tempo de "pompe"
la fin de la tempo de pompe provoque une impulsion via le relais.
ensuite, si unnouveau top est envoyé par le reveil, le cycle recommence.
si le reveil envoie plusieurs tops dans la journée, il y aura autant de cycles effectués
nota: une demande du reveil ne sera pas prise en compte si un cycle est déjà en cours.
j'ai modifié le bit de vie: il clignote à la seconde en permanence.
si pas de cycle en cours, il affiche '*' ou 'O'
si un cycle est en cours, il affiche 'T' ou 'P' ( pour Tempo Pompe)

Merci dfgh, je viens d'injecter le prg, mais faut-il que je remette le code suivant ? :

 int resultBinary = analogRead(A0);
  float resultVolts = resultBinary / 1023.0 * 5.0;
  float R = 326.0;
  float intensity = resultVolts / R * 1000; // x 1000 pour avoir le résultat en mA (milliampères)!
  Serial.println(intensity); // En milliampères

Car il ne me détecte pas le signal, comme toi tu l'a essayé sans reveil...

Enfait l'impulsion parasite au démarrage du reveil, a une intensité moindre que les impulsions de l'alarme du reveil

const byte impulsion      = 14;

Faut faire référence a la sortie Analogique A0..

hello
non, ne rajoute rien, mes impulsions sont faites par contact du +5V sur A0 (un bref instant).
il te suffit de descendre le seuil de 650 à 450 par exemple, ou 250 ou 100.
si tu reçois 5 volts, la valeur sera de 1023. apres, si le signal fait 2.5V la valeur sera 512
ou 1.25V la valeur sera de 256, etc...c'est une regle de 3.
en ligne 118 pour l'impulsion parasite
en ligne 126 pour l'impulsion suivante à prendre en compte
voici le meme prg présenté différement et commenté correctement

#include <OneWire.h>                  //Librairie du bus OneWire
#include <DallasTemperature.h>        //Librairie du capteur
#include <LiquidCrystal_I2C.h>
//LiquidCrystal_I2C lcd(0x3F, 16, 2); //l adresse 0x27 est a changé en fonction de votre écran
LiquidCrystal_I2C lcd(0x27, 16, 2);
OneWire oneWire(10);                  //Bus One Wire sur la pin 10 de l'arduino
DallasTemperature sensors(&oneWire); //Utilistion du bus Onewire pour les capteurs
DeviceAddress sensorDeviceAddress; //Vérifie la compatibilité des capteurs avec la librairie
//*********************************************************************************************************
//les reglages se font ici ( entre les lignes étoilées )
unsigned long duree_impulsion   = 2000;  //durée de l'impulsion du relais
int neutralisation              = 1000;  //durée de neutralisation pendant impulsion parasite
unsigned long temp[31] [2] = {
  {   40,    17000},//température et temporisation associée
  {   39,    16500},//température et temporisation associée
  {   38,    16000},//température et temporisation associée
  {   37,    15500},//température et temporisation associée
  {   36,    15000},//température et temporisation associée
  {   35,    13500},//température et temporisation associée
  {   34,    13000},//température et temporisation associée
  {   33,    12500},//température et temporisation associée
  {   32,    12000},//température et temporisation associée
  {   31,    11500},//température et temporisation associée
  {   30,    11000},//température et temporisation associée
  {   29,    10500},//température et temporisation associée
  {   28,    10000},//température et temporisation associée
  {   27,    9500},//température et temporisation associée
  {   26,    9000},//température et temporisation associée
  {   25,    8500},//température et temporisation associée
  {   24,    8000},//température et temporisation associée
  {   23,    7500},//température et temporisation associée
  {   22,    7000},//température et temporisation associée
  {   21,    6500},//température et temporisation associée
  {   20,    6000},//température et temporisation associée
  {   19,    5500},//température et temporisation associée
  {   18,    5000},//température et temporisation associée
  {   17,    4500},//température et temporisation associée
  {   16,    4000},//température et temporisation associée
  {   15,    3500},//température et temporisation associée
  {   14,    3000},//température et temporisation associée
  {   13,    2500},//température et temporisation associée
  {   12,    2000},//température et temporisation associée
  {   11,    1500},//température et temporisation associée
  {   10,    1000} //température et temporisation associée
};
//********************************************************************************************************
const byte relais         =  4;          // Pin du relais4 pour temperature entre 10 et 40°C
const byte impulsion      = 14;          // A0 signal du reveil
float temperature         = 0.0;         // temperature en Celsius
unsigned long tempo_pompe = 0;           // durée pompe en fonction de la température de l'eau
unsigned long deb_tempo_pompe   = 0;           //
unsigned long deb_impulsion      = 0;

boolean flag_impulsion          = false; //témoin de l'impulsion parasite à la mise sous tension
boolean flag_premiere_impulsion = false; //témoin de premiere impulsion faite ou pas
boolean flag_deuxieme_impulsion = false; //témoin de deuxième impulsion faite ou pas
boolean flag_tempo_pompe_en_cours = false; //témoin de tempo pompe en cours
boolean premier_passage           = false; //témoin de 1ere impulsion valide du reveil
byte bit_vie                      =     0; //demontre que le micro est actif
unsigned long tempo_vie           =     0; //pour clignotement du bit de vie
void setup(void)
{
  PORTD  |= 0b00010000; //UNO uniquement port D à HIGH.
  DDRD   |= 0b00010000; //UNO uniquement port D en sortie sauf RX. 1 = sortie
  Serial.begin(115200); //Permet la communication en serial
  sensors.begin();      //Activation des capteurs
  sensors.getAddress(sensorDeviceAddress, 0);     //Demande l'adresse du capteur à l'index 0 du bus
  sensors.setResolution(sensorDeviceAddress, 12); //Résolutions possibles: 9,10,11,12
  lcd.begin();                                    // initialize the lcd
  //lcd.init();                                   // initialize the lcd
  lcd.backlight();
  tempo_vie = millis();                           //arme la cadence du bit de vie
  Serial.println(F("fin setup"));                 //affiche au moniteur "fin de setup"
}

void loop()
{
  vie();                                           //gere le bit de vie
  temperature_eau();                               //releve la température de l'eau
  impulsion_relais();                              //desactive le relais d'impulsion si sa tempo est terminée
  saisie_info_reveil();                            //gere les impulsions en provenance du reveil
  gestion_tempo_pompe();                           //gere la pompe
  //ici, tu peux ajouter des fonctions 
  //pour faire d'autres taches
}

void gestion_tempo_pompe()
{
  if ((millis() - deb_tempo_pompe) < tempo_pompe)                     //si tempo pompe en cours
  { 
    //lcd.setCursor(0, 1); lcd.print((millis() - deb_tempo_pompe));   //affichage du temps ecoulé sur lcd
    if (!flag_premiere_impulsion)                               //si la premiere impulsion n'est pas faite
    { 
      flag_deuxieme_impulsion = false;                          //alors la 2eme impulsion n'est pas faite
      Serial.println(F("1ere impulsion ON par relais telerupteur "));
      deb_impulsion = millis();                                 //armement du chrono d'impulsion par relais
      impulsion_relais();                                       //le relais est collé
      flag_premiere_impulsion = true;                           //témoin de 1ere impulsion passe en "fait"
    }
  } 
  else                                                           // sinon la tempo pompe est terminée
  {
    if ((flag_premiere_impulsion) && (!flag_deuxieme_impulsion)) //si 1ere impulsion faite mais pas la 2eme
    {
      flag_premiere_impulsion = false;                           //témoin pour 1ere impulsion razé
      Serial.println(F("deuxieme impulsion OFF par relais telerupteur "));
      deb_impulsion = millis();                                  //armement du chrono d'impulsion par relais
      impulsion_relais();                                        //le relais est collé
      flag_deuxieme_impulsion = true;                            //temoin de 2 eme implsion passe en "fait"
    }
    flag_tempo_pompe_en_cours = false;                           //témoin de tempo pompe passe en terminée
    premier_passage = false;
  }
}

void saisie_info_reveil()
{
  if ((analogRead(impulsion) > 650) && (flag_impulsion == false))
  {                                                     //1ere impulsion (parasite) à la mise sous tension
    Serial.println(F("1ere impulsion parasite"));
    delay(neutralisation);                              //prise en compte neutralisée pendant "neutralisation"
    flag_impulsion = true;
  }
  else                                                  //il est l'heure et ce n'est pas la 1ere impulsion
  {
    if ((analogRead(impulsion) > 650) && (flag_impulsion == true) && (premier_passage == false))
    {
      Serial.println(F("1ere impulsion validée de la journée "));
      premier_passage = true;                                          //1er passage de la journée
      deb_tempo_pompe  = millis();                                           //armement de la tempo de pompe
      init_tempo_pompe();                                              //init de la durée de la tempo
    }
  }
}
void init_tempo_pompe()
{
  if (flag_tempo_pompe_en_cours == false)        //si pas de temporisation en cours
  {
    for (byte f = 0; f <= 30; f++)
    {
      if ((int(temperature)) == temp[f][0])     //recherche plage temperature
      {
        tempo_pompe = temp[f][1];               //init de la durée correspondante
        flag_tempo_pompe_en_cours = true;       //armement du flag de temporisation en cours
        Serial.print(tempo_pompe); Serial.println("\t");
      }
      if (flag_tempo_pompe_en_cours) {          //si correspondance trouvée, sortir du "for"
        break;
      }
    }
  }
}
void impulsion_relais()
{
  if ((millis() - deb_impulsion) < duree_impulsion)
  {
    digitalWrite(relais,  LOW);                                      //relais activé
    Serial.println("relais impulsion activé");
  }
  else
  {
    digitalWrite(relais, HIGH);                                      //relais désactivé
    Serial.println("relais impulsion desactivé");
  }
}
void temperature_eau()
{
  sensors.requestTemperatures();                                    //Demande la température aux capteurs
  temperature = sensors.getTempCByIndex(0);                         // lire temperature en Celsius
  lcd.setCursor(0, 0);
  lcd.print("Temp eau piscine : ");
  lcd.setCursor(1, 1);
  lcd.setCursor(6, 1);
  lcd.print(sensors.getTempCByIndex(0));
  lcd.print(" C ");
   Serial.println(sensors.getTempCByIndex(0)); 
}
void vie()
{
  if (flag_tempo_pompe_en_cours)                 //si une tempo pompe est en cours
  {
    if ((millis() - tempo_vie) > 1000)           //si 1 seconde s'est écoulée
    {
      tempo_vie = millis(); bit_vie++;           
      if (bit_vie % 2)                           //si bit de vie == 1
      { 
        lcd.setCursor(15, 1);
        lcd.print("T");                          //affiche 'T' ( Temporisation)sur le lcd
      } 
      else                                       //sinon, bit de vie == 2
      {
        lcd.setCursor(15, 1);
        lcd.print("P"); bit_vie = 0;             //afffiche 'P' (Pompe)sur le lcd
      }
    }
  }
  else                                           //sinon, la tempo pompe n'est pas en cours
  {
    if ((millis() - tempo_vie) > 1000)           //si 1 seconde s'est écoulée
    {
      tempo_vie = millis(); bit_vie++;
      if (bit_vie % 2) {                          //si le bit de vie ==1
        lcd.setCursor(15, 1);
        lcd.print("*");                           //affiche '*' sur le lcd
      } 
      else                                        //sinon, bit de vie ==2
      {
        lcd.setCursor(15, 1); 
        lcd.print("O"); bit_vie = 0;              //affiche 'O' sur le lcd
      }
    }
  }
}


Je viens de tester, mais je viens de comprendre que j'étais toujours avec mon ancien cablage ( intensité) je vais changer pour mettre le - sur le GND et le + sur le A0..

Alors, apparemment, cela fonctionne mais, les impulsions se déclenchent quand il n'y en a pas... le réveil ne donne pas de signal et le relais s'allume..

Je pense que comme au début du topic, il y a trop de parasites et il faut travailler avec l'intensité...

un parasite et son amplitude sont aléatoires

pour moi, tu es sur un prob de hard

anti parasitage, blindage du cable.........etc....

Pourtant, j'ai tout revérifié et rebranché, mais j'ai tout le temps le cycle tempo relais qui s'allume , meme si A0 est débranché..Il y a surement un problème niveau code, je reposte le code :




#include <OneWire.h> //Librairie du bus OneWire
#include <DallasTemperature.h> //Librairie du capteur
#include <LiquidCrystal_I2C.h>



LiquidCrystal_I2C lcd(0x3F, 16, 2); //l adresse 0x27 est a changé en fonction de votre écran
  OneWire oneWire(10); //Bus One Wire sur la pin 10 de l'arduino
  DallasTemperature sensors(&oneWire); //Utilistion du bus Onewire pour les capteurs
  DeviceAddress sensorDeviceAddress; //Vérifie la compatibilité des capteurs avec la librairie


//*********************************************************************************************************
//les reglages se font ici ( entre les lignes étoilées )
unsigned long duree_impulsion   = 2000;  //durée de l'impulsion du relais
int neutralisation              = 1000;  //durée de neutralisation pendant impulsion parasite
unsigned long temp[31] [2] = {
  {   40,    17000},//température et temporisation associée
  {   39,    16500},//température et temporisation associée
  {   38,    16000},//température et temporisation associée
  {   37,    15500},//température et temporisation associée
  {   36,    15000},//température et temporisation associée
  {   35,    13500},//température et temporisation associée
  {   34,    13000},//température et temporisation associée
  {   33,    12500},//température et temporisation associée
  {   32,    12000},//température et temporisation associée
  {   31,    11500},//température et temporisation associée
  {   30,    11000},//température et temporisation associée
  {   29,    10500},//température et temporisation associée
  {   28,    10000},//température et temporisation associée
  {   27,    9500},//température et temporisation associée
  {   26,    9000},//température et temporisation associée
  {   25,    8500},//température et temporisation associée
  {   24,    8000},//température et temporisation associée
  {   23,    7500},//température et temporisation associée
  {   22,    7000},//température et temporisation associée
  {   21,    6500},//température et temporisation associée
  {   20,    6000},//température et temporisation associée
  {   19,    5500},//température et temporisation associée
  {   18,    5000},//température et temporisation associée
  {   17,    4500},//température et temporisation associée
  {   16,    4000},//température et temporisation associée
  {   15,    3500},//température et temporisation associée
  {   14,    3000},//température et temporisation associée
  {   13,    2500},//température et temporisation associée
  {   12,    2000},//température et temporisation associée
  {   11,    1500},//température et temporisation associée
  {   10,    1000} //température et temporisation associée
};
//********************************************************************************************************
const byte relais         =  4;          // Pin du relais4 pour temperature entre 10 et 40°C
const byte impulsion      = 14;          // A0 signal du reveil
float temperature         = 0.0;         // temperature en Celsius
unsigned long tempo_pompe = 0;           // durée pompe en fonction de la température de l'eau
unsigned long deb_tempo_pompe   = 0;           //
unsigned long deb_impulsion      = 0;

boolean flag_impulsion          = false; //témoin de l'impulsion parasite à la mise sous tension
boolean flag_premiere_impulsion = false; //témoin de premiere impulsion faite ou pas
boolean flag_deuxieme_impulsion = false; //témoin de deuxième impulsion faite ou pas
boolean flag_tempo_pompe_en_cours = false; //témoin de tempo pompe en cours
boolean premier_passage           = false; //témoin de 1ere impulsion valide du reveil
byte bit_vie                      =     0; //demontre que le micro est actif
unsigned long tempo_vie           =     0; //pour clignotement du bit de vie
void setup(void)
{
  PORTD  |= 0b00010000; //UNO uniquement port D à HIGH.
  DDRD   |= 0b00010000; //UNO uniquement port D en sortie sauf RX. 1 = sortie
  Serial.begin(115200); //Permet la communication en serial
  sensors.begin();      //Activation des capteurs
  sensors.getAddress(sensorDeviceAddress, 0);     //Demande l'adresse du capteur à l'index 0 du bus
  sensors.setResolution(sensorDeviceAddress, 12); //Résolutions possibles: 9,10,11,12
  lcd.init();                      // initialize the lcd
  lcd.backlight();
  tempo_vie = millis();                           //arme la cadence du bit de vie
  Serial.println(F("fin setup"));                 //affiche au moniteur "fin de setup"


  

  pinMode(relais, OUTPUT); //Déclaration de la broche 4 en sortie
  digitalWrite(relais, HIGH); // mise off du relais au demarrage



  







}

void loop()
{
  vie();                                           //gere le bit de vie
  temperature_eau();                               //releve la température de l'eau
  impulsion_relais();                              //desactive le relais d'impulsion si sa tempo est terminée
  saisie_info_reveil();                            //gere les impulsions en provenance du reveil
  gestion_tempo_pompe();                           //gere la pompe
  //ici, tu peux ajouter des fonctions
  //pour faire d'autres taches
}

void gestion_tempo_pompe()
{
  if ((millis() - deb_tempo_pompe) < tempo_pompe)                     //si tempo pompe en cours
  {
    //lcd.setCursor(0, 1); lcd.print((millis() - deb_tempo_pompe));   //affichage du temps ecoulé sur lcd
    if (!flag_premiere_impulsion)                               //si la premiere impulsion n'est pas faite
    {
      flag_deuxieme_impulsion = false;                          //alors la 2eme impulsion n'est pas faite
      Serial.println(F("1ere impulsion ON par relais telerupteur "));
      deb_impulsion = millis();                                 //armement du chrono d'impulsion par relais
      impulsion_relais();                                       //le relais est collé
      flag_premiere_impulsion = true;                           //témoin de 1ere impulsion passe en "fait"
    }
  }
  else                                                           // sinon la tempo pompe est terminée
  {
    if ((flag_premiere_impulsion) && (!flag_deuxieme_impulsion)) //si 1ere impulsion faite mais pas la 2eme
    {
      flag_premiere_impulsion = false;                           //témoin pour 1ere impulsion razé
      Serial.println(F("deuxieme impulsion OFF par relais telerupteur "));
      deb_impulsion = millis();                                  //armement du chrono d'impulsion par relais
      impulsion_relais();                                        //le relais est collé
      flag_deuxieme_impulsion = true;                            //temoin de 2 eme implsion passe en "fait"
    }
    flag_tempo_pompe_en_cours = false;                           //témoin de tempo pompe passe en terminée
    premier_passage = false;
  }
}

void saisie_info_reveil()
{
  if ((analogRead(impulsion) > 256) && (flag_impulsion == false))
  { //1ere impulsion (parasite) à la mise sous tension
    Serial.println(F("1ere impulsion parasite"));
    delay(neutralisation);                              //prise en compte neutralisée pendant "neutralisation"
    flag_impulsion = true;
  }
  else                                                  //il est l'heure et ce n'est pas la 1ere impulsion
  {
    if ((analogRead(impulsion) > 256) && (flag_impulsion == true) && (premier_passage == false))
    {
      Serial.println(F("1ere impulsion validée de la journée "));
      premier_passage = true;                                          //1er passage de la journée
      deb_tempo_pompe  = millis();                                           //armement de la tempo de pompe
      init_tempo_pompe();                                              //init de la durée de la tempo
    }
  }
}
void init_tempo_pompe()
{
  if (flag_tempo_pompe_en_cours == false)        //si pas de temporisation en cours
  {
    for (byte f = 0; f <= 30; f++)
    {
      if ((int(temperature)) == temp[f][0])     //recherche plage temperature
      {
        tempo_pompe = temp[f][1];               //init de la durée correspondante
        flag_tempo_pompe_en_cours = true;       //armement du flag de temporisation en cours
        Serial.print(tempo_pompe); Serial.println("\t");
      }
      if (flag_tempo_pompe_en_cours) {          //si correspondance trouvée, sortir du "for"
        break;
      }
    }
  }
}
void impulsion_relais()
{
  if ((millis() - deb_impulsion) < duree_impulsion)
  {
    digitalWrite(relais,  LOW);                                      //relais activé
    Serial.println("relais impulsion activé");
  }
  else
  {
    digitalWrite(relais, HIGH);                                      //relais désactivé
    Serial.println("relais impulsion desactivé");
  }
}
void temperature_eau()
{
  sensors.requestTemperatures();                                    //Demande la température aux capteurs
  temperature = sensors.getTempCByIndex(0);                         // lire temperature en Celsius
  lcd.setCursor(0, 0);
  lcd.print("Temp eau piscine : ");
  lcd.setCursor(1, 1);
  lcd.setCursor(6, 1);
  lcd.print(sensors.getTempCByIndex(0));
  lcd.print(" C ");
  Serial.println(sensors.getTempCByIndex(0));
}
void vie()
{
  if (flag_tempo_pompe_en_cours)                 //si une tempo pompe est en cours
  {
    if ((millis() - tempo_vie) > 1000)           //si 1 seconde s'est écoulée
    {
      tempo_vie = millis(); bit_vie++;
      if (bit_vie % 2)                           //si bit de vie == 1
      {
        lcd.setCursor(15, 1);
        lcd.print("T");                          //affiche 'T' ( Temporisation)sur le lcd
      }
      else                                       //sinon, bit de vie == 2
      {
        lcd.setCursor(15, 1);
        lcd.print("P"); bit_vie = 0;             //afffiche 'P' (Pompe)sur le lcd
      }
    }
  }
  else                                           //sinon, la tempo pompe n'est pas en cours
  {
    if ((millis() - tempo_vie) > 1000)           //si 1 seconde s'est écoulée
    {
      tempo_vie = millis(); bit_vie++;
      if (bit_vie % 2) {                          //si le bit de vie ==1
        lcd.setCursor(15, 1);
        lcd.print("*");                           //affiche '*' sur le lcd
      }
      else                                        //sinon, bit de vie ==2
      {
        lcd.setCursor(15, 1);
        lcd.print("O"); bit_vie = 0;              //affiche 'O' sur le lcd
      }
    }
  }
}

A0 est instable et peut prendre des valeurs aléatoires s'il n'y a rien dessus

testes en mettant A0 à GND, tu verras que leprog se calme

testes ensuite en déplacant le fil du reveil de A0 vers une entrée digitale et n'oublie pas de modifier pour déclarer l'entrée digitale en input

//const byte impulsion = 14; // A0 signal du reveil
const byte impulsion = 5;

dans le setup
pinMode(impulsion,INPUT);

et bien sur mets ton fil de reveil sur D5

edit:
quelle est la longueur de ton fil de reveil ?
croise t'il des fils en 220V ou autre haute tension?
longe t'il des fils en 220V ou autre haute tension?
est il blindé?
y a t'il un néon à proximité?

En mettant sur une entrée Digitale cela a résolut le problème.. je n'ai plus le problème d'un signal automatique toutes les 14 secondes.
Maintenant, j'ai une grande difficulté a gérer le seuil de détection de la tension, autour des 160, je détecte une tension alors que le réveil ne sonne pas et au dessus c'est aussi un peu aléatoire, a 170 il détecte parfois oui parfois non.. Il faudrait un oscilloscope pour voir le signal sortant du réveil.. j'avais au tout début mesuré avec un voltmètre pour me faire une idée, et cela varie, au début des 2minutes on a une tension minime de 0.2v et cela monte crescendo a des pics de 2v..mais au voltmètre c'est très imprécis..

Au seuil de 160, je detecte des parasites et le relais s'allume quand le reveil ne sonne pas, et a 165 je ne detecte plus aucun signal...Bon, je verrais plus tard, faut que je refasse des essais..

A défaut d'oscilloscope , tu fais un programme pour lire la valeur et l'afficher sur le traceur série.

Oui c'est vrai..je reviendrais donner les resultats

hello
j'ai oublié, pour l'entrée digitale,
la ligne
if ((analogRead(impulsion) > seuil_parasite) && (flag_impulsion == false))
devient
if ((digitalRead(impulsion) && (flag_impulsion == false))
et la ligne
if ((analogRead(impulsion) > seuil_valide)
devient
if (digitalRead(impulsion) )

digitalRead va donner 0 ou 1 et non de 0 à 1023 comme AnalogRead

ton signal " reveil " est issu de quoi? collecteur ouvert?

une autre idée, en lecture analogique, si ton signal consiste en une suite de pics pendant 2 secondes, tu peux l'assimilier à de la modulation "PWM"
*tu peux tester en mettant une capa entre GND et A0 et en mettant une resistance entre A0 et le fil du reveil. *
tu devrais lire sur A0 une tension continue et non des pics

attention à respecter la polarité du condo(moins du condo sur GND et le plus sur A0.

les valeurs de C e de R sont à déterminer en fonction des pics (par tests)
plus les valeurs seront élévées et moins la tension sera élevée dans la capa donc sur A0.
mais cela est aussi fonction du nombre de pics
pas moyen de t'aider plus. tu devrais y arriver par approches successsives.
si le temps de pics est assez long (ou plus long que le temps d'acquisition de ton voltmetre), tu pourras lire a tension sur A0 à l'aide de ton voltmetre

Alors, j'ai changé :

la ligne
if ((analogRead(impulsion) > seuil_parasite) && (flag_impulsion == false))
devient
if ((digitalRead(impulsion) && (flag_impulsion == false))
et la ligne
if ((analogRead(impulsion) > seuil_valide)
devient
if (digitalRead(impulsion) )

Mais maintenant il ne me détecte plus du tout le signal..

Quand je mesure sur A1 avec ce code :

// entrée analogique utilisée pour mesurer la tension
#define ENTREE_ANALOGIQUE 1
 
void setup()
{
    // Initialisation de la connexion série avec votre moniteur
    Serial.begin(115200) ;
}
 
void loop()
{
    // lecture de la valeur analogique à mesurer
    int valeurLue = analogRead(ENTREE_ANALOGIQUE) ;
     
    // conversion de la valeur lue en une tension en centi-Volts
    float tensionLue = map(valeurLue, 0, 1023, 0, 500);
     
    // envoi pour affichage sur le moniteur série de la tension mesurée
    Serial.print("Tension : ") ;
    Serial.print(tensionLue / 100.0) ; // Afficher la valeur en Volts
    Serial.println(" Volts") ;
     
    // attente d’une seconde (1000 millisecondes) entre deux mesures & affichages
    delay(1000) ;
}

j'obtiens en sortie de reveil au repos :

Et sur entrée digitale avec ce code :

// entrée analogique utilisée pour mesurer la tension
const int Broche7 = 7;
 
void setup()
{
// Initialisation de la connexion série avec votre moniteur
Serial.begin(115200) ;
}
 
void loop()
{
// lecture de la valeur analogique à mesurer
int valeurLue = digitalRead(Broche7) ;
 
// conversion de la valeur lue en une tension en centi-Volts
float tensionLue = map(valeurLue, 0, 1023, 0, 500);
 
// envoi pour affichage sur le moniteur série de la tension mesurée
Serial.print("Tension : ") ;
Serial.print(tensionLue / 100.0) ; // Afficher la valeur en Volts
Serial.println(" Volts") ;
 
// attente d’une seconde (1000 millisecondes) entre deux mesures & affichages
delay(10) ;
}

Je ne detecte pas de signal, la tension reste a 0

Alors, j'ai maintenant rajouté une résistance de 327 Ohm et une capa de 3.3microF. Et la cela stabilise la tension, en regardant la tension, elle baisse très lentement quand le reveil a fini de sonner, cela veut dire que la capa se décharge lentement. Je n'ai plus de problème sur l'entrée analogique. Tout fonctionne correctement. Un grand merci a Dfgh.

Je vais encore faire quelques modifs pour le réglage de la tempo et l'affichage de l'écran lcd. Ensuite de tout mettre dans un boitier proprement. Je vous tiens au courant

Utilises le traceur série (outil/traceur serie) pour avoir une représentation graphique.
Il faut envoyer uniquement la valeur (pas de texte) et mettre un delay de qq ms