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 ---
- 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 ---
Modérateur : Jérémy
Hygromètre à PIC
- paulfjujo
Maître- Messages : 3143
- Âge : 74
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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+
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+
Hygromètre à PIC
- paulfjujo
Maître- Messages : 3143
- Âge : 74
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
..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 ...
un 16LF1647 ou 18LFxxxxx serait mieux placé ... mais pas testé .
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

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 ...
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.
Hygromètre à PIC
-
RETRAITE128
Débutant- Messages : 96
- Enregistré en : août 2021
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
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
Maître- Messages : 3143
- Âge : 74
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
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
Hygromètre à PIC
-
RETRAITE128
Débutant- Messages : 96
- Enregistré en : août 2021
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
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
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.
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- Messages : 96
- Enregistré en : août 2021
Hygromètre à PIC
- paulfjujo
Maître- Messages : 3143
- Âge : 74
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
et dans la boucle principale
while(TRUE)
j'ai l'equivalent, mais avec delai de 2sec et init du flag Timeout=0 !
As-tu les outils CCS pour modifier ton source et programmer ensuite le PIC ?
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 i, k, _Donnee;
_Donnee= 0; // k is used to count 1 bit reading duration
Time_out=0; // init drapeau TimeOut
for(i = 0; i < 8; i++)
{
k = 0;
while(! PORTAbits.RA0)
{ k++;
if (k > 100) {Time_out = 1;}
__delay_us(1);
}
__delay_us(30);
if(! PORTAbits.RA0)
bit_clear(_Donnee, (7 - i)); // Clear bit (7 - i)
else
{
bit_set(_Donnee, (7 - i)); // Set bit (7 - i)
k=0;
while( PORTAbits.RA0)
{ // Wait until pin goes low
k++;
if (k > 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 ?
Hygromètre à PIC
-
RETRAITE128
Débutant- Messages : 96
- Enregistré en : août 2021
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
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
Maître- Messages : 3143
- Âge : 74
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
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%
mesures AM2302 coherentes !

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)>0 ) // 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(i = 0; i < 8; i++)
{ k = 0;
while(! PORTAbits.RA0)
// while(!DHT22_Pin)
{ k++;
if (k > 100) {Time_out = 1;}
__delay_us(1);
}
__delay_us(30);
if(! PORTAbits.RA0)
// if(!DHT22_Pin)
bit_clear(_Donnee, (7 - i)); // Clear bit (7 - i)
else
{
bit_set(_Donnee, (7 - i)); // Set bit (7 - i)
k=0;
while( PORTAbits.RA0)
// while(DHT22_Pin)
{ // Wait until pin goes low
k++;
if (k > 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] = (j / 100) % 10 + 48;
Texte[1] = (j / 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);
}
}
}
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%

Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 3 invités