डीएस 18 बी 20 तापमान संवेदक फ्लोट फ़ंक्शन के रूप में वापसी का समय 50% कम करता है

मुझे बस एक DS18B20 तापमान सेंसर मिला है और इसके बजाय फ़ंक्शन का उपयोग करने के लिए उदाहरण कोड को संशोधित करने का प्रयास कर रहा हूं। नीचे मेरा getTemp फ़ंक्शन है। यह काम कर रहा है लेकिन उदाहरण के लिए समय के 0 मूल्य भाग के साथ परिणाम लौटा रहा है:

<�पी> तापमान = 72.3 9
  तापमान = 0.00

यदि मैं Serial.print (फ़ारेनहाइट) जोड़ता हूं; फ़ंक्शन के भीतर मुझे हमेशा सही तापमान प्रदान किया जाता है। हालांकि मुझे देरी की आवश्यकता के साथ ऐसा करना पड़ सकता है लेकिन देरी (5000) जोड़ना; मेरे लूप में मदद नहीं की।

मुझे लगता है कि यह कुछ आसान है, मैं समझ नहीं पा रहा हूं कि floats वापसी कैसे करें।

#include 

// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library

OneWire  ds(2); //on pin 10 (a 4.7K resistor is necessary)

void setup(void) {
  Serial.begin(9600);
}

float getTemp(char tScale) {
  byte i;
  byte present = 0;
  byte type_s = 0;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;

  if ( !ds.search(addr)) {
    ds.reset_search();
    delay(250);
    return false;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);       //start conversion, with parasite power on at the end

  delay(1000);    //maybe 750ms is enough, maybe not
 //we might do a ds.depower() here, but the reset will take care of it.

  present = ds.reset();
  ds.select(addr);
  ds.write(0xBE);        //Read Scratchpad

  for ( i = 0; i < 9; i++) {          //we need 9 bytes
    data[i] = ds.read();

  }

 //Convert the data to actual temperature
 //because the result is a 16 bit signed integer, it should
 //be stored to an "int16_t" type, which is always 16 bits
 //even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3;//9 bit resolution default
    if (data[7] == 0x10) {
     //"count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
   //at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7; //9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3;//10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1;//11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw/16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  if (tScale == 'C') {
    return celsius;
  }
  else if (tScale == 'F') {
    return fahrenheit;
  }

}
void loop(void) {
    Serial.print("Temperature = ");
    Serial.println( getTemp( 'F' ) );


}

संपादित करें: काफी दिलचस्प है, हालांकि लूप को if कथन जोड़ना यह ठीक करता है। मैं अभी भी समझना चाहता हूं कि क्या हो रहा है:

void loop(void) {
  if ( getTemp( 'F' ) == 0 ){
    Serial.print( "Temperature = " );
    Serial.println( getTemp( 'F' ) );
  }
}
0
स्पष्ट रूप से बाजार पर बहुत सारे कथित "DS18B20" डिवाइस हैं जो प्रकाशित spec के समय को पूरा नहीं करते हैं। उनका उपयोग करने की कोशिश करने के लिए आपको चीजों को धीमा करने की आवश्यकता होगी। आप कम बिट्स मोड में चलकर ऐसा करने की समय लागत को कुछ हद तक ऑफ़सेट कर सकते हैं, लेकिन कुछ प्रकाशित उदाहरण कोड जो प्रकट होता है विभिन्न बिट चौड़ाई को संभालने के लिए वास्तव में गलत तरीके से गलत व्याख्या करता है, और उसके पास है तय होना है। नहीं, मेरे पास उद्धरण के लिए हाथ में एक मरम्मत की प्रति नहीं है।
जोड़ा लेखक rossp, स्रोत
मुझे लगता है कि मेरा मतलब यह है कि यदि getTemp 0 पर सेट किया गया है तो सही तापमान धारावाहिक में प्रदर्शित किया जा रहा है (कभी भी तापमान = 0.00 दिखा रहा है> यह केवल वास्तविक तापमान देता है।
जोड़ा लेखक Towell, स्रोत
क्या आप कृपया अपने संपादन में 'फिक्स इट' द्वारा इसका अर्थ स्पष्ट कर सकते हैं? चूंकि आपका getTemp() कभी-कभी 0 देता है, यह स्पष्ट है कि आप getTemp ('F') == 0 की जांच करके शून्य के लिए फ़िल्टर करते हैं।
जोड़ा लेखक passing through, स्रोत
तो आप अंतर्निहित समस्या को अनदेखा करते हुए, ! Ds.search (addr) के समस्याग्रस्त उदाहरणों को छोड़ दें (केवल निकट उत्तराधिकार में सेंसर को दो बार मतदान करके)। :)
जोड़ा लेखक passing through, स्रोत
@ क्रिस स्ट्रैटन: मुझे लगता है कि DS18B20 संचार विफल होने के वास्तविक मुद्दे को देखना एक अच्छा विचार है। BandonRandon: आप DallasTemperature पुस्तकालय क्यों नहीं कोशिश करते? यह एक परीक्षक स्केच और अन्य उपयोगी सामान के साथ आता है।
जोड़ा लेखक passing through, स्रोत

1 उत्तर

आपके पास संचार की समस्याएं हैं।

आपकी पता खोज कभी-कभी विफल हो जाती है और getTemp() झूठी रिटर्न देता है। सी ++ (और कई अन्य भाषाओं) में झूठी को स्पष्ट रूप से (int) 0 , (float) 0.0f पर डाला जाएगा, और इसी तरह।

आपका getTemp() फ़ंक्शन भी डीबग करना मुश्किल है क्योंकि एकाधिक रिटर्न स्टेटमेंट का अलग अर्थ होता है।

देरी (250) के बाद; बाकी को छोड़ने के लिए आप झूठी वापसी; करते हैं।

उदाहरण में https://www.pjrc.com/teensy/td_libs_OneWire.html वापसी कथन का अर्थ अलग है। वहां वापसी शून्य लूप() फ़ंक्शन के भीतर होती है, जहां इसका मतलब केवल वर्तमान निष्पादन को बाधित करना है (मूल्य लौटाए बिना) और अगले लूप के साथ जारी रखें।

हालांकि आमतौर पर कई वापसी होने के लिए ठीक है, यह कभी-कभी समस्याग्रस्त हो सकता है और मैं इसे टालने की सलाह देता हूं।

यदि आप अभी भी गलती का पता लगाने की क्षमता को संरक्षित करते हुए इसे साफ़ करना चाहते हैं, तो आपके पास कुछ विकल्प हैं (सबसे कम से कम अनुशंसित आदेश):

  • do the setup/checking in a different function (and only call the second one if the first one succeeded), i.e. if (isReady()) { Serial.println(getTemp()); }
  • set a separate error variable, i.e. error = true; return 0; (and then check error later)
  • define a 'default' value that you interpret as an error (and never expect to be a temperature), i.e. return NAN;//not a number
1
जोड़ा
-460.0f की बजाय, जो एक मूर्ख मूल्य की तरह दिखता है, मैं NAN (यानी कोई संख्या नहीं )। यह स्पष्ट रूप से "वैध मान नहीं" के अर्थ को स्पष्ट रूप से व्यक्त करता है। Serial.print() इसे "नैन" के रूप में प्रदर्शित करता है।
जोड़ा लेखक Sprogz, स्रोत
धन्यवाद माइल्स बर्टन लाइब्रेरी में स्विच किया गया है और सबकुछ अपेक्षित काम कर रहा है और मेरा कोड बहुत साफ दिखता है।
जोड़ा लेखक Towell, स्रोत
क्या वास्तव में एक कारण है कि आप सेंसर को कड़ी मेहनत का उपयोग करते हैं और इसके लिए लाइब्रेरी नहीं लगाते हैं (जैसे आप वनवायर के साथ करते हैं)? डलास तापमान पुस्तकालय हैं जो वनवायर को रोजगार देते हैं, उदा। github.com/milesburton/Arduino- तापमान- नियंत्रण- पुस्तकालय
जोड़ा लेखक passing through, स्रोत
हाँ, बाहर की रेंज सिर्फ पहली चीज थी जिसके साथ मैं आया था। और चूंकि यह मेरा सबसे कम अनुशंसित समाधान है, इसलिए मैं इसे एनएएन का उपयोग करते समय भी कम से कम मानता हूं। मैं तदनुसार अपना जवाब संपादित करता हूं।
जोड़ा लेखक passing through, स्रोत