Quotidien Shaarli

Tous les liens d'un jour sur une page.

January 11, 2020

?eN_FWg

/**

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