version 0.0 ... 20/05/2023
rev 17/12/2023

Projet Horloge 2023 (Mai 2023)
Affichage défilant sur 12 matrices 8x8 (18F27K42 ) MPLAB XC8

Hardware
Schéma
Software .(.mai 2023

Explications & Commentaires

Defilement 12 matrices
Problematique chargement Eeprom PIC
Dialogue et commandes via Terminal UART
Premiere Init RTC
Envoi de Messages
BlueTooth link (UART HC05 ..... Appli Android)
Correction Mesure de Temperature
Mise en Boitier
Plan (2023)
Réalisation ?
Videos
prototype


Autre Horloge ...WS2812
(2023 ?)
à base de Leds WS2812 pour 4 gros afficheurs 7 segments pour afficher HH et MN
et un ruban Led 1Metre 60 leds RGB WS2812B pour les secondes
Plan de départ du projet






Projet Horloge défilante 2023

Usage d'un PIC 18F27K42 et du Pickit4 Microchip pour charger l'éxecutable
Environnement: MPLABX IDE Version 6.00 XC8 2.36 et C99
MCU : FOSC interne 16x4=64MHz
I2C pour la RTC 3231
OWS pour capteur de température DS18B20
Liaison UART pour terminal ou BlueTooth.
SPI software pour la commande des 12 Max7219 ( 3 blocs de 4 matrices 8x8 led rouges)
Usage de la carte de BASE 18F ( idem que pour version 18F26K22)

Utilisation d'un registre à decalage 96 bits sur 24 entiers long ... en ASM !


HARDWARE :

Prototype :

Usage du circuit imprimé : BASE 18F27K42.


images/t_Horloge_Proto_12matrices_18F27K42_2023-05.gif


Schema :
Horloge / Temperature /Message Défilant 12 matrices 8x8 H

rev 01/06/2023
fichier ISIS : BASE_18F27K42_HORLOGE_Defil_12_Matrices_2023-0601.DSN

images/t_schema_horloge_12matrices_18f27k42_2023-0601.gif

Attention : Ce PIC a des Entrees/Sorties PPS ( aiguillages E/S vers peripheriques)

Il faut faire cohabiter plusieurs types de liaisons .

* SPI bit bang (MAX7219)
TRISC = 0b10000000;
#define SPI_CS LATCbits.LATC0
#define SPI_CLOCK LATCbits.LATC1
#define SPI_DOUT LATCbits.LATC5

RC5PPS=0;
* bus I2C1 (Hardware) pour l'horloge RTC
// I2C1
RC3PPS = 0x21; //RC3->I2C1:SCL1;
RC4PPS = 0x22; //RC4->I2C1:SDA1;
I2C1SCLPPS = 0x13; //RC3->I2C1:SCL1;
I2C1SDAPPS = 0x14; //RC4->I2C1:SDA1;

ODCONC = 0x18; // Open Drain sur I2C
* UART1 (dialogue et tracage)
// UART1
RC6PPS = 0x13; //RC6->UART1:TX1;
U1RXPPS = 0x17; //RC7->UART1:RX1;

* bus OWS pour le capteur de temperature DS18B20
// ODx registers
ODCONA = 0x07; // 0x07 => open drain sur RA0,RA1,RA2 OWS sensor


à noter que sur ce modele de bloc matrice MAX7219 , l'Entree est à droite !

Explications, commentaires :

Defilement 12 Matrices :
Utilise la fonction New_decalage_96bits_en_ASM_X();
Nota : Lourdeur d'ecriture par rapport à l'usage avec MikroC Pro 7.60 !
assume le decalage successif de chaque colonne de matrice 8x8 led ..
on fait donc 96 translations de 8 pixel par tour d'affichage .

Ces Registres à decalages sont localisés à une adresse figée dans le programme ..
ainsi que pour la sauvegarde de 2 registres MCU :
unsigned char save_bsr ; // BSR
unsigned char save_w ; //WREG
#define OFFSET 0x0020
unsigned long
temps[24] __at (0x0020);
// 8 lignes de 3 x (4x8) bits = 8 lignes de 96 bits
et un buffer d'affichage pour les 12 matrices x 8 *8= 768
unsigned char Aff_Buffer[768];// 768= 8x 12* 8


Nota : un mode special (Bavard) permet de visualiser sur le terminal les différents décalage à gauche successitf
de charactere de la Trame à afficher ..pixel par pixel
if(Bavard_Forcee==1) Affiche_12_Matrices_en_Texte_sur_Terminal(); // pin RB1
extrait :
images/t_Tracage_decalage_96bits.gif

La traversée des 12 afficheurs se fait en moins de 4sec ,
La trame actuelle de 28 caracteres circule en < 12sec
avec Speed=01
(13:14:40.010) Speed=01
(13:14:40.052) Speed=01 Old speed= 10 New = Speed=01
(13:14:40.280)
(13:14:49.477) 13:10:35 Mer 31 Mai 23.76°
(13:15:01.110) 13:10:47 Mer 31 Mai 23.76°
(13:15:12.741) 13:10:59 Mer 31 Mai 23.82°


Problematique pour Pré-Charger l'Eprom
voir ce fil : https://fantaspic.fr/viewtopic.php?f=10&t=1308
pre_chargement Eeprom PIC 18F27K42
Probleme d'init de l' Eeprom PIC 18F27K42 sous MPLABX IDE 6.00
facile avec MikroC et son Editeur Eeprom ..avec sauvegarde dans fichier *.iHex
.... mais adresse depart buguée pour le 18F27K42 ! (à remplacer manuellement)
compliqué avec MPLABX , car pas d'editor EEPROM
n'accepte pas le format iHex
necessite moulinette (c)Satinas Fantaspic.fr : ..... HexToMch.zip
tourne OK , sous win10 dans une fenetre DOS !
pour transformer un *.iHex en TABLE *.MCH
exemple d'usage : voir discussion sur FANTASPIC
https://fantaspic.fr/viewtopic.php?f=10&t=1308&start=11
.
images/t_Hex_to_Mch_Test_2023-0524.gif
...
au final , j'ai choisi de tester un Flag dans l'eeprom ,au 1er lancement
avec eeprom vierge (si contient 0xFF en 0x3F0), pour faire une Init Directe de l'Eeprom dans le code ..
...bien plus souple..

principaux parametres en Eeprom

PLM=23:01 Plage Horaire luminosité reduite au minima de 23H00 à 01H00
Speed=10 Vitesse de defilement affichage
Rep=00 Nombre de repetitions affichage Message
Lum=01 Valeur de la luminosité (Hors PLM) , nota 08 =déja extrement lumineux!
COR1=+001 Correction mesure de temperature capteur DS18B20 .. ici + 0,01°C


Rappel des commandes possibles
( Help), via terminal ou bluetooth

Help

Help : Help<CR>
RTC Update: U;30;05;23;15;36;02#<CR>
exemple pour :30 Mai 2023 02(Mardi) 15H36
Plage Luminosite Minimale PLM=23:01<CR>
Speed=xx vitesse de defilement xx de 02 a  99 <CR>
Msg=x...x de 0 a  63 caracteres , si >0 , Affiche le message x...x pendant x Rep <CR>
et affichage Time reduit, pas d'info temperatures pendant le Msg Affiche <CR>
Rep=xx de 01 a 99 :Repetition du Msg pendant xx Cycles <CR>
Lum=xx de 00 a  15 :Reglage Luminosite en mode JOUR <CR>
BAVA=0 ou 1 -> Bavard pour tracage programme

nota: Le reglage Lum=00 à 15 n' est opérant qu'en dehors de la plage PLM=xx : yy,
à l'interieur de cette plage Horaire , Lum=00


Premiere Init RTC
Une RTC neuve n'est pas initialisée , ou si le module RTC est resté non alimenté avec une pile HS
Nota : il vaut mieux utiliser une Pile Rechargeable LIR2032 qu'une CR2032
La Pin RB2 est dédiée à cela ..
Si on la met au 0V , au démarrage programme, l'état RB2=0 permet cette initialisation des
registres RTC à une date et heure bien definies, la Led 1Hz doit clignoter .

if(RTC_Forcee==0) // RB2 input
{
CPrint( " Etat pin RB2 = " );
if ( (PORTB & 0x04)==0x04) PrintChar('1'); else PrintChar('0');
CRLF1();
Forcage_RTC();
}

dans RTC_DS3231_2023-06.C

void Forcage_RTC(void) // 27-05-2023 via RB2 input =0
{ int i;
for (i=1;i<9;i++) tmp[i]=0; // tampon taille 32 bytes
CPrint( "
Init RTC Forcee a Samedi 27/05/2023 11:59:57 via RB2=0 \r\n");
tmp[0]=0x00; //start register
tmp[1]=0x57; //second
tmp[2]=0x59; //write min
tmp[3]=0x11; //write hour;
tmp[4]=0x06; ///write day of week
tmp[5]=0x27; // write date
tmp[6]=0x05; // write month
tmp[7]=0x23; // write year
tmp[8]=0x00;
// SQA=1; // pour logic analyser synchro
p1=&tmp[0];
I2C1_WriteNBytes(DS3231_ADDR,p1,8);
// SQA=0;
}
Une fois cette 1ere init faite, remettre RB2 à 1 ( pin non connectée au 0V )
et utiliser la commande Terminal (ou BlueTooth)

Rappel format de cde :
exemple :
U;30;05;23;15;36;02#<CR>
pour :30 Mai 2023 02(Mardi) 15H36

ou simplement la touche MAJ RTC sur l'appli Horloge appinventor ...via liaison bluetooth


Envoi de Message

Taille maxi 63 caracteres.
Sur un envoi d'un message via "Msg=Mon Message", uniquement l'heure est affichée HH:MM:SS, suivie de "Mon Message"
prendant le nombre de repetition dependant de la valeur Rep=xx
Apres le nombre de répétitions écoulés, on revient sur l'affichage complet : Date Heure Temperatures.


Exemple d'envoi de message, répété 4 fois, puis retour à l'affichage Horloge complet
* La durée d'affichage du message dépend donc du nombre de REPétitions.. (max=99x12sec=> 19 minutes)
pour davantage , modifier le code pour la saisie sur 3 digit => 999 ou rajouter choix -1 pour durée infinie

13:16:21.123) Rep=04
(13:16:21.165) Rep=04 Old Rep = 0 New Rep= Rep=04
(13:16:21.501) 13:12:08
(13:16:25.900) 13:12:12
(13:16:26.049) Msg=Salut les copains
(13:16:26.093) Salut les copains
(13:16:26.093) OK for Msg
(13:16:37.802) 13:12:24 Salut les copains
(13:16:49.022) 13:12:35 Salut les copains
(13:17:00.241) 13:12:46 Salut les copains
(13:17:11.460) 13:12:57 Salut les copains
(13:17:23.081) 13:13:09 Mer 31 Mai 23.82°
(13:17:34.702) 13:13:21 Mer 31 Mai 23.82°



BlueTooth Link :

Test préalable , hors application Horloge
avec HC05 <--> terminal YAT

cordon USB --- cable avec fils V=reception Blanc=Emission
croiser les 2 fils Vert et Blanc du cable sur le connecteur rapide en amont du mini connecteur 4 pins femelle ....
... prolongateur Male -Male ..... mini connecteur Femelle 4 Pins relié au Module HC05


code PIN 1234
AT
OK
AT+NAME?
+NAME:CLAVIER-2A03R
OK
AT+ADDR?
+ADDR:98D3:31:F72A03
OK
AT+VERSION
VERSION:3.0-20170609
OK
AT+ROLE
+ROLE:0
OK
AT+UART
+UART:19200,0,0
OK
Modif . vitesse : en accordance avec celle de l'UART PIC
AT+UART=115200,0,0
OK
AT
---- manually ,change terminal speed from 19200 to 115200

AT
OK
AT+UART
+UART:115200,0,0
OK
AT+MRAD?
+MRAD:8BA:5F:74881A
OK
AT+STATE?
+STATE:PAIRABLE
OK

* enlever le connecteur male -Male 4 pins entre les 2 mini connecteur femelle du cable Terminal
* Remettre les 2 fils Vert et Blanc dans le bon ordre sur les fils du connecteur rapide

Test direct avec HC05

Sur la carte BASE 18F, remettre le HC05 sur la connection UART
* le +Vcc (rouge) est connecté dans le cas du module HC05 !

Test avec application Android "Bluetooth Terminal" sur Phone Altice S62
Touches preprogrammées : help, Lum , Speed, Rep, Msg
capture ecran S62
Ce PC\Altice S62\Mémoire interne partagée\Pictures\Screenshots




Correction Mesure de Temperature absolue

Rajout d'une commande (clavier terminal ou BlueTooth.)
Correcteur de mesure pour le capteur OWS DS18B20
gamme de correction limitée à +-3°C , introduite en 1/100em de degré
une commande distincte par capteur
COR1=xxx avec -300 < xxx < +300
la saisie est verifiée/blindée pour etre acceptée.
exemple : COR1=+050 , rajoute COR1/100 ... soit 0,5°C sur la mesure A

Modif de la convertion ascii representant la mesure , pour pouvoir ajouter ou retrancher cette correction
En entrée : La valeur de base du capteur étant exprimée avec une résolutrion de +-0.0625 degré en Floattant .
en sortie : la mesure A corrigée est en ascii dans Temp_DS18B20_A ... rajoutée ensuite dans la Trame d'affichage


La procedure Update _Trame, raffraichit l'affichage en temps quasi reel , au maximum
de vitesse de la boucle principale , ajustable avec le parametre Speed .
Plusieurs Pointeurs sont utilises pour remplir la Trame stockée dans TEXTE[0]
Chaque pointeur ayant un role particulier
pT pour l'heure (Time)
pJ pour le nom du Jour de la semaine (jS)
pD pour la Date , (Date jour)
pM pour le nom du mois
pI pour la mesure de Temperature Interieure (ambiante)
kL = longueur de la Trame
si une demande de Message est emise , seule L' heure (HH:MN:SS est affichée suivit du Message ..

la mesure de temperature est intégrée, à la suite des autres infos time/jour/date
avec la particularité du caractere special regroupant °C sur 1 matrice 8x8 au lieu de ° (en ascii)

Remplacement des 2 caracteres ° C par un seul caractere groupant °C
codage de Degre C = ° 176
.***....
.*.*....
.***.***
.....*..
.....*..
.....*..
.....*..
.....***




Log séquence de démarrage sur Terminal :

fichier log complet : YAT-Log-Horloge_18F27K42_2023-0530.log
extrait :

Presentation : PIC18F27K42 + texte defilant sur 12 matrices MAX7219
Directory :C:\MPLABX_Projects\_18F27K42_Horloge_12xMax7219_2023.X
Project : _18F27K42_Horloge_12xMax7219_2023
Source : main.c _2023-0530
Config Internal Fosc 64MHz
Autres : config.h,table_char.h,RTC_DS3231_06.h ,One_Wire_2023.h
Eeprom : ...
3 blocs de 4 matrices 8x8 Max7219
SPI RC0=CS ,RC1=CLCK,RC5=DOUT UART 115200 bds RA0= OWS DS18B20
RTC sur bus I2C1 HW : RC3=SCL,RC4=SDA
RB1 =Bavard Forcé , RB2==RTC Forcee

Compile le May 30 2023 a 16:57:57 UTC
avec version XC8 : 2360 et PACK PIC18F-K_DFP 1.6.125



SOFTWARE
Derniere MAJ Projet MPLABX XC8 : 01/06/2023




Projet PACK zipé : _18F27K42_Horloge_12xMax7219_2023-0601.zip
Chargeur : _18F27K42_Horloge_12xMax7219_2023-0601.X.hex
Source : main_18F27K42_Horloge_12_Matrices_2023-0601.X.c
Fonte : THIN_SS_2020.h


Mise en boitier

voir version 18F26K22 de 2022 !
Préparation en Image de synthese (MORAY + POVray)

Virtuelle en 3D

images/t_mise_en_boite_journal_lumineux_12_matrices_191218.gif
Lien vers Raytracing fichiers Moray et MDL


Plan de découpe (version 2023)
réalisé avec word ...!
Boitier_holorge_12matrices_2023_0616.pdf

Réalisation :

Problemo :
ATTENTION : cette année, 2023 , j'ai acheté 3 autres modules de 4 max7129 , mais livrés avec les
Afficheurs SOUDES directement sur le circut imprimé !
Il y a
beaucoup de versions différentes de ces modules 4 max 7219 + afficheur 8x8 leds!
Comment mettre des vis de fixations dans ce cas de figure, plus d'access aux trous de fixation par le dessus !
dessouder les afficheurs ?
.... => les coller !


Montage des 3 modules collés sur un support tasseau en bois de 400 x 39 x 9 mm

Videos:
prototype :
Horloge_18F27K42_Proto_2023-05.webm
Réalisation finale .... à suivre



 

AUTRE HORLOGE WS2812B (2023?)

Avec un Ruban RGB Leds WS2812B de 60 leds par Metre ...
et des diodes Leds individuelles RGB WS2812B
pour réaliser les afficheurs 7 segments
Le ruban linéaire ne pouvant etre disposé en cercle, celui ci est decoupé 12 morceaux ( 5 leds=5 sec) pour former
un dodécagone ... Diametre du cercle inscrit 1000/ PI = 318 mm
Les afficheurs 7 segments 110x40mm :
segment horizontal de 3 leds ( ou 4 !), segment vertical de 4 leds => 15 (ou 21) leds par aficheurs
4 Afficheurs : HH MN , les secondes defilant sur le ruban led, et 2 leds centrales pour le clignotement secondes.

Plan
echelle 1/2, réalisé avec word ...!
Gabarit_Horloge_ruban_WS2812B_2023_all.pdf
WS2812_Afficheur_7seg_cablage.pdf


Prototype :




SOFTWARE :









paulfjujo@free.fr


Retour à l'index general