Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 10307|回復: 8
打印 上一主題 下一主題

兩個溫度感測器同時感測兩處溫度

[複製鏈接]
1#
發表於 2015-12-15 19:18:46 | 顯示全部樓層
val 回傳在3個地方
count_per_c = readBytes(2);
temp_read = readBytes(1);
count_remain = readBytes(2);
如果你要用兩個溫度計
可在程式上再宣告
OneWire  ds1(8);
其中的名稱或接腳請自行修改
然後再複製一份 ds 變成 ds1 即可
2#
發表於 2015-12-16 19:38:02 | 顯示全部樓層
本帖最後由 超新手 於 2015-12-16 19:55 編輯

你重覆宣告了相同的變數兩次
下面的那組程式(DS1), 拿掉宣告即可(byte,unsigned int, float)
void loop(void) {

  byte temp_read = 0;
  unsigned int count_remain = 0;
  unsigned int count_per_c = 0;
  byte configuration_register = 0;
.......
      float highResTemp = (float)temp_read - .5 + (((float)count_per_c - (float)count_remain) / (float)count_per_c);
      highResTemp = ( highResTemp);// 這行其實不需要
.........
   delay(1000);// 這行其實不需要
temp_read = 0;[size=13.3333px]//拿掉 byte
count_remain = 0;[size=13.3333px]//拿掉 unsigned int
count_per_c = 0;[size=13.3333px]//拿掉 unsigned int
configuration_register = 0;[size=13.3333px]//拿掉 byte
...........
highResTemp = (float)temp_read - .5 + (((float)count_per_c - (float)count_remain) / (float)count_per_c);[size=13.3333px]//拿掉 float
highResTemp = ( highResTemp);// 這行其實不需要
    Serial.print(highResTemp);
    Serial.println(" degree ");

   delay(1000);

}
另外還有 readBytes
也要複製一份給 DS1

在 DS1 那邊的程式, 要使用 DS1 的 readBytes
不可以用 DS 的 readBytes
3#
發表於 2015-12-21 15:40:57 | 顯示全部樓層
本帖最後由 超新手 於 2015-12-21 15:42 編輯

你把兩組宣告(DS 和 DS1)都拿掉了, 所以有問題
我只說, 拿掉下面那一組(DS1)宣告
你好像又改一些東西, 沒很仔細看
原來的程式沒太大問題.
如果以下程式有問題, 請參照你自己最初的程式修改回去即可
#include <OneWire.h>
#include <Wire.h>

OneWire  ds(7);  // on pin 7
OneWire  ds1(10);  // on pin 10
unsigned int readBytes(int count)
{
    unsigned int val = 0;
    for (int i = 0; i < count; i++)
    {
        val |= (unsigned int)(ds.read() << i * 8);
    }
    return val;
}
unsigned int readBytes1(int count)
{
    unsigned int val = 0;
    for (int i = 0; i < count; i++)
    {
        val |= (unsigned int)(ds1.read() << i * 8);
    }
    return val;
}




void setup(void) {
  Serial.begin(9600);
  ds.reset();
  ds1.reset();

}



void loop(void) {

  byte temp_read = 0;
  unsigned int count_remain = 0;
  unsigned int count_per_c = 0;
  byte configuration_register = 0;

  ds.reset();
  ds.write(0xEE); //Start Converting the temperatures  

   do {
        delay(1);
        configuration_register = 0;
        ds.reset();
        ds.write(0xAC);

        // Read the configuration Register from the DS1821
        configuration_register = readBytes(1);
    } while ((configuration_register & (1 << 7)) == 0); // If Bit #8 is 1 then we are finished converting the temp


    // Get Temp
    ds.reset();
    ds.write(0xAA);
    temp_read = readBytes(1); ;

    // Get Count Remaining
    ds.reset();
    ds.write(0xA0);
    count_remain = readBytes(2);

    // Load The Counter to populate the slope accumulator
    ds.reset();
    ds.write(0x41);

    // Read Count Per Deg
    ds.reset();
    ds.write(0xA0);
    count_per_c = readBytes(2);

    // If we are reading above the 200 mark then we are below 0 and need to compensate the calculation
    if (temp_read >= 200) temp_read -= 256;

    float highResTemp = temp_read - .5 + ((count_per_c - count_remain) / count_per_c);

    highResTemp = ( highResTemp);
    Serial.print(highResTemp);
    Serial.println(" degreesss ");


  temp_read = 0;
  count_remain = 0;
  count_per_c = 0;
  configuration_register = 0;

  ds1.reset();
  ds1.write(0xEE); //Start Converting the temperatures  

   do {
        delay(1);
        configuration_register = 0;
        ds1.reset();
        ds1.write(0xAC);

        // Read the configuration Register from the DS1821
        configuration_register = readBytes1(1);
    } while ((configuration_register & (1 << 7)) == 0); // If Bit #8 is 1 then we are finished converting the temp


    // Get Temp
    ds1.reset();
    ds1.write(0xAA);
    temp_read = readBytes1(1); ;

    // Get Count Remaining
    ds1.reset();
    ds1.write(0xA0);
    count_remain = readBytes1(2);

    // Load The Counter to populate the slope accumulator
    ds1.reset();
    ds1.write(0x41);

    // Read Count Per Deg
    ds1.reset();
    ds1.write(0xA0);
    count_per_c = readBytes1(2);

    // If we are reading above the 200 mark then we are below 0 and need to compensate the calculation
    if (temp_read >= 200) temp_read -= 256;

    highResTemp = temp_read - .5 + ((count_per_c - count_remain) / count_per_c);


    Serial.print(highResTemp);
    Serial.println(" degree ");

   delay(1000);

}
4#
發表於 2015-12-22 15:25:58 | 顯示全部樓層
DS1821 的解析度本來就只有 1 度C
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-5-20 01:17 , Processed in 0.203871 second(s), 8 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表