Bonjour,
je suis en train de terminer un programme à base de arduino nano, un module RF, un écran OLED et le tout sur 2 batterie 18650 avec un BMS 2S.
Mon programme fonctionne bien mais je cherche dorénavant à passer mon arduinon en mode deep sleep. J'ai lu beaucoup de chose avant de poster mon message, sur ce forum mais aussi sur d'autres sites mais je suis perdu dans toutes les explications. Mon programme (et merci encore à hbachetti, al1fch et 68tjs de m'avoir aidé pour l'utilisation de mosfet P sur mon projet).
Le code est le suivant :
#include <Wire.h>
#include <simpleBouton.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(-1);
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
int compteurmenu = 10;
const int Down = 2;
const int Enter = 3;
const int Up = 4;
#define DEFAULT_DELAY 300
char buttonPressed = '0';
byte menuLevel = 0;
byte menu = 1;
byte sub = 1;
//bool currState_B = HIGH;
bool currState_D = HIGH;
bool currState_U = HIGH;
bool currState_E = HIGH;
//bool prevState_B = HIGH;
bool prevState_D = HIGH;
bool prevState_U = HIGH;
bool prevState_E = HIGH;
//unsigned long prevTime_B = 0;
unsigned long prevTime_D = 0;
unsigned long prevTime_U = 0;
unsigned long prevTime_E = 0;
//unsigned long waitTime_B = 50;
unsigned long waitTime_D = 50;
unsigned long waitTime_U = 50;
unsigned long waitTime_E = 50;
const char * Niveau_Humidite;
const char * Niveau_Arrosage;
int percent = 0;
volatile boolean arrosage = false;
const uint8_t pinFlotteur = A1;
const int SoilMoisture = A2;
int SensorValue = 0;
int ValHumidite = 0;
int ValArrosage = 1;
uint32_t T_Previous_Arrosage = 0;
enum t_etatSysteme : uint8_t {REPOS, ALERTE_VIDE} etat;
simpleBouton flotteurBas(pinFlotteur);
void majFlotteurs()
{
flotteurBas.actualiser();
}
bool reservoirvide()
{
return flotteurBas.estEnfonce();
}
bool pompeActive = false;
uint32_t t0Pompe;
const uint32_t dureeMaxPompe = 167000UL;
const byte RelaisPompe = 30;
bool relaispompe = false;
void activerPompe()
{
t0Pompe = millis();
digitalWrite(RelaisPompe, LOW);
pompeActive = true;
}
void desactiverPompe()
{
digitalWrite(RelaisPompe, HIGH);
pompeActive = false;
}
void setup()
{
pinMode(Down, INPUT_PULLUP);
pinMode(Up, INPUT_PULLUP);
pinMode(Enter, INPUT_PULLUP);
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
display.display();
display.clearDisplay();
etat = REPOS;
updateLevel_0();
}
void loop()
{
arrosage();
checkButton();
}
void checkButton()
{
// Button Debouncing
bool currRead_U = digitalRead(Up);
bool currRead_D = digitalRead(Down);
bool currRead_E = digitalRead(Enter);
if (currRead_U != prevState_U) {
prevTime_U = millis();
}
if (currRead_D != prevState_D) {
prevTime_D = millis();
}
if (currRead_E != prevState_E) {
prevTime_E = millis();
}
if ((millis() - prevTime_U) > waitTime_U) {
if (currRead_U != currState_U) {
currState_U = currRead_U;
if (currState_U == LOW) {
buttonPressed = 'U';
Serial.println("U");
}
}
} else buttonPressed = '0';
if ((millis() - prevTime_D) > waitTime_D) {
if (currRead_D != currState_D) {
currState_D = currRead_D;
if (currState_D == LOW) {
buttonPressed = 'D';
Serial.println("D");
}
}
} else buttonPressed = '0';
if ((millis() - prevTime_E) > waitTime_E) {
if (currRead_E != currState_E) {
currState_E = currRead_E;
if (currState_E == LOW) {
buttonPressed = 'E';
Serial.println("E");
}
}
} else buttonPressed = '0';
prevState_U = currRead_U;
prevState_D = currRead_D;
prevState_E = currRead_E;
processButton(buttonPressed);
}
void processButton(char buttonPressed)
{
switch (menuLevel) {
case 0:
switch (buttonPressed) {
case 'E':
menu = 1;
menuLevel = 1;
updateLevel_1();
delay(DEFAULT_DELAY);
break;
case 'D':
break;
case 'U':
menuLevel = 0;
updateLevel_0();
delay(DEFAULT_DELAY);
break;
default:
break;
}
break;
case 1:
switch ( buttonPressed ) {
case 'E':
if(compteurmenu == 10)
{
menu = 1;
sub = 1;
compteurmenu = 10;
menuLevel = 2;
updateLevel_2();
}
if(compteurmenu == 20)
{
if (arrosage == false)
{
arrosage = true;
activerPompe();
Serial.println("yyyy");
}
else if (arrosage == true)
{
arrosage = false;
desactiverPompe();
Serial.println("xxxx");
}
updateLevel_1();
}
if(compteurmenu == 30)
{
Serial.println(" xxxx");
menu = 1;
sub = 2;
compteurmenu = 10;
menuLevel = 3;
updateLevel_2();
}
if(compteurmenu == 40)
{
menu = 0;
compteurmenu = 10;
menuLevel = 0;
updateLevel_0();
}
delay(DEFAULT_DELAY);
break;
case 'D': // Down
if(compteurmenu >= 40)
{
compteurmenu = 10;
}
else
{
compteurmenu = compteurmenu + 10;
}
updateLevel_1();
delay(DEFAULT_DELAY);
break;
case 'U':
if(compteurmenu <= 10)
{
compteurmenu = 10;
}
else
{
compteurmenu = compteurmenu - 10;
}
updateLevel_1();
delay(DEFAULT_DELAY);
break;
default:
break;
}
break;
case 2:
switch ( buttonPressed ) {
case 'E': // Enter
if(compteurmenu == 40)
{
menu = 1;
compteurmenu = 10;
menuLevel = 1;
updateLevel_1();
}
break;
case 'D':
if(compteurmenu >= 40)
{
compteurmenu = 10;
}
else
{
compteurmenu = compteurmenu + 10;
}
updateLevel_2();
delay(DEFAULT_DELAY);
break;
case 'U': // Up
if(compteurmenu <= 10)
{
compteurmenu = 10;
}
else
{
compteurmenu = compteurmenu - 10;
}
updateLevel_2();
delay(DEFAULT_DELAY);
break;
default:
break;
}
break;
case 3:
switch ( buttonPressed ) {
case 'E':
if(compteurmenu == 10)
{
menu = 1;
sub = 2;
compteurmenu = 10;
menuLevel = 4;
updateLevel_2();
}
if(compteurmenu == 20)
{
Serial.println("def humidite");
menu = 1;
sub = 2;
compteurmenu = 20;
menuLevel = 4;
updateLevel_2();
}
if(compteurmenu == 30)
{
menu = 1;
compteurmenu = 10;
menuLevel = 1;
updateLevel_1();
}
break;
case 'D':
if(compteurmenu >= 30)
{
compteurmenu = 10;
}
else
{
compteurmenu = compteurmenu + 10;
}
updateLevel_2();
delay(DEFAULT_DELAY);
break;
case 'U': // Up
if(compteurmenu <= 10)
{
compteurmenu = 10;
}
else
{
compteurmenu = compteurmenu - 10;
}
updateLevel_2();
delay(DEFAULT_DELAY);
break;
default:
break;
}
break;
case 4:
switch ( buttonPressed ) {
case 'E':
if(compteurmenu == 10 || compteurmenu == 20)
{
menu = 1;
sub = 2;
compteurmenu = 10;
menuLevel = 3;
updateLevel_2();
}
break;
case 'D':
if(compteurmenu == 10 && ValArrosage < 30)
{
ValArrosage = ValArrosage + 1;
}
else if(compteurmenu == 20 && ValHumidite < 100)
{
ValHumidite = ValHumidite + 25;
}
updateLevel_2();
delay(DEFAULT_DELAY);
break;
case 'U': // Up
if(compteurmenu == 10 && ValArrosage > 0)
{
ValArrosage = ValArrosage - 1;
}
else if(compteurmenu == 20 && ValHumidite > 0)
{
ValHumidite = ValHumidite - 25 ;
}
updateLevel_2();
delay(DEFAULT_DELAY);
break;
default:
break;
}
break;
}
}
void updateLevel_0()
{
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(30, 30);
display.println("yyyyyy");
display.display();
}
void updateLevel_1 ()
{
switch (menu)
{
case 0 :
menu = 1;
break;
case 1:
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(10, 10);
display.println("xxxx");
display.setCursor(10, 20);
display.println("xxxx");
if (arrosage == true)
{
display.setCursor(60, 20);
display.println("ON");
}
if (arrosage == false)
{
display.setCursor(60, 20);
display.println("OFF");
}
display.setCursor(10, 30);
display.println("xxxx");
display.setCursor(10, 40);
display.println("Back");
display.setCursor(2, compteurmenu);
display.println(">");
display.display();
break;
}
}
void updateLevel_2 () {
switch (menu) {
case 0:
break;
case 1:
switch (sub) {
case 0:
break;
case 1:
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(10, 10);
display.println("xxx 1");
display.setCursor(10, 20);
display.println("xxxx 2");
display.setCursor(10, 30);
display.println("xxxx 3");
display.setCursor(10, 40);
display.println("xxx");
display.display();
display.setCursor(2, compteurmenu);
display.println(">");
display.display();
break;
case 2:
display.setTextSize(1);
display.setTextColor(WHITE);
display.clearDisplay();
display.setCursor(10, 10);
display.println("xxxxx");
display.setCursor(80, 10);
display.println(ValArrosage);
display.setCursor(10, 20);
display.println("Seuil Hum");
percent = (SensorValue - 229) * 0.43;
display.setCursor(80, 20);
display.println(ValHumidite);
display.setCursor(10, 30);
display.println("Back");
display.setCursor(2, compteurmenu);
display.println(">");
display.display();
break;
}
break;
}
}
void arrosage()
{
majFlotteurs();
majLEDs();
SensorValue = analogRead(SoilMoisture);
uint32_t T_Current_Arrosage = millis();
uint32_t T_Arrosage = ValArrosage*1000UL;
switch (etat)
{
case REPOS:
if (SensorValue < (((ValHumidite/0.33)+229)) && !reservoirvide())
{
if(T_Current_Arrosage - T_Previous_Arrosage > T_Arrosage)
{
Serial.println(ValArrosage);
T_Previous_Arrosage = T_Current_Arrosage;
}
}
if (reservoirvide())
{
Serial.println(F("ALERTE RESERVOIR EAU PROPRE VIDE"));
Serial.println(etat);
etat = ALERTE_VIDE;
}
break;
case ALERTE_VIDE:
if (!reservoirvide())
{
etat = REPOS;
}
break;
}
}
j'ai essayé d'utiliser la librairie "LowPower.h" mais en vain d'autant qu'elle rentre en conflit avec celle de Mysensors pour information (j'ai trouvé une solution ici : Compilation error when using LowPower.h library with MySensors | MySensors Forum).
Ma question, comment intégrer une fonction deep sleep dans mon programme pour permettre simplement la lecture des capteurs 1 fois par jour et hop au dodo le reste du temps?
Merci d'avance pour votre aide.