Bonjour,
La mesure par ultrason est en effet une excellente idée, mais j'ai également un peu peur de l'humidité sur ce type de capteur.
Quoiqu'il en soit, maintenant que tu as câblé tes capteurs, ce serait dommage de s'arrêter là.
Tu trouveras ci-dessous le code pour la solution que tu demandes. J'ai écrit ça comme ça dans un éditeur de texte, je n'ai rien sous la main pour vérifier que le code compile, à toi de tester, corriger les éventuelles fautes de frappes et valider.
Pour la partie ds18b20, j'ai recopié le code trouvé ici :
https://www.mysensors.org/build/temp
Tu peux connecter l'alimentation du ds18b20 directement au VCC de ton montage, ou à une broche de l'arduino pour économiser la batterie de ton montage (dans ce cas, le ds18b20 n'est alimenté que lorsqu'il est utilisé)
Si je peux me permettre une remarque personnelle, je n'aime pas mettre trop d'intelligence dans mes cartes mysensors. Qui dit intelligence dit bugs, qui dit bugs dit mise à jour, et qui dit mise à jour dit galère pour accéder au capteur qui est généralement installé dans un endroit pas toujours très accessible.Du coup, à ta place, pour le niveau d'eau, j'aurais tendance à remonter une valeur codée sur 10 bits, avec un bit pour chaque entrée. Et je ferais le décodage dans un script domoticz, ce qui est plus facile car la mise au point se fait sur un programme que tu peux modifier aisément, et tu peut également ainsi détecter, toujours au niveau domoticz, qu'un capteur est HS.
J'ai codé cette possibilité dans le code mesurerNiveauEauSimple();
Avant de tester le code, il faut que tu modifies ou vérifies :
- les valeurs des différents define BROCHE_xxxxx en fonction de ton câblage.
- la valeur du define ETAT_CAPTEUR_AU_REPOS
Bon courage
domdom
Code : Tout sélectionner
#define MY_DEBUG
#define MY_DEBUG_VERBOSE_SIGNING
#define MY_NODE_LOCK_FEATURE
// Enable and select radio type attached
#define MY_RADIO_NRF24
//#define MY_RADIO_NRF5_ESB
//#define MY_RADIO_RFM69
//#define MY_RADIO_RFM95
#include <MySensors.h>
#include <OneWire.h>
#include <DallasTemperature.h>
/************* Definitions liées à la fonction mysensors ***********************************/
#define DUREE_VEILLE_EN_SECONDES 3600
#define TEMPERATURE_CHILD_ID 1
#define NIVEAU_CHILD_ID 2
MyMessage msg_niveau(NIVEAU_CHILD_ID, V_VOLUME);
MyMessage msg_temperature(TEMPERATURE_CHILD_ID, V_TEMP);
/************* Definitions liées à la fonction mesure de température ***********************************/
#define BROCHE_BUS_ONE_WIRE 12 // broche sur laquelle la broche data du DS18b20 est connectée sur l'arduino
#define BROCHE_ALIMENTATION_ONE_WIRE 13 // broche sur laquelle la broche VCC du DS18b20 est connectée sur l'arduino
#define MAX_ATTACHED_DS18B20 1
OneWire oneWire(BROCHE_BUS_ONE_WIRE);
DallasTemperature sensors(&oneWire);
/************* Definitions liées à la fonction mesure de niveau d'eau ***********************************/
#define BROCHE_NIVEAU_0 1 // broche sur laquelle le capteur le plus bas est connecté sur l'arduino
#define BROCHE_NIVEAU_1 4
#define BROCHE_NIVEAU_2 3
#define BROCHE_NIVEAU_3 7
#define BROCHE_NIVEAU_4 5
#define BROCHE_NIVEAU_5 6
#define BROCHE_NIVEAU_6 2
#define BROCHE_NIVEAU_7 8
#define BROCHE_NIVEAU_8 9
#define BROCHE_NIVEAU_9 10 // broche sur laquelle le capteur le plus haut est connecté sur l'arduino
unsigned char entreesNiveauEau[] = { // tableau contenant la liste des entrées des capteurs de niveau
BROCHE_NIVEAU_0,
BROCHE_NIVEAU_1,
BROCHE_NIVEAU_2,
BROCHE_NIVEAU_3,
BROCHE_NIVEAU_4,
BROCHE_NIVEAU_5,
BROCHE_NIVEAU_6,
BROCHE_NIVEAU_7,
BROCHE_NIVEAU_8,
BROCHE_NIVEAU_9
};
#define ETAT_CAPTEUR_AU_REPOS HIGH // niveau logique sur la broche reliée au capteur de niveau lorsque celui-ci ne détecte pas d'eau
unsigned char mesurerNiveauEau() {
unsigned char nbEntrees = sizeof(entreesNiveauEau) / sizeof(entreesNiveauEau[0]);
unsigned char niveau = 0;
for (int i=0; i<nbEntrees; i++) { // pour chaque capteur
if (digitalRead(entreesNiveauEau|i]) == ETAT_CAPTEUR_AU_REPOS) { // si le capteur ne détecte pas d'eau
if (i < (nbEntrees + 1)) { // si on n'est pas sur le dernier capteur
if (digitalRead(entreesNiveauEau|i]) == ETAT_CAPTEUR_AU_REPOS) { // si le capteur suivant ne détecte pas d'eau
break; // on sort de la boucle if
}
}
}
niveau++;
}
return niveau;
}
unsigned char mesurerNiveauEauSimple() {
unsigned char nbEntrees = sizeof(entreesNiveauEau) / sizeof(entreesNiveauEau[0]);
unsigned char niveau = 0;
for (int i=0; i<nbEntrees; i++) { // pour chaque capteur
niveau = niveau * 2; // décalage bit à bit de un bit vers la gauche
if (digitalRead(entreesNiveauEau|i]) != ETAT_CAPTEUR_AU_REPOS) { // si le capteur ne détecte pas d'eau
niveau = niveau+1; // positionne le bit le plus à droite à 1
}
}
return niveau;
}
void setup(void){
// configuration liée à la mesure de température
DeviceAddress sensorDeviceAddress;
pinMode(BROCHE_ALIMENTATION_ONE_WIRE, OUTPUT); // configure la broche en sortie pour pouvoir alimenter le ds18b20
digitalWrite(BROCHE_ALIMENTATION_ONE_WIRE, HIGH); // alimente le ds18b20
sleep(100); // attend 100ms pour permettre au ds18b20 de démarrer tranquillement (temps mis au pif, en cas de problème, vérifier dans le datasheet)
sensors.begin(); // Activation des capteurs
sensors.getAddress(sensorDeviceAddress, 0); // Récupère l'adresse du premier capteur du bus
sensors.setResolution(sensorDeviceAddress, 12); // Configure la résoluton de la mesure
// configuration liée à la mesure de niveau
unsigned char nbEntrees = sizeof(entreesNiveauEau) / sizeof(entreesNiveauEau[0]);
for (int i=0; i<nbEntrees; i++) { // pour chaque capteur
pinMode(entreesNiveauEau|i], INPUT_PULLUP); // configure la broche en entrée avec un pullup
}
}
void presentation()
{
// Emission du nom du module
sendSketchInfo("Etat de la cuve d'eau", "1.0");
// Presentation des fonctions
present(CHILD_ID, S_WATER, "Niveau d'eau");
present(CHILD_ID, S_TEMP, "Température d'eau");
}
void loop(void){
float temperature;
digitalWrite(BROCHE_ALIMENTATION_ONE_WIRE, HIGH); // alimente le ds18b20
sleep(100); // attend 100ms pour permettre au ds18b20 de démarrer tranquillement (temps mis au pif, en cas de problème, vérifier dans le datasheet)
sensors.requestTemperatures(); // Déclenche la lecture des capteurs 1wire
temperature = sensors.getTempCByIndex(0); // Récupère la température en celsius du premier capteur
Serial.print("La température est: "); // Affichage dans la liaison de debug
Serial.print(temperature);
Serial.println(" C°");
send(msg_niveau.set(temperature); // envoi de la valeur sur le résuea mysensors
unsigned char niveauEau = mesurerNiveauEau(); // récupère le niveau d'eau
Serial.print("Le niveau est : ");
Serial.print(niveauEau);
Serial.println(" C°");
send(msg_niveau.set(niveauEau);
digitalWrite(BROCHE_ALIMENTATION_ONE_WIRE, LOW); // coupe l'alimentation du ds18b20 pour économiser la batterie
Sleep(DUREE_VEILLE_EN_SECONDES * 1000);
}