Increment problem que je ne comprend pas ..

J'ai un peu de difficulté, je suis newbie dans la programation je vous le dit toute suite... Merci pour votre aide !

Mon probleme est que ca fonctionné tres bien pendant quelque jours, mais jai rajouté des points de plus sur le controleur atmega 2560. Depuis alors mon delais 28000 ne fonctionnais plus dans le temps, le ventilateur part apres 15 sec seulement... et si je mets le : serial.println(Ventilateur_Toil_Ss), il fonctionne avec le bon delais... ?? pourquoi ? J'ai essayer de cree le int dans le void setup et enlever celui dans le int. il ne part plus .... ? lol Avec le serial.print jarrive pas a voir mes autres points si il reste actif!

int unsigned long Ventilateur_Toil_Ss = 0;

void setup(){
  //unsigned long Ventilateur_Toil_Ss = 0;  
    //Serial.println(currentMillis);
    //Serial.println(Ventilateur_Toil_Ss);
    //Serial.println(pir_Toil_Ss);
    

    if (Etat_Lumiere_Toil_Ss == HIGH){
         Ventilateur_Toil_Ss++;
          if (Ventilateur_Toil_Ss >= 280000) { //delais reel de la lumiere:280 ... soit 4.31 min
                         Time_delay_Toil_Ss = HIGH;
                           digitalWrite(Ventilateur_Toilette_Ss2, HIGH);
                           
                           }
  }
    
   if (Etat_Lumiere_Toil_Ss == LOW){
        Ventilateur_Toil_Ss = 0; }
   
  
  if (Etat_Lumiere_Toil_Ss == LOW && Time_delay_Toil_Ss == HIGH) {
       pir_Toil_Ss++;
             if (pir_Toil_Ss >= 300000){
                 Time_delay_Toil_Ss = LOW;
                   digitalWrite(Ventilateur_Toilette_Ss2, LOW);
                      pir_Toil_Ss = 0;
          }
 }
}

Ton code est entier ?????

Non je t'avoue que jai un mur de int...

lumière état, c mon capteur de mouvement des toilettes... il marche bien, donc je l'ai mis quand je rentre dans la toilette il allume la lumière. Si j'y reste plus de 280000 il part le ventilateur de toilettes ( pour la situation douche ou autre ... ;)

Ensuite c la séquence que j'ai poster, J'essaie vraiment comprendre pourquoi le serial fais que ça fonction et sans il ne voit pas l'incrémentation comme il faut ...

hello prends un exemple dans "fichier" "exemples"

et regardes l'utilisation de "set up" et de "loop"

C'est quel type ça? int unsigned long Ventilateur_Toil_Ss = 0;

(C'est quel type ça? int unsigned long Ventilateur_Toil_Ss = 0;)

Jai 11 onglets et c une programmation de domotique... Jai 11 onglets 1 dht 11/22 un autre entre Electrique et bien d'autre...

Jai une page pour mes int: Et j'ai mis : unsigned long Ventilateur_Toil_Ss = 0; Unsigned long c pour qu'il puisse rouler un compte presque infini ( 4 milliards max je crois ... ) juste long peut faire l'affaire, aussi.... mais le problem reste le même... Sans serial.print il ne suis pas le compte de millis qui roule dans Quartz.. Est ce que quelqu'un peut me dire qu'il utilise une plage incrément et que ça fonctionne bien, sans avoir besoin de serial.print pour maintenir le compte in time ? Je trouve presque tout dans toute les site internet sur d'arduino, mais la je ne trouve rien de rien de se type de problème

J'avais 2 idées derrière la tête avec mon point sur le type

  1. juste que l'on note ce type le plus souvent unsigned long même si la spec c++ permet de mettre des "type specifiers" dans l'ordre que l'on veut. votre réponse montre que vous avez une bonne raison de vouloir un unsigned long - effectivement nécessaire pour bien gérer millis().

  2. Comme vous ne nous avez pas donné tout code difficile de vous dire où est le pb mais je remarque que Pour les constantes vous ne forcez pas justement le type unsigned long. On ne peut pas toujours impunément écrire 280000 car ça ne tient pas dans un entier et que par défaut si vous ne lui dites rien le preprocessor fera des calculs Sur les littéraux en entiers (donc 16 bits). Il vaut mieux donc noter 280000[b]UL[/b]

Sinon attention à la portée (scope) des variables; si vous écrivez

int a = 0;
void setup()
{
   int a =1000;
   Serial.println(a); // affiche 1000
}

void loop()
{
   Serial.println(a); // affiche 0
}

Dans le setup vous créez une variable locale a (avec le int devant) qui va masquer temporairement au sein du setup() la variable globale a mais en dehors de setup() vous refaites référence la variable globale (qui est initialisée zéro par le compilateur en tant que variable globale)

Pour en savoir plus sur la portée des variables et les espaces de noms cf en français https://fr.m.wikiversity.org/wiki/Langage_C%2B%2B/Portée_du_code

Merci J-M-L !

Dans ma quête de connaissance, je cherchais à savoir la base qui différenciais la création de valeurs dans les fonctions et pourquoi d'autre était crée dans le global ! Super

Pour le UL jai fait ma recherche et je comprend mieux ! Voici un petit lien de référence pour d'autre comme moi qui cherche et n'avez pas solutionniez

https://www.arduino.cc/en/Reference/IntegerConstants

Je vous reviens sur la conclusion. Merci pour vos suggestions à tous !!

Bonsoir !

Jai faits des petits test et les resultat sont assomment !!! Est ce que quelqu'un peut m'expliquer, je suis a plus 20h.. sur le problem et je ne comprend absolument pas ce qui se passe !! J-M-L Tu etais certe pas loin avec le faite que l'arduino compte de maniere differente ... ? Mais comme dois-je lui dire comment (8unit)... (16unit) .. Lol

bon ce sketch fonctionne !! Good , sauf que un petit resumé du vrai program: Il exécute en 50 sec le fan...( est-ce 18000 milli c vraiment suppose etre 50 sec ?)

int Ventilateur_Toilette_Ss2= 8; 
int Electricite;                      // Etat 120V
int Etat_120V = 51;                   // Relais input 120V 
int Time_delay_Toil_Ss = 0;           // Etat delay du Fan
int Dm_Toil_Ss = 9;                   // capteur infrarouge PIR Toilette Ss
int pirState_Toil_Ss = LOW;           // pas encore de mouvement détecté au départ Toilette Ss
int Etat_Lumiere_Toil_Ss;
int Lumiere_Toilette_Ss1= 7;

unsigned long Ventilateur_Toil_Ss = 0;
unsigned long pir_Toil_Ss = 0;



void setup(){
  pinMode(Lumiere_Toilette_Ss1, OUTPUT);      //Toilette Ss
  pinMode(Ventilateur_Toilette_Ss2, OUTPUT);  //Toilette Ss
  pinMode(Dm_Toil_Ss, INPUT);                 //Toilette Ss
  Serial.begin(115200);
  }

void loop(){

  Serial.println(Electricite);
// Relais Preuve de marche 120V
 Electricite = digitalRead(Etat_120V);
  if (Electricite == HIGH){
      Serial.println ("{\"Electricite Fonctionnel\"}");
  }
 if (Electricite == LOW) {
  Serial.println("{\"Elctricite en Panne\"}");
  }

 // unsigned long Ventilateur_Toil_Ss = 0;  
 // unsigned long pir_Toil_Ss = 0; **/
    //Serial.println(Time_delay_Toil_Ss);
    //Serial.println(Ventilateur_Toil_Ss);
    //Serial.println(pir_Toil_Ss);

    
    
    if (Etat_Lumiere_Toil_Ss == HIGH){
         Ventilateur_Toil_Ss++;
           //Serial.println(Ventilateur_Toil_Ss);
          if (Ventilateur_Toil_Ss >= 18000ul) { //delais reel de la lumiere:258 ... soit 4.31 min
                         Time_delay_Toil_Ss = HIGH;
                           digitalWrite(Ventilateur_Toilette_Ss2, HIGH);
                           
                           }
  }
    
   if (Etat_Lumiere_Toil_Ss == LOW){
        Ventilateur_Toil_Ss = 0; }
   
  
  if (Etat_Lumiere_Toil_Ss == LOW && Time_delay_Toil_Ss == HIGH) {
       pir_Toil_Ss++;
       //Serial.println(pir_Toil_Ss);
             if (pir_Toil_Ss >= 18000ul){
                 Time_delay_Toil_Ss = LOW;
                   digitalWrite(Ventilateur_Toilette_Ss2, LOW);
                      pir_Toil_Ss = 0;
          }
 }
      
      int val_Toil_Ss = 0;
  
      val_Toil_Ss = digitalRead(Dm_Toil_Ss);        // Lire le statut
      //unsigned long currentMillis_Ss = millis();    //Heure
    

    if (val_Toil_Ss == HIGH) {                    // Si HIGH, détection
      digitalWrite(Lumiere_Toilette_Ss1, HIGH);
      Etat_Lumiere_Toil_Ss = HIGH;    
          
    if (pirState_Toil_Ss == LOW) {             //Front montant (début de détection)
      //Serial.println("Mouvement detecte Lumiere_Toilette_Ss");  //Affiche une seule fois
      pirState_Toil_Ss = HIGH;                 //Mémoriser l'état haut
     // previousMillis_Ss = currentMillis_Ss;    //Mémoriser debut du signal
     }
   
  } else {   //Sinon pas de mouvement détecté
      Etat_Lumiere_Toil_Ss = LOW;
      digitalWrite(Lumiere_Toilette_Ss1, LOW);
      
      if (pirState_Toil_Ss == HIGH){            //Détecter le front descendant
      //Serial.println(" stop Lumiere_Toilette_Ss ");
      pirState_Toil_Ss = LOW;                   //Mémoriser l'état bas
      //unsigned long duree = currentMillis_Ss - previousMillis_Ss;
      //Serial.println(" Duree Lumiere_Toilette_Ss ");
      //Serial.println(duree);                    //Durée en millisecondes
    } 

  }
} // last one

maintenant si je retire l'etat de l'électricité, avec lequel javais fais des test... Il part le fan automatique ! Dès que la lumiere est allumé !

int Ventilateur_Toilette_Ss2= 8; 
int Electricite;                      // Etat 120V
int Etat_120V = 51;                   // Relais input 120V 
int Time_delay_Toil_Ss = 0;           // Etat delay du Fan
int Dm_Toil_Ss = 9;                   // capteur infrarouge PIR Toilette Ss
int pirState_Toil_Ss = LOW;           // pas encore de mouvement détecté au départ Toilette Ss
int Etat_Lumiere_Toil_Ss;
int Lumiere_Toilette_Ss1= 7;

unsigned long Ventilateur_Toil_Ss = 0;
unsigned long pir_Toil_Ss = 0;



void setup(){
  pinMode(Lumiere_Toilette_Ss1, OUTPUT);      //Toilette Ss
  pinMode(Ventilateur_Toilette_Ss2, OUTPUT);  //Toilette Ss
  pinMode(Dm_Toil_Ss, INPUT);                 //Toilette Ss
  Serial.begin(115200);
  }

void loop(){
/**
  Serial.println(Electricite);
// Relais Preuve de marche 120V
 Electricite = digitalRead(Etat_120V);
  if (Electricite == HIGH){
      Serial.println ("{\"Electricite Fonctionnel\"}");
  }
 if (Electricite == LOW) {
  Serial.println("{\"Elctricite en Panne\"}");
  }
**/
 // unsigned long Ventilateur_Toil_Ss = 0;  
 // unsigned long pir_Toil_Ss = 0; **/
    //Serial.println(Time_delay_Toil_Ss);
    //Serial.println(Ventilateur_Toil_Ss);
    //Serial.println(pir_Toil_Ss);

    
    
    if (Etat_Lumiere_Toil_Ss == HIGH){
         Ventilateur_Toil_Ss++;
           //Serial.println(Ventilateur_Toil_Ss);
          if (Ventilateur_Toil_Ss >= 18000ul) { //delais reel de la lumiere:258 ... soit 4.31 min
                         Time_delay_Toil_Ss = HIGH;
                           digitalWrite(Ventilateur_Toilette_Ss2, HIGH);
                           
                           }
  }
    
   if (Etat_Lumiere_Toil_Ss == LOW){
        Ventilateur_Toil_Ss = 0; }
   
  
  if (Etat_Lumiere_Toil_Ss == LOW && Time_delay_Toil_Ss == HIGH) {
       pir_Toil_Ss++;
       //Serial.println(pir_Toil_Ss);
             if (pir_Toil_Ss >= 18000ul){
                 Time_delay_Toil_Ss = LOW;
                   digitalWrite(Ventilateur_Toilette_Ss2, LOW);
                      pir_Toil_Ss = 0;
          }
 }
      
      int val_Toil_Ss = 0;
  
      val_Toil_Ss = digitalRead(Dm_Toil_Ss);        // Lire le statut
      //unsigned long currentMillis_Ss = millis();    //Heure
    

    if (val_Toil_Ss == HIGH) {                    // Si HIGH, détection
      digitalWrite(Lumiere_Toilette_Ss1, HIGH);
      Etat_Lumiere_Toil_Ss = HIGH;    
          
    if (pirState_Toil_Ss == LOW) {             //Front montant (début de détection)
      //Serial.println("Mouvement detecte Lumiere_Toilette_Ss");  //Affiche une seule fois
      pirState_Toil_Ss = HIGH;                 //Mémoriser l'état haut
     // previousMillis_Ss = currentMillis_Ss;    //Mémoriser debut du signal
     }
   
  } else {   //Sinon pas de mouvement détecté
      Etat_Lumiere_Toil_Ss = LOW;
      digitalWrite(Lumiere_Toilette_Ss1, LOW);
      
      if (pirState_Toil_Ss == HIGH){            //Détecter le front descendant
      //Serial.println(" stop Lumiere_Toilette_Ss ");
      pirState_Toil_Ss = LOW;                   //Mémoriser l'état bas
      //unsigned long duree = currentMillis_Ss - previousMillis_Ss;
      //Serial.println(" Duree Lumiere_Toilette_Ss ");
      //Serial.println(duree);                    //Durée en millisecondes
    } 

  }
} // last one

Bon jai fais dautre test, je vais vous epargnez les copiers / coller : Il marrive de l'avoir en 10 sec de delais si je mets le Serial.println dans l'execution et quand je mets le Serial au dessus 15 sec

Conclusion !! WTF ? J'ai un cas de 36" je crois !! Hahaaha Je suis un peu au bout de mes test, Je comprend que le time se fait pas comme il faut ! J'ai vu nul part sur les commentaires un probleme simillaire. La position ou est ecris mon program change le resultat.PK? Jai cru lire sous toute reserve que la pin 6 influencerais l'horloge interne ?? c vrai ?

Merci pour celui ou ceux qui peuvent plancher à m'aider, votre connaissance est de l'or sur ce Forum !!! Merci, Merci !!!

Vous ne faites aucune gestion du temps dans votre boucle!

         Ventilateur_Toil_Ss++;
          if (Ventilateur_Toil_Ss >= 18000ul) { //delais reel de la lumiere:258 ... soit 4.31 min
            ...
          }

quand vous faites cela, vous augmentez Ventilateur_Toil_Ss mais il va augmenter aussi vite que votre micro-processeur est capable de boucler!

il faut avoir une variable qui mémorise votre temps de départ d'une action et une variable d'état qui vous dit si vous êtes en train d'attendre la fin de la tempo, par exemple debutAllumage et ensuite tester

unsigned long debutAllumage;
const unsigned long TEMPORISATION = 15000UL; // 15 secondes

if (millis() - debutAllumage >= TEMPORISATION) {
    // ici on a fini nos 15 secondes, éteindre et mémoriser un nouvel état

} else {
    // ici on n'a pas fini nos 15 secondes, éventuellement ne rien faire

}