Pilotage d'un radiateur par téléphone mobile via Arduino UNO

a marqué ce sujet comme résolu.

Bonjour J'ai monté et programmé l'installation suivante qui fonctionne parfaitement… pendant 10 minutes ! Ensuite la broche qui reçoit la masse du MOC change spontanément de niveau !! Pouvez vous avoir la gentillesse de me dire où j'ai buggé ? Merci.

Le fil pilote du radiateur est commandé par téléphone portable. On capte la tension + du buzzer du téléphone pour allumer une LED / GND du téléphone via une résistance de 270 ohms. Une photorésistance LDR capte le signal lumineux provoqué par chaque sonnerie. Elle est branchée sur l'arduino : +5V / GND via une résistance de 4.7 kO. Ce circuit est séparé de celui du téléphone. La broche analogique A0 mesure la tension de la borne de la photorésistance coté GND. Un phototransistor MOC3041 (+ led de controle // via 3.3 kO) est branchée au +5V et, par la broche 2, à la masse de l'Arduino via 510 Ohms. Sa LED commute la phase du circuit 220V protégé par un disjoncteur de 2A, vers le fil pilote qui ne demande que quelques mA.

Voici le programme :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int baseRadiateur = 2; 8// BaseRadiateur comme un nombre entier lu sur la broche 2
unsigned long heure_debut_sonnerie;
const int duree_tot_sonneries = 20000; //stocke la durée totale des sonneries.
void setup()
{
pinMode(baseRadiateur, OUTPUT);   // configure la broche 2 en sortie
digitalWrite(baseRadiateur, LOW); /* envoie la valeur LOW sur la broche 2 qui est au - de la LED du MOC3041. le MOC3041 devient passant=>fil pilote alimenté 220v,radiateur mode "ECO", LED témoin allumée*/ 
}
void loop()  // 1 sonnerie=>mode CONF et > 2 sonneries ou erreur d'appel=>ECO
{
int valSonnerie = analogRead(A0); // valSonnerie nombre entier lu sur la broche analogique A0
heure_debut_sonnerie = millis();
delay(1000);  // pause d'1s dans la boucle pour calmer la loop pour essayer d'éviter que le prog plante après 5 mn
  if ((valSonnerie) >= 600)  {          // si téléphone sonne
     digitalWrite(baseRadiateur, HIGH);
       //MOC3041 non passant=>fil pilote non alimenté et radiateur commuté sur "CONF"
     delay(7000);                       // attente d'une éventuelle 2ème sonnerie
     while (millis() - heure_debut_sonnerie < duree_tot_sonneries) {
                                        //càd<20000 après le début de la 1° sonnerie
        int valSonnerie = analogRead(A0);
        if ((valSonnerie) >= 600) {    // si le téléphone sonne encore 
           digitalWrite(baseRadiateur, LOW); 
             //MOC3041 passant=>fil pilote alimenté et radiateur commuté sur "ECO"
           break;                      // Arrete la boucle while devenue inutile
            }             }
     delay(14000);   // Attente fin de sonnerie après le break
  }   }

Références : http://eskimon.fr/1582-arduino-501-generalites-sur-les-capteurs www.manuel-esteban.com/arduino-capteur-de-luminosite/ www.sonelec-musique.com/electronique_realisations_detecteur_sonnerie_reveil_002.html

+0 -0

Utilise une balise code pour ton code, c'est litéralement ilisible <troll>Comme sur le bloc-note</troll> pour cela c'est les chevrons (<>) au dessus de ton message dans l'éditeur ou comme ça

1
2
3
```c++
    // Ton code
\```

sans le backslash avant les backquotes.

+0 -0

Bonjour :)

Pourquoi la variable valSonnerie est déclarée une fois au début de la fonction loop et une autre fois dans la boucle while ?

Ne serait-il pas mieux de la déclarer une fois au début de loop en l'initialisant à 0, et ensuite de lui affecter la valeur avant chaque utilisation, genre ça ? Edit : et de lui réaffecter 0 après utilisation

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    void loop()  // 1 sonnerie=>mode CONF et > 2 sonneries ou erreur d'appel=>ECO
{
int valSonnerie = 0;

heure_debut_sonnerie = millis();
delay(1000);  // pause d'1s dans la boucle pour calmer la loop pour essayer d'éviter que le prog plante après 5 mn
  valSonnerie = analogRead(A0); // valSonnerie nombre entier lu sur la broche analogique A0
  if ((valSonnerie) >= 600)  {          // si téléphone sonne
     digitalWrite(baseRadiateur, HIGH);
     valSonnerie = 0;
       //MOC3041 non passant=>fil pilote non alimenté et radiateur commuté sur "CONF"
     delay(7000);                       // attente d'une éventuelle 2ème sonnerie
     while (millis() - heure_debut_sonnerie < duree_tot_sonneries) {
                                        //càd<20000 après le début de la 1° sonnerie
        valSonnerie = analogRead(A0);
        if ((valSonnerie) >= 600) {    // si le téléphone sonne encore 
           digitalWrite(baseRadiateur, LOW); 
             //MOC3041 passant=>fil pilote alimenté et radiateur commuté sur "ECO"
           valSonnerie = 0;
           break;                      // Arrete la boucle while devenue inutile
            }             }
     delay(14000);   // Attente fin de sonnerie après le break
  }   }
+0 -0

Bonjour Merci, c'est plus net : je modifie. Mais cela ne résout pas l’arrêt du programme retardé de 10-15 mn. J'ai peut être trop chargé la broche en branchant la LED du MOC et celle de contrôle en parallèle. Cela ne doit pas dépasser 40mA mais sur une longue durée ??? J'ai donc modifié le montage en utilisant la broche 13 uniquement pour le MOC. En plaçant en série 260 ohms replantage, 520 pareil mais le programme est stable depuis une heure avec 1260 ohms, je croise les doigts. Pour la LED j'utilise maintenant la LED de la carte Arduino affectée à cette broche 13, elle est éteinte quand la broche est LOW. Quelqu'un a-t-il déjà rencontré ce type de problème de surcharge d'une broche sur la durée, mon système doit tenir tout au long de l'année ? Salut

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte