Ruche connectée

Amric95
ven, 03/27/2020 - 19:19
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.
Walter
ven, 03/27/2020 - 19:38
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 :)
Amric95
mar, 03/31/2020 - 00:39
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.
Walter
lun, 03/30/2020 - 01:51
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
Amric95
lun, 04/20/2020 - 17:16
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.
Amric95
sam, 03/28/2020 - 02:48
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.
Anonyme
sam, 03/28/2020 - 08:21
Je n'ai pas encore fait le tour de tout ton code mais deux choses me sautent aux yeux
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 :
peux être remplacer par :
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 !
Anonyme
sam, 03/28/2020 - 09:43
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 :
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 !
Amric95
lun, 04/20/2020 - 17:17
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
@+.
Amric95
lun, 03/30/2020 - 22:30
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.
Jetfuzz
sam, 03/28/2020 - 11:35
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
Amric95
mar, 03/31/2020 - 08:04
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.
Amric95
mar, 03/31/2020 - 00:44
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.
}
Amric95
mer, 04/01/2020 - 21:01
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.
Jetfuzz
mar, 03/31/2020 - 11:39
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 !!
Amric95
mar, 03/31/2020 - 12:04
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.
Jetfuzz
mar, 03/31/2020 - 12:45
hello
regarde mon avatar, c'est mon doigt, et mes abeilles....
Amric95
mar, 03/31/2020 - 15:14
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.
Walter
mar, 03/31/2020 - 14:13
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
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
Amric95
mar, 03/31/2020 - 15:17
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.
Walter
mar, 03/31/2020 - 21:12
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.
Amric95
mer, 04/01/2020 - 14:21
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.
Anonyme
mer, 04/01/2020 - 07:04
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 !
Amric95
mer, 04/01/2020 - 21:30
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.
Jetfuzz
sam, 04/04/2020 - 20:04
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 .
Amric95
mer, 04/01/2020 - 17:18
Bonjour
C'est quoi le NodeMCU et à quoi cela sert-il ?
Pourquoi dois-je mets mon, ESP8266-01 à jour ?
Merci.
Walter
mer, 04/01/2020 - 19:31
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.
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.
Amric95
mer, 04/01/2020 - 21:23
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 +="°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.
Walter
jeu, 04/02/2020 - 00:54
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.
Anonyme
jeu, 04/02/2020 - 11:56
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 !
Walter
jeu, 04/02/2020 - 12:05
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
Anonyme
jeu, 04/02/2020 - 12:11
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 !
Walter
jeu, 04/02/2020 - 12:09
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 ?
Anonyme
jeu, 04/02/2020 - 12:12
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 !
Walter
jeu, 04/02/2020 - 12:24
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.
Anonyme
jeu, 04/02/2020 - 12:30
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 !
Walter
jeu, 04/02/2020 - 12:42
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 ?
Anonyme
jeu, 04/02/2020 - 12:48
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 !
Walter
jeu, 04/02/2020 - 12:58
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
.
Anonyme
jeu, 04/02/2020 - 13:50
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 !
Walter
jeu, 04/02/2020 - 20:15
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.
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.
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.
Anonyme
jeu, 04/02/2020 - 13:54
Pour conclure tu as lu mon post dans lequel j'ai expliqué comment réalisé le projet de Amric95 ou étaient tes explications à toi ?
Walter
jeu, 04/02/2020 - 20:26
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?
Anonyme
jeu, 04/02/2020 - 13:57
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 !
Jetfuzz
jeu, 04/02/2020 - 17:48
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
Anonyme
jeu, 04/02/2020 - 18:36
Tient, Zorro est arrivé !
Jetfuzz
jeu, 04/02/2020 - 20:08
j'aime bien Zorro, merci Sergent Garcia !!!
Walter
jeu, 04/02/2020 - 20:17
Lol, du coup je ne peux pas prétendre être Bernardo, pourtant je l'aime bien aussi :)
Jetfuzz
jeu, 04/02/2020 - 20:59
il est cool bernardo !!! c'est le pote a zorro !!! il parle pas beaucoup, mais il est efficace !!
Amric95
jeu, 04/02/2020 - 15:38
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.
Amric95
jeu, 04/02/2020 - 16:13
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
pour ce prog, alors dites moi ?
Histoire de gagner du temps, vous pouvez prendre le main son mon PC via tinyVNC ou autre par internet.
a vous de voir !!!!
Pages