(résolu) Automatisation et communication entre un poêle et un brasseur d'air

Bonjour à tous :slight_smile:

Avant toute chose je suis un habitué des forums mais un pur néophyte en matière d'Arduino.
Les possibilités que cela offre me passionnent de loin depuis longtemps mais j'ai un projet qui me tend les bras et me permettrait de me retrousser les manches.

Je cherche donc avant tout à apprendre à travers ce projet.

Voici le topo global:

Je chauffe mon appart avec un poêle et uniquement comme cela.
Il est controlé par une télécommande qui sert de thermostat.
J'expédie de l'air chaud dans un tuyau pour la chambre de ma fille.
Cette chambre à une hauteur sous plafond de 4 m au plus haut et de 2,70 au moins haut.
La chaleur vient se loger là haut pour ne plus en partir.
J'ai donc un brasseur d'air Dyson muni d'une télécommande.
J'aimerais donc dire à mon brasseur d'air de s'allumer 20 mn après la mise en route de mon poêle (durée à partir de laquelle il envoi l'air dans le tuyau), et de lui dire de s'éteindre 20 mn après l'extinction de mon poêle.
J'ai donc deux télécommandes, celle du poêle et celle du brasseur.
Il faudrait donc que j'arrive à me servir de leurs signaux respectifs pour communiquer.

J'ai été chercher un peu comment décoder le signal infrarouge d'une télécommande puis l'exploiter.
Je tombe sur l'utilisation de bibliothèques qui ont tendances à reconnaitre les signaux reçu par des TSOP.
Mais ces bibliothèques recenses essentiellement des données de télécommandes standards, le plus souvent des télécommandes de TV.
Je doute que ces bibliothèques ne me permettent de décoder facilement le signal d'une télécommande d'un poêle.

Mes questions sont donc les suivantes:

Quel type de puce Arduino dois-je chercher? (j'ai l'impression qu'il en existe plusieurs?)
Vers quel type de TSOP partiriez-vous? Fréquence?
Quelle bibliothèque utiliser si vous aviez connaissance d'une plus exhaustive?

Voila je débarque un peu, mais j'ai envie de m'y mettre :slight_smile:
Merci d'avoir au moins lu ce roman :grinning:

Bonne journée !

Bonjour
basiquement il te faut :
recuperer l trame ON/OFF du poele
recuperer la trame ON/OFF du brasseur d'air
generer cette trame ON/OFF du brasseur d'air

part déjà sur une base UNO avec la lib IRremote
pour voir ce que tu recupere avec déjà un TSOP en 38KHz (c'est ce qui est le plus couramment utilisé)

lien vers vos télécommandes ? certaines sont cryptées et n'envoient pas forcément le même code à chaque fois pour la même opération...

(sinon un petit ventilateur, deux sondes de t° - une en bas de la pièce, une en haut dans le piège à air chaud - et si la différence est > à un seuil avec un relai vous déclenchez le ventilateur --> comme ça pas de lien avec votre autre système, c'est autonome)

J-M-L:
lien vers vos télécommandes ? certaines sont cryptées et n'envoient pas forcément le même code à chaque fois pour la même opération...

Bonjour JML
Je pense que geantvert a verifé que ses telco sont en IR et pas en radio
Proba si ce sont bien des IR qu'il n'y a pas de piege genre cryptage ou code tournant comme en HF

Artouste:
Bonjour JML
Je pense que geantvert a verifé que ses telco sont en IR et pas en radio
Proba si ce sont bien des IR qu'il n'y a pas de piege genre cryptage ou code tournant comme en HF

Salut Artouste
oui c'est ce que je voulais vérifier... si elles sont radio et pas IR... d'où demande du lien.

Merci pour votre réactivité et vos réponses à tous les deux ! :slight_smile:

Artouste:
Bonjour
basiquement il te faut :
recuperer l trame ON/OFF du poele
recuperer la trame ON/OFF du brasseur d'air
generer cette trame ON/OFF du brasseur d'air

part déjà sur une base UNO avec la lib IRremote
pour voir ce que tu recupere avec déjà un TSOP en 38KHz (c'est ce qui est le plus couramment utilisé)

C'est exactement la marche à suivre que je me suis effectivement donnée.
Merci pour la librairie :wink:
Il me faut donc acheter le TSOP en question. Que me conseilles-tu pour commencer comme kit arduino? Un kit complet? Quel type d'arduino? Je suis vraiment débutant du 1er jour :slight_smile:

[/quote]

J-M-L:
lien vers vos télécommandes ? certaines sont cryptées et n'envoient pas forcément le même code à chaque fois pour la même opération...

(sinon un petit ventilateur, deux sondes de t° - une en bas de la pièce, une en haut dans le piège à air chaud - et si la différence est > à un seuil avec un relai vous déclenchez le ventilateur --> comme ça pas de lien avec votre autre système, c'est autonome)

J'ai fait la demande de la notice de la télécommande du poêle pour bine m'assurer qu'elle fonctionne en IR et pas en radio. Le brasseur d'air est un Dyson tout ce qu'il y a de plus classique qui fonctionne en IR.
Effectivement la solution de me passer d'un signal de la télécommande du poêle pourrait simplifier la manip'.
En partant du même principe, je pourrais avoir une simple sonde en sortie de bouche d'air pulsé du poêle. Lorsque celle-ci dépasse une certaine T°, je déclenche le Dyson.
Il sera certainement plus simple de décoder la télécommande du Dyson :slight_smile:

Ce qui me renvoi à la même question que j'ai posé à Artouste à savoir quel matériel de base acheter.
J'ai donc la donnée du TSOP, la sonde de T° et une LED IR pour envoyer le signal une fois celui-ci décodé.
Me reste plus qu'à savoir quel type d'arduino prendre et je me lance !!

Un grand merci pour m'avoir déjà bien éclairé :slight_smile:

geantvert:
Il me faut donc acheter le TSOP en question. Que me conseilles-tu pour commencer comme kit arduino? Un kit complet? Quel type d'arduino? Je suis vraiment débutant du 1er jour :slight_smile:

J'ai fait la demande de la notice de la télécommande du poêle pour bine m'assurer qu'elle fonctionne en IR et pas en radio. Le brasseur d'air est un Dyson tout ce qu'il y a de plus classique qui fonctionne en IR.

Pour discriminer entre IR et radio c'est assez simple avec un APN ou autre telephone prenant des photos

tu positionne la telco devant l'objectif et tu regarde lorsque tu "joue avec" si tu vois la led s'illuminer (plus ou moins en, violet)

pour jouer part sur un uno c'est avec lui que tu trouvera le plus de ressources
il y a qq kits intéressant si vraiment tu pars de zero

si vous êtes pressé: (ce serait bcp moins cher mais plus long en chine)

  • le kit elegoo UNO sur amazon est de qualité correcte pour un prix raisonnable et de quoi faire pas mal de petits projets. bien sûr c'est plus cher que d'acheter que ce dont vous avez besoin en Chine sur eBay ou AliExpress

Dans le kit il y'a un module récepteur IR dans le lot (et une télécommande) mais pas d'émetteur IR sous forme de module. il y a aussi un relai et capteur de T° et d'humidité (un DHT11 pas terrible, un DHT22 serait mieux)

Vous êtes d'une grande aide :slight_smile:
Merci vraiment pour la rapidité et la précision de vos réponses.

Je vais donc passer commande et jouer un peu.

Je ne manquerai pas de vous tenir au courant des avancées.

Bonne journée !

sinon pour bien débuter avec l'arduino, un bon point de départ c'est de lire les tutos d'eskimon

ça vous permettra d'attaquer votre projet du bon pied.. commencer à lire en attendant de recevoir votre kit :slight_smile:

Parfait ! Merci J-M-L :slight_smile:
Je vais aussi essayer de ne pas me perdre dans la foule de composant hardware disponible :o

geantvert:
Parfait ! Merci J-M-L :slight_smile:
Je vais aussi essayer de ne pas me perdre dans la foule de composant hardware disponible :o

ils sont facile à reconnaitre et documentés :))

Si le brasseur ou le ventilateur peut être lancé à l'allumage, il suffit de le commander via un relais branché sur le secteur.

lesept:
Si le brasseur ou le ventilateur peut être lancé à l'allumage, il suffit de le commander via un relais branché sur le secteur.

Je n'avais pas vu cette réponse !
Le Dyson ne s'allume qu'au moyen de sa télécommande malheureusement.
Sinon je serais effectivement passé par un interrupteur :slight_smile:

Mais cela fait aussi office d'exercice poussé pour un débutant comme moi :wink:

J'ai bien reçu mon kit et ai eu le temps de lire pas mal de choses, notamment le blog d'Eskimon :wink:
J'ai commencé à me familiariser rapidement avec Arduino au moyen du grand nombre de bibliothèques dont nous disposons. C'est assez simple lorsqu'il s'agit... de choses simples :smiley:

Mon problème étant que... le protocole de la télécommande Dyson n'est bien sur pas reconnu par IRremote..
Je vais donc avoir besoin d'utiliser les données brutes.
Pour couronner le tout, un même bouton ne donne pas les même données brutes d'un coup à l'autre.

Bon, je n'ai pas encore reçu mon kit récepteur / émetteur IR (problème de livraison). Il me reste donc quand même à vérifier avec un nouveau récepteur et tenter d'émettre une des 2 liste de données brutes.
Je crains néanmoins que cela ne fonctionne pas.
Quelqu'un a-t-il déjà rencontré un problème similaire?
Je suis tombé sur cet article qui explique une marche à suivre.

Autrement j'ai commencé à coder.
En tant que parfait néophyte... je suis vraiment néophyte :slight_smile:
J'ai cependant réussi à m'organiser pour tirer à droite à gauche certaines méthodes pour lier deux composants.
Ce début de code vous semble-t-il valable?
Je me suis bien sur arrêté à la fonction d'envoi.

//www.elegoo.com
//2018.10.25

#include <SimpleDHT.h>

#include <dht_nonblocking.h>
#define DHT_SENSOR_TYPE DHT_TYPE_11

#include <IRLib.h>
IRsend Ma_Telecommande;

static const int DHT_SENSOR_PIN = 2;
DHT_nonblocking dht_sensor( DHT_SENSOR_PIN, DHT_SENSOR_TYPE );



/*
 * Initialize the serial port.
 */
void setup( )
{
  Serial.begin( 9600);
}



/*
 * Poll for a measurement, keeping the state machine alive.  Returns
 * true if a measurement is available.
 */
static bool measure_environment( float *temperature, float *humidity )
{
  static unsigned long measurement_timestamp = millis( );

  /* Measure once every four seconds. */
  if( millis( ) - measurement_timestamp > 6000ul )
  {
    if( dht_sensor.measure( temperature, humidity ) == true )
    {
      measurement_timestamp = millis( );
      return( true );
    }
  }

  return( false );
}

static bool AllumerLeDyson (float *temperature) {
  if (*temperature > 26.0)
  {
    // allumer le Dyson
    Serial.println("prout");
//    Ma_Telecommande.send(NEC,0x9FAA7414, 32);

  }

  
  return (true);
}

/*
 * Main program loop.
 */
void loop( )
{
  float temperature;
  float humidity;

  /* Measure temperature and humidity.  If the functions returns
     true, then a measurement is available. */
  if( measure_environment( &temperature, &humidity ) == true )
  {
    Serial.print( "T = " );
    Serial.print( temperature, 1 );
    Serial.print( " deg. C, H = " );
    Serial.print( humidity, 1 );
    Serial.println( "%" );

    AllumerLeDyson (&temperature);
  }
}

Merci de votre lecture :slight_smile:

Bonjour à tous,

j'avance pas à pas dans mon projet.
Tout est en place excepté la partie télécommande.

Je fais mes tests avec une télécommande de TV dont j'ai le protocole et le raw data.
Mon IRsend fonctionne parfaitement avec le protocole, cela m'a même permis de voir que ma LED avait une portée d'environ 6m ce qui est vraiment bien.

Pa=r contre je bloque totalement sur le IRsendRaw.
J'ai beau définir le bon delay et la bonne série de flash, rien n'y fait. Et ma LED témoin sur mon module émetteur m'indique vraiment une série différente de mon IRsend avec protocole.

Voici ce que j'obtiens avec le Dump lorsque j'appuie deux fois de suite sur le bouton on/off:

Encoding  : RC6
Code      : 1000C (20 bits)
Timing[39]: 
     +2650, - 850     + 400, - 900     + 450, - 450     + 400, - 450
     +1300, -1350     + 400, - 450     + 450, - 450     + 450, - 450
     + 400, - 450     + 450, - 450     + 450, - 450     + 400, - 450
     + 450, - 450     + 450, - 450     + 400, - 450     + 450, - 450
     + 850, - 450     + 450, - 900     + 400, - 450     + 450
unsigned int  rawData[39] = {2650,850, 400,900, 450,450, 400,450, 1300,1350, 400,450, 450,450, 450,450, 400,450, 450,450, 450,450, 400,450, 450,450, 450,450, 400,450, 450,450, 850,450, 450,900, 400,450, 450};  // RC6 1000C
unsigned int  data = 0x1000C;

Encoding  : RC6
Code      : C (20 bits)
Timing[41]: 
     +2700, - 800     + 450, - 900     + 400, - 450     + 450, - 450
     + 450, - 850     + 900, - 450     + 450, - 400     + 450, - 450
     + 450, - 450     + 400, - 450     + 450, - 450     + 450, - 450
     + 400, - 450     + 450, - 450     + 450, - 450     + 400, - 450
     + 450, - 450     + 850, - 450     + 450, - 900     + 400, - 450
     + 450
unsigned int  rawData[41] = {2700,800, 450,900, 400,450, 450,450, 450,850, 900,450, 450,400, 450,450, 450,450, 400,450, 450,450, 450,450, 400,450, 450,450, 450,450, 400,450, 450,450, 850,450, 450,900, 400,450, 450};  // RC6 C
unsigned int  data = 0xC;

J'en déduis que j'ai une donnée pour le on et une pour le off.
Pourtant le protocole seul 1000C suffit à allumer ET éteindre la TV.
J'ai du mal à comprendre à quoi correspond la deuxième salve.

J'utilise donc les raw data de la première salve de cette manière:

#include <IRremote.h>

IRsend irsend;

void setup()
{
  Serial.begin(9600);
}

void loop() {
  int khz = 38; 
  unsigned int irSignal[] = {2650,850, 400,900, 450,450, 400,450, 1300,1350, 400,450, 450,450, 450,450, 400,450, 450,450, 450,450, 400,450, 450,450, 450,450, 400,450, 450,450, 850,450, 450,900, 400,450, 450}; 
  
  irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz); 
  delay(39); 
{
  delay(5000); 
}

}

Et rien n'y fait... J'ai pas mal écumé le web sur des sendraw sans trouver le même code...

Merci de votre aide si vous le pouvez :slight_smile:

Bon j'ai fini par trouver la solution, un code plus concis et de bien respecter la fréquence.
Ce qui donne tout simplement:

unsigned int  rawData[33] = {2200,850, 750,1600, 700,850, 700,800, 750,1600, 750,800, 750,750, 750,850, 700,850, 750,850, 700,850, 700,850, 700,850, 750,800, 700,850, 700,800, 750};

static void SendRawDataON_OFF (int rawNbr, int freq) {
  for (int i = 0; i < 3; i++) {
    irsend.sendRaw(rawData,rawNbr,freq);
    delay(40);
  }
}

Et ça fonctionne très bien, le Dyson réagit au poil !

J'ai donc finalisé mon code complet pour lier température de l'air qui sort de la bouche de sortie et activation ou nom du Dyson ainsi que sa rotation.
Comme le Dyson ne communique pas son état, il faut espérer que l'émetteur IR ne déconne pas de temps en temps, sinon il va tout inverser.
La solution réside dans un nouveau capteur de type anémomètre qui permettra de bien vérifier l'état du Dyson. C'est la suite.

Je mets donc à la suite mon code complet pour qui rencontrerait un projet similaire et chercherait des réponses.

#include <SimpleDHT.h>

#include <dht_nonblocking.h>
#define DHT_SENSOR_TYPE DHT_TYPE_11

#include <IRremote.h>

static const int DHT_SENSOR_PIN = 2;
DHT_nonblocking dht_sensor( DHT_SENSOR_PIN, DHT_SENSOR_TYPE );

//Emetteur IR On/Off
IRsend irsend;
unsigned int  rawData[33] = {2200,850, 750,1600, 700,850, 700,800, 750,1600, 750,800, 750,750, 750,850, 700,850, 750,850, 700,850, 700,850, 700,850, 750,800, 700,850, 700,800, 750};
bool interrupteur; ///< stock l'etat allumé eteint du dyson

//Emetteur IR Turn
unsigned int  rawDataTurn[34] = {2250,800, 800,1550, 750,800, 750,800, 800,1500, 800,750, 800,750, 750,800, 750,1600, 750,800, 750,1550, 800,750, 800,1500, 800,750, 800,750, 800,1500, 750};
bool BouttonTurn; ///< stock l'etat allumé eteint de la fonction turn du dyson

/*
 * Initialize the serial port et l'état par défaut de l'interrupteur et du boutton turn du dyson
 */
void setup( )
{
  Serial.begin( 9600);
  interrupteur = false;
  BouttonTurn = false;
}



// Renvoi true si une mesure est disponible


 //fonction temperature-humidité
static bool measure_environment( float *temperature, float *humidity )
{
  static unsigned long measurement_timestamp = millis( );

  // Mesure toutes les 12 secondes
  if( millis( ) - measurement_timestamp > 12000ul )
  {
    if( dht_sensor.measure( temperature, humidity ) == true )
    {
      measurement_timestamp = millis( );
      return( true );
    }
  }

  return( false );
}

//fonction check temperature, renvoi vrai si la temperature > 28°
static bool CheckTemperature (float *temperature) {
  if (*temperature > 20.0)
  {
    // Donne la temperature
    Serial.print( *temperature );
    Serial.println(" T°>28 ");
    return (true);
  }
  return (false);
}

      //fonction emmeteur IR ON/OFF
static void SendRawDataON_OFF (int rawNbr, int freq) {
  for (int i = 0; i < 3; i++) {
    irsend.sendRaw(rawData,rawNbr,freq);
    delay(40);
  }
}

      //fonction emmeteur IR turn
static void SendRawDataTurn (int rawNbr, int freq) {
  for (int i = 0; i < 3; i++) {
    irsend.sendRaw(rawDataTurn,rawNbr,freq);
    delay(40);
  }
}
 


void loop( )
{
  float temperature;
  float humidity;

  /* Measure temperature and humidity.  If the functions returns
     true, then a measurement is available. */
  if( measure_environment( &temperature, &humidity ) == true )
  {
    Serial.print( "T = " );
    Serial.print( temperature, 1 );
    Serial.print( " deg. C, H = " );
    Serial.print( humidity, 1 );
    Serial.println( "%" );

    if ( CheckTemperature( &temperature ) && (interrupteur == false) )
    {                 
        SendRawDataON_OFF (33,38);
        interrupteur = true;
        Serial.println( "ON_envoyé" );
        Serial.println( "interrupteur_ON" );                 
    }

    if ( !CheckTemperature( &temperature ) && (interrupteur == true) )
    {                 
        SendRawDataON_OFF (33,38);
        interrupteur = false;  
        Serial.println( "OFF_envoyé" );
        Serial.println( "interrupteur_OFF" );               
    }

     if ( ( interrupteur == true ) && ( BouttonTurn == false ) )
    {                 
        delay(4000); //délai d'attente entre l'allumage du dyson et le lancement de la fonction turn
        SendRawDataTurn (34,38); 
        BouttonTurn = true;
        Serial.println( "Turn_envoyé" );
        Serial.println( "BouttonTurn_ON" );                
    }

    if (interrupteur == false) 
    {                 
        BouttonTurn = false;
        Serial.println( "BouttonTurn_OFF" );                
    }
    
  }
}

Merci de votre aide et de votre absence d'aide de temps en temps, qui m'a permis de réfléchir un peu plus loin que je ne le pensais :slight_smile:

A bientôt !

Super !

merci pour ton retour d'informations :slight_smile: