Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Code pour construction d'un thermostat "maison", recois un signal qui indique presence/absence
- * et ouvre ou ferme un relais de chauffage
- *
- * blabla licence et tout do what the fuck you want...
- * Fréquence : 433.92 mhz
- * Protocole : home easy
- * Licence : CC -by -sa
- * Matériel associé : Atmega 328 (+résonateur associé) + récepteur RF AM 433.92 mhz + relais + led d'etat
- * Auteur : Valentin CARRUESCO aka idleman (idleman@idleman.fr - http://blog.idleman.fr)
- *
- * Basé sur le travail de :
- * Barnaby Gray 12/2008
- * Peter Mead 09/2009
- */
- #include <EEPROM.h>
- #include "EEPROMAnything.h"
- #include <OneWire.h>
- //REGLAGE!
- temppresence = 20;
- tempabsence = 15;
- int recepteurPin = 9; // antenne rf 433
- int relaiPin = 10; // broche du relais
- int ledPin = 11; // broche de la led
- const int broche_OneWire=2; // broche de la sonde ds18b20
- boolean chauffage = 0;
- boolean presence = 0;
- int tempvoulu = 20;
- const int modeLecture=0xBE;
- const int lancerMesure=0x44;
- byte data[12];
- byte adresse[8];
- float ma_tempetf=0.0;
- OneWire capteur(broche_OneWire);
- struct config_t
- {
- long sender;
- int receptor;
- } signal;
- struct signal_t
- {
- long sender;
- int receptor;
- boolean isSignal;
- boolean state;
- } receivedSignal;
- void setup()
- { pinMode(recepteurPin, INPUT);
- pinMode(relaiPin, OUTPUT);
- pinMode(ledPin, OUTPUT);
- Serial.begin(9600);
- Serial.println("start");
- digitalWrite(ledPin,HIGH);
- capteurInit();
- }
- void loop()
- {
- //Ecoute des signaux
- listenSignal();
- //Si un signal au protocol home easy est reçu...
- if(receivedSignal.isSignal){
- //Récuperation du signal de référence en mémoire interne
- EEPROM_readAnything(0, signal);
- //Si aucun signal de référence, le premier signal reçu servira de reference en mémoire interne
- if(signal.sender <0){
- EEPROM_writeAnything(0, receivedSignal);
- Serial.println("Aucun signal de référence dans la mémoire interne, enregistrement du signal reçu comme signal de réference");
- EEPROM_readAnything(0, signal);
- }
- //Comparaison signal de référence, signal reçu
- if (receivedSignal.sender==signal.sender && receivedSignal.receptor==signal.receptor){
- Serial.println("Signal correspondant");
- //On change de mode presence/absence en fonction
- if(receivedSignal.state)
- {
- Serial.println("Presence humaine, mode confort");
- presence = 1;
- }
- else
- {
- Serial.println("Personne ici, mode eco");
- presence = 0
- }
- //La led clignotte 10 fois rapidemment pour signaler que le signal est le bon
- blinkLed(10,20);
- }else{
- Serial.println("Signal inconnu");
- //La led clignotte 1 fois lentement pour signaler que le signal est mauvais mais que le protocol est le bon
- blinkLed(1,200);
- }
- }
- capteurMesureTemp();
- if (presence = 1){
- tempvoulu = temppresence;
- }
- else if (presence = 0){
- tempvoulu = tempabsence;
- }
- if (chauffage = 1){
- digitalWrite(relaiPin,HIGH);
- }
- else if (chauffage = 0){
- digitalWrite(relaiPin,LOW);
- }
- }
- void capteurInit(void) // detection du capteur
- {
- Serial.println("**** Detection du capteur **** ");
- while (capteur.search(adresse)== false)
- Serial.println("Aucun capteur 1-wire present sur la broche ! ");
- delay (1000);
- }
- Serial.print ("1 capteur 1-wire present avec code adresse 64 bits : ");
- for(int i = 0; i < 8; i++) {
- if (adresse[i]<16) Serial.print('0');
- Serial.print(adresse[i], HEX);
- Serial.print(" ");
- }
- Serial.println();
- if (adresse[0]==0x28)
- {
- Serial.println ("Type du capteur present : Capteur temperature DS18B20.");
- }
- else
- {
- Serial.println ("Le capteur present n'est pas un capteur de temperature DS18B20.");
- }
- if (capteur.crc8( adresse, 7) == adresse[7]) // vérification validité code CRC de l'adresse 64 bits
- {
- Serial.println ("Verification du code CRC de l'adresse 64 bits de ce capteur : VALIDE !");
- }
- else
- {
- Serial.println ("Verification du code CRC de l'adresse 64 bits de ce capteur : NON VALIDE !");
- }
- Serial.println("----- fin de la recherche du capteur ----");
- Serial.println("");
- }
- float capteurMesureTemp(void) { //mesure de la temperature
- int tempet=0;
- float tempetf=0.0;
- capteur.reset();
- capteur.select(adresse);
- capteur.write(lancerMesure,1);
- delay(1000);
- capteur.reset();
- capteur.select(adresse);
- capteur.write(modeLecture,1);
- for ( int i = 0; i < 9; i++) {
- data[i] = capteur.read();
- }
- data[1]=data[1] & B10000111;
- tempet=data[1];
- tempet=tempet<<8;
- tempet=tempet+data[0];
- tempetf=float(tempet)*6.25;
- tempetf=tempetf/100.0;
- return (tempetf);
- if (tempetf<(tempvoulu -1))
- chauffage = 1; //si la température est inférieure à l'objectif -1
- if (tempetf>(tempvoulu +1))
- chauffage = 0; //si la température est supérieure à l'objectif +1
- }
- void blinkLed(int repeat,int time){
- for(int i =0;i<repeat;i++){
- digitalWrite(ledPin,LOW);
- delay(time);
- digitalWrite(ledPin,HIGH);
- delay(time);
- }
- }
- void listenSignal(){
- receivedSignal.sender = 0;
- receivedSignal.receptor = 0;
- receivedSignal.isSignal = false;
- int i = 0;
- unsigned long t = 0;
- byte prevBit = 0;
- byte bit = 0;
- unsigned long sender = 0;
- bool group = false;
- bool on = false;
- unsigned int recipient = 0;
- // latch 1
- while((t < 9200 || t > 11350))
- { t = pulseIn(recepteurPin, LOW, 1000000);
- }
- Serial.println("latch 1");
- // latch 2
- while(t < 2550 || t > 2800)
- { t = pulseIn(recepteurPin, LOW, 1000000);
- }
- Serial.println("latch 2");
- // data
- while(i < 64)
- {
- t = pulseIn(recepteurPin, LOW, 1000000);
- if(t > 200 && t < 365)
- { bit = 0;
- }
- else if(t > 1000 && t < 1400)
- { bit = 1;
- }
- else
- { i = 0;
- break;
- Serial.println("bit mort"+t);
- }
- if(i % 2 == 1)
- {
- if((prevBit ^ bit) == 0)
- { // must be either 01 or 10, cannot be 00 or 11
- i = 0;
- break;
- }
- if(i < 53)
- { // first 26 data bits
- sender <<= 1;
- sender |= prevBit;
- }
- else if(i == 53)
- { // 26th data bit
- group = prevBit;
- }
- else if(i == 55)
- { // 27th data bit
- on = prevBit;
- }
- else
- { // last 4 data bits
- recipient <<= 1;
- recipient |= prevBit;
- }
- }
- prevBit = bit;
- ++i;
- }
- // interpret message
- if(i > 0)
- {
- receivedSignal.sender = sender;
- receivedSignal.receptor = recipient;
- receivedSignal.isSignal = true;
- if(on)
- {
- receivedSignal.state = true;
- }else{
- receivedSignal.state = false;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement