system
December 15, 2013, 8:00pm
1
bonjour
j aimerais savoir comment programmer 2 ds18b20 un sur la broche 4 et l'autre sur la broche 5 de ma carte arduino mega
pourquoi cette solution? ne plus avoir de problème adressage de sonde ( 1 sonde / broche )
est ce possible?
merci d'avance
Le one-wire permet d'utiliser facilement une seule pin, qu'est ce que tu as comme problème d'adressage ?
system
December 17, 2013, 11:46am
3
salut
j'aimerais utiliser des ds18b20 pour leur précision , prix , et la version étanche.
le but d'avoir une sonde par broche est la possibilité de ne pas a avoir a reprogrammer l'arduino si je change une sonde hs par une autre.
merci d'avance
mike201085:
salut
j'aimerais utiliser des ds18b20 pour leur précision , prix , et la version étanche.
le but d'avoir une sonde par broche est la possibilité de ne pas a avoir a reprogrammer l'arduino si je change une sonde hs par une autre .
merci d'avance
Bonjour
je ne comprend pas bien ton probleme
tu veux faire du skip rom ?
Admettons le besoin
Qu'est-ce qui t'empêche d'instancier deux objets bus 1Wire, sur deux pins distinctes ?
#include <OneWire.h>
OneWire sonde1(4);
OneWire sonde2(5);
...
Cela ne marche pas ?
system
December 18, 2013, 8:37pm
6
je suis très débutant ds le domaine de la programmation du ds18b20 ou plutôt en onewire.
j'ai essayé du genre
#include <OneWire.h>
byte data[12];
byte adresse[8];
float sonde1=0;
float sonde2=0;
OneWire sonde1(4);
OneWire sonde2(5);
void setup() {
Serial.begin(115200);
}
void loop(){
sonde1=??????????????????
sonde2=????????????????
apres je ne vois plus comment faire la différence entre les 2 broches et la facon simple de demander la prise de mesure au capteur.
Rapidos, quelques lignes à tester (pas compilé, mais donne un exemple de ce à quoi je pensais)
#include <OneWire.h>
OneWire bus_sonde1(4);
OneWire bus_sonde2(5);
uint8_t adresse_sonde1[8];
uint8_t adresse_sonde2[8];
void initialiserSonde1()
{
if (!bus_sonde1.search(adresse_sonde1))
{
Serial.println("Sonde 1 absente");
bus_sonde1.reset_search();
return;
}
bus_sonde1.reset_search();
if (OneWire::crc8(adresse_sonde1, 7) != adresse_sonde1[7])
{
Serial.println("Identifiant sonde 1 invalide");
return;
}
if (adresse_sonde1[0] != 0x28)
{
Serial.println("Le composant sonde 1 n'est pas un DS18B20");
return;
}
Serial.println("Sonde 1 trouvee");
}
void initialiserSonde2()
{
if (!bus_sonde2.search(adresse_sonde2))
{
Serial.println("Sonde 2 absente");
bus_sonde2.reset_search();
return;
}
bus_sonde2.reset_search();
if (OneWire::crc8(adresse_sonde2, 7) != adresse_sonde2[7])
{
Serial.println("Identifiant sonde 2 invalide");
return;
}
if (adresse_sonde2[0] != 0x28)
{
Serial.println("Le composant sonde 2 n'est pas un DS18B20");
return;
}
Serial.println("Sonde 2 trouvee");
}
uint16_t lectureSonde1()
{//retourne la température relevée en seizièmes de degrés
uint8_t data[9];
uint8_t i;
bus_sonde1.reset();
bus_sonde1.select(adresse_sonde1);
bus_sonde1.write(0x44,1);
delay(750);
bus_sonde1.reset();
bus_sonde1.select(adresse_sonde1);
bus_sonde1.write(0xBE);
for (i=0; i<9; i++) data[i] = bus_sonde1.read();
if (OneWire::crc8(data, 8) != data[8])
{
return 0;
}
else
{
return ((uint16_t) data[1] << 8) | data[0];
}
}
uint16_t lectureSonde2()
{//retourne la température relevée en seizièmes de degrés
uint8_t data[9];
uint8_t i;
bus_sonde2.reset();
bus_sonde2.select(adresse_sonde2);
bus_sonde2.write(0x44,1);
delay(750);
bus_sonde2.reset();
bus_sonde2.select(adresse_sonde2);
bus_sonde2.write(0xBE);
for (i=0; i<9; i++) data[i] = bus_sonde2.read();
if (OneWire::crc8(data, 8) != data[8])
{
return 0;
}
else
{
return ((uint16_t) data[1] << 8) | data[0];
}
}
void setup()
{
Serial.begin(9600);
initialiserSonde1();
initialiserSonde2();
}
void loop()
{
Serial.print("temperature sonde 1 : ");
Serial.print((float) 0.0625 * lectureSonde1());
Serial.write(176);
Serial.write('C');
Serial.println();
Serial.print("temperature sonde 2 : ");
Serial.print((float) 0.0625 * lectureSonde2());
Serial.write(176);
Serial.write('C');
Serial.println();
Serial.println();
delay(5000);
}
Edit : quelques parenthèses plus tard, ça compile
system
December 19, 2013, 7:49pm
8
il n'y a qu'un mot
BRAVO
je continu dans mon projet de régulation de chaudière bois / électrique avec par la suite gestion de la vmc double flux
pour info est ce que tu pourrai me dire ou mettre la résistance entre le vcc et le data ( au plus près de la sonde ou de l'arduino?
mike201085:
pour info est ce que tu pourrai me dire ou mettre la résistance entre le vcc et le data ( au plus près de la sonde ou de l'arduino?
tu mets la 4.7K? où c'est le plus simple pour toi, ce n'est qu'une R de tirage, de toutes façons si tu travaille en parasitic power (2 fils) tu n'a pas vraiment le choix
system
December 21, 2013, 8:25pm
10
pour l'instant 4 sonde de branché
je me tourne vers vous pour savoir si il y a un moyen de mesurer une fréquence d'impulsion d'un débitmètre (flowmeter water)?
BUT:
mesurer une puissance thermique réelle dissipé par la chaudière debit *( delta T° départ retour)= puissance
B_tto
December 23, 2013, 8:38am
11
Si tu as juste une sortie impulsionnelle (après tout dépend la fréquence évidemment mais je ne pense pas que ça dépasse le khz) rien de plus simple, il s'agit d'une "banale" lecture digitale.
Après il te faudra peut-être conditionner le signal pour l'adapter aux tensions/fréquence de l'Atmega mais rien de bien compliqué.
system
December 27, 2013, 7:48am
12
Quand tu parle de conditionner le signal tu parle de en faire quoi? Est ce que tu a un exemple de code ?
L'impulsion est de 5v et niveau fréquence je suis d'accord avec toi pas de khz .