Advertisement
Guest User

Chauffage

a guest
Jun 21st, 2014
381
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.75 KB | None | 0 0
  1.  
  2.     /*
  3.      * Code pour construction d'un thermostat "maison", recois un signal qui indique presence/absence
  4.      * et ouvre ou ferme un relais de chauffage
  5.      *
  6.      * blabla licence et tout do what the fuck you want...
  7.      * Fréquence : 433.92 mhz
  8.      * Protocole : home easy
  9.      * Licence : CC -by -sa
  10.      * Matériel associé : Atmega 328 (+résonateur associé) + récepteur RF AM 433.92 mhz + relais + led d'etat
  11.      * Auteur : Valentin CARRUESCO  aka idleman (idleman@idleman.fr - http://blog.idleman.fr)
  12.      *
  13.      * Basé sur le travail de :
  14.      * Barnaby Gray 12/2008
  15.      * Peter Mead   09/2009
  16.      */
  17.      
  18.      #include <EEPROM.h>
  19.      #include "EEPROMAnything.h"
  20.      #include <OneWire.h>
  21.      
  22.     //REGLAGE!
  23.     temppresence = 20;
  24.     tempabsence = 15;
  25.      
  26.      
  27.      
  28.     int recepteurPin = 9; // antenne rf 433
  29.     int relaiPin = 10; // broche du relais
  30.     int ledPin = 11; // broche de la led
  31.     const int broche_OneWire=2; // broche de la sonde ds18b20
  32.      
  33.     boolean chauffage = 0;
  34.     boolean presence = 0;
  35.     int tempvoulu = 20;
  36.      
  37.     const int modeLecture=0xBE;
  38.     const int lancerMesure=0x44;
  39.      
  40.     byte data[12];
  41.     byte adresse[8];
  42.      
  43.     float ma_tempetf=0.0;
  44.      
  45.     OneWire  capteur(broche_OneWire);
  46.      
  47.     struct config_t
  48.     {
  49.       long sender;
  50.       int receptor;
  51.     } signal;
  52.      
  53.     struct signal_t
  54.     {
  55.       long sender;
  56.       int receptor;
  57.       boolean isSignal;
  58.       boolean state;
  59.     } receivedSignal;
  60.      
  61.      
  62.     void setup()
  63.     { pinMode(recepteurPin, INPUT);
  64.             pinMode(relaiPin, OUTPUT);
  65.             pinMode(ledPin, OUTPUT);
  66.       Serial.begin(9600);
  67.             Serial.println("start");
  68.             digitalWrite(ledPin,HIGH);
  69.       capteurInit();      
  70.     }
  71.      
  72.      
  73.     void loop()
  74.     {
  75.      
  76.            //Ecoute des signaux
  77.            listenSignal();
  78.            
  79.            //Si un signal au protocol home easy est reçu...
  80.            if(receivedSignal.isSignal){
  81.                
  82.                //Récuperation du signal de référence en mémoire interne
  83.                EEPROM_readAnything(0, signal);
  84.              
  85.                //Si aucun signal de référence, le premier signal reçu servira de reference en mémoire interne
  86.                if(signal.sender <0){
  87.                   EEPROM_writeAnything(0, receivedSignal);
  88.                   Serial.println("Aucun signal de référence dans la mémoire interne, enregistrement du signal reçu comme signal de réference");
  89.                   EEPROM_readAnything(0, signal);
  90.                }
  91.      
  92.                //Comparaison signal de référence, signal reçu
  93.                if (receivedSignal.sender==signal.sender && receivedSignal.receptor==signal.receptor){
  94.                          Serial.println("Signal correspondant");
  95.                          
  96.                         //On change de mode presence/absence en fonction
  97.                         if(receivedSignal.state)
  98.                       {
  99.                             Serial.println("Presence humaine, mode confort");
  100.                             presence = 1;
  101.                       }
  102.                       else
  103.                       {
  104.                             Serial.println("Personne ici, mode eco");
  105.                             presence = 0
  106.      
  107.                       }
  108.                       //La led clignotte 10 fois rapidemment pour signaler que le signal est le bon
  109.                       blinkLed(10,20);
  110.                }else{
  111.                   Serial.println("Signal inconnu");
  112.                   //La led clignotte 1 fois lentement  pour signaler que le signal est mauvais mais que le protocol est le bon
  113.                   blinkLed(1,200);
  114.                }
  115.            }
  116.          
  117.     capteurMesureTemp();
  118.      
  119.     if (presence = 1){
  120.     tempvoulu = temppresence;
  121.     }
  122.     else if (presence = 0){
  123.     tempvoulu = tempabsence;
  124.     }
  125.      
  126.     if (chauffage = 1){
  127.     digitalWrite(relaiPin,HIGH);
  128.     }
  129.     else if (chauffage = 0){
  130.     digitalWrite(relaiPin,LOW);
  131.     }
  132.      
  133.      
  134.     }
  135.      
  136.     void capteurInit(void) // detection du capteur
  137.     {
  138.      
  139.     Serial.println("**** Detection du capteur **** ");
  140.      
  141.     while (capteur.search(adresse)== false)
  142.      
  143.       Serial.println("Aucun capteur 1-wire present sur la broche ! ");
  144.       delay (1000);
  145.     }
  146.      
  147.       Serial.print ("1 capteur 1-wire present avec code adresse 64 bits : ");
  148.        for(int i = 0; i < 8; i++) {
  149.      
  150.         if (adresse[i]<16) Serial.print('0');
  151.         Serial.print(adresse[i], HEX);
  152.         Serial.print(" ");
  153.       }
  154.      
  155.       Serial.println();
  156.       if (adresse[0]==0x28)
  157.       {
  158.         Serial.println ("Type du capteur present : Capteur temperature DS18B20.");
  159.       }
  160.       else
  161.       {
  162.         Serial.println ("Le capteur present n'est pas un capteur de temperature DS18B20.");
  163.       }
  164.       if (capteur.crc8( adresse, 7) == adresse[7]) // vérification validité code CRC de l'adresse 64 bits
  165.       {
  166.         Serial.println ("Verification du code CRC de l'adresse 64 bits de ce capteur : VALIDE !");
  167.       }
  168.       else
  169.       {
  170.         Serial.println ("Verification du code CRC de l'adresse 64 bits de ce capteur : NON VALIDE !");    
  171.       }
  172.       Serial.println("----- fin de la recherche du capteur ----");
  173.       Serial.println("");  
  174.     }
  175.      
  176.      
  177.     float capteurMesureTemp(void) { //mesure de la temperature
  178.       int tempet=0;
  179.       float tempetf=0.0;
  180.       capteur.reset();
  181.       capteur.select(adresse);
  182.       capteur.write(lancerMesure,1);
  183.       delay(1000);
  184.       capteur.reset();
  185.       capteur.select(adresse);
  186.       capteur.write(modeLecture,1);
  187.     for ( int i = 0; i < 9; i++) {
  188.         data[i] = capteur.read();
  189.       }
  190.      
  191.     data[1]=data[1] & B10000111;
  192.     tempet=data[1];
  193.     tempet=tempet<<8;
  194.     tempet=tempet+data[0];
  195.     tempetf=float(tempet)*6.25;
  196.     tempetf=tempetf/100.0;
  197.     return (tempetf);
  198.     if (tempetf<(tempvoulu -1))  
  199.       chauffage = 1; //si la température est inférieure à l'objectif -1
  200.     if (tempetf>(tempvoulu +1))
  201.       chauffage = 0; //si la température est supérieure à l'objectif +1
  202.     }
  203.      
  204.     void blinkLed(int repeat,int time){
  205.      for(int i =0;i<repeat;i++){
  206.               digitalWrite(ledPin,LOW);
  207.               delay(time);
  208.               digitalWrite(ledPin,HIGH);
  209.               delay(time);
  210.       }
  211.     }
  212.      
  213.      
  214.     void listenSignal(){
  215.             receivedSignal.sender = 0;
  216.             receivedSignal.receptor = 0;
  217.             receivedSignal.isSignal = false;
  218.                
  219.             int i = 0;
  220.       unsigned long t = 0;
  221.      
  222.       byte prevBit = 0;
  223.       byte bit = 0;
  224.      
  225.       unsigned long sender = 0;
  226.       bool group = false;
  227.       bool on = false;
  228.       unsigned int recipient = 0;
  229.      
  230.       // latch 1
  231.       while((t < 9200 || t > 11350))
  232.       { t = pulseIn(recepteurPin, LOW, 1000000);  
  233.       }
  234.             Serial.println("latch 1");
  235.          
  236.       // latch 2
  237.       while(t < 2550 || t > 2800)
  238.       { t = pulseIn(recepteurPin, LOW, 1000000);
  239.       }
  240.      
  241.             Serial.println("latch 2");
  242.      
  243.       // data
  244.       while(i < 64)
  245.       {
  246.         t = pulseIn(recepteurPin, LOW, 1000000);
  247.                      
  248.         if(t > 200 && t < 365)
  249.         { bit = 0;
  250.                        
  251.         }
  252.         else if(t > 1000 && t < 1400)
  253.         { bit = 1;
  254.                          
  255.         }
  256.         else
  257.         { i = 0;
  258.           break;
  259.                       Serial.println("bit mort"+t);
  260.         }
  261.      
  262.         if(i % 2 == 1)
  263.         {
  264.           if((prevBit ^ bit) == 0)
  265.           { // must be either 01 or 10, cannot be 00 or 11
  266.             i = 0;
  267.             break;
  268.           }
  269.      
  270.           if(i < 53)
  271.           { // first 26 data bits
  272.             sender <<= 1;
  273.             sender |= prevBit;
  274.           }
  275.           else if(i == 53)
  276.           { // 26th data bit
  277.             group = prevBit;
  278.           }
  279.           else if(i == 55)
  280.           { // 27th data bit
  281.             on = prevBit;
  282.           }
  283.           else
  284.           { // last 4 data bits
  285.             recipient <<= 1;
  286.             recipient |= prevBit;
  287.           }
  288.         }
  289.      
  290.         prevBit = bit;
  291.         ++i;
  292.       }
  293.      
  294.            
  295.       // interpret message
  296.       if(i > 0)
  297.       {
  298.                 receivedSignal.sender = sender;
  299.                 receivedSignal.receptor = recipient;
  300.                 receivedSignal.isSignal = true;
  301.                 if(on)
  302.               {
  303.                  receivedSignal.state = true;
  304.                 }else{
  305.                   receivedSignal.state = false;
  306.                 }
  307.       }
  308.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement