Question:
"Plus d'adresses" lors de l'utilisation de plusieurs capteurs DS18B20
serge1peshcoff
2015-12-17 20:18:45 UTC
view on stackexchange narkive permalink

Je veux créer un schéma pour obtenir les données de plusieurs capteurs DS18B20 et écrire leur température sur série. Avant de les connecter en mode parasite et en utilisant une résistance de 2,7k (car je n'avais pas 4,7k à la maison). À l'époque, cela fonctionnait pour 1 appareil, si j'en branche un autre, il ne détectera aucun d'entre eux (il écrit "Plus d'adresses"). Maintenant, j'ai remplacé la résistance de 2,7k par 4,7k et il ne détecte aucun appareil connecté. Mais si je fais une petite chose, qui remplace la résistance de 4,7k par 2,7k, il détectera un appareil.

Comment y remédier?

Voici exactement comment tout est maintenant connecté: enter image description here

et voici le croquis par défaut que j'utilise:

  #include <OneWire.h> // OneWire DS18S20, DS18B20, DS1822 Exemple de température //// http://www.pjrc.com/teensy/td_libs_OneWire.html//// La bibliothèque DallasTemperature peut faire tout ce travail pour vous! // http://milesburton.com/Dallas_Temperature_Control_LibraryOneWire ds (10); // sur la broche 2 (une résistance de 4,7K est nécessaire) void setup (void) {Serial.begin (9600);} void loop (void) {byte i; octet présent = 0; byte type_s; données d'octet [12]; byte addr [8]; float celsius, fahrenheit; if (! ds.search (addr)) {Serial.println ("Plus d'adresses."); Serial.println (); ds.reset_search (); retard (250); revenir; } Serial.print ("ROM ="); pour (i = 0; i < 8; i ++) {Serial.write (''); Serial.print (addr [i], HEX); } if (OneWire :: crc8 (addr, 7)! = addr [7]) {Serial.println ("CRC is not valid!"); revenir; } Serial.println (); // le premier octet ROM indique quel commutateur de puce (addr [0]) {case 0x10: Serial.println ("Chip = DS18S20"); // ou ancien DS1820 type_s = 1; Pause; cas 0x28: Serial.println ("Chip = DS18B20"); type_s = 0; Pause; cas 0x22: Serial.println ("Chip = DS1822"); type_s = 0; Pause; par défaut: Serial.println ("Le périphérique n'est pas un périphérique de la famille DS18x20."); revenir; }
ds.reset (); ds.select (addr); ds.write (0x44); // démarrer la conversion, utiliser ds.write (0x44,1) avec une alimentation parasite allumée à la fin du délai (1000); // peut-être que 750 ms suffisent, peut-être pas // nous pourrions faire un ds.depower () ici, mais la réinitialisation s'en chargera. présent = ds.reset (); ds.select (addr); ds.write (0xBE); // Lire Scratchpad Serial.print ("Data ="); Serial.print (présent, HEX); Serial.print (""); for (i = 0; i < 9; i ++) {// nous avons besoin de 9 octets data [i] = ds.read (); Serial.print (données [i], HEX); Serial.print (""); } Serial.print ("CRC ="); Serial.print (OneWire :: crc8 (données, 8), HEX); Serial.println (); // Convertit les données en température réelle // parce que le résultat est un entier signé 16 bits, il doit // être stocké dans un type "int16_t", qui est toujours 16 bits // même lorsqu'il est compilé sur un processeur 32 bits. int16_t raw = (données [1] << 8) | données [0]; if (type_s) {raw = raw << 3; // Résolution par défaut de 9 bits if (data [7] == 0x10) {// "count still" donne une résolution complète de 12 bits raw = (raw & 0xFFF0) + 12 - data [6]; }} else {byte cfg = (données [4] & 0x60); // à une résolution inférieure, les bits faibles ne sont pas définis, donc remettons-les à zéro si (cfg == 0x00) raw = raw & ~ 7; // Résolution 9 bits, 93,75 ms sinon si (cfg == 0x20) raw = raw & ~ 3; // 10 bits res, 187,5 ms sinon si (cfg == 0x40) raw = raw & ~ 1; // résolution de 11 bits, 375 ms //// par défaut, résolution de 12 bits, temps de conversion de 750 ms} celsius = (float) raw / 16.0; fahrenheit = celsius * 1,8 + 32,0; Serial.print ("Température ="); Serial.print (Celsius); Serial.print ("Celsius,"); Serial.print (fahrenheit); Serial.println ("Fahrenheit");}  

Y a-t-il quelque chose que je fais mal? Parce que j'ai réussi à le faire fonctionner il y a quelque temps.

Wow, la commutation de la résistance sur 620R a fonctionné. Je suppose que j'ai un problème dans ma maquette.
Avez-vous essayé sans pouvoir parasite ou avez-vous une raison particulière d'utiliser le pouvoir parasite?
La planche à pain crée un peu de capacité sur la ligne de données. Essayez de placer le deuxième module juste en dessous du premier (partageant ainsi les mêmes «colonnes» de maquette).
@Personagem, il était juste plus facile de se connecter, à mon avis. Y a-t-il une différence?
Certaines sources conseillent de ne pas utiliser avec plusieurs périphériques (http://openenergymonitor.org/emon/buildingblocks/DS18B20-temperature-sensing). Cependant, la fiche technique indique que c'est possible tant qu'une forte traction est présente. J'irais avec la puissance normale avec 4,7k pullup. Soyez très prudent en connectant vdd pour corriger le PIN dans le capteur. Il brûlera en quelques secondes si vous inversez la polarité.
Deux réponses:
jdr5ca
2015-12-19 16:02:42 UTC
view on stackexchange narkive permalink

Un problème avec ce que vous faites sur la maquette est que vous ne montrez aucun condensateur de dérivation.

Ce qui rend le pull up "fort" est la capacité à fournir du courant pour déplacer la ligne de données de zéro en arrière à une. La charge sur la ligne de données est sa capacité. Pour déplacer la ligne de données de 0 à 1, vous devez charger ce condensateur. En travaillant sur une planche à pain, vous avez raison de dire que vous avez une charge capacitive plus importante. Vous avez donc besoin de plus de courant pour déplacer rapidement la ligne de données de zéro à un.

Vous avez raison de dire que la résistance inférieure de 620 ohms fournira plus de courant. Le courant important déplacera plus rapidement la charge capacitive de la ligne de données. Mais vous ne faites pas attention à l'autre côté de la résistance, le rail 5V.

La disposition que vous avez a une inductance dans les fils de l'alimentation Arduino à la carte à pain. Un inducteur a une chute de tension à travers lui proportionnelle au taux de changement du courant qui le traverse:

  V = L di / dt  

L'analogie est cette inductance est un volant: si elle ne tourne pas, il faudra de la force pour se mettre en mouvement. De même, une fois qu'il tourne, il faudra de la force pour l'arrêter.

Ainsi, lorsque la résistance commence à conduire pour remonter la ligne de données, l'inductance dans les fils et la plaque d'essai provoque une chute de tension. Le côté +5 de la tension de la résistance chute. Cette inductance dans les fils menant à la résistance l'empêche de recharger rapidement la ligne de données vers 1.

C'est le rôle des condensateurs bypass . Vous placez 1 ou 2 juste à la résistance entre les bandes +5 et GND sur la planche à pain. Maintenant, lorsque la résistance tire du courant, elle tire initialement de l'énergie stockée dans les condensateurs. Après une courte période, le courant commencera à tirer du fil +5. Ainsi, vous avez contourné l'inductance de l'alimentation +5, d'où son nom.

Ajoutez un condensateur céramique 0,1 microFarad sur votre maquette où les fils se connectent aux bandes de contact. Vous verrez cela sur les schémas pour tout ce qui a une alimentation CC hors carte. Juste à côté du connecteur d'alimentation, il y aura 2 ou 3 condensateurs, généralement un gros tantale de 2 à 10 uF et un plus petit de 0,1 uF environ. Similaire à travers les circuits imprimés, vous voyez des bouchons de dérivation placés à la broche de tension d'alimentation de chaque puce, généralement deux: un 0,1 uF et un plus petit 10 nF.

Il peut sembler inutile de placer un petit condensateur en parallèle avec un plus gros condensateur. Les valeurs ajoutent juste, oui? Mais encore une fois, la réponse temporelle est différente. Les condensateurs ne sont pas parfaits et ont une résistance série interne. Un gros condensateur électrolytique de 10 uF peut stocker beaucoup d'énergie, mais il n'est pas rapide en termes de vitesse à laquelle il peut commencer à fournir du courant. Un petit condensateur monolithique céramique de 100 nF est très rapide, mais n'a pas beaucoup d'énergie.

Donc, avec deux bouchons de dérivation en parallèle, vous avez le petit pour la poussée de courant initiale, le plus grand pour le levage lourd, et le dernier et le plus lent des fils et des traces 5V pour fournir un courant constant.

0,1 uF == 100 nF.
JRobert
2015-12-19 04:52:44 UTC
view on stackexchange narkive permalink

Un pullup fort semble être la clé pour avoir plusieurs capteurs en mode parasite, comme décrit dans la fiche technique des appareils DS18b20. Bien qu'ils suggèrent d'utiliser un MOSFET pour remonter le bus 1 fil, j'ai eu de bons résultats (3 mètres de fil, 3 appareils à plus de 2 mètres) en reliant un port de sortie directement au bus 1 fil, en contournant le Résistance 4.7K.

  // Un bus de fil fort-pullup: //// + ------------ + + 5v + ------ --- + + --------- + // | MCU | | | DS18b20 | | DS18b20 | // | | R_pu ​​= 4,7K | g d +5 | | g d +5 | // | Strong- | | + -o - o - o- + + -o - o - o - + // | Pullup > o ------ o | | | | | | // | | | + - | - + + - | - + // | | | | | | | // | Données <> o ------ o --------------- | --o ------------ | --o ----- - - - - // | | | | // + ------------ + VV  

Initialisez le port strong-pullup en définissant le port comme une sortie et HIGH, le désactiver et l'activer en changeant le mode du port, pas la valeur de sortie. (Définir le mode de port sur entrée le fait flotter, plutôt que de le mettre à la terre comme le ferait BAS. Cette technique m'a été suggérée par Dave Tweed dans Electrical Engineering Stack Exchange.)



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...