// Définition des broches pour le capteur de température et le relais de chauffage
#define DHTPIN 2
#define DHTTYPE DHT22
#define HEATER_PIN 5 // // Pin à laquelle le relais de chauffage est connecté
// Inclusion des bibliothèques nécessaires
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <ESP32Servo.h>
#include <WiFi.h>
#include <ThingSpeak.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_MPU6050.h>
#include <Wire.h>
const int servoPin = 18; // Broche à laquelle le servomoteur est connecté
// Configuration ThingSpeak
const char *thingSpeakApiKey = "KKYZ081CQO63JRLX";
const int thingSpeakChannelID = 2389733; // Remplacez par votre ID de canal ThingSpeak
Servo servo; // Objet Servo pour contrôler le servomoteur
DHT dht(DHTPIN, DHTTYPE); // Objet DHT pour le capteur de température et d'humidité
// Configuration des paramètres du réseau WiFi
char ssid[] = "Wokwi-GUEST"; // Le nom du réseau wifi utilisé
char pass[] = ""; // Le mot de passe du réseau wifi utilisé
const int pinMicrophone = 35; // Broche analogique pour le capteur de bruit
const int pinBuzzer = 4; // Broche à laquelle le buzzer est connecté
const int seuilSonore = 300; // Seuil du niveau sonore pour détecter le sommeil
const int dureeMinSommeil =480; // Durée minimale du sommeil en minutes (8 heures)
bool personneEndormie = false;
unsigned long tempsDebutSommeil = 0;
const int ldrPin = A0; // Broche à laquelle le capteur LDR est connecté
Adafruit_MPU6050 mpu; // Déclarez l'objet MPU6050
// Client WiFi pour la communication
WiFiClient client;
//creation d'une séquence de notes pré-définies sur un buzzer avec des pauses entre chaque note
void jouerMelodie() {
int melodie[] = {262, 294, 330, 349, 392, 440, 494, 523};
int dureeNote = 5000; // Durée de chaque note en millisecondes
for (int i = 0; i < 8; ++i)
{
tone(pinBuzzer, melodie[i], dureeNote);
delay(dureeNote);
noTone(pinBuzzer);
delay(50); // Pause entre les notes
}
}
void setup() {
Serial.begin(115200); // Initialisation de la communication série
// Connexion au réseau WiFi
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
//Surveillance de la température ambiante dans la chambre
pinMode(HEATER_PIN, OUTPUT); // Configuration de la broche du relais de chauffage en sortie
servo.attach(servoPin, 500, 2400); // Attachement du servomoteur à la broche spécifiée avec des paramètres de pulsation
//Surveillance de mouvement de personne
Wire.begin(21, 22); // Initialisation du bus I2C avec les broches 21 (SDA) et 22 (SCL)
if (!mpu.begin()) { // Initialisation du capteur MPU6050
Serial.println("Failed to find MPU6050");
while (1) {
delay(10);
}
}
mpu.setAccelerometerRange(MPU6050_RANGE_2_G); // Configuration de la plage de mesure de l'accéléromètre
mpu.setGyroRange(MPU6050_RANGE_250_DEG); // Configuration de la plage de mesure du gyroscope
Serial.println("MPU6050 found!");
Serial.println("");
delay(1000);
ThingSpeak.begin(client);
}
int pos = 0; // Variable pour la position du servomoteur
int servoState = 0; // État initial du servomoteur
void loop(){
float temperature = dht.readTemperature(); // Lecture de la température avec le capteur DHT
if (temperature > 25.0) {
// Ouvrir les ventilateurs (simuler le mouvement du servo)
for (pos = 0; pos <= 180; pos++) {
servo.write(pos); // Déplacer le servomoteur à la position actuelle
servoState = 1; // Mettre à jour l'état du servomoteur
delay(15); // Délai pour simuler le mouvement du servomoteur
}
delay(2000); // Délai pour simuler le temps pendant lequel les ventilateurs restent ouverts
} else {
servoState = 0;
// Fermer les ventilateurs en ramenant le servomoteur à la position initiale
digitalWrite(servoPin, LOW);
}
// Contrôle du chauffage en fonction de la température
if (temperature < 20.0) {
// Activer le chauffage (simuler le relais du chauffage)
digitalWrite(HEATER_PIN, HIGH);
delay(2000); // Délai pour simuler le temps pendant lequel le chauffage reste activé
} else {
//Désactiver le chauffage
digitalWrite(HEATER_PIN, LOW);
}
// Affichage de la température sur le moniteur série
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
// Envoi des données sur ThingSpeak
ThingSpeak.setField(1, temperature);
ThingSpeak.setField(2,servoState); // État du servomoteur
ThingSpeak.setField(3, digitalRead(HEATER_PIN)); // État du chauffage
ThingSpeak.writeFields(thingSpeakChannelID, thingSpeakApiKey);
delay(1000); // Délai entre chaque envoi de données
// Mesure de la luminosité avec le capteur LDR
int luminosite = analogRead(ldrPin); // Lit la valeur analogique du capteur LDR
// Envoi des données sur ThingSpeak
ThingSpeak.writeField(2389733, 4, luminosite, thingSpeakApiKey);
Serial.print("Luminosity: "); // Affiche le libellé "Luminosity: "
Serial.println(luminosite); // Affiche la valeur de luminosité mesurée
delay(500); // Attend 500 millisecondes entre chaque itération de la boucle
int niveauSonore = analogRead(pinMicrophone);
Serial.print("Niveau sonore : ");
Serial.println(niveauSonore);
// Vérifier si le niveau sonore est en dessous du seuil
if (niveauSonore < seuilSonore) {
// Si la personne n'était pas déjà endormie, enregistrer le début du sommeil
if (!personneEndormie) {
tempsDebutSommeil = millis();
personneEndormie = true;
Serial.println("Personne endormie !");
}
} else {
// Réinitialiser le statut si le niveau sonore est au-dessus du seuil
personneEndormie = false;
}
// Vérifier si la personne a dormi pendant la durée minimale
if (personneEndormie && (millis() - tempsDebutSommeil > dureeMinSommeil * 60000)) {
// Si la personne a dormi pendant la durée minimale, envoyer les données sur ThingSpeak
// envoyerDonneesThingSpeak(niveauSonore);
jouerMelodie();
personneEndormie = false; // Réinitialiser le statut
}
ThingSpeak.setField(5, niveauSonore); // Champ 1 : Niveau sonore
ThingSpeak.setField(6, personneEndormie); // Champ 2 : État du buzzer (0 éteint, 1 allumé)
ThingSpeak.writeFields(thingSpeakChannelID, thingSpeakApiKey);
//delay(1000); // Ajustez la pause en fonction de la fréquence de surveillance du sommeil
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp); // Obtenir les données du gyroscope et de l'accéléromètre
// L'accélération totale
float acceleration = sqrt(a.acceleration.x * a.acceleration.x +
a.acceleration.y * a.acceleration.y +
a.acceleration.z * a.acceleration.z);
// La rotation totale
float rotation = sqrt(g.gyro.x * g.gyro.x +
g.gyro.y * g.gyro.y +
g.gyro.z * g.gyro.z);
// Utilisez le type de données approprié pour l'acceleration et rotation
// En supposant que ce sont des float
float AccelerometerRangeData = mpu.getAccelerometerRange();
float GyroData = mpu.getGyroRange ();
ThingSpeak.setField(7,acceleration);
ThingSpeak.setField(8, rotation );
ThingSpeak.writeFields(thingSpeakChannelID, thingSpeakApiKey); // Envoi des données à ThingSpeak
Serial.print("Acceleration: ");
Serial.println(acceleration);
Serial.print("Rotation : ");
Serial.println(rotation);
delay(500);
}