Jeg vil lage et skjema for å hente data fra flere DS18B20 sensorer og skrive temperaturen deres til serie. Før jeg koblet dem til ved hjelp av parasittmodus og med 2,7 k motstand (fordi jeg ikke hadde 4,7 000 hjemme). Den gang fungerte det for en enhet. Hvis jeg kobler til en annen, vil den ikke oppdage noen av dem (den skriver "Ingen flere adresser"). Nå byttet jeg ut 2,7k motstand med 4,7k, og den oppdager ingen tilkoblet enhet. Men hvis jeg gjør en liten ting, som erstatter 4,7k motstand tilbake med 2,7k, vil den oppdage en enhet.
Hvordan fikser jeg det?
Her er nøyaktig hvordan alt er koblet sammen nå:
og her er standardskissen jeg bruker:
#include <OneWire.h> // OneWire DS18S20, DS18B20, DS1822 Temperatureksempel //// http://www.pjrc.com/teensy/td_libs_OneWire.html//// DallasTemperature-biblioteket kan gjøre alt dette arbeidet for deg! // http://milesburton.com/Dallas_Temperature_Control_LibraryOneWire ds (10); // på pin 2 (en 4.7K motstand er nødvendig) ugyldig oppsett (ugyldig) {Serial.begin (9600);} ugyldig loop (ugyldig) {byte i; byte til stede = 0; byte type_s; byte-data [12]; byte addr [8]; flyte celsius, fahrenheit; if (! ds.search (addr)) {Serial.println ("Ingen flere adresser."); Serial.println (); ds.reset_search (); forsinkelse (250); komme tilbake; } Serial.print ("ROM ="); for (i = 0; i < 8; i ++) {Serial.write (''); Serial.print (addr [i], HEX); } hvis (OneWire :: crc8 (addr, 7)! = addr [7]) {Serial.println ("CRC er ikke gyldig!"); komme tilbake; } Serial.println (); // den første ROM-byten indikerer hvilken chip-bryter (addr [0]) {case 0x10: Serial.println ("Chip = DS18S20"); // eller gammel DS1820 type_s = 1; gå i stykker; sak 0x28: Serial.println ("Chip = DS18B20"); type_s = 0; gå i stykker; sak 0x22: Serial.println ("Chip = DS1822"); type_s = 0; gå i stykker; standard: Serial.println ("Enheten er ikke en DS18x20-familieenhet."); komme tilbake; }
ds.reset (); ds.select (addr); ds.write (0x44); // start konvertering, bruk ds.write (0x44,1) med parasitt på på sluttforsinkelsen (1000); // kanskje 750ms er nok, kanskje ikke // vi kan gjøre en ds.depower () her, men tilbakestillingen tar seg av det. present = ds.reset (); ds.select (addr); ds.write (0xBE); // Les Scratchpad Serial.print ("Data ="); Serial.print (nåværende, HEX); Serial.print (""); for (i = 0; i < 9; i ++) {// trenger vi 9 byte data [i] = ds.read (); Serial.print (data [i], HEX); Serial.print (""); } Serial.print ("CRC ="); Serial.print (OneWire :: crc8 (data, 8), HEX); Serial.println (); // Konverter dataene til faktisk temperatur // fordi resultatet er et 16-bits signert heltall, skal det // lagres til en "int16_t" -type, som alltid er 16 bits // selv når den kompileres på en 32-biters prosessor. int16_t rå = (data [1] << 8) | data [0]; hvis (type_s) {rå = rå << 3; // 9 bit oppløsning standard hvis (data [7] == 0x10) {// "count rest" gir full 12 bit oppløsning raw = (raw & 0xFFF0) + 12 - data [6]; }} annet {byte cfg = (data [4] & 0x60); // ved lavere oppløsning er de lave bitene udefinerte, så la oss nullstille dem hvis (cfg == 0x00) rå = rå & ~ 7; // 9 bit oppløsning, 93,75 ms annet hvis (cfg == 0x20) rå = rå & ~ 3; // 10 bit res, 187,5 ms annet hvis (cfg == 0x40) rå = rå & ~ 1; // 11 bit res, 375 ms //// standard er 12 bit oppløsning, 750 ms konverteringstid} celsius = (float) raw / 16.0; fahrenheit = celsius * 1,8 + 32,0; Serial.print ("Temperatur ="); Serial.print (celsius); Serial.print ("Celsius,"); Serial.print (fahrenheit); Serial.println ("Fahrenheit");}
Er det noe jeg gjør galt? Fordi jeg på en eller annen måte klarte å få det til å fungere for en tid tilbake.