10 liens privés
/**
- Exemple de code pour la bibliothèque VirtualWire – Client d'envoi de variable
*/
#include <VirtualWire.h>
#include <OneWire.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
const byte BROCHE_ONEWIRE = 8;
OneWire ds(BROCHE_ONEWIRE);
unsigned long counter = 0;
enum DS18B20_RCODES {
READ_OK, // Lecture ok
NO_SENSOR_FOUND, // Pas de capteur
INVALID_ADDRESS, // Adresse reçue invalide
INVALID_SENSOR // Capteur invalide (pas un DS18B20)
};
// watchdog interrupt
ISR (WDT_vect)
{
wdt_disable(); // disable watchdog
} // end of WDT_vect
void setup() {
delay(2000);//le temps des tests
Serial.begin(9600);
// Initialisation de la bibliothèque VirtualWire
// Vous pouvez changez les broches RX/TX/PTT avant vw_setup() si nécessaire
vw_setup(2000);
Serial.println("Go !");
float valeur = 99.99;
vw_send((byte *) &valeur, sizeof(valeur)); // On envoie le message
vw_wait_tx(); // On attend la fin de l'envoi
}
void loop() {
counter ++;
if(counter >= 10){
counter = 0;
// Lit un nombre depuis le port série
float valeur;
if (getTemperature(&valeur, true) != READ_OK) {
Serial.println(F("Erreur de lecture du capteur"));
return;
}
Serial.println(valeur);
vw_send((byte *) &valeur, sizeof(valeur)); // On envoie le message
vw_wait_tx(); // On attend la fin de l'envoi
}
// disable ADC
ADCSRA = 0;
// clear various "reset" flags
MCUSR = 0;
// allow changes, disable reset
WDTCSR = bit (WDCE) | bit (WDE);
// set interrupt mode and an interval
WDTCSR = bit (WDIE) | bit (WDP3) | bit (WDP0); // set WDIE, and 8 seconds delay
wdt_reset(); // pat the dog
set_sleep_mode (SLEEP_MODE_PWR_DOWN);
noInterrupts (); // timed sequence follows
sleep_enable();
// turn off brown-out enable in software
MCUCR = bit (BODS) | bit (BODSE);
MCUCR = bit (BODS);
interrupts (); // guarantees next instruction executed
sleep_cpu ();
// cancel sleep as a precaution
sleep_disable();
}
/**
-
Fonction de lecture de la température via un capteur DS18B20.
/
byte getTemperature(float temperature, byte reset_search) {
byte data[9], addr[8];
// data[] : Données lues depuis le scratchpad
// addr[] : Adresse du module 1-Wire détecté/ Reset le bus 1-Wire ci nécessaire (requis pour la lecture du premier capteur) /
if (reset_search) {
ds.reset_search();
}/ Recherche le prochain capteur 1-Wire disponible /
if (!ds.search(addr)) {
// Pas de capteur
return NO_SENSOR_FOUND;
}/ Vérifie que l'adresse a été correctement reçue /
if (OneWire::crc8(addr, 7) != addr[7]) {
// Adresse invalide
return INVALID_ADDRESS;
}/ Vérifie qu'il s'agit bien d'un DS18B20 /
if (addr[0] != 0x28) {
// Mauvais type de capteur
return INVALID_SENSOR;
}/ Reset le bus 1-Wire et sélectionne le capteur /
ds.reset();
ds.select(addr);/ Lance une prise de mesure de température et attend la fin de la mesure /
ds.write(0x44, 1);
delay(800);/ Reset le bus 1-Wire, sélectionne le capteur et envoie une demande de lecture du scratchpad /
ds.reset();
ds.select(addr);
ds.write(0xBE);/ Lecture du scratchpad /
for (byte i = 0; i < 9; i++) {
data[i] = ds.read();
}/ Calcul de la température en degré Celsius /
temperature = (int16_t) ((data[1] << 8) | data[0]) 0.0625;// Pas d'erreur
return READ_OK;
}