/*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 = 15;
int buzzer_pin = 26;
int start_pin = 0;
int stop_pin = 2;
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, c;
int clearmaint;
int miniteur_h, miniteur_m, miniteur_s, Exs = 0, Exm = 0;
unsigned long sec_chrono, ss_chrono;
bool isRunning = false;
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);
pinMode(start_pin, INPUT_PULLUP);
pinMode(stop_pin, INPUT_PULLUP);
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) {
sortie = 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("CHRONO");
lcd.setCursor(11, 1);
lcd.write(2);
}
else if (choix == 1) {
sortie = 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 == 0) {
lcd.setCursor(1, 0);
lcd.print("Chrono :");
if (digitalRead(start_pin) == LOW) {
sec_chrono = millis();
isRunning = true;
lcd.setCursor(1, 0);
lcd.print(" Running ");
lcd.setCursor(5, 1);
lcd.print(" ");
} else if (digitalRead(stop_pin) == LOW) {
ss_chrono = millis() - sec_chrono;
isRunning = false;
lcd.setCursor(1, 0);
lcd.print(" stopped ");
}
if (isRunning) {
ss_chrono = millis() - sec_chrono;
}
lcd.setCursor(5, 1);
lcd.print(ss_chrono / 1000);
lcd.setCursor(7, 1);
lcd.print(":");
lcd.setCursor(8, 1);
lcd.print((ss_chrono % 1000) / 10);
if (!digitalRead(button_pin)) {
ss_chrono = 0;
sec_chrono = 0;
choix = 3;
lcd.clear();
}
}
if (choix == 1) {
lcd.setCursor(1, 0);
lcd.print(" Minuteur");
while (digitalRead(button_pin) && sortie) {
int exminiteur_h = miniteur_h;
miniteur_h = map(analogRead(reglage_pin), 0, 4095, 0, 23);
if ((exminiteur_h >= 10 && miniteur_h < 10) || (exminiteur_h < 10 && miniteur_h >= 10)) {
for (int i = 0; i <= 5; i++) {
lcd.setCursor(i, 1);
lcd.print(" ");
}
}
lcd.setCursor(3, 1);
lcd.print(miniteur_h);
lcd.setCursor(5, 1);
lcd.print(":");
lcd.setCursor(6, 1);
lcd.print(miniteur_m);
lcd.setCursor(8, 1);
lcd.print(":");
lcd.setCursor(9, 1);
lcd.print(miniteur_s);
}
delay(500);
while (digitalRead(button_pin) && sortie) {
int exminiteur_m = miniteur_m;
miniteur_m = map(analogRead(reglage_pin), 0, 4095, 0, 59);
if ((exminiteur_m >= 10 && miniteur_m < 10) || (exminiteur_m < 10 && miniteur_m >= 10)) {
for (int i = 7; i <= 15; i++) {
lcd.setCursor(i, 1);
lcd.print(" ");
}
}
lcd.setCursor(3, 1);
lcd.print(miniteur_h);
lcd.setCursor(5, 1);
lcd.print(":");
lcd.setCursor(6, 1);
lcd.print(miniteur_m);
lcd.setCursor(8, 1);
lcd.print(":");
lcd.setCursor(9, 1);
lcd.print(miniteur_s);
}
delay(500);
while (digitalRead(button_pin) && sortie) {
int exminiteur_s = miniteur_s;
miniteur_s = map(analogRead(reglage_pin), 0, 4095, 0, 59);
if ((exminiteur_s >= 10 && miniteur_s < 10) || (exminiteur_s < 10 && miniteur_s >= 10)) {
for (int i = 7; i <= 15; i++) {
lcd.setCursor(i, 1);
lcd.print(" ");
}
}
lcd.setCursor(3, 1);
lcd.print(miniteur_h);
lcd.setCursor(5, 1);
lcd.print(":");
lcd.setCursor(6, 1);
lcd.print(miniteur_m);
lcd.setCursor(8, 1);
lcd.print(":");
lcd.setCursor(9, 1);
lcd.print(miniteur_s);
if (!digitalRead(start_pin) && sortie) {
c = 0;
while (c == 0 && sortie) {
miniteur_s--;
lcd.setCursor(1, 0);
lcd.print(" Time left: ");
lcd.setCursor(3, 1);
lcd.print(miniteur_h);
lcd.setCursor(5, 1);
lcd.print(":");
lcd.setCursor(6, 1);
lcd.print(miniteur_m);
lcd.setCursor(8, 1);
lcd.print(":");
lcd.setCursor(9, 1);
lcd.print(miniteur_s);
if (Exs >= 10 && miniteur_s < 10) {
lcd.setCursor(10, 1);
lcd.print(" ");
}
if ((miniteur_s == 0) && (miniteur_m > 0)) {
miniteur_m--;
delay(1000);
miniteur_s = 59;
}
if (Exm >= 10 && miniteur_m < 10) {
lcd.setCursor(7, 1);
lcd.print(" ");
}
if ((miniteur_m == 0) && (miniteur_h > 0)) {
miniteur_h--;
miniteur_m = 59;
}
if (miniteur_h == 0 && miniteur_m == 0 && miniteur_s == 0) {
lcd.clear();
lcd.setCursor(1, 0);
lcd.print(" Time's up");
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;
Exs = 0;
Exm = 0;
lcd.clear();
c = 1;
}
}
}
if (!digitalRead(stop_pin)) {
c = 1;
}
if (!digitalRead(button_pin)) {
sortie = 0;
choix = 3;
Exs = 0;
Exm = 0;
lcd.clear();
}
Exs = miniteur_s;
delay(1000);
}
}
while (c == 1 && sortie) {
lcd.setCursor(1, 0);
lcd.print(" Pause ");
lcd.setCursor(3, 1);
lcd.print(miniteur_h);
lcd.setCursor(5, 1);
lcd.print(":");
lcd.setCursor(6, 1);
lcd.print(miniteur_m);
lcd.setCursor(8, 1);
lcd.print(":");
lcd.setCursor(9, 1);
lcd.print(miniteur_s);
delay(100);
if (!digitalRead(start_pin)) {
c = 0;
lcd.clear();
}
if (!digitalRead(button_pin)) {
sortie = 0;
c = 0;
choix = 3;
Exs = 0;
Exm = 0;
lcd.clear();
}
}
}
}
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;
}
}
}
}
}