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);
}