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