Photo de l'électronique de l'horloge, tout y est: le plateau de support des leds, les 4 modules PCF8574+uln, le circuit carte mêre avec le picaxe et la RTC (ici une DS137), le poussoir et la prise alim 5V
La suite à suivre
MM
-----
Photo de l'électronique de l'horloge, tout y est: le plateau de support des leds, les 4 modules PCF8574+uln, le circuit carte mêre avec le picaxe et la RTC (ici une DS137), le poussoir et la prise alim 5V
La suite à suivre
MM
Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...
Bonjour,
Aujourd'hui, premier projet de face avant. Fait de photocopies sur papier calque entre deux feuilles de plexiglas.
On voit un peu trop les leds, c'est normal, la face avant est posée dessus
MM
Dernière modification par mag1 ; 31/03/2020 à 17h07.
Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...
Bravo mag1 pour ton effort et ton travail
Merci pour les encouragements.
Je soumets à la critique le dernier schéma utilisé, peu de changements
Le montage est directement alimenté par une alim stabilisée, Il n'y a pas de régulateur, le µC est alimenté via une 5819 et découplé par 100µF //100nF.
PWM pour alimenté les leds, modulé par une LDR et coef de proportionnalité (poussoir,8 paliers). Une 1n4148 pour compenser le passage par l'uln des autres leds.
Pour l'instant, tout fonctionne: mise à l'heure de la RTC, resynchronisation à +/- 2mn30 après coupure, etc
MM
Dernière modification par mag1 ; 31/03/2020 à 21h37.
Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...
Bonjour,
Oui, bon, pas la peine de rigoler, on est bien obligé de prendre ce que l'on a sous la main.
Le problème, c'est que l'impression laser sur calque n'est pas opaque. Même avec deux épaisseurs, ça ne vaut pas une découpe du même nom.
J'ai acheté du cuivre 1/10 de mm sur papier, beau rouleau.., mais le cuivre se plisse quand on le déroule...dommage. Je vais quand même essayer d'imprimer dessus et de le passer au perchlo... pour voir.
MM
Dernière modification par mag1 ; 04/04/2020 à 16h56.
Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...
As-tu essayé avec une feuille blanche classique?
Je peux essayer, mais je doute que cela donne un meilleur résultat.
L'idéal serait un masque opaque, je pense à une feuille cuivre de 1/10, sans frisures, bombe verni UV, insolation, gravure perchlo ou HCL...pas gagné.
Je suis preneur d'idées...
MM
Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...
Et pourquoi pas un PCB simple face en 4/10 en gravure anglaise?
J'ai fait faire une cotation pour voir, ça te revient à 60 balles port compris, PCB noir.
Pour 5 pièces vu que c'est leur minimum.
Si des fois tu étais intéressé je peux te faire le "routage" des lettres avec tes dimensions.
Merci, pour l'instant, je passe commande d'une bombe de positiv20. Avec l'expérience, j'espère dérouler ce qui me reste de cuivre autocollant sur une plaque de plexi, sans frisure cette fois.
Parce que l'impression directe sur cuivre avec la laser, même sans frisures, ça marche pas,(ben oui, j'ai essayé ...) le toner fond bien au début de la feuille, plus à la fin, le cuivre doit refroidir le rouleau du four.
Je ne sais pas où ni comment thjazi39 fabrique ses faces avant, mais ça n'était pas sa préoccupation
MM
Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...
Je retiens en tout cas l'idée de la fraiseuse cnc. Reste à savoir où je pourrais faire çà.
MM
Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...
Bonjour,
Très bonne idée le PCB mais pourquoi pas faire graver directement un masque de prototypage.
Ils le proposent chez JLCPCB
Bonjour,
C'est une belle réalisation, proche de celle de HULK
Oui, il y a les entreprises de signalétique qui peuvent faire des bandeaux publicitaires autocollants, j'en avais vu un quand mon fils à fait le 4LTrophy (2008)
C'est effectivement une bonne piste.
MM
Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...
Astucieux le coup de l'affichage des secondes en se servant des lettres....
Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...
Bonjour,
J'ai repris ma qlock.
L'idée du max6955 est bonne, mais chère, 15 à 20 euros et en cms, pas pratique. Mais on peut trouver deux modules MAX7219 pour pas cher et ça donne des idées....
Celle en cours se porte bien, il a juste fallu mettre au point la mise à l'heure à partir de son affichage pour tous les cas de figures.
Pour la finition, on peut se faire fabriquer des panneaux autocollants découpés en vinyle, 3 ou 4 pour une quinzaine d'euros.
J'attends le vernis UV pour essayer le cuivre. Bref, il y a des solutions.
Le code à suivre
MM
Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...
Bonjour,
La perfectionite est une maladie handicapante, quasi incurable.
Le pense ajouter deux signes: un + et un -, dans le coin inf gauche (y a un trou).
Entre H-2mn30 et H- 1mn, le signe - s'allume, l'heure réelle est inférieure à l'heure affichée de plus de 1 mn. Entre H-1mn et H+1mn, on affiche rien, l'heure exacte et l'heure affichée sont à 1 mn près. Entre H+1mn et H+2mn30, le + s'allume pour indiquer que l'heure réelle est dépassée de plus de 1 mn.
C'est pas grand chose à ajouter et ce sera une option...
MM
Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...
Bonjour,
Je suis en train de me "battre" avec le max 6955, ayant repris l'idée de celle citée en #43. Certes, il est un peu cher, mais 2x7219, c'est aussi cher. Cependant, le 7219 semble plus simple d'emploi, du moins la datasheet est plus explicite!
La datasheet de maxim est, je trouve, pas très claire et compréhensible. A moins que vous ayez trouvé comment adresser chaque segment de la table 2. Peut-être qu'à nos ages, nos neurones sont un peu essoufflés, et en ce moment on ne les "aère" pas beaucoup!
J'écris le prg en C avec CCS, que je maitrise assez bien.
La façade envisagée en PJ et le schéma sous proteus que j'utilise pour mettre au point le prg.
J'envisage de la faire de 35x35cm pour accrocher au mur.
A+
Jacques
Bon courage...j'ai pas trouvé ça très clair non plus. Voir si il y a des notes d'application.Bonjour,
Je suis en train de me "battre" avec le max 6955, ayant repris l'idée de celle citée en #43. Certes, il est un peu cher, mais 2x7219, c'est aussi cher. Cependant, le 7219 semble plus simple d'emploi, du moins la datasheet est plus explicite!
La datasheet de maxim est, je trouve, pas très claire et compréhensible. A moins que vous ayez trouvé comment adresser chaque segment de la table 2. Peut-être qu'à nos ages, nos neurones sont un peu essoufflés, et en ce moment on ne les "aère" pas beaucoup!
J'écris le prg en C avec CCS, que je maitrise assez bien.
La façade envisagée en PJ et le schéma sous proteus que j'utilise pour mettre au point le prg.
J'envisage de la faire de 35x35cm pour accrocher au mur.
Jacques
La solution des PCF8574 fonctionne bien, et c'est pas trop compliqué, surtout en basic de collégien. Le résultat sera exactement le même, pas de regrets...L'idée du décalage de 2mn30 est à retenir, à mon avis.
En parlant de code, voici le dernier utilisé, Ok pour l'instant, avec option + et -
Code:;Horloge qclocktwo picaxe 14M2 MM 14/04/2020 ;poussoir de commande sur C.3 ;interrupt sur C.0 :comptage pulses 1Hz, Déphasage de 2mn30s ;Mise au point par Afficheur LCD. les commandes sont restées en commentaires. #picaxe 14M2 setfreq M32 ; Moins vite, ça fonctionne aussi symbol pous=pinC.3 symbol eclair= C.2 ;sortie PWM symbol LDR= C.4 ;entrée LDR symbol buz=B.2 ;sortie buzzer pour les 3s mise à l'heure symbol PM=bit0 ; bascule jour/nuit symbol midinuit=bit1 symbol cpt1Hz=w13 ;compteur pulses 1Hz symbol cptmax=w12 ;valeur max ;300 pour 5 mn symbol heure=w11 ;heure sous forme HHmm symbol lum=w10 ;mesure lumière (0 à 1023) symbol varlum=w9 ;mesure après atténuation (170 à 1023) symbol heuraff=w8 symbol hh=b1 ;valeut heures symbol mm=b2 ;valeur minutes symbol octet4=b3 symbol octet3=b4 ;octets pour pcf8574 symbol octet2=b5 symbol octet1=b6 symbol mmbcd=b7 ;valeur mn en BCD => DS3231 symbol hhbcd=b8 ;valeur HH en BCD symbol varb=b10 ;variable locale symbol dch=b11 ;variable locale, chiffre des dizaines symbol coef=b12 ;coef lumière symbol memomm=b13 ;mémo veleur précédente des minutes symbol memoct2=b14 symbol vit=i2cslow_32 #macro transdectobcd(varb) ;transformation de dec vers bcd dch=varb//10 varb=varb/10*16 'mises au format BCD varb=varb+dch 'pour enregistrement #endmacro #macro transbcdtodec(varb) ;transformation de bcd vers dec dch=varb/16*10 varb=varb//16 varb=varb+dch #endmacro pullup %100000000000 ;activation pullup sur C.3 pause 1000 pwmout pwmdiv64,eclair,255,1023 ;PWM sur C.2 488Hz ,100%. div16 =>1955 Hz read 0,coef ;lecture niveau éclairage mis en mémoire EEPROM if coef=0 then coef=60 ;si pas en mémoire => éclairage max endif octet4=0:octet3=0:octet2=0:octet1=0 gosub afficheur gosub affichmin ;serout B.0,T9600_32,(254,1,254,1,254,128,"OK") If pous=0 then gosub initDS gosub synchro ;suite mise àl'heure et perrte alimentation: recherche heure et mn ;***** boucle principale . Horloge 24H µC et réglage pour affichage sur 12H ******** do do ;mise à l'échelle de lum à ajuster ? readadc10 LDR,lum ;lecture LDR lum=lum+10 max 1023 if pous=0 then gosub atenu ;atténuation éclairage varlum=lum*coef/60 pwmduty eclair,varlum ;valeur % PWM (lum=0 =>0%, 1023 =>100% gosub plusmoins loop while memomm=mm ;attente incrémentation des minutes (+5) memomm=mm ;mm a changé =>mise en mémoire nouvelle valeur cptmax=300 ;compteur 5 mn après 1er comptage if mm>55 then ;après 55, on repasse mm=0 ;à 0 inc hh ;et on incrémente l'heure endif if hh>23 then ;pendule H24 hh=0 endif heure=hh*100 + mm ;heure en forme hhmm sur 24H gosub convheur loop end convheur: ;convertisseur H24 => H12 + nuit select case heure ;passage en mode H12 case 0 to 0025 PM=1 ;pour minuit + mn heuraff=heure case 0030 to 1130 PM=0 ;=> AM pour afficher AM/PM heuraff=heure ;0 midi ou minuit, pasd'affichage AM/PM case 1135 to 1155 ; midi =>nuit sans objet heuraff=heure case 1200 to 1225 heuraff= heure-1200 case 1230 to 2355 PM=1 ;=> PM et minuit heuraff=heure-1200 endselect ;serout B.0,T9600_32,(254,192,"H24=",#heure," ","haff= ",#heuraff," ") gosub codheur gosub codmin return codheur: ;******* sub codage heure , octets 4 et 3 *************** midinuit=0 ;par défaut select case heuraff case 0035 to 0130 octet4=2: octet3=2 case 135 to 230 octet4=131: octet3=0 case 235 to 330 octet4=67:octet3=0 case 335 to 430 octet4=3:octet3=1 case 435 to 530 octet4=19:octet3=0 case 535 to 630 octet4=3:octet3=8 case 635 to 730 octet4=35:octet3=0 case 735 to 830 octet4=3:octet3=16 case 835 to 930 octet4=3:octet3=4 case 935 to 1030 octet4=3:octet3=96 case 1035 to 1130 octet4=11:octet3=0 else ;reste 0 à 30 et 1135 à 1155 midinuit=1 ;il est midi ou minuit if PM=1 then ;minuit octet4=4:octet3=0 else ;midi octet4=0:octet3=192 endif end select gosub afficheur return codmin: ;******* sub codage minutes octets 2 et 1 ******** select case mm case 35 octet2=7 : octet1=33 case 40 octet2=5 : octet1=1 case 45 octet2=1 : octet1=81 case 50 octet2=1 : octet1=129 case 55 octet2=1 : octet1=33 case 00 octet2=0 : octet1=1 case 05 octet2=0 : octet1=33 case 10 octet2=0 : octet1=129 case 15 octet2=8 : octet1=17 case 20 octet2=4 : octet1=1 case 25 octet2=6 : octet1=33 case 30 octet2=8 : octet1=13 end select octet1=octet1+PM memoct2=octet2 if midinuit=1 then ;a midi ou à minuit: octet1=octet1 & %11111100 ;on efface "AM" ou "PM" endif gosub afficheur ;si 1130-1230 => effacement AM PM gosub affichmin return initDS: ;******* Initialisation DS3231;'%11010000 est l'adresse i2c****** do loop while pous=0 time=0 PM=0 sound buz,(103,100) do ;réglage AM/PM (jour/PM) if pous=0 then pause 100 ;anti rebonds logiciel time =0 do if time >3 then sound buz,(103,100) goto heur endif loop while pous=0 PM=not PM octet1=PM +1 ;càd 1 ou 2 gosub affichmin ;on affiche "AM" ou "PM" endif loop heur: do loop while pous=0 time=0 : hh=0 : mm=0 do ;réglage heures if pous=0 then pause 100 time =0 do if time >3 then sound buz,(103,100) goto minute endif loop while pous=0 inc hh if hh>11 then ;càd 12 hh=0 endif endif heuraff=100*hh gosub codheur gosub codmin loop minute: do loop while pous=0 ;on a choisi l'heure time=0 : mm=0 do ;réglage minutes if pous=0 then pause 100 time =0 do if time >3 then sound buz,(103,100) goto fin endif loop while pous=0 mm=mm+5 if mm>55 then ;càd 60 mm=0 endif endif gosub codmin loop fin: if hh>0 then if mm>30 then hh=hh-1 endif hh=12*PM+hh endif if hh=0 then if mm>30 then hh=12*PM+11 endif if mm<35 and PM=1 then PM=not PM hh=12*PM endif endif do loop while pous=0 ;attente relache memomm=mm mmbcd=mm ;mmbcd est la forme BCD de mm sur 1 octet hhbcd=hh ;serout B.0,T9600_32,(254,212,"H24=",#hh,#mm) transdectobcd(mmbcd) transdectobcd(hhbcd) do loop while pous=1 ;on attend do loop while pous=0 ;on relâche à sec=00 hi2csetup i2cmaster, %11010000, i2cslow, i2cbyte hi2cout 0, ($00,mmbcd,hhbcd,$0,$0,$0,$0,%00010000) ;mise en mémoire EEPROM hi2cout 14,(0) ;registre control DS3231 au cas où sound buz,(103,100) pause 50 sound buz,(103,100) octet4=0:octet3=0:octet2=0:octet1=0 ;on gosub afficheur ;efface gosub affichmin ;tout (presque) return afficheur: ;affichage des l'heures hi2csetup i2cmaster,%01001000, vit, i2cbyte ;adresse I2C à ajuster hi2cout (octet4) hi2csetup i2cmaster,%01000110, vit, i2cbyte ;adresse I2C à ajuster hi2cout (octet3) ;serout B.0,T9600_32,(254,128," 4=",#octet4," 3=",#octet3," 2=",#octet2," 1=",#octet1," ",254,212,"haff= ",#heuraff," ","N=",#PM," ") return affichmin: ;affichage des minutes hi2csetup i2cmaster,%01000100, vit, i2cbyte ;adresse I2C à ajuster hi2cout (octet2) hi2csetup i2cmaster,%01000010, vit, i2cbyte ;adresse I2C à ajuster hi2cout (octet1) ;serout B.0,T9600_32,(254,128,"4=",#octet4," 3=",#octet3," 2=",#octet2," 1=",#octet1," ") ;serout B.0,T9600_32,(254,192,"haff=",#heuraff," ",#mm," PM=",#PM," ") ;serout B.0,T9600_32,(254,212,"h24=",#heure," " ) return synchro: ;sous prog resynchronosation hi2csetup i2cmaster, %11010000, i2cslow, i2cbyte ;en cas de coupure d'alim hi2cout 14,(0) ;registre control DS3231 hi2cout 7,(%00010000) ;registre control DS1307 do hi2cin 1,(mm) ;lecture minutes et heures sur RTC hi2cin 2,(hh) transbcdtodec(mm) ;passage forme bcd => dec transbcdtodec(hh) varb= mm//5 ;attente mn multiple de 5 ;serout B.0,T9600_32,(254,1,254,148,"hhmm=",#hh," ",#mm," ") loop while varb<>0 or memomm=mm ;pour attendre la valeur suivante cpt1Hz=0 ;raz compteur setint %1,%1 ;interruption niveau 1 sur C.0; comptage cptmax=150 ;comptage pour décalage 2mn30s heure=hh*100+mm ;mise en forme hhmm memomm=mm return atenu: ;***** sub atténuation éclairage ******* pause 100 do loop while pous=0 coef=coef+10 if coef>60 then coef=0 ;de 0 à 60 => 7 paliers endif write 0,coef ;mise en mémoire EEPROM return plusmoins: octet2=memoct2 if cpt1Hz < 90 and cptmax=300 then octet2=octet2 | 128 ; ajoute 1 sur bit 7 (de 0 à 7) elseif cpt1Hz >210 and cptmax=300 then octet2=octet2 | 64 ;ajout 1 sur bit 6 endif hi2csetup i2cmaster,%01000100, vit, i2cbyte ;adresse I2C à ajuster hi2cout (octet2) ;serout B.0,T9600_32,(254,148,"oct2=",#octet2," moc2=",#memoct2," ",254,222,"cpt=",#cpt1Hz," ") return interrupt: ;comptage de secondes RTC inc cpt1Hz if cpt1Hz>=cptmax then ;a cptmax, on incrément les minutes cpt1Hz=0 ;raz compteur mm=mm+5 ;on augmente les minutes de 5 endif do loop while pinC.0=1 ; un seul inc par seconde setint %1,%1 ;réactivation interruption return
MM
Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...
Bonjour,
Voilà une bonne semaine que la Qlocktwo donne l'heure dans le séjour et que j'attends des faces avant vinyle.
Je me suis amusé à faire un programme intégrant la mise à l'heure avec le texte affiché. Ça fonctionne, mais cela alourdit le programme inutilement.
Je propose donc une procédure en deux temps.
Un programme de mise à l'heure indépendant, utilisant uniquement le PC, avec une marche à suivre simple. Et un programme horloge allégé.
A suivre
MM
Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...
Pour le programme de mise à l'heure des RTC, tout est là, avec une vidéo:
http://electromag1.wifeo.com/mise-a-lheure-rtc.php
MM
Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...
Bonjour,
Les faces avant vinyle sont arrivées.
La lisibilité réelle est meilleure que sur la photo:
Le petit "+" indique que l'heure affichée est dépassée de plus de 1 mn (entre +1 et +2mn30)
Le vinyl: C'est une mince feuille de plastique entre deux protections, papier glacé côté autocollant, qu'il faut décoller en déroulant, progressivement, doucement, petit à petit et transférer avec précaution sur le support final (feuille de plexi de 2 mm) et même, vu la taille des surfaces, il y a quelques centres de "o" et autres qui manquent. Heureusement, on peut les récupérer avec une lame de cutter et les replacer où ils faut. Bref, on y arrive.
Le fabricant est un vrai pro, on lui envoie le projet en pdf et le produit arrive les jours qui suivent dans une grande enveloppe cartonnée "Ne pas plier!".
Prix raisonnable, c'est la première planche qui coute le plus chère, les planches supplémentaires sont à 2 ou 3 euros. j'en ai 3 pour 15 euros tout compris.
Pour la diffusion de la lumière, j'ai ajouté derrière deux ou trois feuilles de papier calque avec une autre plaque de plexi. Le sandwich est assemblé avec du scotch invisible. Le total fixé contre les cloisonnements (joints de portes découpés) par quelques mm de velcro aux quatre coins, repositionnables et qui ne glissent pas,( contrairement aux aimants).
MM
Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...
Joli travail et réalisation
Bonjour et merci;
Le projet arrive à son terme. Ce qui précède est l'évolution "temps réel".
Résumé des caractéristiques de la Qlocktwo "revisitée"
La face a une surface totale de 25 x 25 (simplement parce que j'ai acheté une plaque de plexi de 50 x 70 cm)
La surface utile (textes) est de 19 x 19 cm (simplement parce que on peut l'imprimer sur une feuille A4. Les lettres ajoutées autour de cette surface masquent mieux les textes.
L'alimentation est un bloc secteur "standard" de 5V régulés 1A. La consommation dépend du nombre de lettres éclairées, mais ne dépasse pas les 500mA.
Le matériel utilisé est accessible à tous, en France: plaques genre veroboard, module horloge DS3231, modules PCF8574, câbles "dupond" , leds cms 1206 et résistances cms 75ohms. condensateurs, picaxe, transistors, etc.
La procédure de mise à l'heure intégrée à l'horloge est restée, en cas de nécessité (changement d'heure) il est pratique de pouvoir le faire sans rien démonter.
Le rétroéclairage s'ajuste à la lumière ambiante, avec un petit poussoir pour régler le point de fonctionnement (7 paliers).
Indication AM ou PM, un petit plus qui ne ça sert pas à grand chose. Un autre plus est celui qui s'éclaire en bas à gauche, avec le -, il divise les 5 mn en trois et améliore la précision.
La RTC interne est protégée par sa batterie. En cas de coupure d'alimentation, l'horloge se resynchronise automatiquement.
Je rappelle le décalage de 2mn30 par rapport à l'heure réelle (grosse amélioration à mon avis).
Pour le reste, il s'agit d'un coffret vite fait à la colle au pistolet sur une boite de marrons glacés (vide).
Le code définitif (pour l'instant), la fréquence du PWM est modifiée pour palier des fluctuations du rétroéclairage (origine?)
Et pour finir:Code:;Horloge qclocktwo picaxe 14M2 MM 30/04/2020 ;poussoir de commande sur C.3 ;interrupt sur C.0 :comptage pulses 1Hz, Déphasage de 2mn30s ;Mise au point par Afficheur LCD. les commandes sont restées en commentaires. #picaxe 14M2 setfreq M32 ; Moins vite, ça fonctionne aussi symbol pous=pinC.3 symbol eclair= C.2 ;sortie PWM symbol LDR= C.4 ;entrée LDR symbol buz=B.2 ;sortie buzzer pour les 3s mise à l'heure symbol PM=bit0 ; bascule jour/nuit symbol midinuit=bit1 ;midi ou minuit=> supp AM ou PM symbol cpt1Hz=w13 ;compteur pulses 1Hz symbol cptmax=w12 ;valeur max ;300 pour 5 mn symbol heure=w11 ;heure sous forme HHmm symbol lum=w10 ;mesure lumière (0 à 1023) symbol varlum=w9 ;mesure après atténuation (170 à 1023) symbol heuraff=w8 ;heure affichée symbol hh=b1 ;valeur heures symbol mm=b2 ;valeur minutes symbol octet4=b3 symbol octet3=b4 ;octets pour pcf8574 symbol octet2=b5 symbol octet1=b6 symbol mmbcd=b7 ;valeur mn en BCD => DS3231 symbol hhbcd=b8 ;valeur HH en BCD symbol varb=b10 ;variable locale symbol dch=b11 ;variable locale, chiffre des dizaines symbol coef=b12 ;coef lumière symbol memomm=b13 ;mémo veleur précédente des minutes symbol memoct2=b14 ;mémo octet 2 pour +/- symbol vit=i2cslow_32 ;vitesse I2C symbol frson=109 ;fréquence buzzer #macro transdectobcd(varb) ;transformation de dec vers bcd dch=varb//10 varb=varb/10*16 'mises au format BCD varb=varb+dch 'pour enregistrement #endmacro #macro transbcdtodec(varb) ;transformation de bcd vers dec dch=varb/16*10 varb=varb//16 varb=varb+dch #endmacro pullup %100000000000 ;activation pullup sur C.3 pause 1000 pwmout pwmdiv4,eclair,255,1023 ;PWM sur C.2 :7813Hz ,RC=100%. read 0,coef ;lecture niveau éclairage mis en mémoire EEPROM if coef=0 then coef=60 ;si pas en mémoire => éclairage max endif octet4=0:octet3=0:octet2=0:octet1=0 gosub afficheur gosub affichmin ;serout B.0,T9600_32,(254,1,254,1,254,128,"OK") If pous=0 then gosub initDS gosub synchro ;suite mise àl'heure et perrte alimentation: recherche heure et mn ;***** boucle principale . Horloge 24H µC et réglage pour affichage sur 12H ******** do do ;mise à l'échelle de lum à ajuster ? readadc10 LDR,lum ;lecture LDR lum=lum+10 max 1023 if pous=0 then gosub atenu ;atténuation éclairage varlum=lum*coef/60 pwmduty eclair,varlum ;valeur % PWM (lum=0 =>0%, 1023 =>100% gosub plusmoins loop while memomm=mm ;attente incrémentation des minutes (+5) memomm=mm ;mm a changé =>mise en mémoire nouvelle valeur cptmax=300 ;compteur 5 mn après 1er comptage if mm>55 then ;après 55, on repasse mm=0 ;à 0 inc hh ;et on incrémente l'heure endif if hh>23 then ;pendule H24 hh=0 endif heure=hh*100 + mm ;heure en forme hhmm sur 24H gosub convheur loop end convheur: ;convertisseur H24 => H12 + nuit select case heure ;passage en mode H12 case 0 to 0025 PM=1 ;pour minuit + mn heuraff=heure case 0030 to 1155 PM=0 ;=> AM pour afficher AM/PM heuraff=heure ;0 midi ou minuit, pasd'affichage AM/PM case 1200 to 1225 PM=0 heuraff= heure-1200 case 1230 to 2355 PM=1 ;=> PM et minuit heuraff=heure-1200 endselect ;serout B.0,T9600_32,(254,192,"H24=",#heure," ","haff= ",#heuraff," ") gosub codheur gosub codmin return codheur: ;******* sub codage heure , octets 4 et 3 *************** midinuit=0 ;par défaut select case heuraff case 0035 to 0130 octet4=2: octet3=2 case 135 to 230 octet4=131: octet3=0 case 235 to 330 octet4=67:octet3=0 case 335 to 430 octet4=3:octet3=1 case 435 to 530 octet4=19:octet3=0 case 535 to 630 octet4=3:octet3=8 case 635 to 730 octet4=35:octet3=0 case 735 to 830 octet4=3:octet3=16 case 835 to 930 octet4=3:octet3=4 case 935 to 1030 octet4=3:octet3=96 case 1035 to 1130 octet4=11:octet3=0 else ;reste 0 à 30 et 1135 à 1155 midinuit=1 ;il est midi ou minuit if PM=1 then ;minuit octet4=4:octet3=0 else ;midi octet4=0:octet3=192 endif end select gosub afficheur return codmin: ;******* sub codage minutes octets 2 et 1 ******** select case mm case 35 octet2=7 : octet1=33 case 40 octet2=5 : octet1=1 case 45 octet2=1 : octet1=81 case 50 octet2=1 : octet1=129 case 55 octet2=1 : octet1=33 case 00 octet2=0 : octet1=1 case 05 octet2=0 : octet1=33 case 10 octet2=0 : octet1=129 case 15 octet2=8 : octet1=17 case 20 octet2=4 : octet1=1 case 25 octet2=6 : octet1=33 case 30 octet2=8 : octet1=13 end select octet1=octet1+PM memoct2=octet2 if midinuit=1 then ;a midi ou à minuit: octet1=octet1 & %11111100 ;on efface "AM" ou "PM" endif gosub afficheur ;si 1130-1230 => effacement AM PM gosub affichmin return initDS: ;******* Initialisation DS3231;'%11010000 est l'adresse i2c****** do loop while pous=0 time=0 PM=0 sound buz,(frson,100) do ;réglage AM/PM (jour/PM) if pous=0 then pause 100 ;anti rebonds logiciel time =0 do if time >3 then sound buz,(frson,100) goto heur endif loop while pous=0 PM=not PM octet1=PM +1 ;càd 1 ou 2 gosub affichmin ;on affiche "AM" ou "PM" endif loop heur: do loop while pous=0 time=0 : hh=0 : mm=0 do ;réglage heures if pous=0 then pause 100 time =0 do if time >3 then sound buz,(frson,100) goto minute endif loop while pous=0 inc hh if hh>11 then ;càd 12 hh=0 endif endif heuraff=100*hh gosub codheur gosub codmin loop minute: do loop while pous=0 ;on a choisi l'heure time=0 : mm=0 do ;réglage minutes if pous=0 then pause 100 time =0 do if time >3 then sound buz,(frson,100) goto fin endif loop while pous=0 mm=mm+5 if mm>55 then ;càd 60 mm=0 endif endif gosub codmin loop fin: if hh>0 then if mm>30 then hh=hh-1 endif hh=12*PM+hh endif if hh=0 then if mm>30 then hh=12*PM+11 endif if mm<35 and PM=1 then PM=not PM hh=12*PM endif endif do loop while pous=0 ;attente relache memomm=mm mmbcd=mm ;mmbcd est la forme BCD de mm sur 1 octet hhbcd=hh ;serout B.0,T9600_32,(254,212,"H24=",#hh,#mm) transdectobcd(mmbcd) transdectobcd(hhbcd) do loop while pous=1 ;on attend do loop while pous=0 ;on relâche à sec=00 hi2csetup i2cmaster, %11010000, i2cslow, i2cbyte hi2cout 0, ($00,mmbcd,hhbcd,$0,$0,$0,$0,%00010000) ;mise en mémoire EEPROM hi2cout 14,(0) ;registre control DS3231 au cas où sound buz,(frson,100) pause 50 sound buz,(frson,100) octet4=0:octet3=0:octet2=0:octet1=0 ;on gosub afficheur ;efface gosub affichmin ;tout sauf "il est" return afficheur: ;affichage des l'heures hi2csetup i2cmaster,%01001000, vit, i2cbyte ;adresse I2C à ajuster hi2cout (octet4) hi2csetup i2cmaster,%01000110, vit, i2cbyte ;adresse I2C à ajuster hi2cout (octet3) ;serout B.0,T9600_32,(254,128," 4=",#octet4," 3=",#octet3," 2=",#octet2," 1=",#octet1," ",254,212,"haff= ",#heuraff," ","N=",#PM," ") return affichmin: ;affichage des minutes hi2csetup i2cmaster,%01000100, vit, i2cbyte ;adresse I2C à ajuster hi2cout (octet2) hi2csetup i2cmaster,%01000010, vit, i2cbyte ;adresse I2C à ajuster hi2cout (octet1) ;serout B.0,T9600_32,(254,128,"4=",#octet4," 3=",#octet3," 2=",#octet2," 1=",#octet1," ") ;serout B.0,T9600_32,(254,192,"haff=",#heuraff," ",#mm," PM=",#PM," ") ;serout B.0,T9600_32,(254,212,"h24=",#heure," " ) return synchro: ;sous prog resynchronosation hi2csetup i2cmaster, %11010000, i2cslow, i2cbyte ;en cas de coupure d'alim hi2cout 14,(0) ;registre control DS3231 hi2cout 7,(%00010000) ;registre control DS1307 do hi2cin 1,(mm) ;lecture minutes et heures sur RTC hi2cin 2,(hh) transbcdtodec(mm) ;passage forme bcd => dec transbcdtodec(hh) varb= mm//5 ;attente mn multiple de 5 ;serout B.0,T9600_32,(254,1,254,148,"hhmm=",#hh," ",#mm," ") loop while varb<>0 or memomm=mm ;pour attendre la valeur suivante cpt1Hz=0 ;raz compteur setint %1,%1 ;interruption niveau 1 sur C.0; comptage cptmax=150 ;comptage pour décalage 2mn30s heure=hh*100+mm ;mise en forme hhmm memomm=mm return atenu: ;***** sub atténuation éclairage ******* pause 100 do loop while pous=0 coef=coef+10 if coef>60 then coef=0 ;de 0 à 60 => 7 paliers endif write 0,coef ;mise en mémoire EEPROM return plusmoins: octet2=memoct2 ;réinitialisation octet2 if cpt1Hz < 90 and cptmax=300 then octet2=octet2 | 128 ; ajoute 1 sur bit 7 (de 0 à 7) elseif cpt1Hz >210 and cptmax=300 then octet2=octet2 | 64 ;ajout 1 sur bit 6 endif hi2csetup i2cmaster,%01000100, vit, i2cbyte ;adresse I2C à ajuster hi2cout (octet2) ;serout B.0,T9600_32,(254,148,"oct2=",#octet2," moc2=",#memoct2," ",254,222,"cpt=",#cpt1Hz," ") return interrupt: ;comptage de secondes RTC inc cpt1Hz if cpt1Hz>=cptmax then ;a cptmax, on incrément les minutes cpt1Hz=0 ;raz compteur mm=mm+5 ;on augmente les minutes de 5 endif do loop while pinC.0=1 ; un seul inc par seconde setint %1,%1 ;réactivation interruption return
MM
Dernière modification par mag1 ; 30/04/2020 à 16h10.
Si il y a des erreurs ci dessus, c'est que je n'ai pas eu le temps de les corriger...