Bonjour, j'introduis mon projet afin d'y voir plus clair (je précise que je débute en programmation):
J'ai réalisé un montage et un code qui permet de lire les temperatures de 4 sondes DS18B20 sur un afficheur 20x4.
Jusque la aucun souci, seulement maintenant le coté "sympa" du projet serait d'enregistrer les données des capteurs temp a x intervalles de temps (toutes les heures par exemple).
Je précise que j'ai réalisé le même circuit avec une horloge RTC qui fonctionne parfaitement, c'est la partie enregistrement carte SD qui me pose souçi.
De plus je sais comment enregistrer les valeures des dates ainsi que des capteurs temp sur carte SD mais sa enregistre au moins 300 mesures en 0.5 secondes, c'est trop.
Je me tourne donc vers vous, si vous auriez un bout de code qui permet de verifier un temps d'une RTC et de réaliser une capture lorsque la variable de l'heure passe a +1.
J'ai pensé a une boucle while, mais je ne sais pas comment m'en servir correctement.
Si il manque des infos, n'hésitez pas a demander.
Merci d'avance pour vos réponses.
le code du projet:
#include <LiquidCrystal.h> //Librairie pour ecran LCD
LiquidCrystal lcd(11,10,5,4,3,2); //Défini la liaison du LCD comme un 4 bits de données
#include <OneWire.h> // librairie pour capteur OneWire
//---- code des instructions du capteur
const int modeLecture=0xBE;
const int lancerMesure=0x44;
// --- constantes des broches ---
const int broche_OneWire=7; // declaration constante de broche des capteurs
// --- Déclaration des objets utiles pour les fonctionnalités utilisées ---
OneWire capteur(broche_OneWire); // crée un objet One Wire sur la broche voulue
void setup() {
lcd.begin(20,4); //Initialise l'ecran LCD
lcd.setCursor(6,1); //Place le curseur de l'ecran aux coordonnées 6,1 (x,y)
lcd.write("Copyright"); //Ecris le texte contenu entre les ""
lcd.setCursor(6,2);
lcd.write("Bulenger Andy");
delay(5000); //Mets le programme en pause (durée en Millisecondes)
lcd.clear(); //Fais disparaitre le contenu de l'afficheur
delay(800);
}
void loop(){
unsigned long tps;
float Temp1=0.00; //Assigne un variable a virgules et 2 zeros pour la valeur Temp1
float Temp2=0.00; //Assigne un variable a virgules et 2 zeros pour la valeur Temp2
float Temp3=0.00; //Assigne un variable a virgules et 2 zeros pour la valeur Temp3
float Temp4=0.00; //Assigne un variable a virgules et 2 zeros pour la valeur Temp4
byte Adresse1[8]={
0x28, 0x91, 0xA6, 0x89, 0x06, 0x0, 0x0, 0xAC }; //Toute cette partie sert a attribuer une Adresse MAC propre a chaque sonde
byte Adresse2[8]={
0x28, 0x31, 0x7C, 0x8A, 0x06, 0x0, 0x0, 0x9B };
byte Adresse3[8]={
0x28, 0xC5, 0x4B, 0x8A, 0x06, 0x0, 0x0, 0xE0 };
byte Adresse4[8]={
0x28, 0xC0, 0x25, 0x8A, 0x06, 0x0, 0x0, 0xB8 };
delay (500);
while (1){ // Fonction servant a faire plusieurs tâches en même temps (tandis que)
Temp1=capteurMesureTemp(Adresse1);
Temp2=capteurMesureTemp(Adresse2); //Attribue a la variable Temp la valeur récupérée sur les capteurs a chaque adresse MAC
Temp3=capteurMesureTemp(Adresse3);
Temp4=capteurMesureTemp(Adresse4);
lcd.setCursor(0,0);
lcd.write("Entree Lait");
lcd.setCursor(15,0);
lcd.print(Temp1); //Ici la fonction lcd.print n'est pas a confondre avec lcd.write, print sert a inserer des variables alors que write sert a inserer du texte ou des valeures fixes
lcd.setCursor(0,1);
lcd.write("Sortie Lait");
lcd.setCursor(15,1);
lcd.print(Temp2); // Les fonctions lcd.print des lignes 47 a 62 servent a afficher la temperature relevée des capteurs sur l'ecran LCD
lcd.setCursor(0,2);
lcd.write("Entree eau");
lcd.setCursor(15,2);
lcd.print(Temp3);
lcd.setCursor(0,3);
lcd.write("Sortie eau");
lcd.setCursor(15,3);
lcd.print(Temp4);
lcd.home();
delay(2000); // L'écran va donc se raffraichir toute les 2 secondes et afficher les nouvelles valeures des capteurs ds18b20
//tps=millis()+28500; // Temporisation de 28.5 secondes mise en commentaire car utile mais trop longue lors de la configuration initiale
}
}
float capteurMesureTemp(byte adressecapteur[8]) { //fonction qui renvoie résultat float et ne reçoit rien
byte data[12]; // Tableau de 12 octets pour lecture des 9 registres de RAM et des 3 registres d'EEPROM du capteur One Wire
int tempet=0; // variable pour resultat brute de la mesure
float tempetf=0.0; // variable pour resultat à virgule de la mesure
capteur.reset(); // initialise le bus 1-wire avant la communication avec un capteur donné
capteur.select(adressecapteur); // sélectionne le capteur ayant l'adresse 64 bits contenue dans le tableau envoyé à la fonction
capteur.write(lancerMesure,1); // lance la mesure et alimente le capteur par la broche de donnée
delay(750); // au moins 750 ms (voir Datasheet de la sonde)
capteur.reset(); // initialise le bus 1-wire avant la communication avec un capteur donné
capteur.select(adressecapteur); // sélectionne le capteur ayant l'adresse 64 bits contenue dans le tableau envoyé à la fonction
capteur.write(modeLecture,1); // passe en mode lecture de la RAM du capteur
for ( int i = 0; i < 9; i++) { // 9 octets de RAM stockés dans 9 octets
data[i] = capteur.read(); // lecture de l'octet de rang i stocké dans tableau data
}
tempet=(data[1]<<8)|data[0]; //Cette partie de code est primordiale, c'est le calcul a réaliser afin de convertir les données de la sonde numerique en temperature
tempetf=float(tempet)*6.25;
tempetf=tempetf/100.0;
return (tempetf);
}
PS: je suis obligé de mettre un lcd.clear car l'emplacement de l'Arduino se situe a coté de nombreux parasites (variateurs, électrovannes...) c'est donc la seule parade que j'ai trouvé (je compte quand même rajouter des anti-parasitaires au système).