Spørsmål:
"Ingen flere adresser" når du bruker flere DS18B20 sensorer
serge1peshcoff
2015-12-17 20:18:45 UTC
view on stackexchange narkive permalink

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å: enter image description here

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.

Wow, byttet motstanden til 620R fungerte. Antar at jeg har et problem i brødbordet mitt.
Har du prøvd uten parasittkraft, eller har du noen spesiell grunn til å bruke parasittkraft?
Brødbrett skaper litt kapasitans på datalinjen. Prøv å plassere den andre modulen rett under først (så del de samme brødbrett "kolonnene").
@Personagem det var bare lettere å koble til, etter min mening. Er det noen forskjell?
Noen kilder anbefaler at du ikke bruker det med flere enheter (http://openenergymonitor.org/emon/buildingblocks/DS18B20-temperature-sensing). Imidlertid sier databladet at det er mulig så lenge en sterk pullup er til stede. Jeg vil gå med normal kraft med 4,7 k pullup. Vær veldig forsiktig når du kobler vdd til riktig PIN-kode i sensoren. Det vil brenne på sekunder hvis du snur polariteten.
To svar:
jdr5ca
2015-12-19 16:02:42 UTC
view on stackexchange narkive permalink

Et problem med det du gjør på brødplaten er at du ikke viser noen bypasskondensatorer.

Det som gjør pull up "sterk" er muligheten til å gi strøm for å flytte datalinjen fra null tilbake til en. Belastningen på datalinjen er dens kapasitans. For å flytte datalinjen fra 0 til 1, må du lade kondensatoren. Når du arbeider på et brødbrett, har du rett i at du har større kapasitiv belastning. Så du trenger mer strøm for å flytte datalinjen raskt fra null til en.

Du har rett i at den nedre motstanden på 620 ohm vil gi mer strøm. Den store strømmen vil flytte kapasitansbelastningen på datalinjen raskere. Men du tar ikke hensyn til den andre siden av motstanden, 5V-skinnen.

Oppsettet du har har induktans i ledningene fra Arduino-strømforsyningen ut til brødbrettet. En induktor har et spenningsfall over seg proporsjonalt med strømens endringshastighet gjennom den:

  V = L di / dt  

Analogien er at induktans er et svinghjul: hvis det ikke snurrer, vil det ta kraft for å få det i bevegelse. Lignende, når den snurrer, vil det ta kraft å stoppe den.

Så når motstanden begynner å lede for å trekke opp datalinjen, forårsaker induktansen i ledningene og brødplaten et spenningsfall. +5-siden av motstandsspenningen synker. Denne induktansen i ledningene som fører til motstanden hindrer den i å raskt lade datalinjen tilbake til 1.

Det er rollen som bypass kondensatorer. Du plasserer 1 eller 2 rett ved motstanden mellom +5 og GND-stripene på brødplaten. Nå når motstanden trekker strøm, trekker den opprinnelig fra energien som er lagret i kondensatorene. Etter kort tid begynner strømmen å trekke fra +5-ledningen. Dermed har du forbigått induktansen til +5-forsyningen, derav navnet.

Legg til en keramisk kondensator på 0,1 microFarad på brødplaten der ledningene kobles til kontaktstrimlene. Du vil se dette på skjemaer for alt som har DC-forsyning om bord. Rett ved siden av strømkontakten vil det være 2 eller 3 kondensatorer, vanligvis en stor 2-10 uF tantal og en mindre 0,1 uF eller så. Lignende på tvers av kretskort ser du bypass-hetter plassert ved forsyningsspenningen til hver brikke, vanligvis to: en 0,1 uF og en mindre 10 nF.

Det kan virke meningsløst å plassere en liten kondensator parallelt med en større kondensator. Verdiene bare tilføyer, ja? Men igjen, tidsresponsen er annerledes. Kondensatorer er ikke perfekte og har intern seriemotstand. En stor 10 uF elektrolytkondensator kan lagre mye energi, men den er ikke rask når det gjelder hvor raskt den kan begynne å gi strøm. En liten 100 nF keramisk monolitisk kondensator er veldig rask, men har ikke mye energi.

Så med to bypass-hetter parallelt, har du den lille for den første strømutbruddet, den større hetten for tunge løft, og sist og tregest 5V-ledningene og sporene for å levere til jevn strøm.

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

En sterk pullup ser ut til å være nøkkelen til å ha flere sensorer i parasittmodus, som beskrevet i databladet for DS18b20-enhetene. Selv om de foreslår at jeg bruker en MOSFET til å trekke opp 1-ledningsbussen, har jeg hatt gode resultater (3 meter ledning, 3 enheter mer enn 2 meter ut) ved å knytte en utgang direkte til 1-ledningsbussen 4.7K motstand.

  // En ledningsbuss sterk pullup: //// + ------------ + + 5v + ------ --- + + --------- + // | MCU | | | DS18b20 | | DS18b20 | // | | R_pu ​​= 4.7K | g d +5 | | g d +5 | // | Sterk- | | + -o - o - o- + + -o - o - o - + // | Pullup > o ------ o | | | | | | // | | | + - | - + + - | - + // | | | | | | | // | Data <> o ------ o --------------- | --o ------------ | --o ----- - - - - // | | | | // + ------------ + VV  

Initier den sterke pullup-porten ved å sette porten som en utgang og HIGH, deaktiver og aktiver den ved å endre portmodus, ikke utgangsverdien. (Hvis du setter portmodus for å legge inn, flyter den, i stedet for å jording den slik at den ville være lav. Denne teknikken ble foreslått av Dave Tweed i Electrical Engineering Stack Exchange.)



Denne spørsmålet ble automatisk oversatt fra engelsk.Det opprinnelige innholdet er tilgjengelig på stackexchange, som vi takker for cc by-sa 3.0-lisensen den distribueres under.
Loading...