Aide pour Sonde Temp + Hum (AM2305) base DS18D20 onewire

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

gef13:
...

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 :grin:
donc les codes pour ds18x20 ne fonctionneront pas.
il faut gerer tout le protocole tel qu'exposé table 5 du datasheet

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+

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+

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

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 :grin: )

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

ok ! compris le problème !!

haa l’époque du thermo en mercure !!! :wink:

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+

gef13:
ok ! compris le problème !!

haa l’époque du thermo en mercure !!! :wink:

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 :grin:

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 ?

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++;
       }

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 !

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

a+
gf

Artouste:
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 ?

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.

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+

Salut,

Artouste:
ç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;"

Artouste:
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.

Artouste:
ç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 :

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"
    ::);
}

skywodd:
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.

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

#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