Premier code Arduino - Demande d'infos

Bonjour à tous,

Je suis nouveau venu dans le monde de l'arduino, et j'ai voulu commencer à apprendre en essayant de construire un jardin "autonome".

J'ai donc un bac à herbes équipé d'un réservoir de 80litres, d'une boite contenant un arduino Nano équipé d'un module RTC, d'un module BT, d'un capteur de présence d'eau et de réservoir rempli, d'une sonde DHT22 et d'un capteur d'humidité du sol. J'ai aussi ajouté un pont diviseur pour calculer la capacité de ma batterie qui est rechargée par un panneau solaire.

Tous ces modules fonctionnent au poil un par un, les données renvoyées en BT sont parfaitement cohérentes avec le réel.

Là ou cela se corse, c'est que mon système refuse de monter le relais qui pilote ma pompe pour arroser le bac...alors qu'il fonctionne sur une commande BT.

Je pense qu'il y a un bug dans mon code, notamment au niveau des comparaisons de valeurs pour autoriser le pilotage du relais. ( Peut être la comparaison entre des "int" et des "floats" ? )

Pouvez vous regarder brièvement mon code, et m'aiguiller pour comprendre ce qui coince ?

Grand merci d'avance !

PS: J'ai joint mon programme .ino. J'espère que vous pourrez le récupérer pour le lire :wink:

Programme_final_sans_prog_BT.ino (3.89 KB)

Bonjour,
De quel type sont le capteur de niveau d'eau? Si se sont des flotteurs simples,
Il faudrait déjà remplacer

 pinMode(capt_H2OB,INPUT); //Pin DI7 pour capteur niveau bas H2O
 pinMode(capt_H2OH,INPUT); //Pin DI9 pour capteur niveau haut H2O

par

 pinMode(capt_H2OB,INPUT_PULLUP); //Pin DI7 pour capteur niveau bas H2O
 pinMode(capt_H2OH,INPUT_PULLUP); //Pin DI9 pour capteur niveau haut H2O

puis:

if(digitalRead (capt_H2OB) == HIGH && hum_pc < 80 && Air_temp < 26 && Air_hum < 85 && batt_pc > 75 && t.hour > 21 && t.hour < 23 && tag_RAZ_pompe == 0)

cela fait beaucoup de conditions pour que la pompe s'allume.
Il faut donc vérifier qu'elle sont vraies à un instant T.

et ça c'est pas bon du tout ça bloque le code pendant trop longtemps

delay(60000);

faites une rechecher pour " Blink witout delay" ça vous apprend à faire une temporisation sans bloquer le fonctionnement du programme.

Hello,

Merci beaucoup de votre réponse.

Les capteurs de présence d'eau sont des tiges en inox. S'il y a de l'eau, il y a contact, et inversement.
J'ai choisi de mettre moi même les résistances en hard sur mon PCB, car j'avais lu pour je ne sais plus quelle raison, il fallait éviter les résistances internes de l'arduino ( INPUT_PULLUP)

J'espère que je n'ai pas fait de bêtises !!

Concernant le test conditionnel, je suis conscient qu'il y a beaucoup de paramètres à tester en même temps, mais les conditions ont une latence énorme ( jardin , par exemple l'humidité du sol ), et je pense avoir mis assez de latitude pour dans un premier temps presque "forcer" la pompe à fonctionner.

Je vais faire une recherche pour le timer de 60s, cependant, je ne vois toujours pas pourquoi ma condition n'est pas remplie alors que tous les paramètres sont au vert.

D'autres idées ?

Merci d'avance à tous, je touche du doigt la fin de mon projet, il ne reste pas grand chose pour que cela fonctionne, j'en suis sur !

Bonjour à tous,

Je me permet de remonter mon post, car je n'ai toujours pas trouvé de solution à mon problème.

Des idées ?

Merci d'avance !

Salut

La moindre des choses quand on cherche à deboguer un logiciel est d'utiliser le terminal pour afficher des variables ou des informations utiles.
Dans ton code tu n'a même pas ouvert la ligne série (Serial.begin()).

Le code est le suivant (parce que pas facile de le lire en PJ depuis un mobile)
(j'ai enlevé votre nom et eMail car les robot scan le web et vous allez vous faire spammer...)

//GESTION AUTOMATISEE DU JARDIN
//Copyright 2019.05  par Yann xxx
//xxxx@libertysurf.fr

#include <SoftwareSerial.h>
#include <Wire.h>
#include <ds3231.h>
#include "DHT.h"

#define DHTPIN 8 //Pin DI8 pour lecture capteur DHT22
#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

SoftwareSerial CanalSerieBT(12, 11); // RX, TX

//Declaration variables pour comm BT et calculs
int BluetoothData;
int hum_pc;
int hum_brute;
float batt_brute;
float batt_volts;
float batt_pc;
float Air_hum;
float Air_temp;
int H2OB;
int H2OH;
int tag_RAZ_pompe;

//Declaration variables pour entrées sorties digitales
int pompe = 6;
int capt_H2OB = 7;
int capt_H2OH = 9;
int LED_verte = 2;
int LED_rouge = 3;

struct ts t; //Necessaire pour lecture de l'heure RTC

void setup() {
  CanalSerieBT.begin(9600);
  pinMode(pompe, OUTPUT); //Pin DO6 pour allumage pompe
  pinMode(A1, INPUT); //Pin AI1 pour capteur humidité sol
  pinMode(A2, INPUT); //Pin AI2 pour capteur niveau de batterie
  pinMode(capt_H2OB, INPUT); //Pin DI7 pour capteur niveau bas H2O
  pinMode(capt_H2OH, INPUT); //Pin DI9 pour capteur niveau haut H2O
  pinMode(LED_verte, OUTPUT); //Pin DO2 pour allumage LED Verte
  pinMode(LED_rouge, OUTPUT); //Pin DO3 pour allumage LED Rouge

  Wire.begin();
  DS3231_init(DS3231_INTCN);
  dht.begin();

}

void loop() {

  //Gestion allumage pompe sur commande BT ( remplacer ledpin par DO pompe )
  if (CanalSerieBT.available()) {
    BluetoothData = CanalSerieBT.read();

    if (BluetoothData == '1') {
      digitalWrite(pompe, HIGH);
    }

    if (BluetoothData == '0') {
      digitalWrite(pompe, LOW);
    }
  }

  //Gestion affichage heure sur canal BT
  DS3231_get(&t);
  CanalSerieBT.print("Heure : ");
  CanalSerieBT.print(t.hour);
  CanalSerieBT.print(":");
  CanalSerieBT.print(t.min);
  CanalSerieBT.println("");

  //Gestion affichage humidité sol sur canal BT
  hum_brute = analogRead(1);
  hum_pc = map(hum_brute, 0, 702, 0, 100);
  CanalSerieBT.print("Humidite Sol :  ");
  CanalSerieBT.print(hum_pc);
  CanalSerieBT.print(" %     ");

  //Gestion affichage niveau batterie sur canal BT
  batt_brute = analogRead(A2);
  batt_volts = map(batt_brute, 0, 1023, 0, 14150);
  batt_pc = map(batt_volts, 0, 14150, 0, 100);
  CanalSerieBT.print("Voltage Batterie = ");
  CanalSerieBT.print(batt_volts);
  CanalSerieBT.println(" mV");
  CanalSerieBT.print("% Batterie = ");
  CanalSerieBT.print(batt_pc);
  CanalSerieBT.println(" %");
  CanalSerieBT.println(".");

  //Gestion affichage humidité air et temperature air sur canal BT

  // Verification si lecture OK sur module DHT22
  if (isnan(Air_hum) || isnan(Air_temp)) {
    CanalSerieBT.println("Failed to read from DHT sensor!");
    return;
  }

  Air_hum = dht.readHumidity();
  Air_temp = dht.readTemperature();
  CanalSerieBT.print("Temperature Air :  ");
  CanalSerieBT.print(Air_temp);
  CanalSerieBT.println(" *C     ");
  CanalSerieBT.print("Humidite Air :  ");
  CanalSerieBT.print(Air_hum);
  CanalSerieBT.println(" %     ");

  //Gestion affichage etat des niveaux d'eau sur canal BT

  H2OB = digitalRead(capt_H2OB);
  H2OH = digitalRead(capt_H2OH);
  CanalSerieBT.print("Etat capteur Eau Basse :  ");
  CanalSerieBT.print(H2OB);
  CanalSerieBT.println(" ");
  CanalSerieBT.print("Etat capteur Eau Haute :  ");
  CanalSerieBT.print(H2OH);
  CanalSerieBT.println(" ");

  //Gestion allumage LED verte et rouge si H2O NOK

  if (digitalRead (capt_H2OH) == HIGH) {
    digitalWrite(LED_verte, HIGH);
  }
  else {
    digitalWrite(LED_verte, LOW);
  }

  if (digitalRead (capt_H2OB) == LOW) {
    digitalWrite(LED_rouge, HIGH);
  }
  else {
    digitalWrite(LED_rouge, LOW);
  }

  //Gestion allumage pompe sur programmation fixe
  //-- gestion programmation par BT à venir --

  if (digitalRead (capt_H2OB) == HIGH && hum_pc < 80 && Air_temp < 26 && Air_hum < 85 && batt_pc > 75 && t.hour > 21 && t.hour < 23 && tag_RAZ_pompe == 0) {
    digitalWrite(pompe, HIGH);
    delay(60000);
    digitalWrite(pompe, LOW);
    tag_RAZ_pompe = 1;
  }

  if (tag_RAZ_pompe == 1 && t.hour > 23 && t.hour < 21) {
    tag_RAZ_pompe = 0;
  }


  delay(50);

}

Je vais faire une recherche pour le timer de 60s, cependant, je ne vois toujours pas pourquoi ma condition n'est pas remplie alors que tous les paramètres sont au vert.

d'accord avec @hbachetti, si vraiment toutes les conditions étaient remplies, vous rentreriez dans le if. Si vous n'entrez pas c'est qu'une condition est fausse (Ou alors que votre relai ne marche pas - avez vous essayé de mettre une LED avec sa résistance de limitation de courant à la place du relai de la pompe ? est-ce que vous êtes en direct sur la pompe d'ailleurs ou vous avez bien un relai qui vous protège ?)

Notez cependant que ce test sera toujours faux:

  if (tag_RAZ_pompe == 1 && t.hour > 23 && t.hour < 21) {
    tag_RAZ_pompe = 0;
  }

l'heure ne peut pas être à la fois plus grande que 23 et plus petite que 21. Donc vous ne remettez jamais tag_RAZ_pompe à 0 (vrai ou faux seraient mieux et faites en un booléen)

le blocage d'une minute veut aussi dire que vous ne testez plus la réception des commandes BT pendant ce temps là...

Merci de vos réponses rapides. J'ai bien compris vos remarques.
Merci à vous J-M-L pour la confidentialité, ma boite mail s'en souviendra.

Je précise que c'est mon premier code, et qu'il y a moins d'un mois je ne connaissais rien à ce langage !
Soyez indulgents :frowning:

J'ai bien compris l'erreur flagrante de la RAZ compteur, je vais procéder autrement.

@hbachetti : J'ai bien mis la ligne Serial.begin :wink: . Mon canal porte juste un nom différent.

En ce qui concerne le relayage : oui, ma pompe se situe bien derrière un relais qui protège mon circuit. D'ailleurs, par le biais d'une commande BT, celui-ci claque bien et la pompe s'allume. Je considère donc que mon montage est correct.

Je vais procéder par étapes pour voir si toutes les conditions sont OK ou NOK pour entrer dans la boucle IF.

Pour le timer d'une minute, je n'ai pas les compétences pour faire autrement pour le moment, on verra pour la V2 !

Encore merci...

@hbachetti : J'ai bien mis la ligne Serial.begin :wink: . Mon canal porte juste un nom différent.

Non, CanalSerieBT est un SoftwareSerial réservé au BT.

Je parle de Serial tout court, qui permettrait d'afficher des infos dans le terminal (moniteur série).
Il serait dommage de s'en priver.