Programme interrupteur levé/couché version 0.1

20 mar Programme interrupteur levé/couché version 0.1

La partie en bas à droite de l’écran tactile permet d’indiquer le fait que les enfants soient couchés ou non.

Le dessin d’un soleil indique « levé »

Le dessin d’une lune indique « couché »

L’appuie sur le dessin permet de changer d’état.

Définir la table de votre image

Pour commencer, il va falloir transformer votre image en une table. Pour cela, j’utilise un utilitaire de mikroBasic : « GLCD Bitmap Editor »

Ce petit programme permet de « transformer » une image en code mikroBasic.

Une fois que vous avez choisi la taille de votre écran (pour mon cas 128×64), cliquez sur le bouton « Load BMP Picture » afin de sélectionner votre image.

Puis, votre code s’affichera.

Faites bien attention d’avoir sélectionner « mikroBasic code » à droite de l’écran.

Cela va vous donner un code du genre
const <nom table> as byte [1024] = (

x, x, x, x, ....)
Maintenant que vous savez créer des tables à partir d’image, il va falloir en créer deux pour afficher vos images lune et soleil.

Afficher une image sur l’écran
Pour afficher une image, c’est très simple….Il faut utiliser la fonction Glcd_Fill(0) pour effacer l’écran.

Puis Glcd_Image( <nom table>) pour afficher votre image.

Détecter si l’on appuie sur l’écran

Pour détecter un appuie sur l’écran tactil, il faut utiliser le fonction PressDetect()
' retourne 1 si l'écran tactil est pressé, sinon 0
sub function PressDetect() as byte
dim adc_rd as word
' Configuration des ports du PIC
PORTC.0 = 0 ' DRIVEA = 0 (LEFT drive off, RIGHT drive off, TOP drive on)
PORTC.1 = 0 ' DRIVEB = 0 (BOTTOM drive off)
Delay_us(3500)
adc_rd = ADC_read(1) ' Read RA1 (READ-Y)

result = (adc_rd > ADC_THRESHOLD) ' if logical one is detectet

'debouncing, repeat detecting after 2ms
Delay_ms(2)
adc_rd = ADC_read(1)
result = result and (adc_rd > ADC_THRESHOLD)
end sub

Récupérer l'endroit ou l'on a appuyé
Lorsque l'on appuie sur l'écran tactil, nous allons pouvoir récupérer les coordonnées de l'endroit où nous avons appuyé.
Cela nous permettra de vérifier si l'on a appuyer sur la lune ou le soleil.

Les coordonnées se définissent par deux informations x et y
Voici les fonctions qui permettent de les récupérer
sub function GetX() as word
'reading X
PORTC.0 = 1 ' DRIVEA = 1 (LEFT drive on, RIGHT drive on, TOP drive off)
PORTC.1 = 0 ' DRIVEB = 0 (BOTTOM drive off)
Delay_ms(5)
result = ADC_read(0) ' reading X value from RA0 (BOTTOM)
end sub
sub function GetY() as word
'reading Y
PORTC.0 = 0 ' DRIVEA = 0 (LEFT drive off, RIGHT drive off, TOP drive on)
PORTC.1 = 1 ' DRIVEB = 1 (BOTTOM drive on)
Delay_ms(5)
result = ADC_read(1) ' reading Y value from RA1 (from LEFT)
end sub

Calibration de l’écran
Suivant la position de la dalle tactile sur l’écran, les coordonnées x,y doivent être ajustées afin de correspondre à l’affichage de l’écran LCD.
Pour cela, j’utilise en petit programme à la mise sous tension du système. Ce dernier demande d’appuyer à différent endroit de l’écran afin d’ajuster x et y
sub procedure Calibrate()
Glcd_Dot(0,63,1)
Glcd_Write_Text("TOUCHER EN BAS A GAUCHE",10,3,1)
while (not PressDetect())
nop
wend
' get calibration constants (reading and compensating TouchPanel nonlinearity)
cal_x_min = GetX() - 10
cal_y_min = GetY() - 10
Delay_ms(1000)

Glcd_Fill(0)
Glcd_Dot(127,0,1)
Glcd_Write_Text("TOUCHER EN HAUT A DROITE",10,4,1)
while (not PressDetect())
nop
wend

' get calibration constants (reading and compensating TouchPanel nonlinearity)
cal_x_max = GetX() + 5
cal_y_max = GetY() + 5
Delay_ms(1000)
end sub

Le programme en lui même
Dans cette première version, nous allons changer le dessin lune/soleil

' Affichage du début de la calibration
Glcd_Fill(0)
Glcd_Set_Font(@FontSystem5x8, 5, 8, 32)
Glcd_Write_Text("CALIBRATION", 24, 3, 1)
Delay_ms(1500)
' Appel de la fonction de calibration
Glcd_Fill(0)
Calibrate()
Glcd_Fill(0)
' Affichage de la fin de calibration
Glcd_Write_Text("Ecran configuré", 24, 4, 1)
Delay_ms(1000)
Glcd_Fill(0)

' On affiche la première image
Glcd_Image( image1_bmp )
enfant_leve = 1

' on boucle à l'infinie sur le fonctionnement de l'interrupteur
while true
' si on touche à l'écran tactil
if (PressDetect()) then
' on calcul les coordonnées x et y et on les ajuste
x_coord = GetX() - cal_x_min
y_coord = GetY() - cal_y_min

x_coord128 = (x_coord * 128) div (cal_x_max - longint(cal_x_min))
y_coord64 = (64 -(y_coord *64) div (cal_y_max - longint(cal_y_min)))

if ((x_coord128 < 0) or (x_coord128 > 127)) then
continue
end if

if ((y_coord64 < 0) or (y_coord64 > 63)) then
continue
end if

' si zone leve/couche est pressee
if ((x_coord128 >= 64) and (y_coord64 >= 15)) then
Glcd_Fill(0)
' on inverse l'état enfant couche/ enfant leve
' et on affiche l'image liée à l'état
if (enfant_leve=0) then
enfant_leve=1
Glcd_Image( image1_bmp )
else
enfant_leve=0
Glcd_Image( image2_bmp )
end if
end if
end if
wend

Je rajouterais prochainement un lien vers le programme en entier.
Si je zappe cet ajout, n’hésitez pas à me mettre un commentaire

Be Sociable, Share!
2 Comments

Post A Comment