Projet d'illumination d'une maquette avec des leds RGB et des leds blanches

Bonjour à tous,

Je reviens vers vous 3 semaines après mes dernières questions pour vous présenter le résultat de ce que vous avez contribuer à faire :slight_smile:

J'ai terminé mon projet et ça fonctionne très bien ! Je n'ai que très peu de connaissances en électroniques et l'arduino n'est pas vraiment une passion. Avec un peu de ténacité (pour comprendre) et grâce à vos conseils (pour réaliser), j'ai cru concrétiser cette idée.

Pour rappel : j'ai fabriqué une maquette de l'Empire State Building d'1m40 de hauteur. Comme tout bon modéliste qui se respecte, il me fallait un résultat beau et proche du réel. Il me fallait donc la possibilité d'illuminer le sommet comme sur le vrai building. Je me sers donc d'une arduino qui paraissait être la meilleure solution.

Ci-dessous : le schéma électronique et quelques photos

Merci à tous !

PS : suite des aventures, j'aimerais pouvoir intégrer un calendrier à l'arduino pour que les couleurs changent tous les jours en fonction de mes choix... mais ça me semble vraiment complexe. On m'a parlé de Raspberry Pi éventuellement. Affaire à suivre...

.

bravo - joli !!!

+1 Karma pour être revenu poster le résultat

Vrai! C'est sympa!

Bonsoir à tous !

J’ai une question concernant la suite de ce projet et j’aimerais savoir dans quelle mesure c’est possible :

J’aimerais pouvoir commander les couleurs RGB depuis une application de téléphone OU établir un calendrier dans lequel l’arduino irait chercher quelles couleurs mettre tous les jours.

Ces possibilités existent-elles ?

Merci !

Bonsoir à tous,

Je me permets de relancer ma bouteille à la mer !

Je cherche toujours à faire en sorte que les couleurs de la maquette changent tous les jours à une heure bien définie.

Pour cela, j'ai acheté un module DS3231 RTC et multiplié les recherches. Après avoir téléchargé plein de bibliothèques et essayé plein de codes différents, je reste bloqué... Je ne parviens même pas à régler la date et l'heure ! (le moniteur me donne des caractères bizarres)

Pourriez-vous m'aider dans ma quête ?

En vous remerciant !

les caracteres bizarres sur le moniteur c'est parce que le seriai.begin(valeur) dans le croquis est différent de la valeur choisie dans le moniteur "valeur baud"
voir ici

installer "plein de bibliotheques" pour le meme module n'est pas la bonne solution

Merci pour ta réponse !

Je vais regarder ton lien pour voir si déjà j'arrive à me servir de mon Module RTC

Quelle bibliothèque devrais-je installer pour mon projet ? Et comment devrais-je programmer le changement de couleurs au quotidien ?

désolé, je ne suis pas un spécialiste du langage C, essaye de mettre à l'heure et de lire un ds3231 avec les exemples fournis dans les biblios

Bonjour Aurélien
Tout d'abord bravo pour ton Empire State Building!

Pour la bibliothèque "l'officielle" devrait suffire. La RTC SS3231e fonction alarme, rtc.setA1Time() et rtc.setA2Time().
Recherches arduino ds3231 setA1Time sur Internet pour trouver des exemples.

Cordialement
jpbbricole

Bonjour jpbbricole

Merci pour ta réponse et tes compliments ! J'y ai passé beaucoup de temps ! Le résultat est déjà cool mais il pourrait être encore mieux si mes très faibles connaissances en arduino ne me bloquaient pas :frowning:

Je viens de télécharger la dernière version de la bibliothèque que tu me conseilles et j'ai ouverts un exemple de bibliothèque qui s'appelle "DS3231_set"

J'ai indiqué les dates et heures désirées, débranché et rebranché l'arduino, mais rien ne s'affiche dans le moniteur. Comment savoir si le module est bien à la bonne date/heure ? Je suis un peu perdu, désolé !

/*
DS3231_set.pde
Eric Ayars
4/11

Test of set-time routines for a DS3231 RTC

*/

#include <DS3231.h>
#include <Wire.h>

DS3231 Clock;

byte Year = 2021;
byte Month = 05;
byte Date = 20;
byte DoW = 5;
byte Hour = 16;
byte Minute = 44;
byte Second = 00;

void GetDateStuff(byte& Year, byte& Month, byte& Day, byte& DoW, 
		byte& Hour, byte& Minute, byte& Second) {
	// Call this if you notice something coming in on 
	// the serial port. The stuff coming in should be in 
	// the order YYMMDDwHHMMSS, with an 'x' at the end.
	boolean GotString = false;
	char InChar;
	byte Temp1, Temp2;
	char InString[20];

	byte j=0;
	while (!GotString) {
		if (Serial.available()) {
			InChar = Serial.read();
			InString[j] = InChar;
			j += 1;
			if (InChar == 'x') {
				GotString = true;
			}
		}
	}
	Serial.println(InString);
	// Read Year first
	Temp1 = (byte)InString[0] -48;
	Temp2 = (byte)InString[1] -48;
	Year = Temp1*10 + Temp2;
	// now month
	Temp1 = (byte)InString[2] -48;
	Temp2 = (byte)InString[3] -48;
	Month = Temp1*10 + Temp2;
	// now date
	Temp1 = (byte)InString[4] -48;
	Temp2 = (byte)InString[5] -48;
	Day = Temp1*10 + Temp2;
	// now Day of Week
	DoW = (byte)InString[6] - 48;		
	// now Hour
	Temp1 = (byte)InString[7] -48;
	Temp2 = (byte)InString[8] -48;
	Hour = Temp1*10 + Temp2;
	// now Minute
	Temp1 = (byte)InString[9] -48;
	Temp2 = (byte)InString[10] -48;
	Minute = Temp1*10 + Temp2;
	// now Second
	Temp1 = (byte)InString[11] -48;
	Temp2 = (byte)InString[12] -48;
	Second = Temp1*10 + Temp2;
}

void setup() {
	// Start the serial port
	Serial.begin(9600);

	// Start the I2C interface
	Wire.begin();
}

void loop() {

	// If something is coming in on the serial line, it's
	// a time correction so set the clock accordingly.
	if (Serial.available()) {
		GetDateStuff(Year, Month, Date, DoW, Hour, Minute, Second);

		Clock.setClockMode(false);	// set to 24h
		//setClockMode(true);	// set to 12h

		Clock.setYear(Year);
		Clock.setMonth(Month);
		Clock.setDate(Date);
		Clock.setDoW(DoW);
		Clock.setHour(Hour);
		Clock.setMinute(Minute);
		Clock.setSecond(Second);

		// Test of alarm functions
		// set A1 to one minute past the time we just set the clock
		// on current day of week.
		Clock.setA1Time(DoW, Hour, Minute+1, Second, 0x0, true, 
			false, false);
		// set A2 to two minutes past, on current day of month.
		Clock.setA2Time(Date, Hour, Minute+2, 0x0, false, false, 
			false);
		// Turn on both alarms, with external interrupt
		Clock.turnOnAlarm(1);
		Clock.turnOnAlarm(2);

	}
	delay(1000);
}

Bonsoir Aurélien

Une petite explication:

byte Year = 2021;
byte Month = 05;
byte Date = 20;
byte DoW = 5;
byte Hour = 16;
byte Minute = 44;
byte Second = 00;

ça c'est pas juste, en fait pour mettre à jour la date et l'heure, il faut la mettre sous cette forme, (comme indiqué en remarque dans void GetDateStuff).
2105204180800x
qui signifie année 21 mois 05 jour 20 jour de la semaine 4 heure 18 miniutes 08 secondes 00
Ce paramètre, 2105204180800x, est à introduire dans la ligne de commande du moniteur de l'IDE Arduino, suivi d'un "envoyer"

Tu verra l'effet de la commande, j'ai légèrement modifié le programme afin d'afficher les données.
Le programme DS3231_set modifié:



#include <DS3231.h>
#include <Wire.h>

DS3231 Clock;
bool century = false;
bool h12Flag;
bool pmFlag;

byte Year;
byte Month;
byte Date;
byte DoW;
byte Hour;
byte Minute;
byte Second;

void GetDateStuff(byte& Year, byte& Month, byte& Day, byte& DoW,
byte& Hour, byte& Minute, byte& Second) {
	// Call this if you notice something coming in on
	// the serial port. The stuff coming in should be in
	// the order YYMMDDwHHMMSS, with an 'x' at the end.
	boolean GotString = false;
	char InChar;
	byte Temp1, Temp2;
	char InString[20];

	byte j=0;
	while (!GotString) {
		if (Serial.available()) {
			InChar = Serial.read();
			InString[j] = InChar;
			j += 1;
			if (InChar == 'x') {
				GotString = true;
			}
		}
	}
	Serial.println(InString);
	// Read Year first
	Temp1 = (byte)InString[0] -48;
	Temp2 = (byte)InString[1] -48;
	Year = Temp1*10 + Temp2;
	// now month
	Temp1 = (byte)InString[2] -48;
	Temp2 = (byte)InString[3] -48;
	Month = Temp1*10 + Temp2;
	// now date
	Temp1 = (byte)InString[4] -48;
	Temp2 = (byte)InString[5] -48;
	Day = Temp1*10 + Temp2;
	// now Day of Week
	DoW = (byte)InString[6] - 48;
	// now Hour
	Temp1 = (byte)InString[7] -48;
	Temp2 = (byte)InString[8] -48;
	Hour = Temp1*10 + Temp2;
	// now Minute
	Temp1 = (byte)InString[9] -48;
	Temp2 = (byte)InString[10] -48;
	Minute = Temp1*10 + Temp2;
	// now Second
	Temp1 = (byte)InString[11] -48;
	Temp2 = (byte)InString[12] -48;
	Second = Temp1*10 + Temp2;
}

void setup() {
	// Start the serial port
	Serial.begin(9600);

	// Start the I2C interface
	Wire.begin();
}

void loop() {

	// If something is coming in on the serial line, it's
	// a time correction so set the clock accordingly.
	if (Serial.available()) {
		GetDateStuff(Year, Month, Date, DoW, Hour, Minute, Second);

		Clock.setClockMode(false);	// set to 24h
		//setClockMode(true);	// set to 12h

		Clock.setYear(Year);
		Clock.setMonth(Month);
		Clock.setDate(Date);
		Clock.setDoW(DoW);
		Clock.setHour(Hour);
		Clock.setMinute(Minute);
		Clock.setSecond(Second);

		// Test of alarm functions
		// set A1 to one minute past the time we just set the clock
		// on current day of week.
		Clock.setA1Time(DoW, Hour, Minute+1, Second, 0x0, true,
		false, false);
		// set A2 to two minutes past, on current day of month.
		Clock.setA2Time(Date, Hour, Minute+2, 0x0, false, false,
		false);
		// Turn on both alarms, with external interrupt
		Clock.turnOnAlarm(1);
		Clock.turnOnAlarm(2);

	}
	Serial.print("20");
	Serial.print(Clock.getYear(), DEC);
	Serial.print(' ');
	
	// then the month
	Serial.print(Clock.getMonth(century), DEC);
	Serial.print(" ");
	
	// then the date
	Serial.print(Clock.getDate(), DEC);
	Serial.print(" ");
	
	// and the day of the week
	Serial.print(Clock.getDoW(), DEC);
	Serial.print(" ");
	
	// Finally the hour, minute, and second
	Serial.print(Clock.getHour(h12Flag, pmFlag), DEC);
	Serial.print(" ");
	Serial.print(Clock.getMinute(), DEC);
	Serial.print(" ");
	Serial.print(Clock.getSecond(), DEC);
	Serial.println("");
	delay(1000);
}

Tu peux jouer avec ça et, ensuite on attaquera les alarmes, il faut que j'essaye, j'ai jamais fait.

Ce programme, DS3231_set, sert uniquement à régler ton horloge. Ensuite tu charges l'exemple DS3231_test pour étudier les alarmes, pour ma part, je vais m'y atteler ce week-end.

A+
Cordialement
jpbbricole

Wow merci beaucoup ça marche ! Je n'ai jamais été aussi content de lire l'heure :sweat_smile:

Je n'avais pas compris que l'endroit ou il fallait régler la date et l'heure était dans le monitoring, je cherchais désespérément dans le code :man_facepalming:

J'ai remarqué un décalage d'une seconde toutes les ~2min et ça se rétablie toutes les ~2min :thinking:

Je suppose que c'est avec ce que tu appelles "les alarmes" que je pourrai commander un changement de couleurs quotidiennement ?

Merci beaucoup d'avoir pris le temps de m'aider !!

Bonjour Aurélien

Wouaouuu! te voilà Maître du Temps!
Le programme DS3231_set peut être mis de côté, il ne servira plus qu'en cas de changement de la pile de la RTC ou un mise à l'heure, mais la DS3231 est assez stable.
On va s'attaquer aux alarmes, je m'y mets aujourd'hui ou demain. As-tu déjà un bout de code pour allumer tes LED, si oui, mets le en ligne que je puisse voire comment intégrer les fonctions de la RTC.

Si c'est toujours dans ton idée, dis moi quel Arduino tu as, quel type de smartphone (Android ou iPhone, je suis Android), je pourrais te montrer commander tes couleurs depuis un simple terminal Bluetooth. Pour ça, il te faudrait un module HC-06.
image

A+
Cordialement
jpbbricole

Bonjour jpbbricole,

Ok, maintenant que je sais régler la date et l'heure, j'utiliserai le programme DS3231_set qu'en cas de besoin

Je possède un Arduino Uno et je suis sous Android. Si besoin je peux envoyer une photo de mon installation :wink:

Cette idée de commander des changements via mon téléphone est effectivement très très intéressante ! :hushed:

Ci-après, le code que j'utilise pour allumer les leds. Il y a 3 séries de leds RGB (voir photos plus haut dans le fil et le schéma en dessous) + une led rouge qui clignote.

Chaque série porte un nom (corniche haut, bas et observatoire).

Pour le moment, pour changer les couleurs, je dois me connecter à l'arduino et changer les codes couleurs "manuellement"

  // EMPIRE STATE BUILDING
  // Dernière màj : mai 2021
  // avec les aides précieuses de : Potof, Jean-Mi, J-M-L, vileroi, 68tjs et jpbbricole

int ledPin = 2;

void setup() {
  pinMode(11, OUTPUT); // Corniche Bas (3) - "R"
  pinMode(10, OUTPUT); // Corniche Bas (3) - "G"
  pinMode(9, OUTPUT); // Corniche Bas (3) - "B"
  pinMode(8, OUTPUT); // Corniche Haut (2) - "R"
  pinMode(7, OUTPUT); // Corniche Haut (2) - "G"
  pinMode(6, OUTPUT); // Observatoire (1) - "R"
  pinMode(5, OUTPUT); // Observatoire (1) - "G"
  pinMode(4, OUTPUT); // Corniche Haut (2) - "B"
  pinMode(3, OUTPUT); // Observatoire (1) - "B"
  pinMode(2, OUTPUT); // Anti-collision

  // Commande des couleurs sur les 3 étages :

// Observatoire (1)
analogWrite(6, 255); // Rouge (R)
analogWrite(5, 255); // Vert (G)
analogWrite(3, 255); // Bleu (B)

// Corniche Haut (2)
analogWrite(8, 255); // Rouge (R)
analogWrite(7, 255); // Vert (G)
analogWrite(4, 255); // Bleu (B)

// Corniche Bas (3)
analogWrite(11, 255); // Rouge (R)
analogWrite(10, 255); // Vert (G)
analogWrite(9, 255); // Bleu (B)
}

  // Commande de la led Anti-collision :

void loop()  {
  for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
    analogWrite(ledPin, fadeValue);
    delay(150);
  }
}

Merci encore pour ton temps !

Bonjour Aurélien

Moi, j'adore ça! As-tu un module Bluetooth HC-06 ou HC05 ?

Attention avec analogWrite(), ça ne s'adresse qu'aux pin qui ont PWM comme attribut,
Si tu veux changer l'intensité de l'allumage, seul ces pin réagissent, les autres seront ON ou OFF.

A+
Cordialement
jpbbricole

Non, mais j'ai déjà commencé à regarder pour un achat !

Je l'ai effectivement remarqué. La led RGB seule (pins 9, 10, 11) et une bande de leds (pins 3, 5, 6) sont sur du PWM et peuvent ainsi diffuser beaucoup de couleurs et faire des dégradés.
L'autre bande de led RGB (pins 4, 7 et 8) n'est pas sur du PWM et ne peut que diffuser 7 couleurs. Disons que pour le moment "je fais avec".

On m'a parlé d'une bibliothèque qui pourrait faire en sorte que toutes les pins puissent diffuser toutes les couleurs et faire des dégradés mais je n'ai pas encore pris le temps de savoir laquelle.

Bonjour Aurélien

C'est SoftPwm, l'effet est super!

A+
Cordialement
jpbbricole

Bonjour Aurélien

Encore une petite info, toi qui est bricoleur et aime les trucs fun! pourquoi ne pas utiliser des LED de type WS2812, ça ressemble à ton ruban RGB mais, c'est 3 fils (GND, +5V et signal), ça simplifie le câblage, tu peux en mettre beaucoup (je n'ai pas trouvé le chiffre exacte mais plus de 100), tu règle chaque LED de façon indépendante, bref, le pied! C'est très facile à programmer en Arduino. Quelques exemples.
Si tu veux en commander et hésites, pose des questions.

Cordialement
jpbbricole

Décidément j'avance super vite merci beaucoup :sweat_smile:

Je suppose que je dois seulement installer la bibliothèque et ça suffit ? Il n'y a pas de codage particulier à faire pour que toutes les couleurs soient dispo sur les pin non PWM ?

Wow je ne connaissais pas du tout... Mais la tu me donnes des possibilités que je n'avais même pas imaginé :crazy_face:
J'ai été voir quelques vidéos ça à l'air effectivement assez dingue... Et on se rapporche un peu plus "du vrai", puisque les projecteurs RGB de l'Empire State Building donnent des couleurs indépendamment les uns des autres...

Ce sera très probablement une prochaine étape après ce que j'ai déjà à faire :sweat_smile: car je devrais démonter beaucoup de choses pour installer celles-ci !

Le module HC-06 arrive bientôt :wink:

Merci encore, tu me fais faire des pas de géants !