Capteur température et luminosité pour réfrigérateur

Capteur température et luminosité pour réfrigérateur

Voici une version améliorée du capteur de température et d’humidité pour être utilisée dans un réfrigérateur pour détecter une baisse anormale de température ou bien si la porte restée ouverte.

Pour la partie température on garde le Htu21d. Pour mesurer la luminosité (et ainsi détecter que la porte est restée ouverte) on va prendre un module avec un phototransistor TEMT6000. Un buzzer piezzo permet d’avertir lorsqu’une alerte est détectée.

Le circuit

 

Le programme

 

Pour vérifier la luminosité dans le réfrigérateur, l’ADC mesure périodiquement  la tension aux bornes de la résistance de 10k qui est en série avec le TEMT6000. Avec une référence  de tension de 1.1v on peut mesurer jusqu’à environ 200 lux (100µA que le phototransistor laisse passer). A chaque réveil de l’atmega après un cycle de 8s de veille, on effectue une mesure. Au bout d’un certain nombre de mesures où le capteur n’est pas dans l’obscurité, le buzzer sonne et un message radio est envoyé. Le compteur est remis à zéro dès qu’une mesure est faite dans l’obscurité.

De la même manière que le capteur de température seul, toutes les 5min, les valeurs de température et humidité sont envoyées par radio. La tension de la pile est envoyée toutes les 12h.

 

#include <LowPower.h>
#include <nRF24L01.h>
#include <printf.h>
#include <RF24.h>
#include <RF24_config.h>
#include <Wire.h>
#include <stdint.h>
#include "SparkFunHTU21D.h"

#define DEBUG     1

#define SLEEP_A   25    //5min
#define SLEEP_B   5400  //12h
#define VT_PIN    14    //A0
#define RF24_ON   6
#define LED_PIN   5
#define BUZ_PIN   15
#define BUZ_PIN   17

uint8_t   node_address[5]         = {"1Node"};
uint8_t   server_address[5]       = {"2Node"};

HTU21D    htu21d;
RF24      radio(9,10);
uint8_t   plainRadioBuffer[32]    = {0};

uint16_t  cntA = SLEEP_A;
uint16_t  cntB = SLEEP_B;

uint16_t  openDoorCount = 0;

void setup_radio(){
  radio.begin();
  radio.setChannel(1);
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_MAX);
  radio.setCRCLength(RF24_CRC_16);
  radio.setRetries(3, 15);  
  radio.setAutoAck(1);
  radio.openReadingPipe(1, node_address);
  radio.openWritingPipe(server_address);

#if DEBUG==1
  radio.printDetails();
#endif  
}

void setup() {
#if DEBUG==1
  Serial.begin(9600);
  Serial.println(F("Setup")); 
#endif
  analogReference(INTERNAL);
  htu21d.begin();
  pinMode(RF24_ON, OUTPUT);
  digitalWrite(RF24_ON, HIGH);
}

void loop() {

  if(cntA == SLEEP_A || cntB == SLEEP_B){
    //power on radio
    digitalWrite(RF24_ON, LOW);
    delay(100);
    setup_radio();
    
    if(cntA == SLEEP_A){
      float humd = htu21d.readHumidity();
      float temp = htu21d.readTemperature();

#if DEBUG==1
      Serial.print(F("Measures : "));
	  Serial.print(temp);
      Serial.print(F("°C - "));  
      Serial.print(humd);
      Serial.println(F("%"));    
#endif        
      
      memcpy(plainRadioBuffer,   "DATA",       4);
    
      memcpy(plainRadioBuffer+4,   &temp,      4);
      memcpy(plainRadioBuffer+8,   &humd,      4);

      radio.write(plainRadioBuffer, 32);   
      cntA = 0;
    }

    if(cntB == SLEEP_B){
      float voltage = analogRead(VT_PIN);
      voltage = voltage * 1.1 * ((1670000.0)/470000.0) / 1024.0;   
      
      memcpy(plainRadioBuffer,   "VOLT",       4);    
      memcpy(plainRadioBuffer+4,   &voltage,   4);      

      radio.write(plainRadioBuffer, 32);   
      cntB = 0;
    }   

    //power down radio
    digitalWrite(RF24_ON, HIGH);
  }
  ++cntA;
  ++cntB;
  
  //check if door is opened
  u16   light = analogRead(17);
  if(light > 15){
    openDoorCount++;
    if(openDoorCount >= 7){
      openDoorAlert();
      delay(500);
    }
  }
  else{    
    openDoorCount = 0;
  }

  //flash led
  digitalWrite(LED_PIN, HIGH);
  delay(50);
  digitalWrite(LED_PIN, LOW);

#if DEBUG==1
  Serial.println(F("Sleep for 8 seconds")); 
#endif
  LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
}

void openDoorAlert(){
  tone(BUZ_PIN, 3000, 450);

  //send message
  //power on radio
  digitalWrite(RF24_ON, LOW);
  delay(100);
  setup_radio();  
    
  memcpy(plainRadioBuffer,   "FDOP",       4);
  memset(plainRadioBuffer+4,   0,          28); 

  radio.write(plainRadioBuffer, 32);

  //power down radio
  radio.powerDown();
  digitalWrite(RF24_ON, HIGH);    
}

 

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *