#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <Wire.h>
#include <RTClib.h>
#include <DHT.h>
#define TFT_CS 15
#define TFT_RST 2
#define TFT_DC 4
#define DHT_PIN 5
#define BUZZER_PIN 18
#define BUTTON_PIN 19
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 240
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
RTC_DS1307 rtc;
DHT dht(DHT_PIN, DHT22);
bool alarmeActivee = false;
bool boutonPrecedent = HIGH;
void setup() {
Serial.begin(9600);
if (!rtc.begin()) {
Serial.println("Impossible de trouver le module RTC!");
while (1);
}
if (!rtc.isrunning()) {
Serial.println("RTC n'est pas en marche !");
// rtc.adjust(DateTime(F(_DATE_), F(_TIME_)));
}
dht.begin();
pinMode(BUZZER_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
tft.begin();
tft.setRotation(3); // Orientation du display
tft.fillScreen(ILI9341_BLACK);
tft.setTextSize(2);
// Affichage des informations statiques une seule fois au début
displayStaticInfo();
}
void loop() {
DateTime now = rtc.now();
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
bool boutonActuel = digitalRead(BUTTON_PIN);
// Si le bouton est pressé
if (boutonActuel == LOW && boutonPrecedent == HIGH) {
// Affiche le message et active le buzzer
alarmeActivee = true;
digitalWrite(BUZZER_PIN, HIGH);
displayAlarmMessage();
} else if (boutonActuel == HIGH && boutonPrecedent == LOW) {
// Si le bouton est relâché après avoir été pressé, efface le message
alarmeActivee = false;
digitalWrite(BUZZER_PIN, LOW);
tft.fillRect(10, 120, 300, 60, ILI9341_BLACK); // Efface le message
}
boutonPrecedent = boutonActuel;
// Afficher les autres informations seulement si l'alarme n'est pas active
if (!alarmeActivee) {
displayTemperatureAndHumidity(temperature, humidity);
displayTimeAndDate(now);
}
delay(100); // Attendre un court laps de temps pour éviter le rebondissement du bouton
}
void displayStaticInfo() {
// Affichage de la température et de l'humidité
tft.setCursor(10, 10);
tft.setTextColor(ILI9341_WHITE);
tft.print("Temperature: ");
tft.print("--");
tft.println(" C");
tft.print("Humidite: ");
tft.print("--");
tft.println(" %");
// Affichage de l'heure et de la date
DateTime now = rtc.now();
tft.setCursor(10, 50);
tft.print("Heure : ");
tft.print(now.hour());
tft.print(":");
tft.println(now.minute());
tft.print("Date : ");
tft.print(now.day());
tft.print("/");
tft.print(now.month());
tft.print("/");
tft.println(now.year());
}
void displayTemperatureAndHumidity(float temperature, float humidity) {
// Effacer les anciennes valeurs et afficher les nouvelles valeurs
tft.fillRect(10, 10, 300, 30, ILI9341_BLACK);
tft.setCursor(10, 10);
tft.setTextColor(ILI9341_WHITE);
tft.print("Temperature: ");
tft.print(temperature);
tft.println(" C");
tft.fillRect(10, 40, 300, 30, ILI9341_BLACK);
tft.setCursor(10, 40);
tft.print("Humidite: ");
tft.print(humidity);
tft.println(" %");
}
void displayTimeAndDate(DateTime now) {
// Effacer les anciennes valeurs et afficher les nouvelles valeurs
tft.fillRect(10, 50, 300, 30, ILI9341_BLACK);
tft.setCursor(10, 50);
tft.print("Heure : ");
tft.print(now.hour());
tft.print(":");
tft.println(now.minute());
tft.fillRect(10, 80, 300, 30, ILI9341_BLACK);
tft.setCursor(10, 80);
tft.print("Date : ");
tft.print(now.day());
tft.print("/");
tft.print(now.month());
tft.print("/");
tft.println(now.year());
}
void displayAlarmMessage() {
// Effacer les anciennes valeurs et afficher le message d'alarme
tft.fillRect(10, 120, 300, 60, ILI9341_BLACK);
tft.setCursor(10, 120);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(3);
tft.println("Rendez le medicament");
tft.println("a sa place");
}