bonsoir,
voici le code :
#include <VL6180X.h>
#include <Wire.h>
#include <OneWire.h>
#include <config.h>
#include <ds3231.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
VL6180X sensor;
// Variables et broches pour la mesure de température d'eau et d'air
float newTempEau;
float newTempAir;
float tempEau;
float tempAir;
const byte BROCHE_ONEWIRE = 19;
OneWire ds(BROCHE_ONEWIRE);
// Adresses des capteurs de température */
const byte SENSOR_ADDRESS_0[] = { 0x28, 0xFF, 0x66, 0x3F, 0x60, 0x16, 0x05, 0xCB };
const byte SENSOR_ADDRESS_1[] = { 0x28, 0xFF, 0xE4, 0x02, 0xA4, 0x16, 0x05, 0x9B };
// Variables et broches pour la RTC DS3231 & la gestion du temps
struct ts t;
const char *strJdlS[] = {"Lun", "Mar", "Mer", "Jeu", "Ven", "Sam", "Dim"};
const char *strMois[] = {"Janvier", "Fevrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembr", "Octobre", "Novembr", "Decembr"};
float tempRTC;
// Variables et broches pour l'indication de niveau d'eau
long sondeNiveau;
long sonde;
int s;
unsigned long previousMillis = 0; unsigned long previousMillis3 = 0; unsigned long previousMillis4 = 0;
const int nHH = 40;
const int nH = 41;
const int nN = 42;
const int nB = 43;
const int nBB = 44;
int etatLed2 = LOW; int etatLed3 = LOW;
// Variables pour le programme
int hProg;
const int Minute = 0;
int jdM;
int k = 0;
unsigned long time1; unsigned long interval1 = 121807L;
unsigned long time2; unsigned long interval2 = 60000L;
unsigned long time3; unsigned long interval3 = 181000L;
unsigned long previousMillis1 = 0; unsigned long previousMillis2 = 0;
unsigned long interval4 = 5000L; unsigned long interval5 = 11000L;
unsigned long interval6 = 20000L;
//const int interval7 = 1000;
const int interval8 = 150;
const int interval9 = 50; const int interval10 = 2;
const int interval11 = 1000;
unsigned long dureeAffich;
int etatNiveau;
// Fonction de démarrage de la prise de mesure de la température via un capteur DS18B20.
void mesureTemp (const byte addr[]) //addr[] : Adresse du module 1-Wire détecté
{
// 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);
delay(800);
}
// Fonction de récupération de la prise de mesure de la température via un capteur DS18B20
float lectureMesureT (const byte addr[]) //addr[] : Adresse du module 1-Wire détecté
{
byte data[9]; //data[] : Données lues depuis le scratchpad
// 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
return ((data[1] << 8) | data[0]) * 0.0625;
}
// Affichage de l'heure et de la date
void affichHeure()
{
lcd.setCursor(0,0); lcd.print(" ");
if ((t.hour) < 10)
{
lcd.print(" ");
}
lcd.print(t.hour);
lcd.print("H");
if ((t.min) < 10)
{
lcd.print("0");
}
lcd.print(t.min); lcd.print(" ");
}
void affichDate()
{
lcd.setCursor(0,0); lcd.print(strJdlS[t.wday-1]); lcd.print(" ");
lcd.print(t.mday); lcd.print(" ");
lcd.print(strMois[t.mon-1]); lcd.print(" "); lcd.print(t.year);
}
// Lecture du niveau d'eau
void lectureSondeNiveau()
{
sondeNiveau = (sensor.readRangeSingleMillimeters()); Serial.println(sondeNiveau);
sonde += sondeNiveau; Serial.println(sonde);
s += 1;Serial.println(s);
previousMillis = millis();
}
void clignoLednHH()
{
if(millis() - previousMillis3 > interval8)
{
previousMillis3 = millis();
if (etatLed2 == LOW)
{
etatLed2 = HIGH;
}
else
{
etatLed2 = LOW;
}
digitalWrite(nHH, etatLed2);
}
}
void clignoLednBB()
{
if(millis() - previousMillis4 > interval8)
{
previousMillis4 = millis();
if (etatLed3 == LOW)
{
etatLed3 = HIGH;
}
else
{
etatLed3 = LOW;
}
digitalWrite(nBB, etatLed3);
}
}
void setup()
{
pinMode(nHH, OUTPUT); pinMode(nH, OUTPUT);
pinMode(nN, OUTPUT); pinMode(nB, OUTPUT); pinMode(nBB, OUTPUT);
lcd.begin();
Wire.begin();
DS3231_init(DS3231_INTCN);
sensor.init();
sensor.configureDefault();
Serial.begin(9600);
}
void loop()
{
{
DS3231_get(&t);
// Affichage de la date, de l'heure et des températures
{
if (millis() - dureeAffich < interval4)
{
affichDate();
}
}
}
// Calcul HProg
{
hProg = (t.hour*100) + t.min;
}
// GESTION DU NIVEAU D'EAU
{
{
if (millis() - previousMillis > interval11)
{
lectureSondeNiveau();
}
}
if (s == 10)
{
sonde = sonde / 10; Serial.println(sonde);
if (sonde <= 42)
{
etatNiveau = 1;
}
else if (sonde > 42 && sonde <= 44)
{
etatNiveau = 2;
}
else if (sonde > 44 && sonde <= 46)
{
etatNiveau = 3;
}
else if (sonde > 46 && sonde <= 48)
{
etatNiveau = 4;
}
else if (sonde > 48 && sonde <= 50)
{
etatNiveau = 5;
}
else if (sonde >50 && sonde <= 52)
{
etatNiveau = 6;
}
else
{
etatNiveau = 7;
}
sonde = 0; s = 0;
}
switch (etatNiveau)
{
case 1:
clignoLednHH();
break;
case 2:
digitalWrite(nBB, HIGH); digitalWrite(nB, HIGH); digitalWrite(nN, HIGH); digitalWrite(nH,HIGH); digitalWrite(nHH, HIGH);
break;
case 3:
digitalWrite(nBB, HIGH); digitalWrite(nB, HIGH); digitalWrite(nN, HIGH); digitalWrite(nH,HIGH); digitalWrite(nHH, LOW);
break;
case 4:
digitalWrite(nBB, HIGH); digitalWrite(nB, HIGH); digitalWrite(nN, HIGH); digitalWrite(nH,LOW); digitalWrite(nHH, LOW);
break;
case 5:
digitalWrite(nBB, HIGH); digitalWrite(nB, HIGH); digitalWrite(nN, LOW); digitalWrite(nH,LOW); digitalWrite(nHH, LOW);
break;
case 6:
digitalWrite(nBB, HIGH); digitalWrite(nB, LOW); digitalWrite(nN, LOW); digitalWrite(nH,LOW); digitalWrite(nHH, LOW);
break;
case 7:
clignoLednBB();
break;
}
}
// AFFICHAGE DES TEMPERATURES RTC - AIR - EAU
{
float temperature[2];
// lecture des températures
{
if (millis() - time1 >= interval1)
{
time1 = millis();
mesureTemp(SENSOR_ADDRESS_0);
temperature[0] = lectureMesureT(SENSOR_ADDRESS_0);
newTempAir = temperature[0];
}
if (millis() - time2 >= interval2)
{
time2 = millis();
mesureTemp(SENSOR_ADDRESS_1);
temperature[1] = lectureMesureT(SENSOR_ADDRESS_1);
newTempEau = temperature[1];
}
}
}
}
Pour l'alim, j'utilise une alim 5V séparée pour les relais et le lcd avec la masse en commun avec la MEGA et une alim pour la MEGA.
J'avoue que je galère un peu à trouver d'ou peut venir ce pb