Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général en BASIC et PASCAL !

Modérateur : Gérard

chauffage solaire pour piscine
pspic
Passioné
Passioné
Messages : 357
Âge : 77
Enregistré en : septembre 2017
Localisation : 68

#31 Message par pspic » jeu. 31 janv. 2019 17:59

En regardant de près ton cahier des charges je me pose la question: A quoi sert la deuxième température ?
Vu qu'il y a un écart de 15 °C entre la mise en marche de la pompe et son arrêt, l'introduction d'une hystérésis est inutile.
Voici une démo testée en MikroBasic pour traiter ton problème.
Maintenant il va falloir te mettre au boulot si tu veux aboutir.
J'ai du mal à comprendre tes blagues !

Code : Tout sélectionner

'Démo 2 capteurs DS18B20 sur RA5 d'un PIC18F2420 avec osc 8MHz 31/01/2019
'Si T1 >= 24°C alors RC0 = 1
'Si T1 < 20 °C alors RC0 = 0
'Affichage T1 et T2 sur LCD
'Adresse des capteurs___________________________________________________________
const serial_1 as byte[8]= ($28,$FF,$01,$46,$42,$18,$01,$D6)'Sonde DS18B20 1
const serial_2 as byte[8]= ($28,$FF,$01,$46,$42,$18,$01,$D6)'Sonde DS18B20 2
'Déclaration LCD________________________________________________________________
dim LCD_RS as sbit at RB4_bit
    LCD_EN as sbit at RB5_bit
    LCD_D4 as sbit at RB0_bit
    LCD_D5 as sbit at RB1_bit
    LCD_D6 as sbit at RB2_bit
    LCD_D7 as sbit at RB3_bit
    LCD_RS_Direction as sbit at TRISB4_bit
    LCD_EN_Direction as sbit at TRISB5_bit
    LCD_D4_Direction as sbit at TRISB0_bit
    LCD_D5_Direction as sbit at TRISB1_bit
    LCD_D6_Direction as sbit at TRISB2_bit
    LCD_D7_Direction as sbit at TRISB3_bit
'Déclaration des variables
 Dim FinConv as bit
 b,i as byte
 Dt12F as float
 Tf1, Tf2 as float
 Tt1, Tt2 as string[20]
'Lecture capteur________________________________________________________________
sub function ReadTemp12() as float          '12 bits DS18B20
    Dim temp12 as byte[2]
    Dim Td12 as longint
         Ow_Write(PORTA, 5, $BE)            'Lecture du scratchpad 2 octets
         temp12[0] = Ow_Read(PORTA, 5)      'Read octet bas Temp L
         temp12[1] = Ow_Read(PORTA, 5)      'Read octet haut Temp H
          Td12 = temp12[1] * 256 + temp12[0]'Valeur température brute
          if (Td12 >>15) = 1 then           'Si bit poids fort = 1 alors négatif
           Td12=(Td12 xor $FFFF)            'Négatif
           Td12=Td12+1
           Dt12F=0-float(Td12)*0.0655       'Facteur pour 12 bits
          else
           Dt12F=float(Td12)*0.0655         'Positif
          end if
         Result = Dt12F                     'Température en flottant
end sub
'Formatage température en chaine________________________________________________
sub function ConvFloatStr(Dim ValF as float) as string[20]
  Dim FlSt as string[20]
   floattostr(ValF,FlSt)                       'Conversion temp. float en chaine
      if ValF > -10 then                       'Mise en place des espaces avants
       if ValF < 0 then strappendpre(" ",FlSt)
        else
        if ValF >= 0 then
         if ValF < 10 then
          strappendpre(" ",FlSt)
          strappendpre(" ",FlSt)
          else
          if ValF> 10 then strappendpre(" ",FlSt)
         end if
         end if
         end if
         end if
         end if
  Result = FlSt
end sub
'_______________________________________________________________________________
main:
ADCON1 = $0F         'RA0 -> RA5 en digital
PORTA = %00000000
PORTB = $0
PORTC = $0
TRISA = $0
TRISB = $0
TRISC = $0
'Init LCD_______________________________________________________________________
  Lcd_Init()
  Lcd_Cmd(_LCD_CURSOR_OFF)
  LCD_Cmd(_LCD_CLEAR)
  Lcd_out(1,2, "  DEMO DS18B20")
  Delay_ms(2000)
  LCD_Cmd(_LCD_CLEAR)
'Programme principal____________________________________________________________
 while true
'Conversion pour tous les capteurs______________________________________________
       Ow_Reset(porta, 5)        'Reset OW
       Ow_Write(porta, 5, $CC)   'Envoi CMD à tous les capteurs
       Ow_Write(porta, 5, $44)   'Commande de conversion à tous les capteurs
       Bc:                       'Attente fin conversion
       FinConv = Ow_Read(PortA, 5)
       if Finconv <> 1 then goto Bc end if
'Capteur 1______________________________________________________________________
       Ow_Reset(porta, 5)         'Reset OW
       Ow_Write(porta, 5, $55)    'Commande sélection capteur
       for i=0 to 7               'Sélection du capteur
            b = serial_1[i]
            Ow_Write(porta, 5, b) 'envoi des 8 octets d'adresse au capteur
            Delay_ms(10)          'Délai entre envois
       next i
        Tf1 = ReadTemp12          'Température en float
        Tt1 = ConvFloatStr(Tf1)   'Température en string
'Capteur 2______________________________________________________________________
       Ow_Reset(porta, 5)         'Reset OW
       Ow_Write(porta, 5, $55)    'Commande sélection capteur
       for i=0 to 7               'Sélection du capteur
            b = serial_1[i]
            Ow_Write(porta, 5, b) 'envoi des 8 octets d'adresse au capteur
            Delay_ms(10)          'Délai entre envois
       next i
        Tf2 = ReadTemp12          'Température en float
        Tt2 = ConvFloatStr(Tf2)   'Température en string
'Conditions de sortie___________________________________________________________
 if Tf1 >= 24.0 then setbit(PortC,0) end if   'Marche pompe
 If Tf1 < 20.0 then clearbit(PortC,0) end if  'Arrêt pompe
'Affichage sur LCD______________________________________________________________
 LCD_OUT(1,1,"Temp_1"+Tt1)
 LCD_OUT(1,12," °C  ")
 LCD_OUT(2,1,"Temp_2"+Tt2)
 LCD_OUT(2,12," °C  ")
'Tempo et boucle sans fin_______________________________________________________
  delay_ms(1000)
 wend
end.

chauffage solaire pour piscine
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#32 Message par paulfjujo » jeu. 31 janv. 2019 19:03

bonsoir PSPIC et à tous,


il faudra qu'il découvre d'abord quelles sont les adresses de ses 2 capteurs .
pour pouvoir les mettre en dur dans le programme..
sinon utiliser 2 pins , 1 pin MCU par capteur pour s'affranchir de l'adresse.
Aide toi, le ciel ou FantasPic t'aidera

chauffage solaire pour piscine
pspic
Passioné
Passioné
Messages : 357
Âge : 77
Enregistré en : septembre 2017
Localisation : 68

#33 Message par pspic » jeu. 31 janv. 2019 20:10

Salut Paul et les autres,
Ca ne devrait pas poser de problème, au post #29 j'avais mis le code pour relever l'adresse dans la ROM du capteur.
L'inconvénient est que le jour où il faut remplacer un capteur il faut retoucher le code.
J'avais réalisé une carte avec 6 adresses en Eeprom et modifiable par une appli sous Windows liée au PIC par l'Uart.
Dont voici le détail ici:
RemplCapteur.doc
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

chauffage solaire pour piscine
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#34 Message par paulfjujo » jeu. 31 janv. 2019 20:45

Ok DOC :+1:

donc ,no Problemo
Aide toi, le ciel ou FantasPic t'aidera

chauffage solaire pour piscine
dapi1313
Membre
Membre
Messages : 14
Enregistré en : octobre 2018

#35 Message par dapi1313 » ven. 1 févr. 2019 15:04

Hello PSPIC,

"J'ai du mal à comprendre tes blagues !"

Pour le controle Antidopage ?
N'y voit aucun mal, c'est juste que tu as piquer un de ces sprint en me donnant un tas d'informations.

Je vais décortiquer toutes ces info, là je pense avoir ce qu'il me faut pour démarrer mon projet.

Merci à Tous
Dapi

chauffage solaire pour piscine
dapi1313
Membre
Membre
Messages : 14
Enregistré en : octobre 2018

#36 Message par dapi1313 » mar. 5 févr. 2019 13:10

J'étudie de prêt les 2 programmes reçu de PSPIC, que je remercie pour ses info, et tout ce que j'ai pu trouver...

Petit question:

j'ai deux capteurs DS18B20 connectés sur RA5, je voudrais les configurer en 9 bits, résolution par pas de 0,5°C me suffit amplement.

Donc je dois écrire 00000000 dans l'octet#5 des capteurs
avec la commande 0xHE.

c'est là que je bloque:

en fait je dois envoyer 3 octets
octet#3 - alarme haut -
octet#4 - alarme bas -
Octet#5 - 00000000 pour 9 bits et temps de conversion de 94 ms

le maitre doit commencer par envoyer en premier le LSB de l'octet #3, tous les octets seront ensuite envoyer avec le LSB en tête
Le LSB, c'est bien le bit 0 de l'octet ... et ne peut être que 0 ou 1
Donc je dois d'abord lire les 9 octets des capteurs avec la commande 0xBE pour avoir l'octet# 3 et en trouver le bit de faible poids

si je suis dans le bon jusqu'ici, je devrais utiliser la séquence:

OW_reset(PORTA,5)
OW_write(PORTA,5,0xBE) ' lire les 9 octets
octet1 = ow_read(PORTA,5)'octet LSB température
octet2 = ow_read(PORTA,5)'octet MSB température

octet3 = ow_read(PORTA,5)'octet alarme seuil haut

octet4 = ow_read(PORTA,5)'octet alarme seuil bas, pas besoin
octet5 = ow_read(PORTA,5)'configuration du registre, c'est ici que je dois avoir "00000000"
octet6 = ow_read(PORTA,5)'réservé mais pas besoin, je pense
octet7 = ow_read(PORTA,5)'reservé mais pas besoin...
octet8 = ow_read(PORTA,5)'reservé mais pas besoin...
octet9 = ow_read(PORTA,5)'octet CRC, probablement utile, mais pas dans mon cas je pense

j'ai peut-être déjà tout faux ! :cry:

mais admettons: j'ai l'octet# 3 ... d'un ou des capteurs ?, Est-ce le même pour tout les capteurs de la ligne RA5 ?
ou dois-je répéter l'opération pour chaque capteur avec leurs 64bits d'ID ?

Comment faire pour renvoyer les octet#3, #4 et "00000000" dans le #5 dans la RAM ?

OW_reset(PORTA,5)
Ow_write(PORTA,5,octet#3)
Ow_write(PORTA,5,octet#4)
Ow_write(PORTA,5,0x00)

ensuite OW_write(PORTA,5,0x48) pour copier dans la zone EEPROM, non volatile ?

Mais dans tous les capteurs connectés sur RA5 ?

oui mais: le maitre doit commencer par envoyer en premier le LSB de l'octet #3, tous les octets seront ensuite envoyer avec le LSB en tête.
je sais pas comment faire, je ne comprend pas la notion d'alarme seuil du capteur, ni le LSB en tête

"Petit question, qu'il disait ... bin qu'est ce que ce sera une grosse, alors ? exit

Merci
Bonne Journée

chauffage solaire pour piscine
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#37 Message par paulfjujo » mar. 5 févr. 2019 13:24

bonjour,

AMHA
tu as meilleur compte à faire tes seuis d'alarme toi -meme
de plus , reste à verifier aussi ,si les alarmes DS18B20 , changent d'etat dans le bons sens ,ou
à l'interieur ou l'extrieur de la plage voulue.
Aide toi, le ciel ou FantasPic t'aidera

chauffage solaire pour piscine
pspic
Passioné
Passioné
Messages : 357
Âge : 77
Enregistré en : septembre 2017
Localisation : 68

#38 Message par pspic » mar. 5 févr. 2019 19:19

dapi1313 a écrit :J'étudie de prêt les 2 programmes reçu de PSPIC, que je remercie pour ses info, et tout ce que j'ai pu trouver...

Bonjour à tous,
Après avoir lu ton post, j'ai mal à la tête, tu vas trop vite !
Ne t'occupe pas des alarmes, tu n'en a pas besoin.
Pour avancer, commence déjà par lire l'adresse de chaque capteur et note cette adresse sur une étiquette que tu colle sur le câble du capteur.
Ensuite tu reviens ici, nous te guiderons pas à pas.
Quel compilateur utilises tu ?
Quel PIC utilises tu ?
Avec quel outil tu envois le code dans le PIC ?
Si tu utilises Mikrobasic, je peux te préparer un petit tuto.
Correction de ma démo:

Code : Tout sélectionner

 'Capteur 2______________________________________________________________________
       Ow_Reset(porta, 5)         'Reset OW
       Ow_Write(porta, 5, $55)    'Commande sélection capteur
       for i=0 to 7               'Sélection du capteur
            b = serial_2[i]     ' serial_2
            Ow_Write(porta, 5, b) 'envoi des 8 octets d'adresse au capteur
            Delay_ms(10)          'Délai entre envois
       next i
        Tf2 = ReadTemp12          'Température en float
        Tt2 = ConvFloatStr(Tf2)   'Température en string

chauffage solaire pour piscine
dapi1313
Membre
Membre
Messages : 14
Enregistré en : octobre 2018

#39 Message par dapi1313 » mer. 6 févr. 2019 13:32

Bonjour à Tous, Bonjour PSPIC
J’ai suivi tes conseils et choisi le PIC18F2420 – SPDIP 28-pin
Je n’ai que des Xtal 4 ou 20 MHz, mais je ne pense pas que ce soit un problème dans mon cas.
J’utilise le MIKROBASIC comme langage de programmation
Un K150 – PIC programmer
J’attends mes capteurs et le PIC que je viens de commander d’un jour à l’autre.
Je suppose que le n°serie/adresse du capteur est gravé ou noté dans la doc livrée avec le DS18B20

Je le cablerai probablement comme suit: (sortie commande de pompe ?, je sais pas encore, mais j'ai plein de possibilités avec RB et RC)
18F2420_0001.jpg

Peut-être qu'on peut brancher un DS par I/O, pour simplifier mon apprentissage :razz:
pourquoi la RA5 ? pour la fonction Slave Select, si on veut connecter plusieurs capteurs sur la même entrée,
mais si on dispose de plusieurs I/O qui accepte I/O digital on peut mettre 1 capteur par I/O, je me pose la question...
plutôt: je vous pose la question...

Bonne Journée à Tous
Dapi
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

chauffage solaire pour piscine
Gérard
Avatar de l’utilisateur
Expert
Expert
Messages : 1640
Âge : 65
Enregistré en : septembre 2015
Localisation : Alsace - Haut-Rhin

#40 Message par Gérard » mer. 6 févr. 2019 15:25

Bonjour,
Attention au branchement du LCD. Je crois qu'il faut utiliser soit de 0 à 3 soit de 4 à 7 les pins du port.
Toi tu utilises B1 à B4.
Le 18/04/19 je suis devenu papy de jumeaux, le 01/09/23 une petite cousine des jumeaux est née.


Retourner vers « Langage BASIC & PASCAL »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 30 invités