1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
|
#include <nRF24L01.h>
#include <RF24.h>
#include <RF24_config.h>
#include <DHT.h>
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include "LowPower.h"
// DHT22
#define DHTPIN 3 // DHT22 PIN
#define DHTTYPE DHT22 // DHT 22
DHT dht(DHTPIN, DHTTYPE); // Initialize DHT sensor for 16mhz
//DHT22 Variables
int chk;
float dht22_hum; //Stores humidity value
float dht22_temp; //Stores temperature value
//VBat
const float VccMin = 3.2; // Niveau minimum attendu de Vcc, en Volts.
const float VccMax = 4.2; // Niveau maximum attendu de Vcc, en Volts.
const float VccCorrection = 0.99; // Vcc mesuré par le multimètre divisé par le Vcc rapporté
const float VccEchelle = VccMax - VccMin; // Vcc mesuré par le multimètre divisé par le Vcc rapporté
const byte BROCHE_CAPTEUR_VIN = A0;
const float COEFF_PONT_DIVISEUR_VIN = 4.0;
float bat_value;
//NRF24L01
const int pinCE = 8;
const int pinCSN = 7;
RF24 radio(pinCE, pinCSN);
byte addresses[][6] = {"0"};
const uint64_t pipe = 0xE8E8F0F0E1LL;
struct package
{
float temperature ;
float humidity;
float bat;
};
typedef struct package Package;
Package data;
/// SETUP ////////////////////////////////////
void setup()
{
Serial.begin(9600);
radio.begin();
radio.setChannel(115);
radio.setPALevel(RF24_PA_MAX);
radio.setDataRate( RF24_250KBPS ) ;
radio.openWritingPipe( addresses[0]);
delay(1000);
dht.begin();
}
/// LOOP /////////////////////////////////////
void loop()
{
dht22_hum = dht.readHumidity();
dht22_temp = dht.readTemperature();
Serial.print("--- Veranda ---\n");
Serial.print("Temperature = ");
Serial.print(dht22_temp);
Serial.println(" ºC");
Serial.print("Humidity = ");
Serial.print(dht22_hum);
Serial.println(" %");
Serial.print("Bat = ");
Serial.print(bat_value);
Serial.println(" %");
Serial.print("--------------------------------\n\n");
delay(1000);
readSensor();
do_vcc();
radio.write(&data, sizeof(data));
////// avant de dormir
byte etatSPI = SPCR;
SPCR = 0;
digitalWrite(13,LOW);
////////////////////////////////////////////////
for (int i = 0; i < 1 ; i++) { // 56s de sommeil (7 * 8s )//
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
}
//// on remet l'état
SPCR = etatSPI;
}
/** Lecture DHT22 *********************/
void readSensor()
{
data.humidity = dht.readHumidity()+200;
data.temperature = dht.readTemperature()+200;
data.bat = bat_value+200;
}
//***********************************************************
void do_vcc()
{
/* Mesure la tension en RAW et la référence interne à 1.1 volts */
unsigned int raw_vin = analogRead(BROCHE_CAPTEUR_VIN)*VccCorrection;
unsigned int raw_ref = analogReadReference();
/* Calcul de la tension réel avec un produit en croix */
float v = ((raw_vin * 1.1) / raw_ref) * COEFF_PONT_DIVISEUR_VIN;
Serial.print("VCC = ");
Serial.print(v);
Serial.println(" Volts");
float p =((v-VccMin)/(VccEchelle))*100 ;
bat_value = round(p);
if (bat_value>100){ // max
bat_value = 100 ;
} else if ( bat_value<0) {
bat_value = 0 ;
}
delay(1000);
}
/** Mesure la référence interne à 1.1 volts */
unsigned int analogReadReference(void) {
/* Elimine toutes charges résiduelles */
#if defined(__AVR_ATmega328P__)
ADMUX = 0x4F;
#elif defined(__AVR_ATmega2560__)
ADCSRB &= ~(1 << MUX5);
ADMUX = 0x5F;
#elif defined(__AVR_ATmega32U4__)
ADCSRB &= ~(1 << MUX5);
ADMUX = 0x5F;
#endif
delayMicroseconds(5);
/* Sélectionne la référence interne à 1.1 volts comme point de mesure, avec comme limite haute VCC */
#if defined(__AVR_ATmega328P__)
ADMUX = 0x4E;
#elif defined(__AVR_ATmega2560__)
ADCSRB &= ~(1 << MUX5);
ADMUX = 0x5E;
#elif defined(__AVR_ATmega32U4__)
ADCSRB &= ~(1 << MUX5);
ADMUX = 0x5E;
#endif
delayMicroseconds(200);
/* Active le convertisseur analogique -> numérique */
ADCSRA |= (1 << ADEN);
/* Lance une conversion analogique -> numérique */
ADCSRA |= (1 << ADSC);
/* Attend la fin de la conversion */
while(ADCSRA & (1 << ADSC));
/* Récupère le résultat de la conversion */
return ADCL | (ADCH << 8);
} |
Partager