Jardinnière connecté (encore une ^^) - erreur de compilation pour carte ESP8266

Bonjour à tous,

Depuis quelques temps je me suis lancer dans la réalisation d'une "jardinnière connecté", ce produit aura de nombreuses fonctionnalités (arrosage auto, détection d'humidité sol, détection humidité & température air, panneaux solaires, pilotage à distance à l'aide d'un esp 8266).

Je ne suis pas programmeur de formation, j'ai un bagage technique plutôt dans la mécanique industrielle, c'est donc sans difficulté que j'ai réalisé la structure de mon produit (le proto en miniature).

Voilà quelques semaines que j'avance sur la parties électronique & programmation avec l'aide de personnes que je peux croiser sur le net. (et des différents autres projets que j'ai pu voir)

Alors venons en a mon problème ! Alors je souhaites faire de la "programmation modulaire" afin de ne pas avoir un programme de 800 lignes.

Pour le moment j'ai seulement programmer les fonctions arrosages (avec une simple tempo cela changera) & le capteur d'humidité sol.

et j'ai cette erreur :-/

exit status 1
Erreur de compilation pour la carte Generic ESP8266 Module

Je serais attentif a vos différentes remarques et questions, merci d'avance pour votre aide :-).

Programme "main"

#include <arduino.h>
#include "init_pompe.h" //inclue le .h qui permet d'inclure les fonctions du .ino
#include "init_capteur_humidite_sol.h"
#include "config.h"

// fonctionnement pompe

void loop () {

// quelques lignes pour faire des vérifications sur le moniteur série  
  Serial.println("moniteur pret");
  Serial.print (PinPompe);
  Serial.print("\n");
  Serial.print (PinSensor);
  Serial.print("\n");

// fonctionnement de la pompe 
  digitalWrite(PinPompe, LOW);
  delay (1000); // temps ou la pompe fonctionne
  digitalWrite (PinPompe, HIGH);
  delay (1000); // temps ou la pompe ne fonctionne pas

// fonctionnement capteur humidite sol
   int ValeurSensor = 0; // je pense qu'il faut déclarer les int ici et pas dans mon header, ils n'auront pas la "portée" pour agir dans ce programme
   int pourcentage =0; // idem que le ValeurSensor je ne pense pas pouvoir le définir avec #define dans le header (j'ai testé)
   int AfficheValeurEtPourcentage();
     
   ValeurSensor = analogRead(PinSensor);
   pourcentage = ConvertEnPercent(ValeurSensor);
   AfficheValeurEtPourcentage();
   delay(1000);
}
   int ConvertEnPercent(int value){
   int ValeurPorcentage = 0;
   ValeurPorcentage = map(value, 370, 0, 0, 100);
   return ValeurPorcentage;
}

Voici un config.h

void setup ()
{
  Serial.begin(9600);
  init_capteur_humidite_sol(PinSensor);
    
  init_pompe(PinPompe);
}

init_capteur_humidite_sol.h

//capteur d'humidité du sol

#define PinSensor A0
void init_capteur_humidite_sol(int pin);

init_capteur_humidite_sol

#include "init_capteur_humidite_sol.h"

void init_capteur_humidite_sol(int pin){
  int ValeurSensor = 0; // j'ai du remettre cette valeur dans la boucle, je pense que le int n'a pas une "portée" suffisante.
  pinMode(pin, INPUT);
}

init_pompe.h

//ici les defines et les prototype des fonctions

#define PinPompe 14
void init_pompe(int pin);

init_pompe

#include "init_pompe.h"

void init_pompe(int pin) {
  pinMode(pin, OUTPUT);
}

Le message du compilateur doit être plus long que ça. Utiliser le bouton qui permet de copier ce message en entier et poste le dans ta réponse.

Quelles options as-tu choisies dans l'IDE pour ton ESP8266 ?

Salut,

Voici le message plus complet, merci de l'intérêt portée à mon soucis :-).

Arduino : 1.8.11 Hourly Build 2019/11/11 03:33 (Windows 10), Carte : "Generic ESP8266 Module, 80 MHz, Flash, Legacy (new can return nullptr), All SSL ciphers (most compatible), dtr (aka nodemcu), 26 MHz, 40MHz, DOUT (compatible), 1MB (FS:64KB OTA:~470KB), 2, nonos-sdk 2.2.1+111 (191024), v2 Lower Memory, Disabled, None, Only Sketch, 115200"

c:/users/villard/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-4-b40a506/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: sketch\main.ino.cpp.o:(.text.loop+0x10): undefined reference to `AfficheValeurEtPourcentage()'

c:/users/villard/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-4-b40a506/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: sketch\main.ino.cpp.o: in function `loop':

C:\Users\Villard\Documents\Arduino\main/main.ino:14: undefined reference to `AfficheValeurEtPourcentage()'

collect2.exe: error: ld returned 1 exit status

exit status 1
Erreur de compilation pour la carte Generic ESP8266 Module

Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.

Bonjour

C:\Users\Villard\Documents\Arduino\main/main.ino:14: undefined reference to `AfficheValeurEtPourcentage()'

Echec lors de l'appel de la fonction AfficheValeurEtPourcentage() , fonction non déclarée ou inaccessible.

Merci pour vos retours j'ai pu corriger mon programme (et l'améliorer).

main

#include <arduino.h>
#include "init_pompe.h" //inclue le .h qui permet d'inclure les fonctions du .ino
#include "init_capteur_humidite_sol.h"
#include "config.h"

int ConvertEnPercent(int value, int valueMaxcapteur); // prototype de la fonction (pour convertir valeur en %)

void setup ()
{
  Serial.begin(9600);
  init_capteur_humidite_sol(PinSensor);
  init_pompe(PinPompe);
}

void loop () {
  int ValeurSensor = 0; // je pense qu'il faut déclarer les int ici et pas dans mon header, ils n'auront pas la "portée" pour agir dans ce programme
  int pourcentage = 0; // idem que le ValeurSensor je ne pense pas pouvoir le définir avec #define dans le header (j'ai testé)
  //int AfficheValeurEtPourcentage(); le int permet de créer une variable --> Ici on veut appeler une fonction !

  // quelques lignes pour faire des vérifications sur le moniteur série
  Serial.println("moniteur pret");
  Serial.println (PinPompe);
  Serial.println (PinSensor);

  // fonctionnement de la pompe
  digitalWrite(PinPompe, LOW);
  delay (1000); // temps ou la pompe fonctionne
  digitalWrite (PinPompe, HIGH);
  delay (1000); // temps ou la pompe ne fonctionne pas

  // fonctionnement capteur humidite sol

  ValeurSensor = analogRead(PinSensor); // entre 0 & 1024
  pourcentage = ConvertEnPercent(ValeurSensor, valeurMaxCapteurH);
  AfficheValeurEtPourcentage(ValeurSensor, pourcentage);
  delay(1000);
}

void AfficheValeurEtPourcentage(int ValeurSensor, int Pourcentage) { // fonction mal faite (avant) pour info les itn déclarés ici sont "locaux"
  Serial.print("Valeur: ");
  Serial.println(ValeurSensor);
  Serial.print("Pourcentage: ");
  Serial.print(Pourcentage);
  Serial.println("%");
  Serial.println("-----------");
}

int ConvertEnPercent(int value, int valueMaxcapteur) {
  int ValeurPorcentage = 0;
  ValeurPorcentage = map(value, valueMaxcapteur, 0, 0, 100);
  return ValeurPorcentage;
}

config

// ici on peut mettre les define que l'utilisateur ou un programme changera on ne met pas le setup ici !!!

#define valeurMaxCapteurH 370 // ici l'utilisateur peut faire évoluer ce define en fonction de la valeur max du capteur

humidité sol

//capteur d'humidité du sol

#define PinSensor A0
void init_capteur_humidite_sol(int pin);

init capteur humidité sol

#include "init_capteur_humidite_sol.h"
void init_capteur_humidite_sol(int pin){
  int ValeurSensor = 0; // j'ai du remettre cette valeur dans la boucle, je pense que le int n'a pas une "portée" suffisante.
  pinMode(pin, INPUT);
}

init pompe.h

//ici les defines et les prototype des fonctions + du les define que l'on a pas besoin de faire évoluer

#define PinPompe 14
void init_pompe(int pin);

init pompe

#include "init_pompe.h"

void init_pompe(int pin) {
  pinMode(pin, OUTPUT);
}