Go Down

Topic: Aide pour Sonde Temp + Hum (AM2305) base DS18D20 onewire (Read 1 time) previous topic - next topic

gef13

Bonjour,


malgré tous mes essai je ne parviens pas a faire fonctionner ma sonde !!
je parle meme pas de lire les temperatures mais je ne parviens meme pas a la detecter.


J'ai essayé tous les bout de code pour DS18D20 mais toujours pas de sonde détecté !!
essayer avec résistances 4.7k , 47k rien a faire !

je sais que sur cette sonde le data fait 40 bits , j'ai donc essayé de modifier la longueur 12 en 40 !

je ne suis pas sur mais je pense que la librairie onewire doit subir quelques modif mais je ne sais pas ou et quoi !

ci-joint les liens de la sonde et du datasheet.

merci pour votre aide par avance.

datasheet de la sonde am2305 :
http://www.aosong.com/asp_bin/Products/en/AM2305.pdf

data de ds18b20
http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf


pour les codes testés c'est les code standard pour lecture ds18b20 plus l'exemple dans librairie onewire.

si vous avez une idée ! car je pense pas que ma sonde soit out!

a+ j'espere

gerard

Arduino leonard

Artouste


...

pour les codes testés c'est les code standard pour lecture ds18b20 plus l'exemple dans librairie onewire.

si vous avez une idée ! car je pense pas que ma sonde soit out!

a+ j'espere

gerard



bonjour
C'est de la communication en one wire (1 fil) mais ce n'est pas du onewire (protocole maxim), la nuance est grande  :smiley-mr-green:
donc les codes pour ds18x20 ne fonctionneront pas.
il faut gerer tout le protocole tel qu'exposé table 5 du datasheet



gef13

bonjour Artouste et merci pour l'info !

ce qui veut dire que la librairie onewire ne me sert a rien !!??

et que je dois gérer les us part mois même?
si oui je dois faire une librairie ou je peux les coder directement?

(je débute avec arduino et les librairies milles excuses si mes questions paraissent bêtes)

a+
Arduino leonard

Artouste

#3
Jan 10, 2013, 11:49 am Last Edit: Jan 10, 2013, 12:19 pm by Artouste Reason: 1

bonjour Artouste et merci pour l'info !

ce qui veut dire que la librairie onewire ne me sert a rien !!??

et que je dois gérer les us part mois même?
si oui je dois faire une librairie ou je peux les coder directement?

(je débute avec arduino et les librairies milles excuses si mes questions paraissent bêtes)

a+

bonjour
en gros c'est ça, il faut soit que tu trouve une librarie déjà existante qui gere les AM305
il y a ça de dispo sur le site du fabricant , il y a peut etre de quoi faire du coté AVR
Quote
Download Our production of capacitive digital temperature and humidity sensor corresponding to the C51 MCU and AVR read a single bus routines; for AM2301, AM2302, AM2303, AM2305 temperature and humidity sensors use a common routine.

http://www.aosong.com/asp_bin/downloads/AM23XX.rar
soit que tu te paluche le protocole (dans le code ou en faisant une librairie, mais à ce stade c'est kif-kif  :smiley-mr-green: )

a priori ce fichier .c pour avr à l'air bien documenté et doit etre une bonne base de depart pour arduino.
http://cjoint.com/13jv/CAkmrqygl3H.htm

gef13

ok ! compris le problème !!

haa l'époque du thermo en mercure !!! ;)

bon je vais regarder ce que je peux récupérer dans les fichiers AM23XX...
(j'ai vu des truc dans fichier ".c")

mais bon.... suis pas sur de trouver...

merci encore pour ton aide tu ma bien éclairci le problème ( j'étais loin de me douter que pas onewire)

si je trouve je mettrais le code...

a+
Arduino leonard

Artouste


ok ! compris le problème !!

haa l'époque du thermo en mercure !!! ;)

bon je vais regarder ce que je peux récupérer dans les fichiers AM23XX...
(j'ai vu des truc dans fichier ".c")

mais bon.... suis pas sur de trouver...

merci encore pour ton aide tu ma bien éclairci le problème ( j'étais loin de me douter que pas onewire)

si je trouve je mettrais le code...

a+

re
oui
je viens d'editer ma reponse
le .C à l'air bien documenté et si tu seche , les petits genies du C te donnerons un coup de main pour adapter  :smiley-mr-green:

Artouste

#6
Jan 10, 2013, 12:51 pm Last Edit: Jan 10, 2013, 12:55 pm by Artouste Reason: 1
au passage et pour les petits genies du C

ça c'est pour etre au plus proche des 10µs ? , en dur c'est la meilleure méthode de prog  en C ?
ça revient a l'equivalent multiple du NOP en ASM  ?
Code: [Select]
void  Delay_10us(void)
     {
       U8 i;                    
       i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;i++;i++;i++;i++;i++;
      }

gef13

j'ai essayer de traduire (en petit chinois via google) les renseignements du code d'origine pour aider a comprendre !!!

C'est le fichier Display_DHTXX.c   sans aucune modif de ma part juste traduit !

http://cjoint.com/?CAkobltK2Ro

voila si ça peu servir ! et si je trouve quelque chose qui fonctionne je le mettrai....

a+
gf
Arduino leonard

bricofoy


au passage et pour les petits genies du C

ça c'est pour etre au plus proche des 10µs ? , en dur c'est la meilleure méthode de prog  en C ?
ça revient a l'equivalent multiple du NOP en ASM  ?
Code: [Select]
void  Delay_10us(void)
      {
        U8 i;                     
        i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;i++;i++;i++;i++;i++;i++;i++;
i++;i++;i++;i++;i++;i++;i++;
       }



ben ça ça me semble parfaitement approximatif comme méthode de timing, ça va dépendre du proc utilisé, de son horloge, probablement aussi du compilo... Les fonctions équivalentes de l'arduino utilisent un timer de processeur pour faire ça, au moins c'est précis.
-tu savais que si tu passe le CD de windows à l'envers, tu entends une chanson satanique ?
-non, mais il y a pire : à l'endroit, ça l'instal

gef13

Re

je pense avoir trouver le bon fichier (probablement a adapter un peu)

(perso pour l'instant j'ai problème avec librairie)
#include "REG52.H"
#include <INTRINS.H>
j'ai trouver que les .h (pas les cpp) et j'ai des non déclarés!

j'ai mis le fichier ici : http://cjoint.com/?CAkrb7YnROQ

a+
Arduino leonard

skywodd

Salut,


ça c'est pour etre au plus proche des 10µs ?

Si ça fait 10µs en vrai c'est vraiment un sacré coup de chance ...
L'optimisation du compilateur devrait complétement rasé les "i++" pour faire un seul "i += 70;"


en dur c'est la meilleure méthode de prog  en C ?

Pas vraiment ... pour faire un delai de 10µs la seul vrai solution sur AVR c'est :
http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html#gab20bfffeacc678cb960944f5519c0c4f

Sinon en pure C c'est impossible d'avoir 10µs exactement, ça dépend du cpu, de la fréquence d'horloge et de plein d'autre facteurs.


ça revient a l'equivalent multiple du NOP en ASM  ?

Non ici c'est un post-incrémentation, pas un nop.

A F_CPU = 16MHz pour faire un delai de 10us il faut 16E6 * 10E-6 = 160 cycles cpu soit :
Code: [Select]
inline void delay_10us(void) {
    asm volatile(
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
"nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t nop\n\t"
    ::);
}
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Artouste



Si ça fait 10µs en vrai c'est vraiment un sacré coup de chance ...
L'optimisation du compilateur devrait complétement rasé les "i++" pour faire un seul "i += 70;"


bonjour
ok skywodd
merci pour les explications, j'ai une facheuse tendance à "ignorer/occulter" le rôle d'optimisation du compilo.

gef13

bonjour,

suite de mes recherches...

j'ai trouver un librairie DTH11 qui fait aussi temp+hum qui me parait très compatible avec AM2305 !!

j'ai maintenant une reconnaissance (a 1er vu) mais j'ai erreur de checksum !

j'ai modifié quelque valeur de temps dans librairie mais suis pas sur !
et je crois aussi qu'il faut bien formater les données...

j'ai mis la librairie d'origine DTH11 avec les modifs en commentaires pour ceux que ça intéresse ici: http://cjoint.com/?CAlqQavZ7dX

pas encore trouver mais j'y travaille...

pour info ci dessous le cpp
Code: [Select]
#include "dht11.h"

// Return values:
// DHTLIB_OK
// DHTLIB_ERROR_CHECKSUM
// DHTLIB_ERROR_TIMEOUT
int dht11::read(int pin)
{
// BUFFER TO RECEIVE
uint8_t bits[5];
uint8_t cnt = 7; //*************ici j'ai un doute 7?? 16!
uint8_t idx = 0;

// EMPTY BUFFER
for (int i=0; i< 5; i++) bits[i] = 0;

// REQUEST SAMPLE
pinMode(pin, OUTPUT);
digitalWrite(pin, LOW);
delay(1); // pour am2305
//  ORIGINAL delay(18);
digitalWrite(pin, HIGH);
delayMicroseconds(30);// pour am2305
// ORIGINAL delayMicroseconds(40);
pinMode(pin, INPUT);

// ACKNOWLEDGE or TIMEOUT
unsigned int loopCnt = 10000;   // ***************************la je crois pas que soit bon !!
while(digitalRead(pin) == LOW)
if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;

loopCnt = 10000;
while(digitalRead(pin) == HIGH)
if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;

// READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUT
for (int i=0; i<40; i++)
{
loopCnt = 10000;
while(digitalRead(pin) == LOW)
if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;

unsigned long t = micros();

loopCnt = 10000;
while(digitalRead(pin) == HIGH)
if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT;

if ((micros() - t) > 40) bits[idx] |= (1 << cnt);
if (cnt == 0)   // next byte?
{
cnt = 7;    // restart at MSB
idx++;      // next byte!
}
else cnt--;
}

// WRITE TO RIGHT VARS
        // as bits[1] and bits[3] are allways zero they are omitted in formulas.
humidity    = bits[0];
temperature = bits[2];
//******************************************* ici je crois qui qui faut 5 bits!!
uint8_t sum = bits[0] + bits[2]; 

if (bits[4] != sum) return DHTLIB_ERROR_CHECKSUM;
return DHTLIB_OK;
}
//
// END OF FILE
//


voila pour l'instant...

suis preneurs de confirmation ou de conseils ....

a+
gf


Arduino leonard

Go Up