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 168 169 170 171 172 173 174 175 176 177 178 179
| //#include <FastLED.h> /* https://github.com/FastLED/FastLED */
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_VL53L0X.h"
#include "DHT.h"
// Capteurs vl53l0x..............................
#define pinLOX1 7 /* Capteur 1 */
#define pinLOX2 6 /* Capteur 2 */
#define LOX1_ADDRESS 0x30 /* Adresse I2C : 0x30 */
#define LOX2_ADDRESS 0x31 /* Adresse I2C : 0x31 */
#define maxDistance 100 /* distance max 100 mm */
Adafruit_VL53L0X LOX1 = Adafruit_VL53L0X();
Adafruit_VL53L0X LOX2 = Adafruit_VL53L0X();
// DHT22.........................................
#define pinDHT 2
DHT dht(pinDHT, DHT22); // DHT22 (AM2302), AM2321
// Mesure Batterie...............................
#define pinVin A0; /* Pont diviseur 300k et 100K */
#define pinRef A6; /* REF tension LM385Z */
#define a 4.356 /* VccCorrection(.99)*Coeff_Pont_Vin(4)*1.1 */
#define VccMin 3.2 /* Niveau minimum attendu de Vcc, en Volts */
#define VccMax 4.2 /* Niveau maximum attendu de Vcc, en Volts */
#define VccRange VccMax - VccMin
const float Ratio = 100.0 / VccRange; // Eviter les divisions par la suite
/*
// NeoPixels.....................................
#define NUM_STRIPS 1
#define NUM_LEDS 3
#define BRIGHTNESS 10
#define LED_TYPE WS2812B
#define COLOR_ORDER BRG//RGB
#define FASTLED_ALLOW_INTERRUPTS 0
#define FASTLED_INTERRUPT_RETRY_COUNT 1
#define FRAMES_PER_SECOND 60
#define COOLING 55
#define SPARKING 120
CRGB leds[NUM_LEDS];
*/
#define pinLDR 3 /* LDR sur D3 */
#define pinAlarm A1 /* Alarme sur A1 */
// Variables
byte Panels = 0; // 0: 1 & 2 clos, impair: 1 ouvert, > 1: 2 ouvert
bool isDark = 0; // Luminosité faible ?
bool isRaining = 0; // Humidité forte ?
// Lire l'état des panneaux ***********************************************************************
void ReadPanels() {
VL53L0X_RangingMeasurementData_t measure;
// Capteur1 en lecture........................
Serial.print(F("Panneau N°1 => "));
LOX1.rangingTest(&measure, false); // 'true' pour avoir les données de débogage
Panels = (measure.RangeMilliMeter - 10 > maxDistance);
digitalWrite(4, Panels); // Panels = 1 si panneau n°1 ouvert
if(Panels) Serial.print(F("Ouvert")); else Serial.print(F("Fermé"));
Serial.println();
// Serial.print(F(" "));
// Capteur2 en lecture........................
Serial.print(F("Panneau N°2 => "));
LOX2.rangingTest(&measure, false); // 'true' pour avoir les données de débogage
byte Panel2 = (measure.RangeMilliMeter > maxDistance);
digitalWrite(5, Panel2); // Panel2 = 1 si panneau n°2 ouvert
if(Panel2) Serial.print(F("Ouvert")); else Serial.print(F("Fermé"));
Serial.println();
Panels += Panel2 << 1;
}
// Lire Température et humidité********************************************************************
void ReadDHT() {
float h = dht.readHumidity();
float t = dht.readTemperature();
//float correction = 3 ;
// Check DHT22.
if(isnan(t) || isnan(h)) {
Serial.println("Impossible de lire la sonde DHT!");
return;
}
Serial.print("Humidite : "); Serial.print(round(h)); Serial.println("%");
Serial.print("Temperature : "); Serial.print(round(t)); Serial.println("°C");
isRaining = h > 90.0;
}
delay(100);
}
// Lire la tension de la batterie *****************************************************************
void ReadVcc() {
/* Mesure la tension en RAW et la référence interne à 1.1 volts */
unsigned int raw_ref = analogRead(pinRef);
/* Calcul de la tension réel avec un produit en croix */
float v = (analogRead(pinVin) * a) / raw_ref ;
// Serial.print("VCC = "); Serial.print(v); Serial.println(" Volts");
int p = round(Ratio*(v-VccMin));
if(p > 100) p = 100 ; else if(p < 0) p = 0;
Serial.print("BAT = "); Serial.print(p); Serial.println(" %");
delay(100);
}
// Vérifier si une alarme est nécessaire **********************************************************
void CheckAlarm() {
if(Panels) { // > 0 si au moins l'un des panneaux est ouvert
Serial.println(F("Panneaux ouverts..."));
isDark = digitalRead(pinLDR); // Pas analogique ?
if(isDark || isRaining) {
if(isDark) Serial.println(F("Alarme obscurite..."));
if(isRaining) Serial.println(F("Alarme pluie..."));
digitalWrite(pinAlarm, HIGH);
} else digitalWrite(pinAlarm, LOW);
} else { // Les deux sont fermés
Serial.println(F("Panneaux clos..."));
digitalWrite(pinAlarm, LOW);
isDark = false; // ???
isRaining = false; // Pas de pluie à l'intérieur si panneaux clos
// done();
}
}
// Initialiser les capteurs d'ouverture des panneaux **********************************************
void setID() {
// tout est remis à zéro
digitalWrite(pinLOX1, LOW);
digitalWrite(pinLOX2, LOW);
delay(10);
// initialisation LOX1........................
digitalWrite(pinLOX1, HIGH);
delay(10);
if(! LOX1.begin(LOX1_ADDRESS)) {
Serial.println(F("Échec init 1er VL53L0X"));
while(1);
}
// initialisation LOX2........................
digitalWrite(pinLOX2, HIGH);
delay(10);
if(! LOX2.begin(LOX2_ADDRESS)) {
Serial.println(F("Échec init 2nd VL53L0X"));
while(1);
}
}
// SETUP*******************************************************************************************
void setup() {
Serial.begin(115200);
dht.begin();
while(! Serial) delay(10); // Attendre que le port série s'ouvre
pinMode(pinAlarm, OUTPUT); // Alarme
pinMode(pinLDR, INPUT); // LDR
//Init led strips
//FastLED.addLeds<LED_TYPE, pinAlarm, COLOR_ORDER>(leds, NUM_LEDS);
//FastLED.setBrightness( BRIGHTNESS );
pinMode(pinLOX1, OUTPUT);
pinMode(pinLOX2, OUTPUT);
//Serial.println(F("Broches d'arrêt activées..."));
digitalWrite(pinLOX1, LOW);
digitalWrite(pinLOX2, LOW);
//Serial.println(F("Les deux en mode de réinitialisation...(les broches à l'etat bas)"));
//Serial.println(F("Départ..."));
setID();
delay(100);
}
// LOOP********************************************************************************************
void loop() {
ReadDHT(); // Lecture Temp et Humidite
delay(1000); // Pourquoi ces délais longs ?
ReadPanels(); // Position des Panneaux
delay(1000);
ReadVcc();
delay(1000);
Serial.println();
Serial.print("Sombre ? "); Serial.print(isDark); Serial.println();
Serial.print("Pluie ? "); Serial.print(isRaining); Serial.println();
CheckAlarm();
delay(1000);
// done();
} |