Le projet :
Réaliser une horloge avec des leds derrière un panneau de plexiglass blanc avec un affichage séquentiel de données de capteurs. Prise en compte de la luminosité ambiante pour baisser l’intensité lumineuse le soir.
Les besoins :
– Affichage de l’heure, sauvegardée en cas de coupure de courant et mis à jour automatiquement par le relais DCF77.
– Affichage de la température intérieure
– Affichage du taux d’humidité,
– Affichage des données d’un module extérieur en 433 Mhz pour la température et le taux d’humidité
– * Affichage de la qualité de l’air
– Gestion du mode d’affichage par bouton poussoir ou sensor touch :
- HMS en permanence et affichage DMY par intermittence toutes les 5 minutes.
- HMS en permanence et affichage des capteurs à la suite pendant 5 secondes toutes les 2 minutes et affichage DMY par intermittence toutes les 5 minutes.
- Défilement des données par appui sur sensor touch ou bouton poussoir (exemple : HMS, DMY, Temp, Pression, Humidité, Air, Extérieur) et retour au mode 1 si aucun appui après le cycle.
Les pré-requis :
– Carte contrôleur (Arduino Uno)
– Circuit avec 32X8 Leds rouges
– Capteur de température et humidité DHT11 ou DHT22 (plus précis)
– Capteur de pression barométrique*
– Carte Horloge DS1307
– Carte Récepteur 433 Mhz
– Carte DCF77 pour réception heure pilotée à 77,5 kHz
– Détecteur de luminosité
– Boutons poussoir
– Alimentation 9V
– De la réflexion et programmation…
Le programme de test :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 |
/* * Projet Mon Horloge * Affichag sur matrix led 32x8 * Heures, Minutes, Secondes * Date * Temperature, Humidite, Pression en alternance * Mise à lheure automatique par dcf77 * Pin : A0=Dht, D2=Dcf, A4,A4=DS1307, A3=Luminosit, D3=433Mhz, D7=Touch, D9,D10,D12,D13=Matrix Led */ #include <Wire.h> #include <DS1307.h> #include <DHT.h> #include <DCF77.h> #include <Time.h> #include <HT1632.h> #include <font_5x4.h> #include <images.h> #define DHTPIN A0 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); DS1307 clock; #define DCF_PIN 2 // Connection DCF 77 device to pin D2 #define DCF_INTERRUPT 0 // Interrupt number associated with pin time_t time; DCF77 DCF = DCF77(DCF_PIN, DCF_INTERRUPT); int compte = 0; String heure; int luminosite = 0; int i = 0; String jour; char disp[] = "HELLO"; void setup() { HT1632.begin(12, 10, 9); Serial.begin(9600); dht.begin(); clock.begin(); DCF.Start(); // mise a heure valeurs passees clock.fillByYMD(2015, 10, 12); clock.fillByHMS(17, 9, 55); clock.fillDayOfWeek(MON); clock.setTime(); //write time to the RTC chip HT1632.renderTarget(0); HT1632.clear(); HT1632.drawText(disp, 6, 1, FONT_5X4, FONT_5X4_END, FONT_5X4_HEIGHT); HT1632.render(); delay(2000); pinMode(7, INPUT); // bouton poussoir } void loop() { eclairement(); time_t DCFtime = DCF.getTime(); if (DCFtime != 0) { setTime(DCFtime); miseajourds1307(); HT1632.setPixel(31, 7); HT1632.render(); delay(100); HT1632.clearPixel(31, 7); HT1632.render(); } clock.getTime(); if (digitalRead(7) == LOW) { if (clock.second == 2) { efface(); printDate(); delay(3000); alterne(); } else { printTime(); delay(1000); } } else { alterne(); } } // Fonctions void printTime() { char heur[10]; clock.getTime(); Serial.print(clock.hour, DEC); Serial.print(":"); if (clock.minute < 10) { Serial.print("0"); Serial.print(clock.minute, DEC); sprintf(heur, "%d:0%d", clock.hour, clock.minute); } else { Serial.print(clock.minute, DEC); sprintf(heur, "%d:%d", clock.hour, clock.minute); } Serial.print(":"); if (clock.second < 10) { Serial.print("0"); Serial.println(clock.second, DEC); } else { Serial.println(clock.second, DEC); } HT1632.clear(); HT1632.drawText(heur, 7, 1, FONT_5X4, FONT_5X4_END, FONT_5X4_HEIGHT); HT1632.render(); delay(100); HT1632.clearPixel(16, 2); HT1632.clearPixel(16, 4); HT1632.render(); } void printDate() { clock.getTime(); switch (clock.dayOfWeek)// Friendly printout the weekday { case MON: Serial.print("Lun "); jour = ("Lundi"); break; case TUE: Serial.print("Mar "); jour = ("Mardi"); break; case WED: Serial.print("Mer "); jour = ("Mercredi"); break; case THU: Serial.print("Jeu "); jour = ("Jeudi"); break; case FRI: Serial.print("Ven "); jour = ("Vendredi"); break; case SAT: Serial.print("Sam "); jour = ("Samedi"); break; case SUN: Serial.print("Dim "); jour = ("Dimanche"); break; } Serial.print(clock.dayOfMonth, DEC); Serial.print("/"); Serial.print(clock.month, DEC); Serial.print("/"); Serial.println(clock.year + 2000, DEC); char jourdate[8]; char journee[10]; jour.toCharArray(jourdate, 8); // sprintf(jourdate, "%s", jourdate); HT1632.clear(); HT1632.drawText(jourdate, 1, 1, FONT_5X4, FONT_5X4_END, FONT_5X4_HEIGHT); HT1632.render(); delay(2000); sprintf(journee, "%d.%d.%d", clock.dayOfMonth, clock.month, clock.year); // clock.year + 2000 HT1632.clear(); HT1632.drawText(journee, 2, 1, FONT_5X4, FONT_5X4_END, FONT_5X4_HEIGHT); HT1632.render(); } void printTemp() { float temperat = dht.readTemperature(); Serial.print("Temperature :"); Serial.print(temperat, 1); Serial.println(" C"); char str_temp[3]; char temper[3]; dtostrf(temperat, 4, 1, str_temp); sprintf(temper, "%s", str_temp); HT1632.clear(); HT1632.drawText(temper, 2, 1, FONT_5X4, FONT_5X4_END, FONT_5X4_HEIGHT); HT1632.setPixel(18, 1); HT1632.setPixel(18, 2); HT1632.setPixel(19, 1); HT1632.setPixel(19, 2); printIn(); HT1632.render(); } void printHumi() { float humidite = dht.readHumidity(); char str_temp[3]; char humi[3]; dtostrf(humidite, 2, 1, str_temp); sprintf(humi, "%s", str_temp); HT1632.clear(); HT1632.drawText(humi, 2, 1, FONT_5X4, FONT_5X4_END, FONT_5X4_HEIGHT); HT1632.setPixel(17, 1); HT1632.setPixel(17, 2); HT1632.setPixel(18, 1); HT1632.setPixel(18, 2); HT1632.setPixel(17, 5); HT1632.setPixel(18, 4); HT1632.setPixel(19, 3); HT1632.setPixel(20, 2); HT1632.setPixel(21, 1); HT1632.setPixel(20, 4); HT1632.setPixel(20, 5); HT1632.setPixel(21, 4); HT1632.setPixel(21, 5); printIn(); HT1632.render(); Serial.print("Humidite : "); Serial.print(humidite, 1); Serial.println(" % "); } void printdcf() { Serial.print("Dcf: "); Serial.print(hour()); printDigits(minute()); printDigits(second()); Serial.println(""); switch (weekday())// Friendly printout the weekday { case 1: Serial.print("Dim "); break; case 2: Serial.print("Lun "); break; case 3: Serial.print("Mar "); break; case 4: Serial.print("Mer "); break; case 5: Serial.print("Jeu "); break; case 6: Serial.print("Ven "); break; case 7: Serial.print("Sam "); break; } Serial.print(" "); Serial.print(day()); Serial.print("/"); Serial.print(month()); Serial.print("/"); Serial.println(year()); } // ajout du zero devant les minutes et heures inférieures à 10 void printDigits(int digits) { Serial.print(":"); if (digits < 10) Serial.print('0'); Serial.print(digits); } void efface() { HT1632.clear(); } void eclairement() { luminosite = analogRead(A3); if (luminosite <= 50) { HT1632.setBrightness(1); } if (luminosite >= 51 ) { HT1632.setBrightness(16); } } void alterne() { efface(); printTemp(); delay(4000); efface(); printHumi(); delay(3000); efface(); // pour debug printdcf(); delay(2000); efface(); } void miseajourds1307() { clock.fillByYMD(year(), month(), day()); clock.fillByHMS(hour(), minute(), second()); switch (weekday()) // Friendly printout the weekday { case 1: clock.fillDayOfWeek(SUN); break; case 2: clock.fillDayOfWeek(MON); break; case 3: clock.fillDayOfWeek(TUE); break; case 4: clock.fillDayOfWeek(WED); break; case 5: clock.fillDayOfWeek(THU); break; case 6: clock.fillDayOfWeek(FRI); break; case 7: clock.fillDayOfWeek(SAT); break; } clock.setTime(); //write time to the RTC chip } void printIn() { HT1632.setPixel(27, 5); HT1632.setPixel(27, 6); HT1632.setPixel(27, 7); HT1632.setPixel(29, 5); HT1632.setPixel(29, 6); HT1632.setPixel(29, 7); HT1632.setPixel(30, 5); HT1632.setPixel(31, 5); HT1632.setPixel(31, 6); HT1632.setPixel(31, 7); } |
les Serial.print sont là pour le debug.
Quelques galères pour avec la réception DCF77 avec le module.
Je pense que la ferrite est trop petite, donc la réception est vraiment très sensible… J’ai tout de même reçu les trames après éloignement de l’ordinateur et du micro contrôleur et la mise à jour se fait en 2 minutes.
Je pensais changer la ferrite pour une de 150 mm , diamètre 50 mm. Peut être un blindage autour du micro contrôleur si cela fonctionne mal au montage final.
Le plan :
Les tests avec platine :
le schéma :