Bonjour
En copiant des code trouver ici et ailleurs j'ai fait un petit code qui fonctionne (même si il est optimisable ) le but est de comprendre
Mes question concerne la compréhension de plusieurs lignes.
Je vais donc vous demander petit à petit si vous pouviez m'expliquer mes lacunes
ne pouvant poster plus de 9000 caractères, je vais essayer de poster le code en deux fois
// encodeur par impulsion
// 2 capteurs de tempratures DS18B20 sur bus OneWire pin 10
//LCD 20x4 I2C SCL sur pin a5
// SDA sur pin a4
// Horloge DS3231 idem que lcd
// Encodeur VMA435 vellman CLK sur pin3
// DT sur pin2
// SW sur pin7
// Encodeur VMA435
const byte pinEncodeurA = 2; // patte CLK de l'encodeur sur 2 numerique
const byte pinEncodeurB = 3; // patte DT de l'encodeur sur 3 numerique
const unsigned long dureeAntiRebond = 10; // temporisation avant nouvelle impulsion 10 milisecondes
volatile byte compte = 0; // variable de comptage des impulsions
int afficherEncodeur = 0; // variable pour autoriser l'affichage de l'action sur l'encodeur si il est différente de compte
int etatBouton = 0; // variable de l'état du bouton de l'encodeur à 0 appuyé à 1 laché
// capteurs de temperature DS18B20
#include <OneWire.h> // inclure la librairie pour le bus OneWire pour les capteur dallas
const byte BROCHE_ONEWIRE = 10; // patte S (sortie) des capteurs sur pin 10 numerique
const byte SENSOR_ADDRESS_1[] = { 0x28, 0xFF, 0x1C, 0x4E, 0xA0, 0x17, 0x05, 0xAB }; // adresse du premier capteur de temperature
const byte SENSOR_ADDRESS_2[] = { 0x28, 0xFF, 0xA2, 0x6A, 0xA2, 0x17, 0x05, 0x77 }; // adresse du deuxieme capteur de temperature
boolean minuterieTemp = 0; // minuterie pour autoriser la lecture de la temperature si il est à 1
int TempoTemperature = 60; // une minutes = 600 secondes.pour prise de temperature
unsigned long TempsPasseT;// variable comptant la durre de la tempo avant la prochaine mesure de temperature
unsigned long DebutTempsT; // variable initialisant une nouvelle temporisation pour la mesure de temperature
OneWire ds(BROCHE_ONEWIRE); // création d'un obje OneWire ??? je supose qu'on utilise un foction de la bibliothèque OneWire (fonction ds)
#include <Wire.h> // inclure la libraire pour le bus I2C pour l'horloge et le LCD
// horloge sur bus I2C
#include "RTClib.h" // inclure la librairie RTC pour le module DS3231
int annee = 0; // variable pour autoriser l'affichage de l'année (pour éviter de l'afficher à chaque cycle de la boucle loop
int mois = 0; // idem que annee pour les mois
int jours = 0; // etc...
int heure = 0;
int minutes = 60;
int secondes = 60;
// Afficheur LCD I2C
#include <LCD.h> // inclure une bibliothèque generale pour les afficheur LCD (sans certitudes)
#include <LiquidCrystal_I2C.h> // inclure une bibliothèque qui utilise des fonction de la bibliothèque LCD pour pouvoir l'utiliser en mode I2C
//LiquidCrystal_I2C lcd(0x27,20,4); // en essayant de déclarer l'afficheur comme ça et sans #include <LCD.h> ça ne fonctionne pas
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // ??? pas encore trouvé, mais je suppose qu'on déclare une sorte de fonction
// horloge
RTC_DS3231 rtc; // ??? mystère également certainement qu'on déclare que RTC_DS3231 s'appel rtc mais pas sûr
void setup()
{
Serial.begin(115200); // vitesse bus serie 115200 bauds
Wire.begin(); // initialisation I2C pour le LCD et l'horloge
DebutTempsT = millis()/1000; // l'initialisation du debut du chronometre vaut le temps actuel en secondes, pour mesure de la température
// encodeur
pinMode(pinEncodeurA,INPUT); // pin2 CLK
pinMode(pinEncodeurB,INPUT); //pin3 DT
attachInterrupt(0, encodeurFrontClk, FALLING); //crée une interruption sur le front descendant du CLK
delay(10); // temporiser 10 milisecondes (j'imagine pour l'anti rebonb) evite un double ou triple comptage sur un seul front
// bouton de l'encodeur
pinMode(7, INPUT); // switch de l'encodeur sur PIN 7
// Affichage
lcd.begin(20,4); // initialisation lcd 20 colone 4 lignes
lcd.backlight(); //initialisé le retroéclairage lcd
affichage_menu(); // appel la fonction affichage du menu
}
void loop() // fonction de lecture infinie
{
// Température
tempo_temperature(); // lancer le chronometre pour la température
if (minuterieTemp != 0) // si le chronometre est terminé minuterieTemp passe à 1 du coup on va lire la temperature
{
mesure_temperatures(); //appel la fonction mesurer et afficher la température
}
// affichage encodeur
if (afficherEncodeur != compte) // si compte à changer (si l'afficheur à bougé) on modifie la position du cursseur et on affiche l'étoile
{
lcd.setCursor(0,3); //cursseur sur 1er colone ,ligne du bas
lcd.print(" "); // imprimer des espaces pour effacer la ligne
lcd.setCursor(compte+10,3); // positioner le curseur sur la bonne colonne
lcd.print("*"); // afficher l'étoile
delay(20); // ?? je ne vois pas pourquoi, mais a priori il faut mettre une temporisation (ça marche sans)??
afficherEncodeur = compte; // on verouille l'affichage de l'étoile
}
// Vérifier si le bouton est appuyé
etatBouton = digitalRead(7); // lire l'état de la pin 7
if (etatBouton != 1) // si le bouton est appuyé (car quand on appuye il passe à 0) on autorise l'affichage de Bp
{
lcd.setCursor(18, 0); // le curseur sur colone 18, 1ere ligne du haut
lcd.print("Bp"); // on affiche Bp
while (digitalRead(7) == 0) //attendre tant que le bouton est appuyé (en fait on bloque alors tout le programe)
delay(10); // on temporise 10miliseconde (anti-rebond)
lcd.setCursor(18, 0); // on remet le cursseur en position de départ
lcd.print(" "); // et on efface Bp en affichant 2 espaces
}
afficheheureetdate(); //appeler la fonction afficher la date et l'heure
} // Fin de la boucle infinie fin du programme
}
Eric 1/2