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 sur le langage C !

Modérateur : Jérémy

Hygromètre à PIC
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3143
Âge : 74
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#21 Message par paulfjujo » dim. 7 juil. 2024 21:01

bonsoir,


Hormis des modifs mineures de ta version de programme DHT22.c
et aussi du fait que j'utilise MPLABX XC8 , qui differe du compilateur CCS
au niveau de la syntaxe ...
et que je n'utilise pas de LCD , mais un UART Software à la place pour afficher les resultats...
1 pin utilisée (RA2) au lieu de 7 pins sur portB

ATTENTION aux effets de bords d'un programme utilisant presque la totalité de la RAM !
Certaines variables n'etant activée que pendant l'execution du programme
et débordement non detecté par le compilateur ...
il faudrait bien verifier les messages emis par le compilo CCS...
Avec MPLABX ..j'ai été villipendé des l'usage d'une table excedent 22 caracteres (bytes)

Essaie de de te mettre aux XC8 ....
j'ai remis plus de details sur ma page web

A+
Aide toi, le ciel ou FantasPic t'aidera

Hygromètre à PIC
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3143
Âge : 74
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#22 Message par paulfjujo » lun. 8 juil. 2024 15:46

bonjour,


j'ai été assez étonné qu'un 16F84 puisse toujours etre OK avec une Alim de 3,3V
FOSC tenue, UART OK , et mesures AM2303 (DHT22) quasi les mêmes
pourquoi ce test ?
pour voir si je peux utiliser une batterie Li-ion 3,7V nominal comme alimentation.

alim diminuée de 5V -> 3,3V

3.3v
115 Temp = 25.2°C RH = 59.5%
116 Temp = 25.1°C RH = 59.4%
117 Temp = 25.2°C RH = 59.4%
118 Temp = 25.3°C RH = 59.4%
119 Temp = 25.4°C RH = 59.4%
120 Temp = 25.3°C RH = 59.2%
121 Temp = 25.3°C RH = 59.2%
122 Temp = 25.3°C RH = 59.1%
123 Temp = 25.4°C RH = 59.1%
124 Temp = 25.3°C RH = 59.0%
125 Temp = 25.2°C RH = 58.9%
126 Temp = 25.3°C RH = 58.9%
127 Temp = 25.2°C RH = 58.8%
128 Temp = 25.2°C RH = 58.8%
129 Temp = 25.2°C RH = 58.8%
130 Temp = 25.2°C RH = 58.7%

4.0v
142 Temp = 25.1°C RH = 58.4%
143 Temp = 25.1°C RH = 58.4%
144 Temp = 25.1°C RH = 58.4%
145 Temp = 25.2°C RH = 58.5%
146 Temp = 25.3°C RH = 58.5%
147 Temp = 25.5°C RH = 58.6%
148 Temp = 25.4°C RH = 58.6%
149 Temp = 25.2°C RH = 58.4%
150 Temp = 25.2°C RH = 58.4%
151 Temp = 25.2°C RH = 58.4%
152 Temp = 25.4°C RH = 58.5%
153 Temp = 25.3°C RH = 58.5%
154 Temp = 25.2°C RH = 58.4%
155 Temp = 25.2°C RH = 58.4%
156 Temp = 25.1°C RH = 58.3%
157 Temp = 25.1°C RH = 58.3%
158 Temp = 25.3°C RH = 58.5%
159 Temp = 25.4°C RH = 58.6%
5.0v
170 Temp = 25.2°C RH = 58.5%
171 Temp = 25.1°C RH = 58.4%
172 Temp = 25.1°C RH = 58.4%
173 Temp = 25.1°C RH = 58.4%
174 Temp = 25.2°C RH = 58.4%
175 Temp = 25.3°C RH = 58.5%
176 Temp = 25.3°C RH = 58.5%
177 Temp = 25.3°C RH = 58.5%
178 Temp = 25.3°C RH = 58.4%
179 Temp = 25.1°C RH = 58.3%
180 Temp = 25.2°C RH = 58.4%
181 Temp = 25.3°C RH = 58.4%
182 Temp = 25.2°C RH = 58.4%
183 Temp = 25.3°C RH = 58.4%
184 Temp = 25.3°C RH = 58.4%
185 Temp = 25.2°C RH = 58.4%

MAIS ! si je redescends l'alim à 3,3V, puis power Off ... Power ON
le PIC ne redémarre pas ! (l'oscillateur quartz je suppose)
je suis obligé de remonter à 3,6V pour que le systeme redémarre et que je capte les mesures à nouveau en bluetooth..

conclusion :
à 3,3V le PIC tombe en MARCHE mais ne peut plus redemarrer
==> pas jouable avec une batterie de 3,4V mini
ou alors que pendant la descente de décharge de 4,2V à 3,3V
:sifflotte: ..mais c'est une peu capilotracté!

consommation enregistrée avec batterie chargée 4,21V => ~ 20mA
avec mesures espacées que de 2 sec., et pas de mise en veille du PIC ou alim module BT.
3600mAH ,ça devrait tenir quelques heures ...

16F84_DHT22_HC05_battery_Li-ion2024-0708..jpg


un 16LF1647 ou 18LFxxxxx serait mieux placé ... mais pas testé .
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

Hygromètre à PIC
RETRAITE128
Débutant
Débutant
Messages : 96
Enregistré en : août 2021

#23 Message par RETRAITE128 » lun. 8 juil. 2024 20:32

Bonsoir,

Vous m'emmenez sur des terrains que je ne connais pas et qui ne répondent pas à ma demande originale, j'en suis désolé.

Je ne vais pas m'équiper dans ces produits pour obtenir le résultat sur PC ou sur Smartphone.

Je souhaitais juste voir cette réalisation aboutir avec des capteurs qui donneraient les mêmes indications d'humidité.

Cordialement,

Alain

Hygromètre à PIC
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3143
Âge : 74
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#24 Message par paulfjujo » lun. 8 juil. 2024 21:00

bonsoir,

J'ai juste signalé ce qu'on pouvait faire avec un simple 16F84 ...
vu que j'ai aussi plusieurs 16F64 à caser.

Pour vraiment répondre à cette demande, il faudrait disposer de plusieurs capteurs ...
..répondants aux specifications de la datasheet, et c'est pas gagné avec les produits émanents de la RPC

De plus , on ne sait pas quel est l'ordre de grandeur des écarts observés ?
Que l'application soit en CCS ou XC8 ..ça ne devrait rien changer
le C est (presque) universel.

Un point positif est que le capteur est quasiment insensible au niveau de la tension d'alimentation

Sur ce, je ne vois pas comment on pourrait t'aider dans ta démarche..

A+ sur Fantaspic
Aide toi, le ciel ou FantasPic t'aidera

Hygromètre à PIC
RETRAITE128
Débutant
Débutant
Messages : 96
Enregistré en : août 2021

#25 Message par RETRAITE128 » mar. 9 juil. 2024 09:55

Bonjour,

J'ai moi aussi une belle collection de PIC que je souhaitais aussi utiliser, tout comme vous.

Les capteurs dont je vous parle ne proviennent pas de RPC mais de chez Reichelt, plus sérieux.

Comme je l'ai dit au début j'ai des écarts de 10à15 points sur la partie hygrométrique.

Il avait été évoqué dans ce dial un délais d'interrogation du DHT22 qu'il fallait respecter, pas moins de deux secondes.

Voir si cela est respecté dans ce programme.

Merci pour vos participations.

Cordialement,

Alain

Hygromètre à PIC
gwion
Confirmé
Confirmé
Messages : 834
Enregistré en : février 2022

#26 Message par gwion » mar. 9 juil. 2024 10:39

Il ne s'agit pas de te faire changer la destination finale de l'affichage, mais de valider le bon fonctionnement de TES capteurs.
Après il n'est pas compliqué de ralentir la boucle d'interrogation du programme que tu utilises. Mais à partir du moment où tu ne veux ni modifier le programme, ni le compiler, mais juste avoir un hygromètre fonctionnel "clés en main", le plus simple me semble d'en acheter un modèle commercial.

Hygromètre à PIC
RETRAITE128
Débutant
Débutant
Messages : 96
Enregistré en : août 2021

#27 Message par RETRAITE128 » mar. 9 juil. 2024 11:46

Bonjour,

Ma réponse s'adressait à paulfjujo uniquement.

Il ne s'agit pas de vouloir un programme clé en main comme il est "dit", mais essayer de comprendre quelque peu sans avoir à télécharger des programmes dont je ne me servirai plus, il faut aussi comprendre cela.

Cordialement,

Alain

Hygromètre à PIC
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3143
Âge : 74
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#28 Message par paulfjujo » mar. 9 juil. 2024 16:28

bonjour à tous,


La seule (grosse ) difference entre ta version initiale unsigned int8 Read_Data() de DHT22.c
et la mienne ... hormis les difference de syntaxes dues entre CCS et XC8
est que je reinitialise k=0 (duree maxi) à chaque test
sinon il y a cumul du delay à chaque fois ...
pouvant faire sauter un test bit inutilement

Code : Tout sélectionner


unsigned char Read_Donnee
()
{
  
unsigned char ik_Donnee;
  
_Donnee0;     // k is used to count 1 bit reading duration
  
Time_out=0;  // init drapeau TimeOut 
  
for(08i++)
  { 
   
0;
  while(! 
PORTAbits.RA0)
    {  
k++;
      if (
100) {Time_out 1;}
     
__delay_us(1);
     }
 
__delay_us(30);
  if(! 
PORTAbits.RA0)
      
bit_clear(_Donnee, (i));               // Clear bit (7 - i)
    
else
    {
      
bit_set(_Donnee, (i));                 // Set bit (7 - i)
      
k=0;
       while( 
PORTAbits.RA0)
       {                         
// Wait until pin goes low
          
k++;
          if (
100) {Time_out 1;}
         
__delay_us(1);}
       }
    }
  return 
_Donnee;
}
 


et dans la boucle principale
while(TRUE)
j'ai l'equivalent, mais avec delai de 2sec et init du flag Timeout=0 !

Code : Tout sélectionner

while(1)

   
__delay_ms([b]2000[/b]);
    [
b]Time_out 0;[/b]
    
Start_signal();
    ...
la suite ne change en rien .... 


As-tu les outils CCS pour modifier ton source et programmer ensuite le PIC ?
Aide toi, le ciel ou FantasPic t'aidera

Hygromètre à PIC
RETRAITE128
Débutant
Débutant
Messages : 96
Enregistré en : août 2021

#29 Message par RETRAITE128 » mar. 9 juil. 2024 17:54

Bonsoir,

Merci pour cette réponse,
Je n'ai rien pour modifier le fichier source, mais je possède bien les outils pour programmer le PIC (famille que j'utilise depuis longtemps avec divers programmateurs, à l'époque Microchip était encore très généreux pour envoyer des échantillons)

Ce serait fort sympa de poster ici le fichier C modifier et son petit frère le point HEX.

Je vous tiendrai alors au courant sur les résultats physiques,

Cordialement,

Alain

Hygromètre à PIC
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3143
Âge : 74
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#30 Message par paulfjujo » jeu. 11 juil. 2024 18:59

bonsoir,


:!: ça été laborieux de traiter ce PIC en XC8 (version free)
beaucoup moins performant que MikroC version Pro

pas possible de mettre UART3 et LCD dans le meme programme car rien qu'avec le LCD :
Program space used 3FFh ( 1023) of 400h words ( 99.9%)
Data space used 34h ( 52) of 44h bytes ( 76.5%)



voir les détails sur ma page web


Code : Tout sélectionner

/*
 *version optimisée avec advisor  optimisation level=0 -> level 2 
 * gagne 4 Bytes sur 68 ... OK 
 *06-07-2024
 * File:   main.c
 * Author: Paul
 */
// PIC16F84 monté sur carte BlueBird Electronics PCB053  4MHz
// programmateur POK508  alimenté en 12V DC
// liaison DB9 F POK508 --- DB9 Male TU-S9 Trend interface RS232/USB 
// verifier que le port virtuel soit declare en #PORT < 4
// voir     as16f684_legacy.h pour les Mnemoniques
// pack,PIC16Fxxx_DFP,1.3.42,Microchip
// xc8\v2.36

//06/07/2024
// PIC 16F84 monté sur mini breadboard, avec quartz de 8Mhz
// PIC alimenté via alim externe : le +5V USB du cordon prolific
// Pickit4 connecté as usual
// chargement du programme ..OK en quelques secondes ..run OK

#define VERSION "20240711"
#define With_LCD
//#define With_UART3
// avec LCD
// Erasing...
// [config mem] 0x2007, expected 0x3fff, got 0x0.
// Programming did not complete.
// attention : deconnecter RB6 RB7 sur le LCD ..conflit avec PickiT4
//#define VERSION "20240707"
//avec  uart3 seulement

#include <xc.h>
#define _16F684
#include <builtins.h>
#include <__at.h>
#define _XTAL_FREQ 8000000          // Quartz 8Mhz encadré par 2x22pF
// was #define _XTAL_FREQ 4000000   // filtre ceramique sur carte BlueBird Electronics PCB053
// programmateur POK508 et icprog105d.exe
//2007  CONFIG  3FF1  FOSC=XT

#pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF       // Watchdog Timer (WDT disabled)
#pragma config PWRTE = OFF       // Power-up Timer Enable bit (Power-up Timer is enabled)
#pragma config CP = OFF         // Code Protection bit (Code protection disabled

#define Byte uint8_t
#define Word uint16_t

#define  CR 13
#define  LF 10

#define  TX3         PORTAbits.RA2          // for UART3
#define  TX3_Pin_Dir TRISAbits.TRISA2       // for UART3
#define  LED_Dir     TRISAbits.TRISA3
#define  LED        PORTAbits.RA3
#define  DHT22_Pin  PORTAbits.RA0 
#define  DHT22_Pin_Dir TRISAbits.TRISA0

#include <__at.h>

#ifdef With_LCD

#define LCD_CLEAR              0x01     //Clear display
#define LCD_RETURN_HOME        0x02     //Return cursor to home 
#define Display_ON             0x0C
#define Display_OFF            0x08
#define LCD_CURSOR_OFF         0x0C     //Turn off cursor
#define LCD_TURN_ON            0x0C     //Turn Lcd display on
#define LCD_TURN_OFF           0x08     //Turn Lcd display off
#define NbCarPL 16
#define LIGNE1            0x80             /* LCD  1 LIGNE      */
#define LIGNE2            0xC0             /* LCD 2 LIGNES ET + */
#define QUATRE_BIT        0             /* 4-bit Interface   */
#define NB_LIGNE            8             /* LCD 2 LIGNES ET + */
#define TAILLE_5X7        0             /* MATRICE 5x7       */
#define SET               32 | (QUATRE_BIT) | (NB_LIGNE) | (TAILLE_5X7) 

// LCD 2x16 en mode // 4 bits
#define Donnee     PORTB 
#define RS         PORTBbits.RB0   
#define RW         PORTBbits.RB1
#define En         PORTBbits.RB2

#endif

 #define bit_set(var,bitno) ((var) |= 1 << (bitno))
 #define bit_clear(var,bitno) ((var) &= ~(1 << (bitno)))
/*
Byte  c3       __at (0x0020);
Byte RS_Count  __at (0x0021);
Byte  RS_tmp   __at (0x0022);
Byte RS_Delay  __at (0x0023);
 * */
   
int i
,j;
Byte Texte[18];  
unsigned char Time_out 
;
//const char Temp[] = "Temp = 00.0 C   ";
//const char Hum[]  = "RH   = 00.0 %   ";
unsigned char T_byte1, T_byte2, RH_byte1, RH_byte2, CheckSum ;
unsigned int Temp, RH;

void Start_signal(void);
unsigned char Read_Donnee(void);
char check_response(void);
void strConstRamCpy(unsigned char *dest, const char *source);

/*

void UART3_Write(uint8_t cc)      // 16MHz 19200 bauds
{
   c3=~cc;    // complement du caractere !
    // avec TX3_PIN => RA2
 __asm("    movlw   8 ");
  __asm("   movwf   _RS_Count");
 __asm("    bcf     PORTA,2 ");
  __asm("   call    RSdelai2");
 __asm(" L00:");
 __asm("    rrcf    _c3,1 ");      
 __asm("    btfsc   STATUS,0 ");    
 __asm("    goto    L10    ");  
 __asm("    bsf     PORTA,2  "); 
 __asm("    goto    L20    ");   
 __asm(" L10:");
 __asm("    bcf     PORTA,2  ");    
 __asm(" L20:");
 __asm("    call    RSdelai2  ");        
 __asm("    decfsz  _RS_Count,1 ");  
 __asm("    goto    L00     ");       
 __asm("    bsf     PORTA,2   ");     
 __asm("    call    RSdelai2   ");   
 __asm("    call    RSdelai2  ");   
 __asm("    goto    LA1");
 __asm(" RSdelai2: "); 
 __asm("    MOVLW 28 ");
 __asm("    MOVWF _RS_tmp ");
 __asm(" RS00:");
 __asm("    NOP");
 __asm("    NOP");
 __asm("    NOP");
 __asm("    NOP");
 __asm("    DECFSZ _RS_tmp,F ");
 __asm("    GOTO   RS00 ");
 __asm("    NOP");
 __asm("    NOP");
 __asm("    NOP");
 __asm("    RETURN ");
__asm("  LA1:  ");
 __asm("    nop");
 }
  */
   

#ifdef With_LCD

void  Pulse_En (void);
void LCD_Delay_20ms(void);
void LCD_Cde(unsigned char cmd);
void Init_XC8_LCD (void);
void LCD_Put(char data);
void LCD_Print(char *str);
//void LCD_CPrint(const char *Cstring);
void LCD_Pos(char L,char posX);
#endif


void strConstRamCpy(unsigned char *dest, const char *source)
 { // --- Copie le texte depuis FLASH ROM vers RAM
  while (*source)
  {
      *dest++ = *source++ ;
  }   
  
*dest = 0 ;    // terminateur
}

#ifdef With_LCD

void  Pulse_En (void)
{
En = 1;
__delay_ms(20);
En=0;
 __asm("    NOP");
 __asm("    NOP");
 }

void LCD_Delay_20ms()
{
 __delay_ms(20);
}

void LCD_Cde(unsigned char cmd)
{
  LCD_Delay_20ms();
RS=0;
En=0;
Donnee  &=0x0f;               //clear port
__asm("NOP");
Donnee  |= cmd&0xf0;          //write upper nibble of cmd to UPPERT port
 LCD_Delay_20ms();
Pulse_En();
Donnee  &= 0x0f;              //clear port and shift left 4 times
__asm("NOP");
Donnee  |= (cmd<<4)&0xf0;        //write lower nibble of cmd  to UPPERT port
 LCD_Delay_20ms();
Pulse_En ();
return;
}

void Init_XC8_LCD ()
{
  
   LCD_Delay_20ms
();
   TRISB=TRISB & 0x0F;
   //TRISBbits.TRISB  = TRISBbits.TRISB &  0x0F; 
   // B0 ..B3 as input  B4..B7 as ouput
   __asm("NOP");
   Donnee &=0x0f;      //clear port
   LCD_Delay_20ms();
   TRISB0=0;
   TRISB1=0;
   TRISB2=0;
   RW=0;
   RS=0;
    En=0;
    LCD_Delay_20ms();
    Donnee=Donnee& 0x0f;              //clear port and shift left 4 times
     __asm("NOP");
    Donnee=Donnee | 0x30;        //write lower nibble of cmd  to UPPERT port
    Pulse_En ();
    LCD_Delay_20ms();
    // Upper nibble interface
    Donnee  & = 0x0f;  // 2em ini
    Donnee  | = 0x30;  // 0b00110000;
    Pulse_En() ;
    LCD_Delay_20ms();
      // Upper nibble interface
    Donnee  & = 0x0f;  // 3em ini
      __asm("NOP");
    Donnee  | = 0x30; 
    Pulse_En
() ;
    LCD_Delay_20ms();
    //Force le mode 4 Bits    0x02H sur quartet MSB du PortB
    //Function SET Commande 0 0 1 DL N F X X  avec RS=0 RW=0
    // Upper nibble interface
    Donnee  &= 0x0f;        // Clear upper port
   __asm("NOP");
    Donnee   |= 0x20;  //  0b00100000;
    Pulse_En() ;
    LCD_Delay_20ms();
    //Function SET Commande 0 0 1 DL N F X X  avec RS=0 RW=0
    //Definit la taille de l'interface (DL=0 pour mode 4 bits, DL=1 pour mode 8 bits),
    // le nombre de lignes (NL=0 pour 1 ligne, N=1 pour 2 ou 4 lignes),
    // et la taille des fontes (F=0 pour des cars 5x7, F=1 pour des cars 5x10).
    LCD_Cde(0x28); //0b00101000  2Line 5x8
    //Display on/off control  0 0 0 0 1 D C B
    // affichage (D), curseur (C), clignotement du curseur (B).
 // pour faire de la place! 
 //   LCD_Cde(0x08) ; //   0b00001000) display off
 //   LCD_Cde(0x01); //    0b00000001)/display clear 

    //Entry mode setting
    //Entry mode command " 0 0 0 0 0 1 ID S "
    //ID =0 no cursor increment during read and write
    //ID =1 cursor increment during read and write
    //S =0 no display during read and write
    //S =1 display shift
     LCD_Cde(0x06) ; //  0b00000110) 0x06 if cursor inc and no display shift
     //Display on off ,Blink ,cursor command set "0 0 0 0 1 D C B "
    //D=1 dislay on, C=1 cursor off, B=1 blink off
    LCD_Cde(0x0C); // 0b00001100);   display ON, cursor ON, blink OFF
    LCD_Delay_20ms();
    LED=1;
  }

void LCD_Put(char data)
{
    // __delay_ms(1);
    RS=1;
    __asm("NOP");
    En=0;
    Donnee &=0x0f;               //clear port
    Donnee|= data&0xf0;         //write upper nibble to port
    En = 1;                     // Clock the cmd in
     __delay_ms(1);
    En = 0;
    Donnee &= 0x0f;              //clear port
    Donnee |= (data<<4)&0xf0;    //shift left 4 times
    En = 1;
   // __delay_ms(1);
     __asm("NOP");
    En = 0;
}


void LCD_Print(char *str1)
{
 char i=0;
    while( *(str1+i)>)    // Write String in RAM to LCD up to null
    {
        LCD_Put(*(str1+i));     // Write character to LCD
        i++;  
        if 
(i>15) break;
    }
}

/* pour faire de la place!
void LCD_CPrint(const char *Cstring)
{ char i=0;
    while(*(Cstring+i) >0)   // Write constant string to LCD up to null
    {
        LCD_Put(*(Cstring+i));         
        i++;  
        if (i>15) break;
    }
}
 */


// position pointeur de la DD_RAM Ligne LIG colonne COL
// home haut gauche -> ligne0 colonne0 
void LCD_Pos(char L,char posX)
{
 if (L==1) LCD_Cde(0x80+posX);     // D7=1 + adresse D6..D0 = 0 a 15
 if (L==2) LCD_Cde(0xC0+posX);        // D7=1 + offset 40H 2nd line + adress D6..D0 = 0 a 15
}

#endif


void Start_signal()
{
  DHT22_Pin_Dir = 0;
  TRISAbits.TRISA0=0;// Configure connection pin as output
  PORTAbits.RA0=0;
  //DHT22_Pin = 0;                        // Connection pin output low
 __delay_ms(25);
  PORTAbits.RA0=1;
  //DHT22_Pin = 1;                        // Connection pin output high
 __delay_us(30);
  DHT22_Pin_Dir = 1;              // Configure connection pin as input
}

 char check_response()
{
 __delay_us(40);
 if(! PORTAbits.RA0)
 // if(!DHT22_Pin)
  {                     // Read and test if connection pin is low
   __delay_us(80);
    if(PORTAbits.RA0)
        //if(DHT22_Pin)
    {                    // Read and test if connection pin is high
     __delay_us(50);
      return (1);
     }
    }
}


unsigned char Read_Donnee()
{
  unsigned char i, k, _Donnee;
  _Donnee= 0;     // k is used to count 1 bit reading duration
  Time_out=0;
  //  break;
  for(= 0; i < 8; i++)
  { k = 0;
 while(! PORTAbits.RA0)
  //  while(!DHT22_Pin)
    {  k++;
      if (> 100) {Time_out = 1;}
     __delay_us(1);
     }
 __delay_us(30);
  if(! PORTAbits.RA0)
 // if(!DHT22_Pin)
      bit_clear(_Donnee, (- i));               // Clear bit (7 - i)
    else
    
{
      bit_set(_Donnee, (- i));                 // Set bit (7 - i)
      k=0;
       while( PORTAbits.RA0)
          // while(DHT22_Pin)
       {                         // Wait until pin goes low
      k++;
      if (> 100) {Time_out = 1;}
    __delay_us(1);}
    }
  }
  return _Donnee;
}
 


void Delay_500ms
()
{
__delay_ms(500);
}

 void main()
 {
  PORTA = 0b00000001;
  TRISA = 0b00000001 ;   // PORTA is RA0,1= analog input  RA2=sortie DAC RA3,4,5=Digital output
  TRISB = 0b00000000 ;
  PORTA=0;
  LED_Dir=0;
  LED=0;
  // pour UART3
  /*
   TX3_Pin_Dir=0;
   TX3=1;
   c3=0;
   RS_Count=0;
   RS_tmp=0;
   RS_Delay=0;
   * */

   DHT22_Pin_Dir =0;
   for (i=0;i<sizeof(Texte)-1;i++) Texte[i]=0;
 /*
 __asm(" CLRWDT ;Clear WDT and  prescaler");
 __asm("BSF STATUS, 5");
 __asm("MOVLW 0x01");
 __asm("MOVWF OPTION_REG ");
 __asm("BCF STATUS, 5 ");
   */
     
        
 
// OPTION REG 0x81
 // RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
  //   OPTION_REG=0x07; //b00000001;   Prescaler =256 
  //  OPTION_REG=0x00; //(par defaut) FOSC/(4x2) => 8/8= 1µS 
     OPTION_REG=0x02; //(par defaut) FOSC/(4x4) =>16/8= 2µS 
   
#ifdef TEST_LCD_ONLY
  while(1)
 {
       for (i=0;i<6;i++)
   { 
       PORTAbits
.RA3=0;__delay_ms(200);
       PORTAbits.RA3=1;__delay_ms(200);
   }   
   __delay_ms
(2000);
  Init_XC8_LCD ();
 LCD_Pos(1,0);
 strConstRamCpy(Texte,"Test LCD2x16   ");
  LCD_Print (Texte);
 __delay_ms(2000);
  LCD_Pos(2,1);
  // strConstRamCpy(Texte,"L2  LCD2x16   "); 
  LCD_CPrint ("L2  LCD2x16   ");
 LCD_Cde(LCD_RETURN_HOME);  //0x02
 }
#endif
 
  __delay_ms
(2000);
  
  
#ifdef With_LCD
  Init_XC8_LCD ();
 #endif

 // mise en comment ci-dessous pour faire de la place!
  //pour verifier si le programme se lance bien !
 //  for (i=0;i<6;i++)
 //  { 
 //     PORTAbits.RA3=0;__delay_ms(200);
 //     PORTAbits.RA3=1;__delay_ms(200);
 //  }   
  //strConstRamCpy(Texte,"16F84 at 8Mhz  ");
  //LCD_Pos(1,0);
  //LCD_Print(Texte);
//   strConstRamCpy(Texte,"Mesure AM2302 ");
//  LCD_Pos(2,0);
//  LCD_Print(Texte);
    __delay_ms(2000);
 //   while(1);
 //}
 
 
  while
(1)
   {
   Delay_500ms();
     #ifdef With_UART3
    j++;
    Texte[0]  = (/ 100) % 10  + 48;
    Texte[1]  = (/ 10) % 10  + 48;
    Texte[2] = j % 10  + 48;
    Texte[3] = ' ';
    Texte[4] =0;
    CPrint("j=");
    Print(Texte);
    #endif
         
 
     Start_signal
();
    if(check_response())
    {                    // If there is response from sensor
      RH_byte1 = Read_Donnee();                 // read RH byte1
      RH_byte2 = Read_Donnee();                 // read RH byte2
      T_byte1 = Read_Donnee();                  // read T byte1
      T_byte2 = Read_Donnee();                  // read T byte2
      CheckSum = Read_Donnee();                 // read checksum
      if(Time_out){                           // If reading takes long time
         strConstRamCpy(Texte,"Time out!");
         LCD_Print(Texte);
      }
      else{
       if(CheckSum == ((RH_byte1 + RH_byte2 + T_byte1 + T_byte2) & 0xFF))
       {
        RH = RH_byte1;
        RH = (RH << 8) | RH_byte2;
        Temp = T_byte1;
        Temp = (Temp << 8) | T_byte2;
        if (Temp > 0x8000)
        {
         Texte[6] = '-';
         Temp = Temp & 0x7FFF; 
        
}
        else
         strConstRamCpy
(Texte, "Temp = 00.00 C  ");
         
          Texte
[7]  = (Temp / 100) % 10  + 48;   //T_byte1 / 10  + '0';
          Texte[8]  = (Temp / 10) % 10  + 48;   //T_byte1 % 10  + '0';
          Texte[10] = Temp % 10  + 48;  //T_byte2 / 10  + '0';
          Texte[11] =223; // put degree symbol (°)
          Texte[12]='C';
          Texte[13]=' ';
          Texte[14]=' ';
          Texte[15]=0;
          LCD_Pos(1, 0);           // go to  row 1 column 0,
          LCD_Print(Texte);
                              //1234567890123456
          strConstRamCpy(Texte,"RH   = 00.0%   ");
          Texte[7]     =  (RH / 100) % 10 + 48; //RH_byte1 / 10 + '0';
          Texte[8]     =  (RH / 10) % 10 + 48; //RH_byte1 % 10 + '0';
          Texte[10]    = RH % 10 + 48;
          Texte[11]    = '%';
          Texte[12]    = ' ';
          Texte[13]    = ' ';
          Texte[15]=0;
          LCD_Pos(2, 0);           // go to Row 2, column 0
          LCD_Print(Texte);
      }
      else {
          LCD_Cde(LCD_CLEAR);  
          LCD_Pos
(1, 0);       
          strConstRamCpy
(Texte,"Checksum Err");
            LCD_Print(Texte);
        }
      }
    }
    else 
    
{
      strConstRamCpy(Texte,"no resp.from DHT");
        LCD_Print(Texte);
    }
  PORTAbits.RA3=1;
 
 for 
(i=0;i<6;i++)
  { 
     PORTAbits
.RA3=0;__delay_ms(200);
    PORTAbits.RA3=1;__delay_ms(200);
   } 
  
}
 }

 


_16F84_DHT22_Tests_2024-0711.X.zip


16F84_DHT22_LCD_2x16_2024-0711_.jpg



ce matin 12/07
j'ai Temp=26.2°C Hum=74.2%
...il pleut
sur ma station Meteo :
T=26.3°C et H=74%

:sifflotte: mesures AM2302 coherentes !
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

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