Réveil soleil intelligent : réveillez-vous en douceur par une lueur progressive
Composants et fournitures
| Arduino Nano R3 | 1 |
| Module DS3231MPMB1 Horloge temps réel Maxim Integrated | 1 |
À propos de ce projet
L'hiver arrive, les nuits sont plus longues que les jours, et se réveiller à 6h dans une pièce sombre et froide est un cauchemar. Et si on créait un "lever de soleil" artificiel pour rendre la pièce plus chaleureuse et agréable ?
C'est une tâche simple : je vais créer une ampoule intelligente qui s'adapte à mon plafonnier actuel. Elle simulera un lever de soleil en éclairant progressivement la pièce. Si ça fonctionne, je la connecterai à mon téléphone pour en faire un vrai réveil.
Ampoule
Pour créer une ampoule intelligente, il faut d'abord une ampoule "bête" pour son culot qui se visse dans la lampe et fournit l'alimentation. Je l'ai brisée au marteau. Cette opération délicate a retiré le verre du culot en aluminium ; après avoir soudé des fils au culot et à la broche du bas, la base de l'ampoule intelligente était prête.
Ensuite, un support pour l'électronique. J'ai utilisé une plaque à trous découpée pour y loger l'Arduino Nano, l'alimentation 5V et tous les composants.

Circuit haute tension
Avertissement de sécurité : Vous travaillez avec des tensions supérieures à 50V. Le contact avec la haute tension peut causer des blessures graves ou la mort.
J'utilise une ampoule classique alimentée par le secteur, je ne peux pas la contrôler directement avec le microcontrôleur. Il me faut un TRIAC, qui agit comme un relais à commutation rapide. Le microcontrôleur alimente et coupe le TRIAC pour modifier l'onde sinusoïdale du secteur, variant ainsi l'intensité lumineuse.
Cependant, la tension alternative se contrôle différemment du continu. L'onde sinusoïdale doit être coupée précisément : le TRIAC doit être déclenché à des moments précis (voir image). Le microcontrôleur doit détecter le passage par zéro de la tension secteur pour couper chaque demi-onde à la même taille, sinon la lumière scintillerait.

Pour détecter le passage par zéro, un optocoupleur 4N35 (U1) avec transistor s'active quand l'onde franchit zéro. Le microcontrôleur voit un signal haut sur son entrée. L'optocoupleur isole aussi le basse tension du circuit secteur.
Un second optocoupleur MOC3063 (U2) avec TRIAC en sortie isole le microcontrôleur du TRIAC puissance (Q2). N'utilisez pas d'optocoupleur à passage par zéro car il ne commute qu'au passage par zéro.

Circuit basse tension
Microcontrôleur : Arduino Nano. Il contrôle le TRIAC et déclenche l'allumage progressif à l'heure programmée. Une horloge temps réel DS3231 précise maintient l'heure même hors tension.
Pour alimenter les puces en 5V, j'utilise un alimentation abaisseuse 5V 700mA bon marché connectée au secteur depuis le culot d'ampoule. Solution pratique !

Code
Le programme est simple. À la mise sous tension par l'interrupteur, la lampe s'allume puis s'éteint progressivement en vérification. Pendant la nuit, elle consulte l'horloge DS3231 et à 6h du matin, la pièce s'éclaire progressivement jusqu'au plein "jour" jusqu'à extinction par l'interrupteur.
Le code ci-joint est auto-explicatif. Sinon, je suis un mauvais développeur !
Prochaines étapes
Je vais tester quelques jours/semaines. Si ça me réveille, je ferai évoluer ce projet vers quelque chose de plus intelligent et moins artisanal !

Bonne nuit !
Code
lightalarm.ino (Arduino)
/* Ampoule intelligente qui s'allume quand il est temps de se lever.
* 1) À la mise sous tension, la lumière s'allume comme test
* 2) Elle s'éteint lentement complètement
* 3) À 6h du matin, la lumière s'allume progressivement jusqu'à extinction le soir
* 4) La lumière ne s'allume pas si la pièce n'est plus sombre (photocellule)
* Utilisation : allumez la lampe au coucher, elle s'allumera au réveil, éteignez en partant pour l'arrêter.
* L'heure est conservée grâce au module DS3231
* @author Jiri Praus (https://twitter.com/jipraus)
* Contrôle lumière AC inspiré par https://arduinotehniq.blogspot.com/2014/10/ac-light-dimmer-with-arduino.html */
#include <TimerOne.h>
#include "RTClib.h"
#define TRIAC_PIN 2
#define ZERO_CROSS_PIN 3
#define LIGHT_SENSOR_PIN A6
#define FREQUENCY_STEP 75 // délai par pas de luminosité en µs pour 50Hz (65 pour 60Hz)
#define CHANGE_DIM_LEVEL_EVERY 1 // changer niveau toutes les N secondes
#define MAX_DIM_LEVEL 128 // éteint
#define MIN_DIM_LEVEL 0 // allumé
#define DARK_THRESHOLD 300 // résistance photocellule considérée comme sombre
volatile byte triacCounter = 0; volatile boolean zeroCrossed = false;
byte dimLevel = MIN_DIM_LEVEL; boolean lightOn = false;
RTC_DS3231 rtc;
void setup() {
Serial.begin(115200); digitalWrite(TRIAC_PIN, LOW); pinMode(TRIAC_PIN, OUTPUT);
pinMode(ZERO_CROSS_PIN, INPUT); pinMode(LIGHT_SENSOR_PIN, INPUT);
if (!rtc.begin()) { Serial.println("Couldn't find RTC"); while(1); }
if (rtc.lostPower()) { Serial.println("RTC lost power, lets set the time!"); rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); }
noInterrupts(); attachInterrupt(digitalPinToInterrupt(ZERO_CROSS_PIN), zeroCrossDetected, RISING); interrupts();
Timer1.initialize(FREQUENCY_STEP); Timer1.attachInterrupt(triacTimerInterrupt, FREQUENCY_STEP);
}
void loop() { delay(CHANGE_DIM_LEVEL_EVERY * 1000); checkAlarmClock(); adjustDimLevel(); debugPrint(); }
void zeroCrossDetected() { zeroCrossed = true; triacCounter = 0; digitalWrite(TRIAC_PIN, LOW); }
void triacTimerInterrupt() {
if (dimLevel >= MAX_DIM_LEVEL) digitalWrite(TRIAC_PIN, LOW);
else if (dimLevel <= MIN_DIM_LEVEL) digitalWrite(TRIAC_PIN, HIGH);
else if (zeroCrossed) {
if (triacCounter >= dimLevel) { digitalWrite(TRIAC_PIN, HIGH); zeroCrossed = false; }
else triacCounter++;
}
}
void adjustDimLevel() {
if (lightOn && dimLevel > MIN_DIM_LEVEL) dimLevel--;
else if (!lightOn && dimLevel < MAX_DIM_LEVEL) dimLevel++;
}
void checkAlarmClock() {
if (!lightOn && isRoomDark()) {
DateTime now = rtc.now();
if (now.hour() == 6 && now.minute() == 0) lightOn = true;
}
}
boolean isRoomDark() { return analogRead(LIGHT_SENSOR_PIN) < DARK_THRESHOLD; }
void debugPrint() {
Serial.print("lightOn="); Serial.println(lightOn);
Serial.print("dimLevel="); Serial.println(dimLevel);
DateTime now = rtc.now();
Serial.print("datetime="); Serial.print(now.year(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.day(), DEC); Serial.print(" "); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.println(now.second(), DEC);
Serial.print("lightLevel="); Serial.println(analogRead(LIGHT_SENSOR_PIN));
}
Schémas


Processus de fabrication
- Explorer l'addition de tension avec connexions série de piles
- Labo diviseur de tension : design, mesure et vérification de la loi des tensions de Kirchhoff
- Thermoélectricité : comprendre les thermocouples et l'effet Seebeck
- Voltmètre potentiométrique : Mesure précise de tension avec charge minimale
- Construire une pile à pomme de terre : Guide étape par étape pour l'énergie électrochimique DIY
- Alimentation AC basse tension : Composants de circuit de déphasage et meilleures pratiques
- Expérience de régulateur de tension avec une diode Zener 12 V
- Amplificateur suiveur de tension : Conception, construction et guide de mesure
- Diodes à usage spécial : Schottky, Tunnel, LED, Laser, Photodiode et innovations cellules solaires