30/11/2015
maj:25/10/2020

Bargraphe 100% ANALOGIQUE (avec 10 ou 20 barres) (2015)
* Diagram de principe LM3914
*
Version 10 segments ou Point
*
Version Mode Cascade 2x10 = 20 segment

Bargraphe LCD 2 x 16 chars (mode TEXTE uniquement) (2020_1024)
* Creation cararatere Speciaux en CGRAM
*
Barre Graphe Horizontal ( avec CGRAM chars)
...
exemple avec EA0 analog
*
Barre Graphe Verticale ( avec CGRAM chars)
*
Barre Graphe Verticale ( avec CGROM chars)
*
Software et video

Bargraphe sur LCD Grafiques :
*Nokia 96x64 , en mode GRAFIQUE

*OLED 128x32
*ILI9235 320X240 couleur


Liens


Indicateur de Position avec un Bargraphe Analogique

But:
Indiquer la position d'un élement, representé par la valeur analogique d'un capteur ou autre..
exemple : recopie de position via un potentiometre.

Documentation sur le (composant) driver de bargraph :

LM3914 driver data sheet , bargraphe à réponse Lineaire et cascadable
le LM3915driver de bargraf à reponse Logarithlique, pour Vumetre ( decibel!)
Boitier DIP18


Schema de principe :


L'afficheur 10 leds en ligne B10BS

images/Bargraph_B10BS_25x10x8.gif
le bargraphe 10 leds .....................................et un enjoliveur



* Attention à l'orientation de l'afficheur et numero de pin.
modele led rouge (existe aussi en vert et orange)
à ma connaissance il n'existe pas de bragraph avec 2 leds vertes au lmilieu..
prevoir 10mA par segment

Montage bargraphe simple :
L'alimentation du module peut varier de 9 à12V , mais doit etre stable
Un regulateur 9V calme le tout ..

Schema de principe (version 10 leds):

version mode Point (DOT)

images/t_Bargraphe_1xLM3914_sch.gif images/t_Proto_afficheur_10_leds_LM3914.gif
schema coammnde 10 leds avec driver LM3914 le prototype de test

*Option Barre ou Point .. si uniquement Point ,laisser la pin 9 non connectée.

Un reglage fin peut etre necessaire en fonction de la course reelle du potar
0 à 270° max pour un potar rotatif classqiue ( reponse lineaire !)
ou xx% de la course d'un potar lineaire.


Version Bargraphe 20 leds , avec 2 LM3914 chainés

Schema :

images/t_Bargraphe_chainage_2_LM3914_sch.gi images/t_Chainage_2xLM3914.gif
schema version 20 leds mode DOT principe en mode point (DOT)

Nota: Version Point (DOT) .
On comprend plus facilement le chainage en regardant le schema de principe du LM3914 !
Les resistances de 10K sur segment 1 , permettent une extinction complete de celui ci apres depassement.
La liaison PIN 9 du 1er LM3914 à la PIN 1 du 2em LM3914 (soit le 1er segment) est indispensable
pour que le dernier segment 10 du 1er bargraf s'eteigne apres passage sur le 1er segment du 2em bargraf
(en mode point, bien sur ..) non utile en mode segment (barre).

Prototype :

Réalisé en 2 partie (platine trop petite .. beaucoup de strap !)

images/t_Proto_afficheur_20_leds_2xLM3914.gif images/t_Proto_afficheur_20_leds_2xLM3914_b.gi
prototype sur 2 plaques d'essais  


La plage de reglage depend de R1 et R2 . et 2xR1 + 2xR2
voir sur le schema ,la relation Volt d'entrée et seuil d'allumage du segment.
Réalisation assez facile, au detail pres de mauvaises connection sur "planche à pain "
Circuit imprimé indispensable.!.
Cette solution est 100% hardware .
j'avais envisagé aussi une solution PIC12F1840+ MCP13017 I2C 16sorties leds.entierment parametrable..
mais rendement :rapport (hardware +developpemnt soft)/ souplesse... pas assez grand..



Bargraphes sur LCD 2x16 en mode TEXTE

Testé sur une carte Microchip IRDA Board equipée d'un LCD OCULAR OM16241 2 lignes de 16 chars
et un MCU PIC 18F47K42


Rappel :
MCU 18F47K42 PinOut
Datasheet MCU (PIC18FxxK42 DS 40001919B rev 2017)

Hardware :



images/t_IRDA_board_16F877_LCD_schem.gif


// Lcd OCULAR OM16241 2 lignes de 16 cars pinout settings
sbit LCD_RS at LATA3_bit;
sbit LCD_RW at LATA2_bit;
sbit LCD_EN at LATA1_bit;
sbit LCD_D7 at LATB3_bit;
sbit LCD_D6 at LATB2_bit;
sbit LCD_D5 at LATB1_bit;
sbit LCD_D4 at LATB0_bit;

// Pin direction
sbit LCD_RS_Direction at TRISA3_bit;
sbit LCD_RW_Direction at TRISA2_bit;
sbit LCD_EN_Direction at TRISA1_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;

sbit LCD_PWR at RD5_bit; // to power on the LCD
sbit LCD_PWR_Dir at TRISD.B5; // to power on the LCD

Portage su PIC18F47K42

Software :

Création de 3 set de table de characteres
const char *Special_Name[]=
{"DEGREE","EURO ","OHM ","PF ","Droite","Gauche","CANCEL","Check ", // pour caracteres Speciaux
"Zero ","un ","deux ","trois ","quatre","cinq ","six ","Seven ", // pour Barre Graphe Horizontale
"Zero ","un ","deux ","trois ","quatre","cinq ","six ","Seven "}; // pour barre Graphe Vertical

les 3 set dans l'espace Flash ROPM du PIC :

const unsigned char LCD_Custom_Chars[] =
{
//---------- set #1 ------------------
0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00, //char #1 Degrée
0x06,0x09,0x08,0x1E,0x1E,0x08,0x09,0x06, //char #2 euro
0x04,0x0A,0x11,0x11,0x0A,0x0A,0x11,0x00, // char #3 Ohm
4,14,14,14,31,0,4,0, // char #4 bell
//0x10,0x18,0x1C,0x1E,0x1C,0x18,0x10,0x00, //char #5 A droite
28,20,27,18,19,18,18,0 , //char #5 initiales PF
0x01,0x03,0x07,0x0F,0x07,0x03,0x01,0x00, //char #6 A gauche
0x00,0x11,0x0A,0x04,0x06,0x11,0x00,0x00, //char #7 cancel
0x00,0x01,0x03,0x16,0x1C,0x10,0x00,0x00, //char #8 Checked


//----- set #2 0 à 6 colonnes Barre horizontale -------
0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,
0b01000000,0b01000000,0b01000000,0b01000000,0b01000000,0b01000000,0b01000000,0b01000000,
0b01100000,0b01100000,0b01100000,0b01100000,0b01100000,0b01100000,0b01100000,0b01100000,
0b01110000,0b01110000,0b01110000,0b01110000,0b01110000,0b01110000,0b01110000,0b01110000,
0b01111000,0b01111000,0b01111000,0b01111000,0b01111000,0b01111000,0b01111000,0b01111000,
0b01111100,0b01111100,0b01111100,0b01111100,0b01111100,0b01111100,0b01111100,0b01111100,
0b01111110,0b01111110,0b01111110,0b01111110,0b01111110,0b01111110,0b01111110,0b01111110,
0b01111111,0b01111111,0b01111111,0b01111111,0b01111111,0b01111111,0b01111111,0b01111111,


//---- #set #3 Barre verticales ------------------
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,31,
0,0,0,0,0,31,31,
0,0,0,0,0,31,31,31,
0,0,0,0,31,31,31,31,
0,0,0,31,31,31,31,31,
0,0,31,31,31,31,31,31,
0,31,31,31,31,31,31,31
};

Set #1 caracteres speciaux Set #2 pour Bargraphe Horizontal




Chargement d'un SET en CGRAM, les chars ainsi crées sont affichés sur le terminal UART

void LCD_Load_Custom_Chars(char Set)
{
unsigned int i;
unsigned int k=0;
// Set address counter pointing to CGRAM address 0.
LCD_WriteCmd(0x40);
// Load custom lcd character data into CGRAM.
// It can only hold a maximum of 8 custom characters.
for(i = 0; i <64; i++)
{
if (i%8==0)
{
CPrint1(Special_Name[k+ (Set<<3)]);
k++;
CRLF1();
}
if ( (i>0) && (i%8==0))
{
CRLF1();
}
LCD_WriteData(LCD_Custom_Chars[i+ (Set<<6)]);
Decompile_byte( LCD_Custom_Chars[i+ (Set<<6)]); // <--------- affichage du char sur terminal
CRLF1();

}
// Set address counter pointing back to the DDRAM.
LCD_WriteCmd(0x80);
Delay_ms(150);
}




BARGRAPHE HORIZONTAL

Utilisation de characteres en CGRAM representant 1,2,3,4,5,6 barres verticales
pour afficher la progression d'une barre horizontale sur 16x8 =128 pas
la fonction modulo 8 est utilisée pour les pas intermediares d'un caractere, mais comme la largeur est seulement
sur 5 bits , on voit un gap blanc entre les pas ! C'EST NORMAL ! on est en mode TEXTE !
L'ideal serait d'avoir un LCD avec une ROM incluant les 8 barres verticales ! et pouvoir afficher des chars 8x8 .

Le SET #1 CGRAM est utilié
un characatere PLEIN de 7 pixel de large , est utilisé pour chaque espace de 8 pixels en largeur ,
on complete avec la valeur modulo 8 ( N%8) qui permet de selectionner le BON caractere en CGRAM comportant le nombre
de barres verticale (pixels)
On a donc Nx8=16x8 => 128 steps dans le sens Horizontal, mais avec un TROU entre les pas de 8 pixels.
le code :

CPrint1(" Load CGRAM set#3 Barre Horizontales\r\n");
LCD_Load_Custom_Chars(1);
CPrint1(" Test bargraph Horizontal \r\n");
CPrint1(" Progression de Gauche vers la droite\r\n");
Lcd_Cmd(_LCD_CLEAR ); Delay_ms(50);
Lcd_Cmd(_LCD_FIRST_ROW ); Delay_ms(150);
Lcd_Out(1,1,"Bargraph Horiz " );
Lcd_Chr_CP( 245) ; // code fleche à droite sur mon LCD
for (i=0;i<128;i++)
{
j=i/8;
m=i%8;
for (k=0;k<j;k++) // <----- la partie entiere
{
LCD_WriteCmd(0xC0+k);
LCD_WriteData(7); // char near max width
Delay_ms(10);
}
LCD_WriteCmd(0xC0+k); // <----- le complement
LCD_WriteData(m);
Delay_ms(25);
}
Delay_ms(3000);

1
2
3


Exemple d'usage avec EA0 entree ADC 12 bits :

* il faut rajouter un effacement du bargraph si la nouvelle valeur Analogique devient inferieure

void Erase_Line(char L)
{
unsigned char Dummy[17]; //" ";
switch(L)
{
case 1:
Lcd_Cmd(_LCD_FIRST_ROW);
strcpy(Dummy,"                 ");
Lcd_Out_CP(Dummy);
Lcd_Cmd(_LCD_FIRST_ROW);
break;
case 2:
Lcd_Cmd(_LCD_SECOND_ROW);
strcpy(Dummy,"                 ");
Lcd_Out_CP(Dummy);
Lcd_Cmd(_LCD_SECOND_ROW);
break;
}
Delay_ms(50);
}


La variable Old_EA0 mémorise la valeur précedente de EA0, pour savoir si il faut effacer la ligne ou pas.
On pourrait aussi effacer SYSTEMATIQUEMENT la ligne 2 , avant d'ecrire le Bargraph
its' up to you

CPrint1(" Load CGRAM set#3 Barre Horizontales\r\n");
LCD_Load_Custom_Chars(1);
CPrint1(" Test bargraph Horizontal \r\n");
CPrint1(" Progression EA0\r\n");
Lcd_Cmd(_LCD_CLEAR ); Delay_ms(50);
Lcd_Cmd(_LCD_FIRST_ROW ); Delay_ms(150);
Lcd_Out(1,1,"EA0 Analog " );
Old_EA0=0;
do
{
EA0=ADC_Get_Sample(0); // 12 bits ADC on my PIC !
i=EA0>>5; // 0 to 128
IntToStr(EA0,CRam1); //
<----------------- Affichage de la mesure en points (ici sur 12 bits !)
Lcd_Out(1,11,CRam1);
j=i/8; // partie entiere
m=i%8; // reste complement
for (k=0;k<j;k++)
{
LCD_WriteCmd(0xC0+k);
LCD_WriteData(7); // char near max width
Delay_ms(10);
}
LCD_WriteCmd(0xC0+k);
LCD_WriteData(m);
if (EA0<Old_EA0) Erase_Line(2);
Old_EA0=EA0;
Delay_ms(1000);
}
while(1);

Resultats:







BARGRAPHE VERTICAL

Utilisation de characteres en CGRAM representant 1,2,3,4,5,6 barres verticales
pour afficher la progression d'une barre Verticale sur 0 à 15 pas

Le SET #2 CGRAM est utilié
un characatere PLEIN est utilisé pour chaque espace de 7 pixels en Hauteur ,
on complete avec la valeur modulo 8 qui permet de selectionner le BON caractere en CGRAM comportant le nombre
de barres Horizontales (pixels)
On a donc Nx8=2x8=16 steps dans le sens Vertical, mais avec un TROU entre les pas de 8 pixels.

le code :

On evite d'afficher le code char 0 =blanc au 8em empilement , déja qu'on le Blanc obligatoire entre les 2 lignes LCD !

CPrint1(" Test Progression Verticale bargraph 0 à 15 )\r\n");
CPrint1(" Progression de bas vers le haut \r\n");
Lcd_Cmd(_LCD_CLEAR ); Delay_ms(100);
Lcd_Out(1,2,"Progression ");
Lcd_Out(2,2," Verticale ");
Lcd_Cmd(0x80+14);
Lcd_Chr_CP(247);
Lcd_Cmd(0xC0+14);
Lcd_Chr_CP(247); // code fleche vers le haut sur mon LCD
Delay_ms(2000);
Lcd_Cmd(_LCD_CLEAR ); Delay_ms(100);

j=0;
do
{
switch (j)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
{
Lcd_Cmd(0xC0+j);// ligne 2 position 1
Delay_ms(50);
Lcd_Chr_CP(j);
break ;
}
default :
{
if(j>=8) i=j+1; //
<--- evite un blanc supplementaire entre les 2 lignes LCD
Lcd_Cmd(0xC0+j); //2em ligne position j
Lcd_Chr_CP(7);
Lcd_Cmd(0x80+j);// ligne 1 position j
Delay_ms(50);
Lcd_Chr_CP(i-8);
break ;
}
}
j++;
Delay_ms(500);
} while(j<15);
Delay_ms(2000);
}

sur 1 seule
colonne
evolution
amplitude
de 0 à15

 




Micro Bargraph Vertical :

Un autre test utilisant cette fois , les caracters presents en CGROM pour un mini affichage vertical conteu dans 2 lignes de caracteres
codes 224 à 228 sur mon LCD
soit 6 pas , en comptant le zero !

// avec seulement 5 car en CGROM pour empilage de ligne de pixel codes 224 à 228
CPrint1(" Test mini bargraph Vertical tres limité (seulement 5 chars en CGROM codes: 224..228 !)\r\n");
Lcd_Cmd(_LCD_CLEAR ); Delay_ms(50);
Lcd_Out(1,1,"CGROM 224 à 228 " );
Lcd_Cmd(_LCD_SECOND_ROW+14);
for (i=0;i<5;i++)
{
Lcd_Cmd(0xC0+i);// ligne 1 position 1
Lcd_Chr_CP(224+i); // 224 = code pour 1 seule barre horizontale dans le charactere
Delay_ms(100);
}
Lcd_Chr_CP(' ');

Sens degressif
i=4; Lcd_Chr_CP(224+i); // 228 = code pour 5 barres horizontale dans le charactere
i=3; Lcd_Chr_CP(224+i);
i=2; Lcd_Chr_CP(224+i);
i=1; Lcd_Chr_CP(224+i);
i=0; Lcd_Chr_CP(224+i); // 224 = code pour 1 seule barre horizontale dans le charactere
Delay_ms(2000);




Projet MikroC 7.60 :
IRDA_Board_18F47K42_UART1_LCD_2x16_Chars_CGRAM_2020_1025.zip
IRDA_Board_18F47K42_UART1_LCD_2x16_Chars_CGRAM_2020_1025.c
IRDA_Board_18F47K42_Tests_UART1_LCD2x16_Chars_CGRAM_2020_1025.hex



Video:
Bargraph_LCD2x16_2020.webm





Bargraph sur LCD en mode Grafique

Avec une definition au Pixel pres, la qualité / Résolution du BarGraphe est NETTEMENT supérieure


NOKIA LCD 96x64




OLED SS1306 128x32 / 128x64
.........

ILI9235 couleur 320x240
.......

Liens interessants à suivre :

Test exemple MikroC : LCD Custom Characters – MikroC
Outils :
HD44780 LCD User-Defined Graphics
MikroElektronica LCD Custom Char Geneartor
Tutorial : CGRAM and Character Building




retour à l'index