Ruche connectée

Portrait de Amric95

Bonjour à tous.

En cette période de confinement, j'ai un peu de temps pour faire du code Arduino.

En effet j'essaie de réaliser une ruche connectée.

Voici la nomenclature du matériel que j'utilise :

-  1 carte Uno pour le coeur du Projet.

-  1 Lcd 20x4 en I2C pour l'affichage.

-  1 DS3231 pour l'horloge en temps réel et la température extérieur.

-  1 BME280  qui sera dans la ruche pour les mesures de la température, l'humidité et  la pression     atmosphérique.

-  1 HX711 pour la pesée de la ruche.

-  1 Lecteur de carte micro SD pour l'échantionnage des données toutes les 5 minutes. Date, Heures, Masse, température intérieur via le BME280, température extérieur via le DS3231, Humidité et pression.

-  1 ESP 8266 01 pour transmettre les données en temps réel via internet sur mon smart phone.

Mon programme fonctionne bien actuellement pour la date, l'heures les deux températures, l'humidité, la pression et le stockage de toutes ces données.

j'ai aussi un bout de code en fin de préparation pour la mesures de masse (a voir plus tard).

Donc je suis à la recherche de bonnes volontés pour m'aider à optimiser mon code et avoir vos points de vues à des fin d'amélioration.

Bonne soirée, Richard.

Portrait de Walter

Bonjour, beau projet, si tu peux donne ton code que chacun puisse le regarder et le commenter si possible.
N'hésite pas a poster ton projet dans la section "Projet réalisés"
Une petite présentation dans la section dédié serait aussi la bienvenue :)

Portrait de Amric95

Merci Walter.

C'est la première fois que je poste sur un forum

donc je ne sais pas faire ce que tu veux dire par :

" N'hésite pas a poster ton projet dans la section "Projet réalisés"
Une petite présentation dans la section dédié serait aussi la bienvenue :) ".

Je sais j'ai l'air  un peu imbécile..... mais je m'adapte vite (Lol).

Donnes moi de plus amples explications et je me ferai une joie de le faire.

pour le code c'est fait.

Je bosse aussi un autre projet d'horizon artificiel (EFIS ou AHRS)

pour lequel je cale sur mon compas (sans processing) que du Arduino Méga ou Due.

Pour l'aéronautique et l'écran TFT  tactile 7" en 800x600 il faut des ressources (lol). 

Encore un grand merci pour ton écoute, Richard.

PS : Les vidéo U=RI sont extras,Claires Nettes et Précises.

Portrait de Walter

Salut, non tu n'a pas du tout l'aire imbécile, on a tous était a ta place, on sait ce que c'est :)

Dans la section "Projet réalisé", tu peux faire un thread dédié a ton projet ou tu peux présenter un petit ou gros descriptif de ton projet, ainsi que divers document pour présenter ton projet.

Cela permet aussi a différent membre de pouvoir te poser des questions sur ton projet ou de l'aide à la mise en place d'un même projet chez eux.

Après il n'y a pas de règle a respecter pour décrire ton projet, tu es complètement libre

Portrait de Amric95

Voici le programme Ruche_V01 auquel j'ajouterai les lignes pour le CAN HX711

et pour l' ESP8266-01. Mon  module ESP8266-01 n'est pas paramètré ni uploader .

Je n'ai jamais fait de code en HTML et il me faudra aussi coder l'application sur

android pour mon téléphone, enfin je crois.

C'est l'ensemble de ce code que je cherche à optimiser car sur du UNO

je ne sais pas s'il y aura assez de place pour les variables et le programme

une fois celui ci sera complet et terminé. merci pour votre aide.

Ruche_V01

// Déclaration des librairies
#include <Wire.h>                               // Port de communication (I2C).
#include <LCD03.h>                           // Inclure bibliothèque LCD03.h (LCD)
#include <Adafruit_BME280.h>          // Capteur BME280.
#include <Adafruit_Sensor.h>             // Température, Humidité et Pression.
#include <DS3231.h>                          // Horloge temps réel (Real Time Clock : RTC).
#include <SD.h>                                  // Gestion du lecteur de la carte SD.
#include <SPI.h>                                 // Port de communication du lecteur de carte SD.
 
// Définitions des constantes.

// Créations des instances pour les modules.
Adafruit_BME280 bme;                       // bme pour le BME280.@I2C 0x76h
DS3231 rtc(SDA, SCL);                      // rtc pour le DS3231.     @I2C 0x68h
LCD03 lcd;                                          // lcd pour le LCD03.      @I2C 0xC6h
File fichierSD;                                     // fichierSD pour le fichier.

// Déclaration des variables globales

unsigned BaseTime = 0;
unsigned long index = 0;
Time t;

// Programme de réglage principal.
void setup() 
{
  Serial.begin(9600);                   // Ouvrir le port série à 9600 Bauds.
  Wire.begin();                             // Ouvrir la communication I2C.
  rtc.begin();                                // Communication à l'adresse I2C du module RTC.
  SD.begin();                               // Communication à l'adresse I2C du lecteur SD. 
  lcd.begin(20, 4);                       // Communication à l'adresse I2C du Lcd en 16 caractères, 4 lignes.
  lcd.backlight();                          // Réglage du rétro éclairage du Lcd.
                   
// POUR LA PREMIERE MISE EN SERVICE PARAMETRAGE DU MODULE RTC.  
                  
  //rtc.setDOW(FRIDAY);                 // Réglage du jour de le semaine.
  //rtc.setTime(18,52,00);                 // Réglage de l'heure au format hh:mm:ss.
  //rtc.setDate(20,03,2020)              // Réglage de la date au formatJJ.MM.AAAA  

// Vérification de la présence du capteur BME280.
  if (!bme.begin(0x76)) 
  {
   lcd.clear();                                     // Effacer le Lcd.
   lcd.setCursor(0,0);                        // Placer le curseur au 1er caractère, 1 ère ligne.
   lcd.print(" BME280 absent.");        // Afficher les caractères entre guillemets.
   lcd.setCursor(0,1);                        // Placer le curseur au 1er caractère, 1 ère ligne.
   lcd.print("Verifiez cablage");          // Afficher les caractères entre guillemets.
   while (1);                                       // Faire tant que (1).
  }
  lcd.setCursor(0,0);                         // Placer le curseur au 1er caractère, 1 ère ligne.
  lcd.print("       LCD Ok       ");         // Afficher les caractères entre guillemets.
  lcd.setCursor(0,1);                         // Placer le curseur au 1er caractère, 1 ère ligne.
  lcd.print("     Capteur Ok     ");        // Afficher les caractères entre guillemets.
  delay(3000);                                   // Attendre 3000 ms (3s).
  
// Création et Ouverture du fichier DATA.CSV mode écriture.  
  fichierSD = SD.open("DATA01.csv",FILE_WRITE);
  
// Écrire les indexs de mesure dans le fichier DATA01. 
  if (fichierSD)
  {
    fichierSD.println("Index,Date,Temps,Masse,Temp_Out,Temp_In,Humi dite,Pression");
    fichierSD.close();                           // Fermeture du fichier DATA01.CSV
  }     
}
// Boucle principale du programme.
void loop() 
{  
// Vérification du temps pour l'échantillonage des mesures. 
  t = rtc.getTime();              // Copier les donnée de temps dans variable t.
  BaseTime = t.min;           // Copier dans BaseTime la valeur contenu dans t.min.
  Serial.println(t.min);
// Récupérer des données pour envoi dans le fichier DATA01. 

// toutes les 5 minutes.
// si BaseTime est égale à une des valeurs. 
  if(BaseTime==0) 
   {                                             
    sampling();                   // Exécuter la fonction sampling.
   }
  if(BaseTime==5) 
   {                                             
    sampling();                    // Exécuter la fonction sampling.
   }
  if(BaseTime==10) 
   {                                             
    sampling();                   // Exécuter la fonction sampling.
   }
  if(BaseTime==15) 
   {                                             
    sampling();                  // Exécuter la fonction sampling.
   }
  if(BaseTime==20) 
   {                                             
    sampling();                  // Exécuter la fonction sampling.
   }
  if(BaseTime==25) 
   {                                             
    sampling();                  // Exécuter la fonction sampling.
   }
  if(BaseTime==30) 
   {                                             
    sampling();                 // Exécuter la fonction sampling.
   }
  if(BaseTime==35) 
   {                                             
    sampling();                // Exécuter la fonction sampling.
   }
  if(BaseTime==40) 
   {                                             
    sampling();              // Exécuter la fonction sampling.
   }
  if(BaseTime==45) 
   {                                             
    sampling();               // Exécuter la fonction sampling.
   }
  if(BaseTime==50) 
   {                                             
    sampling();                // Exécuter la fonction sampling.
   }   
  if(BaseTime==55) 
   {                                             
    sampling();                 // Exécuter la fonction sampling.
   }
// Sinon exécuter la suite du programme.
  else
  {    
    lcd.clear();                               // Effacer le Lcd
    lcd.setCursor(0,0);                  // Placer le curseur au 1er caractère,1 ère ligne.
    lcd.print("Date: ");                    // Afficher les caractères entre guillemets.
    lcd.print(rtc.getDateStr());       // Afficher les variables de date JJ.MM.AAAA
    lcd.setCursor(0,1);                  // Placer le curseur au 1er caractère, 2 eme ligne.
    lcd.print("Time:  ");                  // Afficher les caractères entre guillemets.
    lcd.print(rtc.getTimeStr());       // Afficher les variables de l'heure hh:mm:ss.   
    lcd.setCursor(0,2);                  // Placer le curseur au 1er caractère, 2 eme ligne.
    lcd.print("Temp Out: ");            // Afficher les caractères entre guillemets.
    lcd.print(rtc.getTemp());           // Afficher la variables de température.
    lcd.print(" C");                          // Afficher les caractères entre guillemets.  
    lcd.setCursor(0,3);                   // Placer le curseur au 1er caractère, 1 ère ligne.
    lcd.print("Temp In : ");                     // Afficher les caractères entre guillemets.
    lcd.print(bme.readTemperature());  // Afficher la variable de température en Celsius.
    lcd.print(" C");                                  // Afficher les caractères entre guillemets.
    delay(5000);                                    // Attendre 5s.
    lcd.clear();                                       // Effacer le Lcd.   
    lcd.setCursor(0,0);                          // Placer le curseur au 1er caractère, 2 eme ligne.
    lcd.print("Masse:    37,75");             // Afficher les caractères entre guillemets.
    //lcd.print(mas());                             // Affichage la variable d'humidité.
    lcd.print(" Kg ");                               // Afficher les caractères entre guillemets

    lcd.setCursor(0,1);                          // Placer le curseur au 1er caractère, 2 eme ligne.
    lcd.setCursor(0,1);                          // Placer le curseur au 1er caractère, 2 eme ligne.
    lcd.print("Humidite: ");                     // Afficher les caractères entre guillemets.
    lcd.print(bme.readHumidity());        // Affichage la variable d'humidité.
    lcd.print(" %  ");                               // Afficher les caractères entre guillemets.
    lcd.setCursor(0,2);                          // Placer le curseur au 1er caractère, 1 ère ligne.
    lcd.print("Pression: ");                     // Afficher les caractères entre guillemets.
    lcd.print(bme.readPressure()/100.0F);  // Afficher la variable de pression divisée par 100 pour des hPa.
    lcd.print(" hP");                               // Afficher les caractère entre guillemets.
    delay(5000);                                   // Attendre 5s.
    lcd.clear();// Effacer le Lcd

// PAS NÉCESSAIRE POUR LA RUCHE SAUF EN CAS DE VOL DE LA RUCHE !!!.

// Pas fiable car si la pression change l' altitude change aussi.
    //lcd.setCursor(0,0);                       // Placer le curseur au 1er caractère, 2 eme ligne.
    //lcd.print("Alt : ");                           // Afficher les caractères entre guillemets.
    //lcd.print(bme.readAltitude(SEALEVELPRESSURE_HPA));  //Afficher la variable de Altitude en m.
    //lcd.print(" m");                              // Afficher les caractères entre guillemets.
    //delay(2000);                                 // Attendre 2s.
   }   
}

void sampling ()
{
  Serial.println(BaseTime);
  lcd.clear();                                                  // Effacer le Lcd
  lcd.setCursor(0,0);                                     // Placer le curseur au 1er caractère, 1 ère ligne.
  lcd.print("   Echantionnage  ");                   // Afficher les caractères entre guillemets.
  lcd.setCursor(0,1);                                     // Placer le curseur au 1er caractère, 2 eme ligne.
  lcd.print("    des mesures   ");                     // Afficher les caractères entre guillemets.      
  String date  = String (rtc.getDateStr());      // Récupération de la date.
  String temps  = String (rtc.getTimeStr());   // Récupération du temps.
  float mas = 37.75;                                      // Récupération de la masse.
  float t_out =  rtc.getTemp();                        // Récupération de la température extérieur.
  float t_in = bme.readTemperature();           // Récupération de la température intérieur.
  float hu = bme.readHumidity();                   // Récupération de l'humidité.
  float pr = (bme.readPressure() / 100.0F);   // Récupération de la pression.
  
// Création de la chaîne caractère au format csv.
  String data =
String(index)+","+date+","+temps+","+String(mas)+","+String(t_out)+","+String(t_in)+","+String(hu)+","+String(pr);
  fichierSD = SD.open("DATA01.csv", FILE_WRITE);   //Ouverture en mode écriture du fichier DATA01.csv
// Si fichier ouvert.
  if (fichierSD)
  {
   fichierSD.println(data);               // Écrire les valeurs contenu dans data dans le fichier DATA01.csv
   fichierSD.close();                       // Fermeture du fichier DATA01.
   index++;                                     // Incrémenter  l'index.
  }
  delay(60000);                              // Attendre 1 min.

Tel quel ce programme fonction, je l'ai testé durant deux jours

mais il ne me semble pas optimisé.

Richard.

Portrait de Amric95

Merci Walter.

C'est la première fois que je poste sur un forum

donc je ne sais pas faire ce que tu veux dire par :

" N'hésite pas a poster ton projet dans la section "Projet réalisés"
Une petite présentation dans la section dédié serait aussi la bienvenue :) ".

Je sais j'ai l'ére  un peu imbécile..... mais je m'adapte vite (Lol). Donnes moi de plus ample explications.

et je me ferai une joie de le faire.

pour le code c'est fait.

Encore un grand merci pour ton écoute, Richard.

PS : Les vidéo U=RI son extra. Elles sont claires nette et précise.

Portrait de Anonyme

Je n'ai pas encore fait le tour de tout ton code mais deux choses me sautent aux yeux

  1. à la fin du code il manque une accolade '}' mais je pense que cela vient du copier/coller
  2. dans le setup tu as la ligne : while (1);
  3. qui ne set à rien
  • Le caratère ';' en fin de ligne rend cette instruction sans effet car while ne doit pas être suivit de ce caractère.
  • Heuseusement d'ailleurs car sinon ce serait une boucle infinie car aucune instruction n'est sensé faire sortie de cette boucle.

Tu veux optimiser le code mais à quoi te servent les tests suivi d'affichages comme par exemple :

lcd.print("       LCD Ok       ");
Si ce n'est pas le cas tu n'aurais aucun affichage !

if (!bme.begin(0x76)) 
Est il vraiment nécessaire de donner des instructions comme "Verifiez le cablage"
une seule instruction suffit :
"BME280 : erreur"

tout ce code :

if(BaseTime==0)
   {                                             
    sampling();                   // Exécuter la fonction sampling.
   }
  if(BaseTime==5)
   {                                             
    sampling();                    // Exécuter la fonction sampling.
   }
  if(BaseTime==10)
   {                                             
    sampling();                   // Exécuter la fonction sampling.
   }
  if(BaseTime==15)
   {                                             
    sampling();                  // Exécuter la fonction sampling.
   }
  if(BaseTime==20)
   {                                             
    sampling();                  // Exécuter la fonction sampling.
   }
  if(BaseTime==25)
   {                                             
    sampling();                  // Exécuter la fonction sampling.
   }
  if(BaseTime==30)
   {                                             
    sampling();                 // Exécuter la fonction sampling.
   }
  if(BaseTime==35)
   {                                             
    sampling();                // Exécuter la fonction sampling.
   }
  if(BaseTime==40)
   {                                             
    sampling();              // Exécuter la fonction sampling.
   }
  if(BaseTime==45)
   {                                             
    sampling();               // Exécuter la fonction sampling.
   }
  if(BaseTime==50)
   {                                             
    sampling();                // Exécuter la fonction sampling.
   }   
  if(BaseTime==55)
   {                                             
    sampling();                 // Exécuter la fonction sampling.
   }

peux être remplacer par :

if (BaseTime % 5 == 0) {
sampling();
}

Explication :

la fonction % (modulo) retourne le reste de la division par 5 de BaseTime hors c'est uniquement dans les cas 0,5,10,15,20,25,30,35,40,45,50 et 55 que le reste est égal à 0

exemples

x = 0 % 5;  // retourne "0"
x =1 % 5;   // retourne 1
x = 2 % 5;  // retourne 2
x = 3 % 5;  // retourne 3
x = 4 % 5;  // retourne 4
x = 0 % 5;  // retourne "0"
etc...
Ceux sont des astuces de programmation
Voilà pour le moment ce que j'ai repéré au premier coup d'oeil.

Ces petites choses te ferait gagner de la place pour compléter ton code, comme cela semble être ton souhait !

Portrait de Anonyme

J'ai continué un peu l'analyse de ce code et je me suis rendu compte que la majorité des instructions étaient liées au lcd qui nécessite l'effacement ou non, le positionnement du texte, le ou les textes ou valeurs sur la même ligne :

Il est possible de simplifier tout ceci en utilisant une fonction LCD() comme suit :

void LCD(int Clear, int Caract, int Ligne, String Txt) {
  if (Clear == 1) // on utilse 1 pour effacer et 0 pour ne pas effacer !
    lcd.clear();
  if (Ligne != 100) // ici aussi on utilse 100 comme sans donc si Ligne = 100 ce sera sans positionnement quelque soit Caract !
    lcd.setCursor(Caract, Ligne);
  lcd.print(Txt); // ici on peut concaténer plusieurs textes qui sont sur la même ligne
}

Exemple prit dans ton code :

    lcd.clear();                               // Effacer le Lcd
    lcd.setCursor(0,0);                  // Placer le curseur au 1er caractère,1 ère ligne.
    lcd.print("Date: ");                    // Afficher les caractères entre guillemets.
    lcd.print(rtc.getDateStr());       // Afficher les variables de date JJ.MM.AAAA

Que l'on peut remplacer par :

LCD(1,00,0,"Date: "+String(rtc.getDateStr());

L'instruction String() permet de concaténer des textes avec des "int", des "char" ou des "float"

Ceci multiplié pas le nombre d'affichage cela fait gagner du temps et de la place mémoire !

Voici le code en partie optimisé à vérifier chez toi car je ne possède pas ton matériel, mais la comilation se passe très bien.

Mine de rien j'ai raccourci le code de plus de 60 lignes ...

Le code utilise "Le croquis utilise 24554 octets" et avant optimisation "Le croquis utilise 25140 octets"

Étant donné la faible capacité de mémoire des cartes Arduino UNO c'est un gain de 546 octets !

De surcroît il me semble plus simple plus rapide à écrire et plus intelligible (enfi pour moi !) :o)

Ceci dit je n'ai pas poussé plus avant mais à ta demande je peux essayer de grapiller deux , trois octets par-ci, par-là !

Ceci te permettra de rajouter une liaison WIFI mais pour ce faire j'aurais besoin que tu me donnes tes désirs en la matière !

Tu peux regarder ce tuto qui te peux te donner des idées !

// Déclaration des librairies
#include <Wire.h>                               // Port de communication (I2C).
#include <LCD03.h>                           // Inclure bibliothèque LCD03.h (LCD)
#include <Adafruit_BME280.h>          // Capteur BME280.
#include <Adafruit_Sensor.h>             // Température, Humidité et Pression.
#include <DS3231.h>                          // Horloge temps réel (Real Time Clock : RTC).
#include <SD.h>                                  // Gestion du lecteur de la carte SD.
#include <SPI.h>                                 // Port de communication du lecteur de carte SD.

// Définitions des constantes.

// Créations des instances pour les modules.
Adafruit_BME280 bme;                       // bme pour le BME280.@I2C 0x76h
DS3231 rtc(SDA, SCL);                      // rtc pour le DS3231.     @I2C 0x68h
LCD03 lcd;                                          // lcd pour le LCD03.      @I2C 0xC6h
File fichierSD;                                     // fichierSD pour le fichier.

// Déclaration des variables globales

unsigned int BaseTime = 0;
unsigned long index = 0;
Time t;

// Programme de réglage principal.
void setup()
{
  Serial.begin(9600);                   // Ouvrir le port série à 9600 Bauds.
  Wire.begin();                             // Ouvrir la communication I2C.
  rtc.begin();                                // Communication à l'adresse I2C du module RTC.
  SD.begin();                               // Communication à l'adresse I2C du lecteur SD.
  lcd.begin(20, 4);                       // Communication à l'adresse I2C du Lcd en 16 caractères, 4 lignes.
  lcd.backlight();                          // Réglage du rétro éclairage du Lcd.

  // POUR LA PREMIERE MISE EN SERVICE PARAMETRAGE DU MODULE RTC.

  //rtc.setDOW(FRIDAY);                 // Réglage du jour de le semaine.
  //rtc.setTime(18,52,00);                 // Réglage de l'heure au format hh:mm:ss.
  //rtc.setDate(20,03,2020)              // Réglage de la date au formatJJ.MM.AAAA

  // Vérification de la présence du capteur BME280.
  if (!bme.begin(0x76))
  {
    LCD(1,0,0," BME280 Erreur.");
  }
  delay(3000);                                   // Attendre 3000 ms (3s).

  // Création et Ouverture du fichier DATA.CSV mode écriture.
  fichierSD = SD.open("DATA01.csv", FILE_WRITE);

  // Écrire les indexs de mesure dans le fichier DATA01.
  if (fichierSD)
  {
    fichierSD.println("Index,Date,Temps,Masse,Temp_Out,Temp_In,Humi dite,Pression");
    fichierSD.close();                           // Fermeture du fichier DATA01.CSV
  }
}
// Boucle principale du programme.
void loop()
{
  // Vérification du temps pour l'échantillonage des mesures.
  t = rtc.getTime();              // Copier les donnée de temps dans variable t.
  BaseTime = t.min;           // Copier dans BaseTime la valeur contenu dans t.min.
  Serial.println(t.min);
  // Récupérer des données pour envoi dans le fichier DATA01.

  // toutes les 5 minutes.
  // si BaseTime est égale à une des valeurs.
  if (BaseTime % 5 == 0) {
    sampling();
  }
  else
  {
    LCD(1, 0, 0, "Date: " + String(rtc.getDateStr()));
    LCD(0, 0, 1, "Time:  " + String(rtc.getTimeStr())) ;
    LCD(0, 0, 2, "Temp Out: " + String(rtc.getTemp()) + " C");
    LCD(0, 0, 3, "Temp In : " + String(bme.readTemperature()) + " C");

    // Afficher les caractères entre guillemets.
    delay(5000);                                    // Attendre 5s.
    LCD(1, 0, 0, "Masse:    37,75 Kg");
    LCD(0, 0, 1, "Humidite: " + String(bme.readHumidity()) + " %");
    LCD(0, 0, 2, String(bme.readPressure() / 100.0F) + " hPa");

    delay(5000);                                   // Attendre 5s.
    lcd.clear();// Effacer le Lcd

    // PAS NÉCESSAIRE POUR LA RUCHE SAUF EN CAS DE VOL DE LA RUCHE !!!.

    // Pas fiable car si la pression change l' altitude change aussi.
    //lcd.setCursor(0,0);                       // Placer le curseur au 1er caractère, 2 eme ligne.
    //lcd.print("Alt : ");                           // Afficher les caractères entre guillemets.
    //lcd.print(bme.readAltitude(SEALEVELPRESSURE_HPA));  //Afficher la variable de Altitude en m.
    //lcd.print(" m");                              // Afficher les caractères entre guillemets.
    //delay(2000);                                 // Attendre 2s.
  }
}

void sampling ()
{
  Serial.println(BaseTime);
 
  LCD(1,4,0,"Echantionnage");
  LCD(0,4,1,"des mesures");
  String date  = String (rtc.getDateStr());      // Récupération de la date.
  String temps  = String (rtc.getTimeStr());   // Récupération du temps.
  float mas = 37.75;                                      // Récupération de la masse.
  float t_out =  rtc.getTemp();                        // Récupération de la température extérieur.
  float t_in = bme.readTemperature();           // Récupération de la température intérieur.
  float hu = bme.readHumidity();                   // Récupération de l'humidité.
  float pr = (bme.readPressure() / 100.0F);   // Récupération de la pression.

  // Création de la chaîne caractère au format csv.
  String data =
    String(index) + "," + date + "," + temps + "," + String(mas) + "," + String(t_out) + "," + String(t_in) + "," + String(hu) + "," + String(pr);
  fichierSD = SD.open("DATA01.csv", FILE_WRITE);   //Ouverture en mode écriture du fichier DATA01.csv
  // Si fichier ouvert.
  if (fichierSD)
  {
    fichierSD.println(data);               // Écrire les valeurs contenu dans data dans le fichier DATA01.csv
    fichierSD.close();                       // Fermeture du fichier DATA01.
    index++;                                     // Incrémenter  l'index.
  }
  delay(60000);
  // Attendre 1 min.
}

void LCD(int Clear, int Caract, int Ligne, String Txt) {
  if (Clear == 1) // on utilse 1 pour effacer et 0 pour ne pas effacer !
    lcd.clear();
  if (Ligne != 100) // ici aussi on utilse 100 comme sans donc si Ligne = 100 ce sera sans positionnement quelque soit Caract !
    lcd.setCursor(Caract, Ligne);
  lcd.print(Txt); // ici on peut concaténer plusieurs textes qui sont sur la même ligne
}

Portrait de Amric95

Bonjour et un très grand merci à toi wolfram69.

Super, Je suis impressionné par ta relativité et tes modifs des lignes de programme

que je pense avoir comprises sauf pour la fonction Lcd, bref si cela fonctionne,

je reprendrai ça à tête reposée.

Je test ça au plus vite et ne m'manquerai pas de te tenir au courant.

Un grand merci pour ta participation

@+.

Portrait de Amric95

 Re bonjour wolfram69.

Alors le code fonctionne du feu de Dieu.

j'ai bien enfin compris la fonction LCD.

et j'ai enlevé les lignes unsigned BaseTime = 0; et BaseTime = t.min;

car avec if (t.min % 5 == 0) cela fonction tout aussi bien.

Je vais donc passer à un echantionnage toutes les 10 minutes en changent :

if (t.min % 5 == 0) par if (t.min % 10 == 0), Je teste ça

Concernant le ESP 8266 01 je souhaite que l'on puisse se connecter dessus

comme sur un serveur HTTP afin d'y visualiser :

La date, l'heure, la température extérieur, la température intérieur,la masse, l'humidité et la pression.

Mais aussi pouvoir la récupération les Data sauvegardées dans la carte SD au format .csv

et l'effacer  les data ou pas. Et peu être récupérer le temps sur internet afin de me débarrasser du DS3231.

je me mets de suis en route sur le connexion de mon ESP sur mon Arduino.

Encore un grand merci à toi. The King Of the Code (Lol).

Bien à toi, Richard.

Portrait de Jetfuzz

Hello
Ah ah un apiculteur, je vais suivre ton projet de près.
moi ca fait deux ans que je suis dessus de temps a autre, mais uniquement pour la mesure du poids.
pareil avec un HX711 et deux jauges de contrainte de 100Kg chacune, et un afficheur Oled.
le but etant de faire une transmission en lora ou sigfox.
par contre pour le BME280  a l'interieur de la ruche, j'ai des amis qui on essayé, mais les abeilles le propolisent en moins de temps qu'il faut pour le dire, et devient inopérant du moins pour la pression et l'humidité.
Cordialement
Jetfuzz

Portrait de Amric95

Bonjour Jetfuzz.

Fuzz pour la guitare ? Lol.

Non je ne suis pas apiculteur Electrotechnicien (CAP d'éléctricien de base).

je développe ce projet pour soutenir et venir en aide à 2 lycéens en Bac STI-2D

qui souhaitent présenter un projet de ce type.

Merci à toi pour les infos concernant les problèmes de propolis sur le capteur.

Pour le HX711 j'ai du code qui fonctionne assez bien et j'ai un très bon ami

qui a travaillé dans le pesage en tant que directeur technique,

il m'a expliqué beaucoup de choses dans ce domaine.

Je px aussi te montrer des photos des mes différentes réalisations de pesage.

Bien à toi, Richard.

Portrait de Amric95

Bonsoir à tous.

Voila je viens de terminer le programmation de la Ruche Connectée V2.

Ce programme intègre les corrections apportées par wolfram69,

ainsi qu'un capteur de flexion connecté à l'arduino UNO via le CAN HX711.

Ce croquis utilise 26168 octets soit 81% de l'espace programme

et 1436 octets soit 70% de mémoires dynamique,

en espérant que cela suffira pour la gestion de l'ESP,

sinon je passerai sur une carte Mega.

J'ai aussi paramètré mon ESP8266-01 donc voici une copie.

Est-il nécessaire d'uploadder l'ESP et si oui pourquoi ?

Maintenant je suis un peu bloqué sur mon projet car je n'ai jaimais travaillé

avec l'ESP8266-01 et en HTML.

je vais, bien sur quand même essayer et lire le poste que wolfram69, m'a conseillé d'aller voir.

Enfin, toute aide sera la bienvenue.

Bonne nuit à tous, Richard. @+.

Configuration de l' ESP8266-01.

AT+RST            // Reset du module ESP8266-01.
Reponse de ESP8266-01 : 
OK

AT+CWMODE=3             // Config du module ESP8266-01 en mode 3 (client & serveur).
Reponse de ESP8266-01 : 
ready AT+CWMODE=3 OK

AT+CWLAP                // Decouverte des reseaux Wifi.
Reponse de ESP8266-01 :
+CWLAP:(3,"Livebox-00C0",-50,"7c:26:64:5e:00:c0",6,-14,0) OK

AT+CWJAP="Livebox-00C0","!!!!!!!!!!!!!!!!!!!!!!!!!!​" // Connexion au réseau souhaité.
Reponse de ESP8266-01 : 
AT+CWJAP="Livebox-00C0","!!!!!!!!!!!!!!!!!!!!!!!!!!" 
WIFI CONNECTED
WIFI GOT IP
OK

AT+CIFSR            // Lecture des @ réseaux attribués à ESP8622-01
Reponse de ESP8266-01 : 
+CIFSR:APIP,"192.168.4.1"                  // @ du Serveur ESP8266-01.
+CIFSR:APMAC,"3e:71:bf:25:f5:a7"    // @ MAC du serveur ESP8266-01.
+CIFSR:STAIP,"192.168.1.14"             // @ du Client ESP8266-01
+CIFSR:STAMAC,"3c:71:bf:25:f5:a7" // @ MAC  du client ESP8266-01.
OK

AT+CIOBAUD=9600            // Pour le réglage de la vitesse de transfert

 //  *** Ruche_V02 ***

// 1 Carte Arduino UNO.

 // 1 Capteur de flexion SCAIME Ref : AG75 C3 SH 5e F (75 Kgs sur 3000 points). 
 // Alim + Marron (in 1)  -> HX711 E+   Entrée 1 du pour de wheatston.
 // Alim - Vert      (in 2)   ->  HX711 E-   Entrée 2 du pour de wheatston.
 // Compensation - NC
 // Compensation + NC
 // Sig - Blanc     (out2)  -> HX711 A-   Sortie 2 du pour de wheatston.
 // Sig + Jaune   (out1)  -> HX711 A+   Sortie 1 du pour de wheatston.

 
//***************************** Connexions des modules *****************************
//         1 CAN HX711                 1 Capteur BME280             1 Horloge RTC         
//      Arduino => HX711            Arduino => BME280          Arduino => DS3231     
//          GND ->  GND                    Gnd -> Gnd                        Gnd -> Gnd            
//             5v  ->  5v                             5v -> 5v                               5v -> 5v              
//         Pin 2 -> SCK         Pin A4 SDA -> SDA            Pin A4 SDA -> SDA     
//         Pin 3 -> DOUT       Pin A5 SCL -> SCL            Pin A5 SCL -> SCL     
//
//       1 Afficheur Lcd I2C        1 Lecteur de carte SD
//          Arduino => LCD03          Arduino => Carte SD
//                Gnd -> Gnd                      GND ->  GND
//                  5v -> 5v                              5v  ->  5v
//    Pin A4 SDA -> SDA                 pin 10 ->  CS
//    Pin A5 SCL -> SCL                  pin 11 ->  MOSI
//                                                        pin 12 ->  MISO
//                                                        pin 13 ->  CLK
//***************************************************************************************

// Déclaration des librairies
#include <Wire.h>                  // Port de communication (I2C).
#include <LCD03.h>                 // Inclure bibliothèque LCD03.h (LCD).
#include <Adafruit_BME280.h>    // Capteur BME280.
#include <Adafruit_Sensor.h>       // Température, Humidité et Pression.
#include <DS3231.h>               // Horloge temps réel (Real Time Clock : RTC).
#include "HX711.h"               // Convertiseur Analogique Numérique(CNA)
#include <SD.h>                    // Gestion du lecteur de la carte SD.
#include <SPI.h>                   // Port de communication du lecteur de carte SD.

// Définitions des constantes.
#define SCK 2           // choix de la pin SCK pour le HX711.
#define DOUT 3          // choix de la pin DOUT pour le HX711.
#define calibration_factor 3260.0 // Cette valeur est obtenu via le Prog Calibration
// cette variable devra être changé si on utilise tout autre capteur de flexion.

   
// Créations des instances pour les modules.
DS3231 rtc(SDA, SCL);  // rtc pour le DS3231    @I2C 0x68h.
Adafruit_BME280 bme;   // bme pour le BME280 @I2C 0x76h.
LCD03 lcd;                         // lcd pour le LCD03      @I2C 0xC6h.
HX711 scale;                     // sclale pour le HX711 en pin2 et pin3.
File fichierSD;                    // fichierSD pour le fichier.

// Déclaration des variables globales.
unsigned long index = 0; // Variable index non signée longue.
float jauge = 0;                 // Céer la variable à virgule et signée Jauge avec la valeur 0.
Time t;                              // !!! Pas compris !!!

// Programme principal d'initialisation.
void setup() 
{
  Serial.begin(9600);    // Ouvrir le port série à 9600 Bauds.
  Wire.begin();           // Ouvrir la communication I2C.
  rtc.begin();            // Communication à l'adresse I2C du module RTC.
  SD.begin();             // Communication à l'adresse I2C du lecteur SD.
  lcd.begin(20, 4);       // Communication à l'adresse I2C du Lcd en 16 caractères, 4 lignes.
  lcd.backlight();        // Réglage du rétro éclairage du Lcd.

  // POUR LA PREMIERE MISE EN SERVICE, PARAMETRAGE DU MODULE RTC.
  //rtc.setDOW(SUNDAY);    // Réglage du jour de le semaine.  
  //rtc.setDate(29,03,2020);     // Réglage de la date au formatJJ.MM.AAAA  
  //rtc.setTime(12,40,00);       // Réglage de l'heure au format hh:mm:ss.
  
  // Vérification de la présence du capteur BME280.
  if (!bme.begin(0x76))               // Si BME différent de 0x76 sinon le Prog continu.
  {
    LCD(0,0,0," BME280 Erreur."); // Appel la fonction d'affichage LCD.
  }                                         // Attention la fonction LCD est différent du module Lcd.
  delay(3000);                         // Attendre 3000 ms (3s).

  // Création et ouverture du fichier DATA01V2.CSV mode écriture.
  fichierSD = SD.open("DATA01V2.csv", FILE_WRITE);

  // Écrire les indexs de mesure dans le fichier DATA01V2.
  if (fichierSD)
  {
    fichierSD.println("Index,Date,Temps,Masse,Temp_Out,Temp_In,Humidite,Pression");
    fichierSD.close();   // Fermeture du fichier DATA01V2.CSV
  }  
}

// Boucle principale du programme.
void loop()
{
  // Gestion de la pesé.
  t = rtc.getTime();                  // Copier les donnée de temps dans variable t.
  scale.power_up();                 // HX711 mode travail.
  jauge = scale.get_units(10);  // Copier la valeur moyenne des 10 mesures de masse ds la Variable jauge.
  jauge = jauge / 10;               // Copier ds jauges la valeur de jauge divisée par 10 pour obtenir des Kgs.
  scale.power_down();            // HX711 mode veille.

  // Vérification du temps pour l'échantillonage des mesures, toutes les 10 minutes. 
  // Changer la valeurs 10 pour modifier la base de temps.
  // Récupérer des données pour envoi dans le fichier DATA01V2. 
  if (t.min % 10 == 0)          // Si t.min divisée par 10 egale 0 (Modulo).
  {
    sampling();                    // Appel la fonction samplig (échantionnage).
  }
  else                                // Sinon éxecuter la suite du programme.
  {
    LCD(1, 0, 0, "Date: " + String(rtc.getDateStr()));  // Appel de la fonction LCD pour la date.
    LCD(0, 0, 1, "Time:  " + String(rtc.getTimeStr())) ;// Appel de la fonction LCD pour l'heure.
    LCD(0, 0, 2, "Temp Out: " + String(rtc.getTemp()) + " C");// Appel de la fonction LCD pour la température ext.
    LCD(0, 0, 3, "Temp In : " + String(bme.readTemperature()) + " C");// Appel de la fonction LCD pour la température int.
    delay(5000);                    // Attendre 5s.

    // Afficher les caractères entre guillemets + les valeurs contenus dans les variables stings. 
    LCD(1, 0, 0, "Masse:    " + String(jauge)+ " Kgs"); // Appel de la fonction LCD pour la masse.
    LCD(0, 0, 1, "Humidite: " + String(bme.readHumidity()) + " %");  // Appel de la fonction LCD pour l'humidité. 
    LCD(0, 0, 2, "Pression: " +String(bme.readPressure() / 100.0F) + " hP");  // Appel de la fonction LCD pour la pression.
    delay(5000);                  // Attendre 5s.
    lcd.clear();                    // Effacer le Lcd.
  }
}

// Fonction d'échantionnage (sampling).
void sampling ()                  // aucne variable d'entrée pour le fonction.  
{
  LCD(1,4,0,"Echantionnage");              // Appel de la fonction pour LCD les caracères entre guillemets.
  LCD(0,5,1,"des mesures");                // Appel de la fonction pour LCD les caracères entre guillemets.   
  String date  = String (rtc.getDateStr());  // Récupération de la date.
  String temps  = String (rtc.getTimeStr()); // Récupération du temps.
  float mas = jauge;                       // Récupération de la masse.
  float t_out =  rtc.getTemp();              // Récupération de la température extérieur.
  float t_in = bme.readTemperature();  // Récupération de la température intérieur.
  float hum = bme.readHumidity();        // Récupération de l'humidité.
  float pres = (bme.readPressure() / 100.0F);  // Récupération de la pression.
  // Création de la chaîne caractère au format csv.
  String data = String(index) + "," + date + "," + temps + "," + String(mas) + "," + String(t_out) + "," + String(t_in) + "," + String(hum) + "," + String(pres);
  // Ouverture du fichier DATA01V2.csv en mode écriture.
  fichierSD = SD.open("DATA01V2.csv", FILE_WRITE);  
  // Si fichier ouvert.
  if (fichierSD) 
  {
    fichierSD.println(data);    // Écrire les valeurs contenu dans data dans le fichier DATA01V2.csv
    fichierSD.close();           // Fermeture du fichier DATA01V2.csv
    index++;                         // Incrémenter  l'index.
  }
  delay(60000);                  // Attendre 1 minute.
  
}

// Fonction d'affichage LCD
void LCD(int Clear, int Caract, int Ligne, String Txt)  // Variable d'entrée : effacer, decalage à droite, ligne et texte.
{
  if (Clear == 1)       // On utilse 1 pour effacer et 0 pour ne pas effacer !
    lcd.clear();            // Effacer l'afficheur lcd.
  if (Ligne != 100)     // Ici aussi on utilse 100 comme sans donc si Ligne = 100 ce sera sans positionnement quelque soit le decalage !
    lcd.setCursor(Caract, Ligne);     // Placer le curseur au décalage et à la ligne voulu.
    lcd.print(Txt);       // Ici on peut concaténer plusieurs textes qui sont sur la même ligne.
}

Portrait de Amric95

Bonjour à tous.

J'ai essayé de programmer l'ESP8266 et la page HTML avec ce que j'ai pu glaner sur le net

mais rien ni fait, je n'y arrive pas car je pense avoir trop de lacunes dans ce domaine (je découvre).

Bref, je joins la derniére mouture du programme Ruche_V3 qui intégre le dernier module, l' ESP8266.

 // 1 Carte Arduino UNO.

 // 1 Capteur de flexion SCAIME Ref : AG75 C3 SH 5e F (75 Kgs sur 3000 points). 
 // Alim + Marron (in 1) -> HX711 E+   Entrée 1 du pour de wheatston.
 // Alim - Vert       (in 2) -> HX711 E-   Entrée 2 du pour de wheatston.
 // Compensation - NC
 // Compensation + NC
 // Sig - Blanc     (out2) -> HX711 A-   Sortie 2 du pour de wheatston.
 // Sig + Jaune   (out1) -> HX711 A+   Sortie 1 du pour de wheatston.

 
//*********************** Connexions des modules **************************** 
//         1 CAN HX711         1 Capteur BME280                 1 Horloge RTC         
//      Arduino => HX711      Arduino => BME280             Arduino => DS3231     
//          GND ->  GND              Gnd -> Gnd                         Gnd -> Gnd            
//             5v  ->  5v                     5v -> 5v                               5v -> 5v              
//         Pin 2 -> SCK      Pin A4 SDA -> SDA           Pin A4 SDA -> SDA     
//         Pin 3 -> DOUT    Pin A5 SCL -> SCL            Pin A5 SCL -> SCL     
//
//    1 Afficheur Lcd I2C   1 Lecteur de carte SD                1 ESP8266-01
//      Arduino => LCD03      Arduino => Carte SD          Arduino => ESP8266-01  
//          Gnd -> Gnd                GND ->  GND                    GND ->  GND
//              5v -> 5v                     5v  ->  5v                           5v  ->  5v 
//   Pin A4 SDA -> SDA         pin 10 ->  CS                          5v  ->  CH_PD
//   Pin A5 SCL -> SCL          pin 11 ->  MOSI                  pin 10 -> TX
//                                         pin 12 ->  MISO                  pin 11 -> TX        
//                                         pin 13 ->  CLK
//***************************************************************************
// Déclaration des librairies
#include <Wire.h>             // Port de communication (I2C).
#include <LCD03.h>            // Inclure bibliothèque LCD03.h (LCD)
#include <Adafruit_BME280.h>  // Capteur BME280.
#include <Adafruit_Sensor.h>  // Température, Humidité et Pression.
#include <DS3231.h>           // Horloge temps réel (Real Time Clock : RTC).
#include "HX711.h"            // Convertiseur Analogique Numérique(CNA)
#include <SD.h>               // Gestion du lecteur de la carte SD.
#include <SPI.h>              // Port de communication du lecteur de carte SD.
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiServer.h>

// Définitions des constantes.
#define SCK 2   // choix de la pin SCK pour le HX711.
#define DOUT 3  // choix de la pin DOUT pour le HX711.
#define ssid      "Liveboxe-00C0"       // WiFi SSID.
#define password  "!!!!!!!!!!!!!!!!!!!!!!"  // WiFi password
//SoftwareSerial ESP8266(10, 11);
#define calibration_factor 3260.0 // Cette valeur est obtenu via le Prog de Calibration.
// cette variable devra être changé si on utilise tout autre capteur de flexion      

// Créations des instances pour les modules.
Adafruit_BME280 bme;  // bme pour le BME280 @I2C 0x76h.
DS3231 rtc(SDA, SCL); // rtc pour le DS3231 @I2C 0x68h.
LCD03 lcd;            // lcd pour le LCD03  @I2C 0xC6h.
HX711 scale;          // sclale pour le HX711.
File fichierSD;       // fichierSD pour le fichier.

// Déclaration des variables globales.
unsigned long index = 0; // Variable index non signée longue.
float jauge = 0; // Céer la variable Jauge avec la valeur 0.

Time t;                  // PAS COMPRIS

// Programme de réglage principal.
void setup() 
{
  Serial.begin(9600); // Ouvrir le port série à 9600 Bauds.
  Wire.begin();       // Ouvrir la communication I2C.
  rtc.begin();        // Communication à l'adresse I2C du module RTC.
  SD.begin();         // Communication à l'adresse I2C du lecteur SD.
  lcd.begin(20, 4);   // Communication à l'adresse I2C du Lcd en 16 caractères, 4 lignes.
  lcd.backlight();    // Réglage du rétro éclairage du Lcd.

  // POUR LA PREMIERE MISE EN SERVICE PARAMETRAGE DU MODULE RTC.
  //rtc.setDOW(SUNDAY);      // Réglage du jour de le semaine.  
  //rtc.setDate(29,03,2020); // Réglage de la date au formatJJ.MM.AAAA  
  //rtc.setTime(12,40,00);   // Réglage de l'heure au format hh:mm:ss.
  
  // Vérification de la présence du capteur BME280.
  if (!bme.begin(0x76))           // Si BME différent de 0x76 sinon le Prog continu.
  {
    LCD(1,0,0,"BME280 Erreur."); // Appel la fonction LCD
  }
  delay(3000);                    // Attendre 3000 ms (3s).
  
  scale.begin(DOUT, SCK); //Paramètrage DOUT, SCK, et GAIN (evite d'ajouter scale.set_gain (1);)
  scale.set_scale(calibration_factor); //This value is obtained by using the SparkFun_HX711_Calibration sketch
  scale.tare ();
  //scale.get_units();
  //scale.read();
  
  WiFi.begin ( ssid, password );
  // Attente de la connexion au réseau WiFi / Wait for connection
  while ( WiFi.status() != WL_CONNECTED ) 
    {
     delay(500); Serial.print ( "." );
    }
  // Connexion WiFi établie / WiFi connexion is OK
  Serial.println ( "" ); 
  Serial.print ("Connected to"); Serial.println ( ssid );
  Serial.print ("IP address: "); Serial.println ( WiFi.localIP() );

  // On branche la fonction qui gère la premiere page / link to the function that manage launch page 
  server.on ( "/", handleRoot );

  server.begin();
  Serial.println ("HTTP server started");

  // Création et ouverture du fichier DATA01V2.CSV mode écriture.
  fichierSD = SD.open("DATA01V2.csv", FILE_WRITE);

  // Écrire les indexs de mesure dans le fichier DATA01V2.
  if (fichierSD)
  {
    fichierSD.println("Index,Date,Temps,Masse,Temp_Out,Temp_In,Humidite,Pression");
    fichierSD.close();   // Fermeture du fichier DATA01V2.CSV
  } 
}
// Boucle principale du programme.
void loop()
{
  // Vérification du temps pour l'échantillonage des mesures,n
  // toutes les 10 minutes. Changer la Valeurs 10 pour modifier la base de temps.
  // Récupérer des données pour envoi dans le fichier DATA01V2.
  t = rtc.getTime();           // Copier les donnée de temps dans variable t.
  scale.power_up();            // HX711 mode travail.
  jauge = scale.get_units(10); // Copier la valeur moyenne des 10 mesures de masse ds la Variable jauge.
  jauge = jauge / 10;          // Copier ds jauges la valeur de jauge divisée par 10 pour obtenir des Kgs.
  scale.power_down();          // HX711 mode veille. 
  if (t.min % 10 == 0)         // Si t.min divisée par 10 egale 0 (Modulo).
  {
    sampling();                // Alors appel la fonction samplig (échantionnage).
  }
  else                      //Sinon éxecute la suite du programme.
  {
    LCD(1, 0, 0, "Date: " + String(rtc.getDateStr()));  // Appel de la fonction affichage pour la date.
    LCD(0, 0, 1, "Time: " + String(rtc.getTimeStr()));  // Appel de la fonction affichage pour l'heure.
    LCD(0, 0, 2, "Temp Out: " + String(rtc.getTemp()) + " C");// Appel de la fonction affichage pour la température ext.
    LCD(0, 0, 3, "Temp In : " + String(bme.readTemperature()) + " C");// Appel de la fonction affichage pour la température int.
    delay(5000);            // Attendre 5s.

    // Afficher les caractères entre guillemets. 
    LCD(1, 0, 0, "Masse:    " + String(jauge)+ " Kgs"); // Appel de la fonction affichage pour la masse.
    LCD(0, 0, 1, "Humidite: " + String(bme.readHumidity()) + " %");  // Appel de la fonction affichage pour l'humidité. 
    LCD(0, 0, 2, "Pression: " + String(bme.readPressure() / 100.0F) + " hP");  // Appel de la fonction affichage pour la pression.
    delay(5000);            // Attendre 5s.
    lcd.clear();            // Efface le Lcd.

    server.send(200,"text/html",String getPage());

    // PAS NÉCESSAIRE POUR LA RUCHE SAUF EN CAS DE VOL DE LA RUCHE !!!.
    // Pas fiable car si la pression change l' altitude change aussi.
    // Donc pour mémoire (on ne sait jamais en cas de besoin).
    //lcd.setCursor(0,0);   // Placer le curseur au 1er caractère, 2 eme ligne.
    //lcd.print("Alt : ");  // Afficher les caractères entre guillemets.
    //lcd.print(bme.readAltitude(SEALEVELPRESSURE_HPA));  //Afficher la variable de Altitude en m.
    //lcd.print(" m");      // Afficher les caractères entre guillemets.
    //delay(2000);          // Attendre 2s.
  }
}

// Fonction d'échantionnage (sampling).
void sampling ()              // aucne variable d'entrée pour le fonction.  
{
  LCD(1,4,0,"Echantionnage"); // Appel de la fonction pour afficher les caracères entre guillemets.
  LCD(0,5,1,"des mesures");   // Appel de la fonction pour afficher les caracères entre guillemets.   
  String date  = String (rtc.getDateStr());  // Récupération de la date.
  String temps  = String (rtc.getTimeStr()); // Récupération du temps.
  float mas = jauge;                         // Récupération de la masse.
  float t_out =  rtc.getTemp();              // Récupération de la température extérieur.
  float t_in = bme.readTemperature();        // Récupération de la température intérieur.
  float hum = bme.readHumidity();             // Récupération de l'humidité.
  float pres = (bme.readPressure() / 100.0F);  // Récupération de la pression.
  // Création de la chaîne caractère au format csv.
  String data = String(index) + "," + date + "," + temps + "," + String(mas) + "," + String(t_out) + "," + String(t_in) + "," + String(hum) + "," + String(pres);
  // Ouverture en mode écriture du fichier DATA01V2.csv
  fichierSD = SD.open("DATA01V2.csv", FILE_WRITE);  
  // Si fichier ouvert.
  if (fichierSD) 
  {
    fichierSD.println(data); // Écrire les valeurs contenu dans data dans le fichier DATA01V2.csv
    fichierSD.close();       // Fermeture du fichier DATA01V2.csv
    index++;                 // Incrémenter  l'index.
  }
  delay(60000);              // Attendre 1 minute.
  
}

// Fonction d'affichage LCD
void LCD(int Clear, int Caract, int Ligne, String Txt)  // Variable d'entrée : effacer, decalage à droite, ligne et texte.
{
  if (Clear == 1)   // On utilse 1 pour effacer et 0 pour ne pas effacer !
    lcd.clear();    // Effacer l'afficheur lcd.
  if (Ligne != 100) // Ici aussi on utilse 100 comme sans donc si Ligne = 100 ce sera sans positionnement quelque soit le decalage !
    lcd.setCursor(Caract, Ligne); // Placer le curseur au décalage et à la ligne voulu.
    lcd.print(Txt);   // Ici on peut concaténer plusieurs textes qui sont sur la même ligne.
}

// Contruction de la page en HTML
String getPage()
{
  String page = "<html lang=fr-FR><head><meta http-equiv='refresh' content='10'/>";
  page += "<title>Ruche connectée - Lycée Marcel CACHIN</title>";
  page += "<style> body { background-color: #fffff; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }</style>";
  page += "</head><body><h1>Ruche connectée</h1>";
  page += "<h3> Capteur BME 280</h3>";
  page += "<ul><li>Temperature : ";
  page += bme.readTemperature();
  page += "°C</li>";
  page += "<li>Tx d'humiditè : ";
  page += bme.readHumidity(;
  page += "<li>Pression atmospherique : ";
  page += bme.readPressure();
  page += " hPa</li></ul>";
  page += "%</li></ul><h3>Capteur de flexion</h3>";
  page += "<li>Masse de la ruche : ";
  page += jauge;
  page += " Kgs</li></ul>";
  page += "<br><br><p><a hrf='https://www.amric.fr'>Designed by Amric</p>";
  page += "</body></html>";
  return page;
}
 

Toute aide sera la bienvenue.

Bien à vous,. @+

Richard.

PS : en pièce jointe, voici le genre page HTML que je souhaite faire, bien sur sans la commande de la led

ceci serai remplacer en haut de la page par la Date et l'heure.

Portrait de Jetfuzz

Hello.

Je suis aussi novice en code, mais une fonction qui peux être intéressante serait d'envoyer un notif si la ruche perd en peu de temps un bon kilo voir plus, cela voudrais dire que la ruche a essaimée !!

Portrait de Amric95

Bonjour Jetfuzz.

Oui bien sur, tout est possible, mais j'ai besoin d'une base de programme fiable pour y ajouté les options

que des personnes avisés comme toi pourrai me faire remonter.

Je résume :

- Pb de Propolis sur le capteur BME 280.

- et variation de poids dû à l'essaimage ou autre, bref une alerte.

Bien, bien. Je te remercie pour tes pertinentes remarques.

Es-tu de la partie (apiculture) pour être aussi alerte ? 

si tu as tu vois d'autre problème je suis preneur.

Merci, bien à toi. @+, Richard.

Portrait de Jetfuzz

hello

regarde mon avatar, c'est mon doigt, et mes abeilles....

Portrait de Amric95

Ok Jetfuzz super, tout s'explique je n'avais pas fait attention à la photo de ton avatar.

tant mieux, j'ai donc quelqu'un de la parti avec qui je pourrai peaufiner les détails.

n'hésite pas à me tenir informé de ta réflexion sur ce sujet, qui je dois le dire me passionne aussi.

Dis moi es tu déjà équipé de ce type de de surveillance pour tes abeilles.

moi je sur département du 95, tes ruches se situe où ?

Les Abeilles c'est la VIE.

A bientôt.

Portrait de Walter

voici une page HTML simple, qui correspond a ce que tu veux.
Il faut que tu remplace  {TEMPERATUREDHT22}, {HUMIDITYDHT22} {BMP180} par les valeurs sauvegardées

<!DOCTYPE html>

<html>

<head>

<style>

button {

background-color: rgb(170, 202, 59);

border-color: rgb(140, 181, 23);

border-radius: 4px;

border-width: 0.916667px;

color: rgb(255, 255, 255);

display: inline-block;

margin: 5px;

text-align: center;

vertical-align: middle;

white-space: nowrap;

}

label {

float: left;

}

div {

text-align: right;

clear: both;

}

</style>

<title>ESP Demo</title>

</head>

<body>

<H1>DHT22</H1>

<ul>

<li>

<label>Température:</label><label>{TEMPERATUREDHT22}°C</label>

</li>

<li>

<label>Humidité:</label><label>{HUMIDITYDHT22}%</label>

</li>

</ul>

<H1>BMP180</H1>

<ul>

<li>

<label>Pression atmosphérique:</label><label>{BMP180}mbar</label>

</li>

</ul>

<button onclick="document.location.reload(true);">Actualiser</button>

</body>

</html>

Mais personnellement je ferais plutôt un envoi des données sur un site WEB, pour pouvoir les consultées a loisir, sans faire intervenir ta sonde.
Par exemple pour ma sonde j'utilise le protocole MQTT et le service MyDevices

Portrait de Amric95

Bonjour Walter.

Pour commencé Merci ta relativité et ces lignes de code.

1°) Px tu  m'indiquer ou je dois placer tes lignes de progs, Setup, Boucle ou dois-je crée une fonction ?

2°) je ne comprends pas ce que tu vx dire par "Mais personnellement je ferais plutôt un envoi des données sur un site WEB, pour pouvoir les consultées a loisir, sans faire intervenir ta sonde.
Par exemple pour ma sonde j'utilise le protocole MQTT et le service MyDevices"

3°) est ce que cele vx dire que je ne pourrais pas consulter la page HTTP à l'adresse de mon ESP.

4°) Comment puise-je ajouter la Date et L'heure en haut centré sur la page ?

Bon quoi qu'il en soit j'essaie ça et te tien au jus.

Merci. Richard.

Portrait de Walter

1°) cela dépend de comment tu veux procéder, soit il faut l'insère en tant que chaînes de caractère, soit tu peux le placer en tant que fichier.
Dans ton code cela correspond a une chaine de caractères, c'est la section qui commence par 'String page = "<html lang=fr-FR><head><meta http-equiv='refresh' content='10'/>";'

2°) c'est a dire que l'on c'est ton ESP qui fait serveur WEB, moi ma sonde envoi des données(via le protocole MQTT) à un serveur de donnée(hebergé par myDevices)
mais je ne suis pas sûre que cela soit aproprié a ton cas, il faut un accès à internet

3°) pas du tout, tu peux tout a fait utiliser l'ESP en mode serveur.

4°) tu ne peux pas comme ça, ton ESP est en mode serveur, il n'a donc pas accès a internet pour connaître l'heure.
Il faudrait rajouter un RTC pour sauvegarder l'heure. Il faudra dans ce cas régler l'heure une première fois avec un programme que tu utilisera qu'une seul fois, que pour ça, avant de charger ton programme définitif.

Portrait de Amric95

Bonjour et merci Walter.

La version Ruche_V02 fonctionne très bien, j'ai donc toutes informations souhaitées sous forme de variables ou sur mon afficheur Lcd 20x4.

Je suis actuellement chez moi en phase de test sur mon prototype et j'ai donc un accès internet via ma box.

A terme ce montage sera dans une boite de dérivation avec un couvercle transparent sur le Ruche du Lycée Marcel CACHIN à Saint Ouen (93) et connectée à une liaison internet via une box TPLink. Deplus je pense lui adjoindre une batterie et un petit panneau photovomtaïque.

Mon ESP se connecte bien a ma box, je l'ai paramètré via les commande AT comme je l'ai vu dans la vidéo U=RI. c'est le première fois que travail avec l'ESP8266. Mon ESP a bien les deux adresses client et serveur.

Dois uploader mon ESP comme vu dans la seconde vidéo U=RI si oui pourquoi ? ou la page HTML sera t elle envoyé par l'arduino durant son fonctionnement ?

la page HTML doit elle etre televersé dans l'ESP ou celle-ci sera-t-ele envoyée à l'ESP via l'arduino ?

Comment puis-je vous faire parvenir une petite vidéo de mon prototype en fonctionnement, histoire de gagner du temps ?

J'ai toutes les informations voulu sous forme de variables ou via mon afficheur Lcd 20x4. Donc puis rajouter le Date et l'heure en haut et au centre de la page HTML ? Et à terme je récupererai lla date est l'heure via un serveur de temps sur le net.

Encore merci, Bien à toi. Richard.

Portrait de Anonyme

Pour contrôler le poids d'un solide il faut au minimum 3 jauges de contrainte sauf dans le cas improbable ou ce solide serait pendu en un point ! Avec moins de jauges il te faudra au moins un pied supplémentaire pour former le fameux polygone de sustentation au dessus duquel sera placer le centre de gravité de ta ruche ! Pour déterminé le poids il te suffira alors de faire la somme des trois valeurs fournies par les Jauges !

Dixit Wikipédia :" En mécanique du solide, on appelle surface de sustentation, également polygone de sustentation, la surface sur laquelle la projection orthogonale du centre de gravité d'un solide sur le sol, ou sur un support, doit se trouver pour garantir l'équilibre. "

Ce pied supplémentaire ne pourra pas te donner la valeur de la charge qu'il supporte car la position du centre de gravité de ta ruche ne sera jamais constant.

La liaison WIFI pour obtenir les différentes mesures et le téléchargement des enregistrements ne pose pas de problème particilier, mais il vaut mieux utiliser une carte Arduino AtMéga  2560 + WIFI  beaucoup plus facile à exploiter voir ce tuto !

Mais ce que je dis là n'engage que moi !

Portrait de Amric95

Bonjour et merci wolfram69.

Pour la carte Arduino AtMéga  2560 + WIFI, j'en est commandée 2, mais ne me seront pas livrées avant fin Mai pour cause de saloperie de covid 19. Car le uno ne suffira pas. Je suis actuellement sur une carte Méga.

pour la pesée, elle est indicative, je n'est pas besoin d'une super précision. J'ai déjà fabriquer mon châssis de pesage en acier pour un mono capteur avec mon pote qui était directeur technique dans une boite de pesage. Le nombre de capteur de flexion importe peu, 1 capteur pour les petite balances, 3 capteur souvent utilisés à 120 degrés pour les trémies de pesage, et 4 capteur ou plus pour les ponts bascule.Le centrage du point de gravité est très important. Les capteurs doivent êtres équidistants et êtres étalonné au zéro électrique a charge nul. (Mais ce que je dis là n'engage que moi !) Lol...

 Comment puis-je vous faire parvenir une vidéo de mon proto ? cela nous ferait gagner un temps fou.

Encore merci, bien à toi, Richard.

Portrait de Jetfuzz

le Mec qui dit qu'on ne balance (he he je de mot) que des lien dans la nature !!!!!

top tu es encore une fois un champion.

L'apothéose !!!!!
si je n'arrive pas a te calmer, finalement je vais te pourrir "ton" forum, désolé Alex.
tu ne pourrais pas crée ton propre forum et comme ca le problème serais réglé, et on pourrais retrouver nos anciens membres ici.
une idée pour le non de domaine

www.UN-elerctronien.com

en plus il es libre, réfléchi bien .
 

Portrait de Amric95

Bonjour

C'est quoi le NodeMCU et à quoi cela sert-il ?

Pourquoi dois-je mets mon, ESP8266-01 à jour ?

Merci.

Portrait de Walter

En fait ca dépend, normalement Nodemcu désigne un moteur/environement Lua tournant sur un ESP8266.
Mais cela peut aussi désigné la carte de développement chez certains chinois. Cette carte étant basé sur un ESP8266-12E ou 12F.

Pour toi cela a peut d'intérêt d'utiliser le firmware NodeMCU.
Il serait plus intéressant de faire des programmes en C comme tu le fait  sur ton arduino.
Car cela évite d'utiliser les commandes AT et te permet de mettre plus "d'intéligence" directement sur ton ESP.
Mais cela te force a faire communiquer deux programmes entre eux, par le port série par exemple.

La page HTML est déjà dans le programme arduino que tu as fournis, il faut la remplacer, mais cela doit déjà faire le job, a primère vue.
 

// Contruction de la page en HTML
String getPage()
{
  String page = "<html lang=fr-FR><head><meta http-equiv='refresh' content='10'/>";
  page += "<title>Ruche connectée - Lycée Marcel CACHIN</title>";
  page += "<style> body { background-color: #fffff; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }</style>";
  page += "</head><body><h1>Ruche connectée</h1>";
  page += "<h3> Capteur BME 280</h3>";
  page += "<ul><li>Temperature : ";
  page += bme.readTemperature();
  page += "°C</li>";
  page += "<li>Tx d'humiditè : ";
  page += bme.readHumidity(;
  page += "<li>Pression atmospherique : ";
  page += bme.readPressure();
  page += " hPa</li></ul>";
  page += "%</li></ul><h3>Capteur de flexion</h3>";
  page += "<li>Masse de la ruche : ";
  page += jauge;
  page += " Kgs</li></ul>";
  page += "<br><br><p><a hrf='https://www.amric.fr'>Designed by Amric</p>";
  page += "</body></html>";
  return page;
}

Je n'ai pas fait le calcule, mais tu as besoin de combien d'entrée/sortie?

Pour l'alimentation, sur tu as une carte arduino + un ESP, tu dois déjà consommer au moins 500mA en pic, je pense.
N'hésite pas à prendre un capteur solaire digne de se nom et pas un truc très peu cher.

 

Portrait de Amric95

Merci Walter.

Là ça me gonfle, j'en est plein chou, Après une nuit et 2 jours sur cette Mer.. d'ESP8266, ça ne fonctionne toujours pas. Je pense avoir un problème de librairie.

Pourrais-tu voir ce qui ne va pas dans ce qui suit, Merci.

C'est un prog de test.

Je ne px pas compilé à cause des erreurs, les erreurs sont en gras.

#include <Wire.h>
#include <WiFi.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme;

float temperature, humidity, pressure, altitude;

/*Put your SSID & Password*/
const char* ssid = "Livebox-00C0";  // Enter SSID here
const char* password = "!!!!!!!!!!!!!!!!!";  //Enter Password here

WiFiServer server(80);              
 
void setup() {
  Serial.begin(115200);
  delay(100);
  
  bme.begin(0x76);   

  Serial.println("Connecting to ");
  Serial.println(ssid);

  //connect to your local wi-fi network
  WiFi.begin(ssid, password);

  //check wi-fi is connected to wi-fi network
  while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
  Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected..!");
  Serial.print("Got IP: ");  Serial.println(WiFi.localIP());

  Server.on("/", handle_OnConnect);
  Server.onNotFound(handle_NotFound);

  Server.begin();
  Serial.println("HTTP server started");

}
void loop() {
  //Server.handleClient();
}

void handle_OnConnect() {
  temperature = bme.readTemperature();
  humidity = bme.readHumidity();
  pressure = bme.readPressure() / 100.0F;
  altitude = bme.readAltitude(SEALEVELPRESSURE_HPA);

Problème ici
  Server.send(200, "text/html", SendHTML(temperature,humidity,pressure,altitude)); 
}

void handle_NotFound()
{
  Server.send(404, "text/plain", "Not found");  ET Problème ici
}

String SendHTML(float temperature,float humidity,float pressure,float altitude)
{
  String ptr = "<!DOCTYPE html> <html>\n";
  ptr +="<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
  ptr +="<title>ESP8266 Weather Station</title>\n";
  ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
  ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}\n";
  ptr +="p {font-size: 24px;color: #444444;margin-bottom: 10px;}\n";
  ptr +="</style>\n";
  ptr +="</head>\n";
  ptr +="<body>\n";
  ptr +="<div id=\"webpage\">\n";
  ptr +="<h1>ESP8266 Weather Station</h1>\n";
  ptr +="<p>Temperature: ";
  ptr +=temperature;
  ptr +="&deg;C</p>";
  ptr +="<p>Humidity: ";
  ptr +=humidity;
  ptr +="%</p>";
  ptr +="<p>Pressure: ";
  ptr +=pressure;
  ptr +="hPa</p>";
  ptr +="<p>Altitude: ";
  ptr +=altitude;
  ptr +="m</p>";
  ptr +="</div>\n";
  ptr +="</body>\n";
  ptr +="</html>\n";
  return ptr;
}

Voici l'affichage du compilateur.

C:\Documents and Settings\Utilisateur\Bureau\1 Ruche01\7 WIFI ESP 8266\Test_Page_Web\Test_Page_Web.ino: In function 'void handle_OnConnect()':

Test_Page_Web:56: error: expected unqualified-id before '.' token

   Server.send(200, "text/html", SendHTML(temperature,humidity,pressure,altitude)); 

         ^

C:\Documents and Settings\Utilisateur\Bureau\1 Ruche01\7 WIFI ESP 8266\Test_Page_Web\Test_Page_Web.ino: In function 'void handle_NotFound()':

Test_Page_Web:61: error: expected unqualified-id before '.' token

   Server.send(404, "text/plain", "Not found");

         ^

exit status 1
expected unqualified-id before '.' token

Si déjà ce petit bout de programme px fonctionner, après je px me débrouiller.

Bonne soirée, Richard.
 

Portrait de Walter

Salut,

déjà tu déclare ta variable "server" tout en minuscule, mais tu utilise une variable "Server" avec un S majuscule.

utilise la même syntaxe pour les deux.

Après cela dépend des librairie que tu as ajouté avec l'outil "Gestionnaire de bibliothèque", mais pour moi le fichier d'en-tête "WifiServer.h" ne contient pas d'objet avec les fonctions "on" ou "send", cela serait plutôt le fichier d'en-tête "ESP8266WebServer.h", mais cela dépend de la bibliothèque que tu utilise pour gérer ton esp8266. 

Portrait de Anonyme

Amric95

Encore une fois assez joué !

Si tu suis les conseils des deux rigolos tu n'arriveras à rien du tout. Il faut comprendre comment fonctionne un ESP8266-01 ! (je vais encore me faire assassiner mais il faut bien reconnaître que coté compétences ... il y a des lacunes pour ces deux compères !) Ils veulent t'expliquer ce qu'ils ne comprennent eux même autrement j'espère qu'il te l'aurait fait savoir plus tôt  !

Bon ceci mit à part :

L'ESP8266-01 (ESP) est un module qui comporte un étage WIFI qui te permet de crée un mini Serveur Web et aussi un Client HTTP. Le serveur WEB pouvant être totalement autonome sans besoin de routeur avec sont propre SSID et PASSWORD

Il possède 4 Entrées/Sorties GPIO 0, 1, 2 et 3. En général GPIO 1 et 3 sont utilisées comme port Série.

Gérer un module de température et humidité, plus un module de pression et des jauges de contrainte est impossible car ton ESP8266 01 ne possède pas assez d'entrées/sorties pour communiquer avec tous ces modules.

Le module Arduino UNO lui comporte toutes les Entrées/Sorties nécessaires pour gérer ces modules mais le possède pas d'étage WIFI coté mémoire ce sera peut être un peu juste mais pas sûr. Si je t'ai proposé d'utiliser une Arduino Méga+WIFI c'est que cette carte comporte les deux modules que l'on peut programmer chacun avec sont propre code mais beaucoup plus simple de raccordement et mémoire plus importante !

Par contre ce qui est commun à tous les deux c'est un port, ou des ports (pour le UNO) de communication série, donc grâce à cette liaison il devient possible de communiquer avec la carte Arduino UNO par WIFI via le port série de chacun. TX de l'un sur RX de l'autre et inversement (TX sert à envoyer des octets, RX à les recevoir )

Le principe est les suivant, le module ESP8266 créer un serveur web dans lequel tu peux installer une page HTML avec comme champs des variables qui peuvent être comme dans ton cas, température, humidité, poids etc... Lorsque tu te connectes via WIFI à ce module grâce au SSID + PASSWORD, l'ESP envoie un message à UNO par le port série (Exemple : "parametres ?") UNO décode le message, et comme il interroge de manière cyclique tous les modules il retourne à ESP les différentes valeurs :  Température, Humidité ... Chaque valeur étant séparée par un ou des caractères spéciaux "$" par exemple et cela dans dans un ordre bien établi. L'ESP reçoit ces valeurs remplace les variables de la page HMTL par les valeurs reçues et retourne au client HTTP (toi en l'occurrence) la page HTML qui comporte toutes les valeurs mises à jour à chaque requête que tu feras part WIFI. Tout ceci étant très rapide tu auras l'impression que la réponse est instantanée, mais c'est bien ce qu'il se passe. 

Pour ce qui est des caractères spéciaux pour simplifier le décodage en ESP et UNO il est tout à fait possible de séparer chaque valeur par un caractère différent et facilement reconnaissable.

Exemple :

En tant que client tu te connectes sur le serveur SSID de L'ESP avec le bon PASSWORD

Ta requête en tant que client : « http://192.168.0.40:80/? » (c'est un exemple, 80 est le numéro du port de communication 80 pour un serveur web en général mais tu peux choisir entre 1 et 65535 (FFFF en héxa) par contre il faudra que le numéro dans ta requête corresponde au numéro du port que tu auras déclaré dans le programme de l'ESP donc :

Client HTTP -> ESP :  http://192.168.0.40:80/?

ESP -> port série -> UNO : « paramatres » (attention à ne pas mettre de caractères accentués en langage 'C' )

UNO -> port Série -> ESP : « T25.5H82P1020M52V7.2 » toujours dans le même ordre !!!!!!

ESP -> Client WIFI  : « Temperature : 25.5 °C- - Humidite : 82 % - - Pression : 1020 mBar - - Masse : 52 kg - - Tension batterie: 7.2 volts

Voilà comment tu dois procéder et tu peux comprendre pourquoi tu n’arriveras à rien avec les deux Rigolos , car tu peux maintenant comprendre qu’il faut deux programmes l’un pour l’ESP et l’autre pour UNO ! Voilà pourquoi tu te casses la tête pour rien !

Si tu as des problèmes pour réaliser ces codes demande moi les par Email  dans contact en cliquant  wolfram69 sur je ne tiens pas trop à aider les deux Rigolos, je trouve que ce que j'ai dit ici est bien suffisant pour eux !

J'attends avec impatience les foudres des deux compères qui diront une fois de plus que je les insultes alors que je ne dis que la vérité et l'un d'eux se dit "programmeur", tu peux vérifier dans sa présentation  !

Le second compère lui n'a pas fait de présentation mais il reconnaît ne pas avoir très fort en codage ( que j'apprécie beaucoup pour sa franchise) Il est plus performant en électronique, mais il a prit le costume de ZORRO pour défendre la veuve et l'orphelin, mais il n'a qu'un cheval à bascule et un fleuret en plastique comme il n'ont ni l'un ni l'autre une plume très éloquente leurs mots favoris sont insultes et injures, c'est un peut faible je trouve. De plus comme ils ont peur que je ne comprenne pas ces mots ils me propose des liens pour que j'acquière ce vocabulaire sur Wiki. Ils ont matraqués plusieurs membres ici qui leur faisaient de l'ombre avec les même arguments. ce qui semble avoir convaincu Alex le fondateur de ce site qui au passage à fait des vidéos pédagogiques de tout premier ordre qui m'ont permis d'ajouter une corde à mon arc avec les modules Arduino, bien que je sois, par mon métier, dans le domaine de la programmation et de l'automatisme industriel. Certainement qu'un jour je rejoindrais ces anciens membres compétents car Alex m'aura évincé, il ne restera plus que hercule124 et une ou deux autres personnes ici qui sont capables d'une aide réelle ! 

Portrait de Walter

Lol, je suis content que tu reprennes exactement ce que je lui conseil!!!
Je ne  répondrais pas a tes provocations, car cela m'obligerais à t'insulter aussi et ce forum mérite bien mieux.

Comme d'habitude tu confond tout, tu peux très bien faire un serveur WEB en mode station, mais l'inconvénient et qu'il faut que tu connaisse l'adresse IP. ou utiliser une IP fixe, ou un service tel que noip, ce qui revient du coup à la même chose que d'utiliser le mode AP.
L'avantage du mode AP est du coup de pouvoir ce connecter en wifi a ton serveur/point d'accés au fond du jardin(hors de porté de ta box/routeur wifi).

Mais a priori ce n'est pas son cas, sur le toit de son école, il a peut être accès au réseau WIFI de l'école.
De plus la consommation d'un ESP en mode AP ou d'un serveur WEB, doit tourner autour de 80-100mA.
Donc sur 24h 2400mA, donc il faut que la batterie puisse être rechargée par le panneau solaire tout les jours!!!

Je maintient que pour moi la meilleur solution avec un accès wifi et d'alimenter un broker MQTT(ou équivalent) pour stocker a intervalle régulier les informations.
Ce qui permet d'avoir un graphique de l'évolution des mesures et même de définir des alertes très facilement.
C'est ce que j'ai publié dans mon petit projet de sonde, mais cela utilise un nodemcu, donc codé en Lua

Portrait de Anonyme

Walter tu ne sais même pas lire ??

J'ai écrit " Le serveur WEB pouvant être totalement autonome sans besoin de routeur avec sont propre SSID et PASSWORD "

Mais rassure toi je connais les termes Points d'accès, mode infrastructure, Ad hoc.

Mais toi tu sembles encore une fois tout confondre .

Le mode AP "Access Poin" en anglais ne fonctionne pas comme tu le prétends tu es encore plus nul que le pensais ! AP est un point d'accès qui peut étendre la portée d'un réseau WIFI mais pas un serveur !

Pourtant j'utilise des mots que tout un chacun peut comprendre ce qui  n'est pas ton cas "mode AP" par exemple, j'ai vraiment de la peine que tu sois aussi mauvais !

Portrait de Walter

Ba si c'est exactement le fond de mon propos.
ba le mode Access Point, c'est le fait de créer un point d'accés avec son SSDI et pass, désolé mais cela s'appel comme ça, pourquoi utiliser d'autre mots?
C''est quoi que tu comprend pas ?

Portrait de Anonyme

relis ce que j'ai écris au dessus de ton post !! Tu es très loin de faire le poids aussi bien en informatique qu'en français !

Portrait de Walter

Absolument pas, un petit lien.
Tu peut très bien avoir que l'AP sans faire de connections en mode station en parallèle, pour donner l'acces a internet ou un autre réseau wifi.

Si tu avais regardé mon code pour ma sonde, tu verrais que je passe ne mode AP, pour pouvoir configurer le SSDI/pass de mon reseau, sans a avoir a reprogrammer mon ESP.

Portrait de Anonyme

Bon je vois que tu encore plus nul que je le pensais tu n'y connais strictement rien c'est évident pour un informaticien ! Je te laisse à tes divagations stériles !

Portrait de Walter

Lol, en fait tu t'es rendu compte que tu raconte des conneries, pourquoi ne pas me donner un lien qui me montre que le mode AP, sert uniquement a étendre la portée d'un réseau wifi.

Que veut tu dire execatement "AP est un point d'accès qui peut étendre la portée d'un réseau WIFI mais pas un serveur !"
Que le mode AP ne peut pas être utilisé pour faire fonctionner un serveur WEB sur l'ESP ?
 

Portrait de Anonyme

Tu dis des âneries

Point c'accès veux bien dire ce que cela veux dire un point d'entrée sur un réseau WIFI ou un réseau filaire, si tu as des dévelopeurs dans ton entourage pose leur la question !

Portrait de Walter

Comme tu sais que j'aime bien les liens, un autre lien sur le même genre de projet qu'ici et un autre sur sparkfun

Visiblement je ne suis pas le seul à le dire!

Mais je suis d'accord avec toi, cela veut bien dire ce que cela veut dire, le réseau wifi étant celui créer pour l'ESP, qui héberge le serveur WEB créer par l'objet WifiServer ou autre suivant la lib utilisée

.

Portrait de Anonyme

Oui  dans le même module il y a deux entités un Access Point et un serveur mais le serveur n'est pas en mode access point regarde mes tutos et tu verras que j'ai utilisé ce système mainte et mainte fois mets une brique pour une fois !

De plus je voudrais que tu comprennes une chose en exemple:

Quand on le traite voleur, si c'est faux c'est une injure ou une insulte, comme il te plaira, mais si c'est avéré cela devient une vérité !

A bon entendeur Salut !

Tu n'as jamais expliqué que le module ESP8266-01 ne pouvait en aucun cas gérer les différents capteurs tu l'as bien laissé dans la mouise car tu ne sais pas de quoi tu parles !

Je t'ai laissé t'enferrer pendant quelque temps et j'ai enfin décidé d'intervenir et d'expliquer la chose à Amric95 !

Absolument aucun de tes posts n'on étés constructifs !!!!!

P.S. S'il te plait arrête avec tes LIENS quand on veux se défendre on utilise des phrases pas des liens !

Portrait de Walter

Oui  dans le même module il y a deux entités un Access Point et un serveur mais le serveur n'est pas en mode access point regarde mes tutos et tu verras que j'ai utilisé ce système mainte et mainte fois mets une brique pour une fois ! 

il y a donc un mode "serveur" pour le WIFI, je suis curieux de voir ton tuto là dessus, tu as un lien?
Un dernier lien la datasheet de l'ESP8266, on peut y lire ceci "Support Infrastructure BSS Station mode/SoftAP mode/Promiscuous mode" ou "Wi-Fi Mode Station/SoftAP/SoftAP+Station", cela parle bien du mode Station, mode AP, ou combiné Station + AP, mais je n'y vois aucune référence à un mode serveur.

Tu n'as jamais expliqué que le module ESP8266-01 ne pouvait en aucun cas gérer les différents capteurs tu l'as bien laissé dans la mouise car tu ne sais pas de quoi tu parles !

Non, puisqu'il utilise sa carte arduino pour faire l'acquisition des données.
Sa carte ESP ne lui sert qu'a proposer une page HTML de visualisation.
Sauf erreur de ma pars, il n'a pas fait mention de ce passer de sa carte arduino.
 

Quand on le traite voleur, si c'est faux c'est une injure ou une insulte, comme il te plaira, mais si c'est avéré cela devient une vérité !

Et non, si c'est faux, c'est de la diffamation.
Par contre sale voleur, ou ducon(que tu n'a pas utilisé, comme je suis un menteur!), sont des insultes.
Et cela complètement indépendamment du fait qu'il y a un fond de vérité, car ton but alors n'est pas d'établir un fait, mais bien d'offenser.

Et arrête de te cacher avec cette argument complètement fallacieux de vouloir dire la vérité, ton seul but est de descendre ton interlocuteur et de le dénigrer ou de l'offenser. Ce qui systématiquement met fin a tout dialogue constructif avec un échange d'opinion. Mais cela impliquerais que d'autre que toi aurais une certaine vérité, ce qui t'es insupportable.

Portrait de Anonyme

Pour conclure tu as lu mon post dans lequel j'ai expliqué comment réalisé le projet de Amric95  ou étaient tes explications à toi ?

Portrait de Walter

c'est celui-ci?
J'ai lu en diagonale, je ne vois que le mode station.
Tu peux m'indiquer le moment ou tu défini un mode "serveur", qui n'utilise pas la box internet?

Portrait de Anonyme

Alex, si  vous passez par ici je vous prie s'il vous plait de bien lire tout ce qui a été dit et les heures de modifications des posts vous pourrez vous rendre compte que certaines modifs sont apparues discrètement !

Portrait de Jetfuzz

Oh oui, j'aimerais bien qu'il passe, pour encore une fois te bannir de ce forum.... et encore une fois que tu lui demandes de supprimer ton n eime pseudo. et pour revenir avec un nouveau pseudo et continuer d'insulter les gens.
Nan mais sans blagues
 

Portrait de Anonyme

Tient, Zorro est arrivé !

Portrait de Jetfuzz

j'aime bien Zorro, merci Sergent Garcia !!!

Portrait de Walter

Lol, du coup je ne peux pas prétendre être Bernardo, pourtant je l'aime bien aussi :)

Portrait de Jetfuzz

il est cool bernardo !!! c'est le pote a zorro !!! il parle pas beaucoup, mais il est efficace !!

Portrait de Amric95

Messieurs, Messieurs tout doux de tout façon, toutes vos informations me sont utilites.

Quoi qu'il en soit je suis toujours ds la panade.

merci. Richard.

Portrait de Amric95

Bref de tout façon je suis toujours dans la padane.

j'essaie juste un prog de test ave seulement ma carte UNO et mon ESP pour faire au plus simple (histoire limité les dégats)

quelque soit la carte selectionnée en Outils, Type de carte, et la il y en a beaucoup,

j'ai sélectionné Generic ESP8266 Module. Reponse de l'DE

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

pour ce prog, alors dites moi ? 

/*  Le serveur affectera les sorties GPIO0 et GPIO2 selon les requètes du client :
 *    http://server_ip/1F affectera GPIO0 à l'état bas  (LED 1 éteinte)
 *    http://server_ip/1O affectera GPIO0 à l'état haut (LED 1 Allumée)
 *    http://server_ip/2F affectera GPIO2 à l'état bas  (LED 2 éteinte)
 *    http://server_ip/2O affectera GPIO2 à l'état haut (LED 2 Allumée)
 *    http://server_ip/?    lecture de l'état des sorties( GPIO0 et GPIO2)
 *    
 *  L'adresse Ip du module ESP8266 sera envoyée sur la sortie série du module
 *  dès que celui-ci sera connecté
 */

#include <ESP8266WiFi.h>
//Définition des varaibles globales et constantes
 int val0;
 int val2;
 const char* ssid = "Livebox-00C0"; // Le nom de votre réseau Wifi
const char* password = "kL4ATh3YqRcMSJE6LE";
int Deb,Fin;
String txt;
// Creation d'un serveur Web sur le port standard 100

WiFiServer server(100); /*si vous ne savez pas attribuer un port sur votre BOX internet remplacez 100 par 80*/

void setup() {
  delay(500);
  // Création d'un port série à 115200 bauds
  Serial.begin(115200);
  delay(10);
 
  // Affectations des port GPIO0 et GPIO2 en sorties et à l'état bas
  pinMode(16, OUTPUT);
  digitalWrite(16, 0);
 
  pinMode(2, OUTPUT);
  digitalWrite(2, 0);
  // Connection au réseau WiFi
  Serial.println();
  Serial.println();
  Serial.print("Connection au réseau Wifi :");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(100);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connectee");
 
  // Démarrage du Serveur
  server.begin();
  Serial.println("Serveur demarre");

  // Envoie de l'adresse IP sur le port série
  Serial.println("Adresse Ip du serveur :");
  Serial.println(WiFi.localIP());
  }

void loop() {
  // Vérification de la connection d'un client
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
 
  // Attente des datas du client
 
  while(!client.available()){
   // delay(10);
  }
 
  // Lecture de la requête du client
  String req = client.readStringUntil('\r');
 // Serial.println(req);
//GET /tata HTTP/1.1
Deb = req.indexOf("GET /")+5;
Fin = req.indexOf(" HTTP/");
txt = req.substring(Deb,Fin);
txt.replace("%20"," ");
Serial.print(txt);

 
  // Interprétation de la requète
 
  if (req.indexOf("1F") != -1)
    {val0 = 1;}
  if (req.indexOf("1O") != -1)
    {val0 = 0;}
  if (req.indexOf("2F") != -1)
    {val2 = 1;}
  if (req.indexOf("2O") != -1)
    {val2 = 0;}

    // Affectation des variables aux sorties correspondantes
   digitalWrite(2, val2);
   digitalWrite(16, val0);

   //Lecture de l'état des sorties
  if (req.indexOf("/?") != -1)
  {
     val0 == digitalRead(16);
     val2 == digitalRead(2);  
  }

  // Création de la page HTML en réponse à la requête
  String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\n ";
  String Retour ="La led1 est ";//nGPIO is now ";
  Retour += (val0)?"Eteinte   ":"Allumee   ";
  Retour += " et La led2 est ";
  Retour += (val2)?"Eteinte   ":"Allumee   ";
  s+=Retour;
  client.print(s);
  Retour = " Reçu "+ Retour;
  Serial.println(Retour);
  client.flush();
  client.flush();
}

Histoire de gagner du  temps, vous pouvez prendre le main son mon PC via tinyVNC ou autre par internet.

a vous de voir  !!!!

Pages