/*Horloge multifonctions : Concevoir
une horloge multifonction pour afficher
l’heure et la température ambiante, régler un réveil,
et fournir un mode minuteur ou chronomètre.*/
#include <WiFi.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
int temperature_pin = 32;
int reglage_pin = 33;
int button_pin = 25;
int buzzer_pin = 26;
int temperature=0;
int analogValue;
int extemp;
int timezone=0;
int extime;
int mode;
int choix=3;
int reglage_heure;
int reglage_minute;
int minute;
int heure;
int sortie = 0;
int clearmaint;
LiquidCrystal_I2C lcd(0x27, 16, 2);
const char *ssid = "Wokwi-GUEST";
const char *password = "";
String welcome[] = {"w", "e", "l", "c", "o", "m", "e"};
void setup() {
pinMode(temperature_pin, OUTPUT);
pinMode(reglage_pin, INPUT);
pinMode(button_pin, INPUT_PULLUP);
pinMode(buzzer_pin, OUTPUT);
Serial.begin(115200);
lcd.init();
lcd.backlight();
lcd.clear();
WiFi.begin(ssid, password);
byte emoji[] = {0x0, 0xa, 0x0, 0x4, 0x4, 0x11, 0xe, 0x0};
byte fleche_droite[] = {0x8, 0xc, 0xe, 0xf, 0xf, 0xe, 0xc, 0x8};
byte fleche_gauche[] = {0x2, 0x6, 0xe, 0x1e, 0x1e, 0xe, 0x6, 0x2};
byte horloge[] = {0x0, 0x8, 0x8, 0x9, 0xa, 0xc, 0x0, 0x0};
lcd.createChar(0, emoji);
lcd.createChar(1, fleche_droite);
lcd.createChar(2, fleche_gauche);
lcd.createChar(3, horloge);
while (WiFi.status() != WL_CONNECTED)
{
lcd.setCursor(1, 0);
lcd.print("connecting....");
}
lcd.clear();
for (int i = 0; i <= 6; i++)
{
lcd.setCursor(i + 4, 0);
lcd.print(welcome[i]);
delay(200);
}
lcd.setCursor(11, 0);
lcd.write(0);
delay(1000);
lcd.clear();
while(digitalRead(button_pin)){
extime = timezone;
timezone = map(analogRead(reglage_pin), 0, 4095, -12, 12);
if((extime>=10 && timezone<10) || (extime <= -10 && timezone>-10) || (extime < 0 && timezone >= 0)){
for(int i=9; i<=11; i++){
lcd.setCursor(i,1);
lcd.print(" ");
}
}
lcd.setCursor(1, 0);
lcd.print("Your timezone");
lcd.setCursor(4, 1);
lcd.print("GMT+ ");
lcd.print(timezone);
}
configTime(timezone * 3600, 0, "fr.pool.ntp.org");
lcd.clear();
delay(1000);
}
void loop() {
int maintien=0;
if(!digitalRead(button_pin)){
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Vous voulez");
while(!maintien){
choix = map(analogRead(reglage_pin), 0, 4095, 0, 3);
if(choix == 0){
for(int i=0; i<=3; i++){
lcd.setCursor(i, 1);
lcd.print(" ");
}
for(int i=12; i<=15; i++){
lcd.setCursor(i, 1);
lcd.print(" ");
}
lcd.setCursor(4, 1);
lcd.write(1);
lcd.setCursor(5, 1);
lcd.print("CHRONO");
lcd.setCursor(11, 1);
lcd.write(2);
}
else if(choix == 1){
for(int i=0; i<=2; i++){
lcd.setCursor(i, 1);
lcd.print(" ");
}
for(int i=13; i<=15; i++){
lcd.setCursor(i, 1);
lcd.print(" ");
}
lcd.setCursor(3, 1);
lcd.write(1);
lcd.setCursor(4, 1);
lcd.print("MINUTEUR");
lcd.setCursor(12, 1);
lcd.write(2);
}
else if(choix == 2){
sortie=1;
clearmaint=1;
for(int i=0; i<=3; i++){
lcd.setCursor(i, 1);
lcd.print(" ");
}
for(int i=12; i<=15; i++){
lcd.setCursor(i, 1);
lcd.print(" ");
}
lcd.setCursor(4, 1);
lcd.write(1);
lcd.setCursor(5, 1);
lcd.print("REVEIL");
lcd.setCursor(11, 1);
lcd.write(2);
}
else if(choix == 3){
for(int i=0; i<=2; i++){
lcd.setCursor(i, 1);
lcd.print(" ");
}
for(int i=13; i<=15; i++){
lcd.setCursor(i, 1);
lcd.print(" ");
}
lcd.setCursor(3, 1);
lcd.write(1);
lcd.setCursor(4, 1);
lcd.print("ACCUEIL!");
lcd.setCursor(12, 1);
lcd.write(2);
}
if(!digitalRead(button_pin)){
lcd.clear();
maintien = 1;
}
}
delay(500);
}
if(choix == 3 || choix == 2){
if(choix == 2){
if(clearmaint){
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("Reglage reveil");
}
clearmaint=0;
while(digitalRead(button_pin) && sortie){
int Exreglage_heure = reglage_heure;
reglage_heure = map(analogRead(reglage_pin), 0, 4095, 0, 23);
if((Exreglage_heure>=10 && reglage_heure<10) || (Exreglage_heure<10 && reglage_heure>=10)){
for(int i=0; i<=5; i++){
lcd.setCursor(i, 1);
lcd.print(" ");
}
}
lcd.setCursor(4, 1);
lcd.print(reglage_heure);
lcd.setCursor(6, 1);
lcd.print(":");
lcd.setCursor(7, 1);
lcd.print(reglage_minute);
}
delay(500);
while(digitalRead(button_pin) && sortie){
int Exreglage_minute = reglage_minute;
reglage_minute = map(analogRead(reglage_pin), 0, 4095, 0, 59);
if((Exreglage_minute>=10 && reglage_minute<10) || (Exreglage_minute<10 && reglage_minute>=10)){
for(int i=7; i<=15; i++){
lcd.setCursor(i, 1);
lcd.print(" ");
}
}
lcd.setCursor(4, 1);
lcd.print(reglage_heure);
lcd.setCursor(6, 1);
lcd.print(":");
lcd.setCursor(7, 1);
lcd.print(reglage_minute);
if(!digitalRead(button_pin)){
sortie = 0;
lcd.clear();
delay(500);
lcd.setCursor(7, 0);
lcd.write(3);
}
}
}
struct tm timeinfo;
time_t now = time(NULL);
struct tm *datetime = gmtime(&now);
while (!getLocalTime(&timeinfo)) {
lcd.setCursor(3, 0);
lcd.println("Time error");
delay(200);
lcd.clear();
}
lcd.setCursor(1, 1);
lcd.print(&timeinfo, "%a %d/%m/%Y");
lcd.setCursor(9, 0);
lcd.print(&timeinfo, "%H:%M");
heure = datetime -> tm_hour + timezone;
if(heure >= 24){
heure = heure-24;
}
minute = datetime -> tm_min;
if(minute >= 60){
minute = minute-60;
}
analogValue = analogRead(temperature_pin);
extemp = temperature;
temperature = 1 / (log(1 / (4095. / analogValue - 1)) / 3950 + 1.0 / 298.15) - 273.15;
if((extemp >= 10 && temperature < 10) || (extemp < 0 && temperature >= 0) || (extemp <= -10 && temperature > -10)){
for(int i=2; i<=6; i++){
lcd.setCursor(i,0);
lcd.print(" ");
}
}
lcd.setCursor(2, 0);
lcd.print(temperature);
lcd.print((char)223);
lcd.print("C");
if(reglage_heure == heure && reglage_minute == minute && choix == 2){
while(digitalRead(button_pin)){
digitalWrite(buzzer_pin,HIGH);
delay(50);
digitalWrite(buzzer_pin,LOW);
delay(50);
if(!digitalRead(button_pin)){
digitalWrite(buzzer_pin,LOW);
choix = 3;
lcd.clear();
delay(500);
break;
}
}
}
}
}