久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2918|回復: 8
收起左側

DS18B20的分辨率怎么調整一下?

[復制鏈接]
ID:1010435 發表于 2023-3-7 22:21 | 顯示全部樓層 |閱讀模式
上面的18B20的溫度變化只有0.5,應該怎么修改以下,能讓溫度在0.01就變化

  1. #include <OneWire.h>



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

  3. void setup(void) {
  4.   Serial.begin(9600);
  5. }

  6. void loop(void) {
  7.   byte i;
  8.   byte present = 0;
  9.   byte type_s;
  10.   byte data[9];
  11.   byte addr[8];
  12.   float celsius, fahrenheit;
  13.   
  14.   if ( !ds.search(addr)) {
  15.     Serial.println("No more addresses.");
  16.     Serial.println();
  17.     ds.reset_search();
  18.     delay(250);
  19.     return;
  20.   }
  21.   
  22.   Serial.print("ROM =");
  23.   for( i = 0; i < 8; i++) {
  24.     Serial.write(' ');
  25.     Serial.print(addr[i], HEX);
  26.   }

  27.   if (OneWire::crc8(addr, 7) != addr[7]) {
  28.       Serial.println("CRC is not valid!");
  29.       return;
  30.   }
  31.   Serial.println();

  32.   // the first ROM byte indicates which chip
  33.   switch (addr[0]) {
  34.     case 0x10:
  35.       Serial.println("  Chip = DS18S20");  // or old DS1820
  36.       type_s = 1;
  37.       break;
  38.     case 0x28:
  39.       Serial.println("  Chip = DS18B20");
  40.       type_s = 0;
  41.       break;
  42.     case 0x22:
  43.       Serial.println("  Chip = DS1822");
  44.       type_s = 0;
  45.       break;
  46.     default:
  47.       Serial.println("Device is not a DS18x20 family device.");
  48.       return;
  49.   }

  50.   ds.reset();
  51.   ds.select(addr);
  52.   ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  53.   
  54.   delay(1000);     // maybe 750ms is enough, maybe not
  55.   // we might do a ds.depower() here, but the reset will take care of it.
  56.   
  57.   present = ds.reset();
  58.   ds.select(addr);   
  59.   ds.write(0xBE);         // Read Scratchpad

  60.   Serial.print("  Data = ");
  61.   Serial.print(present, HEX);
  62.   Serial.print(" ");
  63.   for ( i = 0; i < 9; i++) {           // we need 9 bytes
  64.     data[i] = ds.read();
  65.     Serial.print(data[i], HEX);
  66.     Serial.print(" ");
  67.   }
  68.   Serial.print(" CRC=");
  69.   Serial.print(OneWire::crc8(data, 8), HEX);
  70.   Serial.println();

  71.   // Convert the data to actual temperature
  72.   // because the result is a 16 bit signed integer, it should
  73.   // be stored to an "int16_t" type, which is always 16 bits
  74.   // even when compiled on a 32 bit processor.
  75.   int16_t raw = (data[1] << 8) | data[0];
  76.   if (type_s) {
  77.     raw = raw << 3; // 9 bit resolution default
  78.     if (data[7] == 0x10) {
  79.       // "count remain" gives full 12 bit resolution
  80.       raw = (raw & 0xFFF0) + 12 - data[6];
  81.     }
  82.   } else {
  83.     byte cfg = (data[4] & 0x60);
  84.     // at lower res, the low bits are undefined, so let's zero them
  85.     if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
  86.     else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
  87.     else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
  88.     //// default is 12 bit resolution, 750 ms conversion time
  89.   }
  90.   celsius = (float)raw / 16.0;
  91.   fahrenheit = celsius * 1.8 + 32.0;
  92.   Serial.print("  Temperature = ");
  93.   Serial.print(celsius);
  94.   Serial.print(" Celsius, ");
  95.   Serial.print(fahrenheit);
  96.   Serial.println(" Fahrenheit");
  97. }
復制代碼

回復

使用道具 舉報

ID:1010435 發表于 2023-3-7 22:23 | 顯示全部樓層
這段程序是從米思齊里找到的
回復

使用道具 舉報

ID:1065634 發表于 2023-3-7 23:16 | 顯示全部樓層
通過寄存器地址0x4e地址內容修改為1f,3f,5f,分別對應精度0.5,0.25,0.125℃精度
回復

使用道具 舉報

ID:1034262 發表于 2023-3-8 09:54 | 顯示全部樓層
18B20的最小分辨率為0.0625度,你怎么能得到0.01度?
回復

使用道具 舉報

ID:230500 發表于 2023-3-8 11:09 | 顯示全部樓層
實現不了; 沒有這個精度;

12位的分辨率,其精度是低4位決定的,因為低4位是代表的小數位,在低4位中,從高到底的每一位代表2^(-n)次方。

就是說第4位是2^-1=0.5,往下推2^-2=0.25,2^-3=0.125,2^-4=0.0625

18b20的測量精度是正負0.5攝氏度,最高分辨率是0.0625攝氏度(可設置采樣精度來改變分辨率)。可以將分辨率提高或減小,但是精度是改不了的,由芯片決定了,可查閱datasheet。
回復

使用道具 舉報

ID:1010435 發表于 2023-3-8 14:50 | 顯示全部樓層
coody_sz 發表于 2023-3-8 09:54
18B20的最小分辨率為0.0625度,你怎么能得到0.01度?

我說錯了 不好意思,是顯示到0.01位不是度
回復

使用道具 舉報

ID:1010435 發表于 2023-3-8 14:52 | 顯示全部樓層
a399288395 發表于 2023-3-8 11:09
實現不了; 沒有這個精度;

12位的分辨率,其精度是低4位決定的,因為低4位是代表的小數位,在低4位中, ...

受教了,我本想說是顯示到0.01位,現在米思齊只能0.5度的變化
回復

使用道具 舉報

ID:230500 發表于 2023-3-8 15:49 | 顯示全部樓層
mtt661 發表于 2023-3-8 14:52
受教了,我本想說是顯示到0.01位,現在米思齊只能0.5度的變化

如果只是要顯示到小數點后2位 是可以的; 哪怕顯示小數點后5位都是可以的;18B20  的精度是0.0625度;是可以顯示小數點后4位的;  常規的辦法就是把你得到和計算出的那個溫度數,乘以1000倍;
不同的程序可能會有不同的BUG會出現;那同時程序也要改;程序中也要發命令告訴18B20,轉換精度設置為12位; 那么延時時間也要改 12位分辨率轉換時間好像是750毫秒
回復

使用道具 舉報

ID:883242 發表于 2023-3-10 21:18 | 顯示全部樓層
過采樣oversampling可以實現顯示0.01度,比如采樣100次,把結果的和除100就能做到,但實際精度那就很不幸了。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文在线播放 | 亚洲日本乱码在线观看 | 成人免费在线视频 | 午夜激情在线视频 | 成人av在线网站 | 亚洲一区高清 | 久久99精品久久久久久噜噜 | 久久国产视频网站 | caoporn国产精品免费公开 | 一级片在线视频 | 91在线观| 亚洲精品乱码 | 黑色丝袜三级在线播放 | 亚洲欧美日韩精品久久亚洲区 | 中国黄色在线视频 | 欧美国产视频 | 亚洲视屏 | 男人av网 | 精品国产精品 | av在线二区 | 成人网在线观看 | 天天精品在线 | 亚洲综合在线视频 | 国产精品www | 日韩精品久久一区 | 成人日b视频 | 成人妇女免费播放久久久 | 久久99深爱久久99精品 | 国产成人一区二区三区 | 欧洲尺码日本国产精品 | 欧美国产中文字幕 | 日本不卡一区二区三区在线观看 | 日韩在线免费视频 | 一区二区三区国产 | 亚洲欧美一区二区三区国产精品 | 欧美精品在欧美一区二区 | 人人澡人人射 | 成人三级视频 | 亚州一区二区三区 | 成人自拍视频 | 国产成人精品一区二区在线 |