Horloge Murale RGB Animée – Arduino Nano & Contrôle Bluetooth
Composants et fournitures
| Composant | Quantité |
|---|---|
| Arduino Nano R3 | 1 |
| Module Bluetooth HC-06 | 1 |
| Module RTC Maxim Integrated DS3231MPMB1 | 1 |
| Bandeau LED RGB | 1 |
| Pièces imprimables en 3D | 1 |
Outils et machines nécessaires
- Fer à souder (générique)
- Imprimante 3D (générique)
À propos de ce projet
Si vous vous souvenez, nous avons présenté nos projets d'horloges comme l'INFINITY MIRROR CLOCK et l'HORLOGE NUMÉRIQUE 7 SEGMENTS dans les sections précédentes. Nous voici de retour avec une pièce temporelle différente, spéciale et très esthétique.
Il n'y a aucun doute que vous allez adorer cette horloge murale. Pour ce projet, nous avons à nouveau utilisé des LED RGB. Et une imprimante 3D est bien sûr essentielle ! Nous avons conçu et produit certaines pièces nécessaires pour notre HORLOGE MURALE. Et ce n'est pas qu'une horloge, elle contient aussi différentes ANIMATIONS. Vous pouvez aussi utiliser l'horloge comme simple animation si vous le souhaitez.
Comment contrôler cette horloge et ces animations, demandez-vous ? Pas d'inquiétude. Nous l'avons développée avec une application très simple pour vous. Vous pouvez la télécharger via le lien.
Arduino est indispensable. Nous avons utilisé un Arduino Nano pour gagner de la place. Notre projet d'HORLOGE MURALE RGB, avec son circuit électronique compact, ne vous décevra pas. Nous ne voulons pas vous faire languir plus longtemps, alors nous vous invitons à regarder notre vidéo ci-dessous !
Code
Code Arduino Nano
Les codes pour l'heure et les animations sont dans les fichiers :
#include <DS3231.h>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN 6
#define PIN2 7
#define NUMPIXELS 60
DS3231 rtc(SDA, SCL);
Time t;
int hr, mnt, sc;
char data;
char color_select;
int h_red_deger = 255, h_green_deger = 0, h_blue_deger = 0;
int m_red_deger = 0, m_green_deger = 255, m_blue_deger = 0;
int s_red_deger = 255, s_green_deger = 255, s_blue_deger = 0;
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel pixels2 = Adafruit_NeoPixel(12, PIN2, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(12, PIN2, NEO_GRB + NEO_KHZ800);
int delayval = 10;
void setup() {
Serial.begin(9600);
rtc.begin();
#if defined (__AVR_ATtiny85__)
if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif
pixels.begin();
pixels2.begin();
strip.begin();
strip.show();
strip2.begin();
strip2.show();
}
void loop() {
while (Serial.available() > 0) {
delay(10);
char c = Serial.read();
data = c;
if (data == 'm') {
data = ' ';
t = rtc.getTime();
hr = t.hour; mnt = t.min; sc = t.sec;
while (data != 'm') {
data = Serial.read();
if (data == '+') { hr++; }
if (data == '-') { hr--; }
for (int i = 0; i < 12; i++) { pixels2.setPixelColor(i, pixels2.Color(0, 255, 10)); }
pixels2.show();
if (hr >= 12) { hr = hr - 12; }
if (hr < 0) { hr = hr + 12; }
pixels2.setPixelColor(hr, pixels2.Color(255, 0, 0));
pixels2.show(); delay(100);
pixels2.setPixelColor(hr, pixels2.Color(0, 0, 0));
pixels2.show(); delay(100);
}
rtc.setTime(hr, mnt, sc);
if (data == 'm') {
data = ' ';
t = rtc.getTime();
hr = t.hour; mnt = t.min; sc = t.sec;
while (data != 'm') {
data = Serial.read();
if (data == '+') { mnt++; if (mnt == 60) mnt = 0; }
if (data == '-') { if (mnt == 0) mnt = 60; mnt--; }
for (int k = 0; k < 60; k++) { pixels.setPixelColor(k, pixels.Color(0, 0, 0)); }
for (int k = 0; k < 60; k++) { pixels.setPixelColor(k, pixels.Color(25, 25, 255)); k = k + 4; }
pixels.setPixelColor(mnt, pixels.Color(0, 250, 0));
pixels.show(); delay(100);
pixels.setPixelColor(mnt, pixels.Color(0, 0, 0));
pixels.show(); delay(100);
}
}
rtc.setTime(hr, mnt, sc);
data = ' ';
}
if (data == 'H') { color_select = data; }
if (data == 'M') { color_select = data; }
if (data == 'S') { color_select = data; }
if (data == 'A') {
data = ' ';
colorWipe(strip.Color(255, 0, 0), 50); // Rouge
colorWipe(strip.Color(0, 255, 0), 50); // Vert
colorWipe(strip.Color(0, 0, 255), 50); // Bleu
theaterChase(strip.Color(127, 127, 127), 50); // Blanc
theaterChase(strip.Color(127, 0, 0), 50); // Rouge
theaterChase(strip.Color(0, 0, 127), 50); // Bleu
rainbow(20);
rainbowCycle(20);
theaterChaseRainbow(50);
}
if (data == 'r' && color_select == 'H') {
h_red_deger = Serial.parseInt();
pixels2.setPixelColor(hr, pixels2.Color(h_red_deger, h_green_deger, h_blue_deger));
pixels2.show();
}
if (data == 'g' && color_select == 'H') {
h_green_deger = Serial.parseInt();
pixels2.setPixelColor(hr, pixels2.Color(h_red_deger, h_green_deger, h_blue_deger));
pixels2.show();
}
if (data == 'b' && color_select == 'H') {
h_blue_deger = Serial.parseInt();
pixels2.setPixelColor(hr, pixels2.Color(h_red_deger, h_green_deger, h_blue_deger));
pixels2.show();
}
if (data == 'r' && color_select == 'M') {
m_red_deger = Serial.parseInt();
pixels.setPixelColor(mnt, pixels.Color(m_red_deger, m_green_deger, m_blue_deger));
pixels.show();
}
if (data == 'g' && color_select == 'M') {
m_green_deger = Serial.parseInt();
pixels.setPixelColor(mnt, pixels.Color(m_red_deger, m_green_deger, m_blue_deger));
pixels.show();
}
if (data == 'b' && color_select == 'M') {
m_blue_deger = Serial.parseInt();
pixels.setPixelColor(mnt, pixels.Color(m_red_deger, m_green_deger, m_blue_deger));
pixels.show();
}
if (data == 'r' && color_select == 'S') {
s_red_deger = Serial.parseInt();
pixels.setPixelColor(sc, pixels.Color(s_red_deger, s_green_deger, s_blue_deger));
pixels.show();
}
if (data == 'g' && color_select == 'S') {
s_green_deger = Serial.parseInt();
pixels.setPixelColor(sc, pixels.Color(s_red_deger, s_green_deger, s_blue_deger));
pixels.show();
}
if (data == 'b' && color_select == 'S') {
s_blue_deger = Serial.parseInt();
pixels.setPixelColor(sc, pixels.Color(s_red_deger, s_green_deger, s_blue_deger));
pixels.show();
}
}
t = rtc.getTime();
hr = t.hour; mnt = t.min; sc = t.sec;
pixels.setPixelColor(sc, pixels.Color(s_red_deger, s_green_deger, s_blue_deger));
pixels.setPixelColor(mnt, pixels.Color(m_red_deger, m_green_deger, m_blue_deger));
pixels.show();
for (int i = 0; i < 12; i++) {
if (i == hr) { i++; }
pixels2.setPixelColor(i, pixels2.Color(0, 255, 0));
}
pixels2.show();
if (hr >= 12) { hr = hr - 12; }
pixels2.setPixelColor(hr, pixels2.Color(h_red_deger, h_green_deger, h_blue_deger));
pixels2.show();
delay(10);
pixels.setPixelColor(sc, pixels.Color(0, 0, 0));
for (int k = 0; k < 60; k++) { pixels.setPixelColor(k, pixels.Color(0, 0, 0)); }
for (int k = 0; k < 60; k++) { pixels.setPixelColor(k, pixels.Color(25, 25, 255)); k = k + 4; }
pixels.setPixelColor(mnt, pixels.Color(0, 0, 0));
pixels.show();
}
void colorWipe(uint32_t c, uint8_t wait) {
for (uint16_t i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, c);
strip.show();
strip2.setPixelColor(i, c);
strip2.show();
delay(wait);
}
}
void rainbow(uint8_t wait) {
uint16_t i, j;
for (j = 0; j < 256; j++) {
for (i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel((i + j) & 255));
strip2.setPixelColor(i, Wheel((i + j) & 255));
}
strip2.show();
strip.show();
delay(wait);
}
}
void rainbowCycle(uint8_t wait) {
uint16_t i, j;
for (j = 0; j < 256 * 5; j++) {
for (i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
strip2.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
}
strip.show();
strip2.show();
delay(wait);
}
}
void theaterChase(uint32_t c, uint8_t wait) {
for (int j = 0; j < 10; j++) {
for (int q = 0; q < 3; q++) {
for (int i = 0; i < strip.numPixels(); i = i + 3) {
strip.setPixelColor(i + q, c);
strip2.setPixelColor(i + q, c);
}
strip2.show();
strip.show();
delay(wait);
for (int i = 0; i < strip.numPixels(); i = i + 3) {
strip.setPixelColor(i + q, 0);
strip2.setPixelColor(i + q, 0);
}
}
}
}
void theaterChaseRainbow(uint8_t wait) {
for (int j = 0; j < 256; j++) {
for (int q = 0; q < 3; q++) {
for (int i = 0; i < strip.numPixels(); i = i + 3) {
strip.setPixelColor(i + q, Wheel((i + j) % 255));
strip2.setPixelColor(i + q, Wheel((i + j) % 255));
}
strip2.show();
strip.show();
delay(wait);
for (int i = 0; i < strip.numPixels(); i = i + 3) {
strip.setPixelColor(i + q, 0);
strip2.setPixelColor(i + q, 0);
}
}
}
}
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if (WheelPos < 85) {
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
if (WheelPos < 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
Schémas
Contrôle par votre téléphone
clockconnect__Ieit1qA91l.apk (application Android de contrôle)
Processus de fabrication
- L'Horloge à Coucou : Histoire, Artisanat et Évolution Moderne
- Horloge POV Arduino : Construire un affichage LED à persistance rétinienne
- Construire une horloge murale design avec anneaux Neopixel 60 LED Adafruit et Arduino
- Horloge à Mots DIY Arduino – Afficheur Temps Réel Élégant et Personnalisable
- Construire une horloge maître LED personnalisée avec alarme – Visible à 12 mètres
- Horloge 3D RGB Arduclock – Montre LED Bluetooth avec horloge temps réel
- Horloge à Mots Italienne avec Arduino Nano, NeoPixel, LCD et RTC
- JX Wave Generator – Générateur DDS compatible Arduino avec affichage OLED
- Horloge Miroir Infini : Élégance Infinie et Précision Temporelle