/*
Projet:Objets connectés
fichier:TP01
Auteur: Félix Théoret
date: 21 octobre 2022
---------------------------------------------------------------------------------------
Ce projet est un thermostats réalise sur wokwi qui permet à l'utilisateur
de monter la température grâce à l'utilisation du bouton rouge ou encore la
descendre à l'aide du bouton bleu. Il est aussi possible de changer de celcius
à fahrenheit avec le bouton vert, tout sa avec le temps écoulé depuis le
lancement du projet.
---------------------------------------------------------------------------------------
Mise à jour:
*/
// Installation des bibliothèques utilisées lors de ce projet
#include <LiquidCrystal_I2C.h>
#include <stdio.h>
// activation de variable qui setront utiliser dans le programme
#define LCD_NB_COLONNE 20
#define LCD_NB_LIGNE 4
#define LCD_ADRESSE_I2C 0x27
#define BTR 11 // le bouton rouge est sur le d11
#define BTB 2 // le bouton bleu est sur le d2
#define BTV 9 // le bouton vert est sur le d9
#define DEL 5 // la les est sur le d5
#define NB_MAX_CHAR 20 + 1
#define DELAY_DEL 250
#define DELAY_BRUIT 5
#define LCD_LIGNE1 0
#define LCD_LIGNE2 1
#define LCD_LIGNE3 2
#define LCD_LIGNE4 3
#define LCD_COLONNE1 0
#define LCD_COLONNE4 3
#define LCD_COLONNE5 4
#define LCD_COLONNE9 8
const int TPMINC = 8;
const int TPMINF = 46;
const int TPMAXC = 32;
const int TPMAXF = 90;
#define DIVISEUR_SECONDE 1000
#define DIVISEUR_MINUTE 60000
#define DIVISEUR_HEURE 3600000
#define DIVISEUR_JOUR 86400000
#define MODULO_TEMPS 60
LiquidCrystal_I2C ecranLCD(LCD_ADRESSE_I2C, LCD_NB_COLONNE, LCD_NB_LIGNE );
char chaineCaracteres[NB_MAX_CHAR + 1];
bool changementFahrenheit = false;
int Celcius = 19;
int fahrenheit = (Celcius * 1.8) + 32;
void setup() {
Serial.begin(9600);
// activation des boutons et de la del
pinMode(BTR, INPUT);
pinMode(BTV, INPUT);
pinMode(BTB, INPUT);
pinMode(DEL, OUTPUT);
ecranLCD.backlight();
// affichage de la premiere ecran sur le lcd
ecranLCD.begin(LCD_NB_COLONNE, LCD_NB_LIGNE);
ecranLCD.setCursor(LCD_COLONNE4, LCD_LIGNE1);
ecranLCD.print("420-1C4 : TP01");
ecranLCD.setCursor(LCD_COLONNE4, LCD_LIGNE2);
ecranLCD.print("Par : 2087949");
ecranLCD.setCursor(LCD_COLONNE1, LCD_LIGNE3 );
ecranLCD.print("--------------------");
ecranLCD.setCursor(LCD_COLONNE1, LCD_LIGNE4 );
ecranLCD.print("BT.ROUGE-> Continuer");
int valeurBtR = digitalRead(BTR);
// Tant que le bouton rouge n'est pas appuyé le programme bloque ici
while (digitalRead(BTR) == false) {
valeurBtR = digitalRead(BTR);
}
// Tant que le bouton rouge n'est pas lacher le programme bloque ici
while (valeurBtR) {
valeurBtR = digitalRead(BTR);
delay(DELAY_BRUIT);
}
// affichage de la dexieme ecran sur le lcd tant
// que le bouton rouge n'est pas appuyé
while (valeurBtR == false) {
delay(DELAY_BRUIT);
ecranLCD.setCursor(LCD_COLONNE1, LCD_LIGNE1);
ecranLCD.print("Temp haut: BT.Rouge ");
ecranLCD.setCursor(LCD_COLONNE1, LCD_LIGNE2);
ecranLCD.print("Temp bas : BT.Bleu");
ecranLCD.setCursor(LCD_COLONNE1, LCD_LIGNE3 );
ecranLCD.print("Celcius/F: BT.Vert ");
ecranLCD.setCursor(LCD_COLONNE1, LCD_LIGNE4 );
ecranLCD.print("BT.ROUGE-> Continuer");
valeurBtR = digitalRead(BTR);
}
// Tant que le bouton rouge n'est pas lacher le programme bloque ici
while (valeurBtR ) {
delay(DELAY_BRUIT);
valeurBtR = digitalRead(BTR);
delay(DELAY_BRUIT);
}
// affichage de la Troisieme ecran sur le lcd
while (valeurBtR == false) {
delay(DELAY_BRUIT);
ecranLCD.setCursor(LCD_COLONNE1, LCD_LIGNE1);
ecranLCD.print("TERMOSTAT 4201C4 PRO");
ecranLCD.setCursor(LCD_COLONNE1, LCD_LIGNE2);
ecranLCD.print(" ");
ecranLCD.setCursor(LCD_COLONNE1, LCD_LIGNE3 );
ecranLCD.print("--------------------");
valeurBtR = true;
}
}
void loop() {
// activation des variables qui seront utilisé pour le temps ecoulé
unsigned long int secondes = (millis() / DIVISEUR_SECONDE) % MODULO_TEMPS,
minutes = (millis() / DIVISEUR_MINUTE) % MODULO_TEMPS,
heures = (millis() / DIVISEUR_HEURE) % MODULO_TEMPS,
jours = (millis() / DIVISEUR_JOUR);
// si le bouton vert n'est pas appuyé la temperature est en celcius
if (changementFahrenheit == false) {
ecranLCD.setCursor(LCD_COLONNE9, LCD_LIGNE2);
snprintf(chaineCaracteres, NB_MAX_CHAR, "%02dc",
Celcius);
ecranLCD.print(chaineCaracteres);
}
// Si le programme roule depuis moin d'un jour le jour ne prendra pas de s
if (jours < 1) {
ecranLCD.setCursor(LCD_COLONNE1, LCD_LIGNE4 );
snprintf(chaineCaracteres, NB_MAX_CHAR, "Jour : %03lu, %02lu:%02lu:%02lu", jours,
heures, minutes, secondes);
ecranLCD.print(chaineCaracteres);
}
else // Dasn le cas contraire jour prendra un s
{
ecranLCD.setCursor(LCD_COLONNE1, LCD_LIGNE4 );
snprintf(chaineCaracteres, NB_MAX_CHAR, "Jours: %03lu, %02lu:%02lu:%02lu",
jours, heures, minutes, secondes);
ecranLCD.print(chaineCaracteres);
}
// Si le bouton rouge est appuyé la temperature en celcius et fahrenheit augmente
if (digitalRead(BTR) ) {
while (digitalRead(BTR)) // bloque ici tant que le bouton rouge n'est pas relacher
{
// Permet au temps de s,actualiser même si le bouton rouge est appuyer
secondes = (millis() / DIVISEUR_SECONDE) % MODULO_TEMPS;
minutes = (millis() / DIVISEUR_MINUTE) % MODULO_TEMPS;
heures = (millis() / DIVISEUR_HEURE) % MODULO_TEMPS;
jours = (millis() / DIVISEUR_JOUR);
if (jours < 1) {
ecranLCD.setCursor(LCD_COLONNE1, LCD_LIGNE4 );
snprintf(chaineCaracteres, NB_MAX_CHAR, "Jour : %03lu, %02lu:%02lu:%02lu", jours,
heures, minutes, secondes);
ecranLCD.print(chaineCaracteres);
}
else
{
ecranLCD.setCursor(LCD_COLONNE1, LCD_LIGNE4 );
snprintf(chaineCaracteres, NB_MAX_CHAR, "Jours: %03lu, %02lu:%02lu:%02lu",
jours, heures, minutes, secondes);
ecranLCD.print(chaineCaracteres);
}
}
// chaque fois qu'on entre dans ce if la valeur de celcius augmente de 1
Celcius++;
fahrenheit = (Celcius * 1.8) + 32;
delay(DELAY_BRUIT);
}
// Si le bouton vert est appuyé la temperature en celcius et fahrenheit diminue
if (digitalRead(BTB)) {
while (digitalRead(BTB)) // bloque ici tant que le bouton bleu n'est pas relacher
{
// Permet au temps de s,actualiser même si le bouton rouge est appuyer
secondes = (millis() / DIVISEUR_SECONDE) % MODULO_TEMPS;
minutes = (millis() / DIVISEUR_MINUTE) % MODULO_TEMPS;
heures = (millis() / DIVISEUR_HEURE) % MODULO_TEMPS;
jours = (millis() / DIVISEUR_JOUR);
if (jours < 1) {
ecranLCD.setCursor(LCD_COLONNE1, LCD_LIGNE4 );
snprintf(chaineCaracteres, NB_MAX_CHAR, "Jour : %03lu, %02lu:%02lu:%02lu", jours,
heures, minutes, secondes);
ecranLCD.print(chaineCaracteres);
}
else
{
ecranLCD.setCursor(LCD_COLONNE1, LCD_LIGNE4 );
snprintf(chaineCaracteres, NB_MAX_CHAR, "Jours: %03lu, %02lu:%02lu:%02lu",
jours, heures, minutes, secondes);
ecranLCD.print(chaineCaracteres);
}
}
// chaque fois qu'on entre dans ce if la valeur de celcius diminue de 1
Celcius--;
fahrenheit = (Celcius * 1.8) + 32;
delay(DELAY_BRUIT);
}
// Fait clignoter la del si la valeur de celcius est plus grand que 32 et
// Fait clignoter la del si la valeur de Fahrenheit est plus grand que 90
if (changementFahrenheit == false) {
if (Celcius > TPMAXC || fahrenheit > TPMAXF) {
Celcius = TPMAXC;
fahrenheit = TPMAXF;
digitalWrite(DEL, HIGH);
delay(DELAY_DEL);
digitalWrite(DEL, LOW);
delay(DELAY_DEL);
digitalWrite(DEL, HIGH);
delay(DELAY_DEL);
digitalWrite(DEL, LOW);
delay(DELAY_DEL);
}
}
// Fait clignoter la del si la valeur de celcius est plus petit que 8 et
// Fait clignoter la del si la valeur de Fahrenheit est plus grand que 46
if (changementFahrenheit == false) {
if (Celcius < TPMINC || fahrenheit < TPMINF) {
Celcius = TPMINC;
fahrenheit = TPMINF;
digitalWrite(DEL, HIGH);
delay(DELAY_DEL);
digitalWrite(DEL, LOW);
delay(DELAY_DEL);
digitalWrite(DEL, HIGH);
delay(DELAY_DEL);
digitalWrite(DEL, LOW);
delay(DELAY_DEL);
}
}
// Fait clignoter la del si la valeur de Fahrenheit est plus grand que 90
if (changementFahrenheit) {
if (fahrenheit < TPMINF) {
Celcius = TPMINC;
fahrenheit = TPMINF;
digitalWrite(DEL, HIGH);
delay(DELAY_DEL);
digitalWrite(DEL, LOW);
delay(DELAY_DEL);
digitalWrite(DEL, HIGH);
delay(DELAY_DEL);
digitalWrite(DEL, LOW);
delay(DELAY_DEL);
}
}
// Fait clignoter la del si la valeur de Fahrenheit est plus grand que 46
if (changementFahrenheit) {
if (fahrenheit > TPMAXF) {
Celcius = TPMAXC;
fahrenheit = TPMAXF;
digitalWrite(DEL, HIGH);
delay(DELAY_DEL);
digitalWrite(DEL, LOW);
delay(DELAY_DEL);
digitalWrite(DEL, HIGH);
delay(DELAY_DEL);
digitalWrite(DEL, LOW);
delay(DELAY_DEL);
}
}
// active les Fahrenheits si le bouton vert est appuyé
if (digitalRead(BTV)) {
if (changementFahrenheit == false) {
changementFahrenheit = true;
while (digitalRead(BTV))
{
secondes = (millis() / DIVISEUR_SECONDE) % MODULO_TEMPS;
minutes = (millis() / DIVISEUR_MINUTE) % MODULO_TEMPS;
heures = (millis() / DIVISEUR_HEURE) % MODULO_TEMPS;
jours = (millis() / DIVISEUR_JOUR);
if (jours < 1) {
ecranLCD.setCursor(LCD_COLONNE1, LCD_LIGNE4 );
snprintf(chaineCaracteres, NB_MAX_CHAR, "Jour : %03lu, %02lu:%02lu:%02lu", jours,
heures, minutes, secondes);
ecranLCD.print(chaineCaracteres);
}
else
{
ecranLCD.setCursor(LCD_COLONNE1, LCD_LIGNE4 );
snprintf(chaineCaracteres, NB_MAX_CHAR, "Jours: %03lu, %02lu:%02lu:%02lu",
jours, heures, minutes, secondes);
ecranLCD.print(chaineCaracteres);
}
}
delay(DELAY_BRUIT);
}
}
// affiche les Fahrenheits si le bouton vert à été appuyer
if (changementFahrenheit) {
ecranLCD.setCursor(LCD_COLONNE9, LCD_LIGNE2);
snprintf(chaineCaracteres, NB_MAX_CHAR, "%02dF",
fahrenheit);
ecranLCD.print(chaineCaracteres);
}
// désactive les Fahrenheits si le bouton vert est appuyé à nouveau
if (digitalRead(BTV)) {
if (changementFahrenheit) {
changementFahrenheit = false;
while (digitalRead(BTV))
{
secondes = (millis() / DIVISEUR_SECONDE) % MODULO_TEMPS;
minutes = (millis() / DIVISEUR_MINUTE) % MODULO_TEMPS;
heures = (millis() / DIVISEUR_HEURE) % MODULO_TEMPS;
jours = (millis() / DIVISEUR_JOUR);
if (jours < 1) {
ecranLCD.setCursor(LCD_COLONNE1, LCD_LIGNE4 );
snprintf(chaineCaracteres, NB_MAX_CHAR, "Jour : %03lu, %02lu:%02lu:%02lu", jours,
heures, minutes, secondes);
ecranLCD.print(chaineCaracteres);
}
else
{
ecranLCD.setCursor(LCD_COLONNE1, LCD_LIGNE4 );
snprintf(chaineCaracteres, NB_MAX_CHAR, "Jours: %03lu, %02lu:%02lu:%02lu",
jours, heures, minutes, secondes);
ecranLCD.print(chaineCaracteres);
}
}
delay(DELAY_BRUIT);
}
}
}