Freeduino 2009 с Atmega328+Ethernet Shield v2+DS18B20(датчики) 2 шт паралельно на одном пине

Dsr
Offline
Зарегистрирован: 11.06.2013

Всем привет!
Решил сделать своими руками ip-термометр.
Погуглил немного и прикупил микромодуль+Ethernet модуль и соответсвенно сами термодатчики.
Проключил 1 датчик на 7 пин микромодуля сверху через Ethernet модуль, + соответсвенно подключил на 5В, - на выходе "Gnd"...
Физика проключена.
установил драйвер, подключил через квадпатный кабель Usb к компу и патч-корд в сетку к Ethernet-модулю.
в сете развёрнут web-сервер Apach на компе с адресом 192.168.0.1 255.255.255.0, ну на этом же компе и DHCP развёрнут тоже.
вообщем цель такова-получить на 192.168.0.1 данные от датчика и соответсвенно потом уже на серваке с этими данными работать)
собсвенно вроде бы как не очень сложная задача с одной стороноы и я написал одну программу, но для одного датчика..программу в студию?
-----------------------------------------------------------------------------

#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>

byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xE0 };
IPAddress server(192,168,0,1); // ip web_server


EthernetClient client;
OneWire ds(7);


void setup() {
  // start the serial library:
  Serial.begin(9600);
  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    for(;;)
      ;
  }
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println("connecting...");

}


void loop()
{
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  if (!ds.search(addr)){
    ds.reset_search();
    return;
    }
  
  for (i = 0;i<8;i++){
  Serial.print(" ");
  }
  if (OneWire::crc8( addr, 7) != addr[7]){
    Serial.print("CRC is not valid! \n");
    return;
    }
  if (addr[0] == 0x28) {
  }
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);
  present = ds.reset();
  ds.select(addr);
  ds.write(0xBE);
  for (i = 0;i<9;i++){
  data[i] = ds.read();
  }
  int HighB,LowB,TRead, Tc_100, Holod; 
  int Celch, Drobch;
  LowB = data[0];
  HighB = data[1];
  TRead = (HighB << 8) + LowB;
  Holod = TRead & 0x8000;
  if (Holod){
   TRead =(TRead ^ 0xffff)*1;
  }
  Tc_100 = (6*TRead)+TRead/4;
  Celch = Tc_100/100;
  Drobch = Tc_100 % 100;
  delay(1000);
  Serial.print("TEMPERATURA = ");
  if (Holod){
  Serial.print("-");
  }
  client.connect(server, 8888);
  char bufer[32];
  memset(bufer,0,32);
  sprintf(bufer,"%i",Tc_100);
  client.println(bufer);
  client.println();
  client.stop();
  Serial.print(Celch);
  Serial.print(".");
  if (Drobch < 10){
   Serial.print("0");
  }
  Serial.print(Drobch);
  Serial.println();
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
    
  }

}

--------------------------------------------------------------------

Программа работает на ура)это уже меня порадовало)
но на сервак я отправляю просто всем числом-без выделения целой и дробной части(это уже так-для интереса сделал на устройстве:-) )

но сами понимаете одинм датчиком не ограничешься...

слооответсвенно хотелось бы работать с несколькими датчиками..причём допустим на 7 пине шины повесить паралельно 2 датчика и на 6 пине также повесить паралельно подключаемые датчики..
Да ещё один нюанс забыл написать между 2 и "+" ножек датчиков нужно сопротивление 4.7 кОм резистор-без него ничего не будет работать...

вообщм подключил я дополнительно к вышеуказанной схеме датчик с резистором паралельно к существуещиму-т.е. у меня на 7 пине навешены 2 датчика DS18B20.
Да и датчики использую только DS18B20-по причине, что других у меня просто нет)

собственно и вопрос-не могу подправить прогу вышеуказанную,чтобы зарабатала схема вышеизоженная с 2-мя датчиками((
кто знает-может подправите?я уже несколько вараинтов пробовал, что-то не получается((датчики показывают, что 0 градусов, а реальео градусов 24-25 по цельсию...но я думаю это не неправильное вычисление температуры или неисправность датчиков(они новые), а просто видимо программу на 2 датчика я подпривил не правильно и соответсвенно неправильно обращаюсь к датчикам, чтобы получить от них данные.
Заранее благодарю за практическую помощь!

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

ну для начала я бы посоветовал вам использовать родную библиотеку этих датчиков

http://milesburton.com/Main_Page?title=Dallas_Temperature_Control_Library

станет чуть чуть удобней...

а дальше начинается веселуха, в плане что я изначально думал что такие да 1wire же, давай буду вешать датчики горстями... но как оказалось выяснить какой где датчик возможно, но только в плане если это вообще разные датчики, но когда датчики одинаковые, и их несколько, то идентифицировать их в сети, какой где представляется не простой задачей...  подключая по одному и сохраняя их адреса. Там в родной библиотеки есть образец кода для нескольких датчиков на одной линии... но опять же в коментах сноска о том что адреса нужно выяснять в ручную :)

да и в принципе не думаю что у вас датчиков больше чем свободных пинов.. вешайте на каждый по одному и будете точно знать где какой. :)

сопротивление можно запаять так как у меня на фото.. на каждый датчик персонально. Либо можно на выходе с дуинки запаять одно на всех...

Dsr
Offline
Зарегистрирован: 11.06.2013

Спасибо за совет!

Но дело в том, что у меня проблема в написании этой вот программы ....

как будет выглядеть (на основе вышеизложенной программы,кот я написал))программа в случае, если к примеру на 7 пине будет 1 датчик DS18B20, на 6 пине-1 датчик DS18B20, и на 5 пине-1 датчик DS18B20 и допустим в паралель как вы говорите нужен другой датчик-допустим возьмём датчик DS18S20.

Я впервые это устройство взял-поэтому только разбираюсь, но на примерах просто намного бытсрее понимаю и синтаксис и вообще алгоритм работы.

Заранее благодарю!

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

выглядеть будет примерно так, все так сказать просто

OneWire ds(7);

OneWire ds1(5);

OneWire ds2(6);

ну и так далее

Dsr
Offline
Зарегистрирован: 11.06.2013





#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>

byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xE0 };
IPAddress server(192,168,0,1); // ip web_server


EthernetClient client;
OneWire ds(7);
OneWire ds1(6);
OneWire ds2(5);



void setup() {
  // start the serial library:
  Serial.begin(9600);
  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    for(;;)
      ;
  }
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println("connecting...");

}


void loop()
{
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  if (!ds.search(addr)){
    ds.reset_search();
    return;
    }
  
  for (i = 0;i<8;i++){
  Serial.print(" ");
  }
  if (OneWire::crc8( addr, 7) != addr[7]){
    Serial.print("CRC is not valid! \n");
    return;
    }
  if (addr[0] == 0x28) {
  }
//ds7
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);
  present = ds.reset();
  ds.select(addr);
  ds.write(0xBE);
  for (i = 0;i<9;i++){
  data[i] = ds.read();
  }
  int HighB,LowB,TRead, Tc_100, Holod; 
  int Celch, Drobch;
  LowB = data[0];
  HighB = data[1];
  TRead = (HighB << 8) + LowB;
  Holod = TRead & 0x8000;
  if (Holod){
   TRead =(TRead ^ 0xffff)*1;
  }
  Tc_100 = (6*TRead)+TRead/4;
  Celch = Tc_100/100;
  Drobch = Tc_100 % 100;
  delay(1000);
  Serial.print("TEMPERATURA = ");
  if (Holod){
  Serial.print("-");
  }
  client.connect(server, 8888);
  char bufer[32];
  memset(bufer,0,32);
  sprintf(bufer,"%i",Tc_100);
  client.println(bufer);
  client.println();
  client.stop();
  Serial.print(Celch);
  Serial.print(".");
  if (Drobch < 10){
   Serial.print("0");
  }
  Serial.print(Drobch);
  Serial.println();
//ds6
ds1.reset();
  ds1.select(addr);
  ds1.write(0x44,1);
  present = ds1.reset();
  ds1.select(addr);
  ds1.write(0xBE);
  for (i = 0;i<9;i++){
  data[i] = ds1.read();
  }
  LowB = data[0];
  HighB = data[1];
  TRead = (HighB << 8) + LowB;
  Holod = TRead & 0x8000;
  if (Holod){
   TRead =(TRead ^ 0xffff)*1;
  }
  Tc_100 = (6*TRead)+TRead/4;
  Celch = Tc_100/100;
  Drobch = Tc_100 % 100;
  delay(1000);
  Serial.print("TEMPERATURA = ");
  if (Holod){
  Serial.print("-");
  }
  client.connect(server, 8888);
  char bufer[32];
  memset(bufer,0,32);
  sprintf(bufer,"%i",Tc_100);
  client.println(bufer);
  client.println();
  client.stop();
  Serial.print(Celch);
  Serial.print(".");
  if (Drobch < 10){
   Serial.print("0");
  }
  Serial.print(Drobch);
  Serial.println();
//ds5
ds2.reset();
  ds2.select(addr);
  ds2.write(0x44,1);
  present = ds2.reset();
  ds2.select(addr);
  ds2.write(0xBE);
  for (i = 0;i<9;i++){
  data[i] = ds2.read();
  }
  LowB = data[0];
  HighB = data[1];
  TRead = (HighB << 8) + LowB;
  Holod = TRead & 0x8000;
  if (Holod){
   TRead =(TRead ^ 0xffff)*1;
  }
  Tc_100 = (6*TRead)+TRead/4;
  Celch = Tc_100/100;
  Drobch = Tc_100 % 100;
  delay(1000);
  Serial.print("TEMPERATURA = ");
  if (Holod){
  Serial.print("-");
  }
  client.connect(server, 8888);
  char bufer[32];
  memset(bufer,0,32);
  sprintf(bufer,"%i",Tc_100);
  client.println(bufer);
  client.println();
  client.stop();
  Serial.print(Celch);
  Serial.print(".");
  if (Drobch < 10){
   Serial.print("0");
  }
  Serial.print(Drobch);
  Serial.println();
//-------------------------------
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
    
  }

}

вот так будет выглядить программа, если посадить на 7,6, и 5 пины датчики по одному?если да, то для 5-го же пина-там посадить нужно 2 разных датчика-для 5-го в данном случае тогда как нужно обращаться к датчикам,если они на одном пине, но разные по модели?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

у вас что ограниченое количество пинов? обращатся все так же идентифицируйте их по модели датчика.. они отзываются вот и различайте их... читайте спецификацию датчиков. там все раписано по пакету который они присылают.

Dsr
Offline
Зарегистрирован: 11.06.2013

я попробовал просто посадить 2 датчкиа на 7 и 5 пин, вот такая программа:







#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>

byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEA };
IPAddress server(192,168,0,1); // ip web_server


EthernetClient client;
OneWire ds1(7);
OneWire ds2(5);



void setup() {
  // start the serial library:
  Serial.begin(9600);
  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    for(;;)
      ;
  }
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println("connecting...");

}


void loop()
{
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  byte addr2[8];
  int HighB,LowB,TRead, Tc_1, Tc_2, Holod; 
  int Celch1, Drobch1, Celch2, Drobch2;
  //ds7
  if (!ds1.search(addr)){
    ds1.reset_search();
    return;
    }
    for (i = 0;i<8;i++){
  Serial.print(" ");
  }
  if (OneWire::crc8( addr, 7) != addr[7]){
    Serial.print("CRC is not valid! \n");
    return;
    }
  if (addr[0] == 0x28) {
  }
  ds1.reset();
  ds1.select(addr);
  ds1.write(0x44,1);
  present = ds1.reset();
  ds1.select(addr);
  ds1.write(0xBE);
  for (i = 0;i<9;i++){
  data[i] = ds1.read();
  }

  LowB = data[0];
  HighB = data[1];
  TRead = (HighB << 8) + LowB;
  Holod = TRead & 0x8000;
  if (Holod){
   TRead =(TRead ^ 0xffff)*1;
  }
  Tc_1 = (6*TRead)+TRead/4;
  Celch1 = Tc_1/100;
  Drobch1 = Tc_1 % 100;
  delay(1000);
  Serial.print("TEMPERATURA1 = "+Tc_1);
  if (Holod){
  Serial.print("-");
  }
 //------------------ds5
 if (!ds2.search(addr){
    ds2.reset_search();
    return;
    }
    for (i = 0;i<8;i++){
  Serial.print(" ");
  }
  if (OneWire::crc8( addr, 5) != addr[5]){
    Serial.print("CRC2 is not valid! \n");
    return;
    }
  if (addr[0] == 0x28) {
  }
  ds2.reset();
  ds2.select(addr);
  ds2.write(0x44,1);
  present = ds1.reset();
  ds2.select(addr);
  ds2.write(0xBE);
  for (i = 0;i<9;i++){
  data[i] = ds2.read();
  }

  LowB = data[0];
  HighB = data[1];
  TRead = (HighB << 8) + LowB;
  Holod = TRead & 0x8000;
  if (Holod){
   TRead =(TRead ^ 0xffff)*1;
  }
  Tc_2 = (6*TRead)+TRead/4;
  Celch2 = Tc_2/100;
  Drobch2 = Tc_2 % 100;
  delay(1000);
  Serial.print("TEMPERATURA2 = "+Tc_2);
  if (Holod){
  Serial.print("-");
  }
  //----------------------------
 client.connect(server, 8888);
  char bufer[32];
  memset(bufer,0,32);
  sprintf(bufer,"1 datchik %i 2 datchik %i",Tc_1, Tc_2);
  client.println(bufer);
  client.println();
  client.stop();
  Serial.println();
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
    
  }

}

зависает вот здесь всё:







 if (OneWire::crc8( addr, 5) != addr[5]){
    Serial.print("CRC2 is not valid! \n");
    return;
    }

и соответсвенно на серваке я вообще ничего не получаю...(((

попробовал по аналогии для 5 пина так же как для 7-го использовать сл строки:







 if (OneWire::crc8( addr, 7) != addr[7]){
    Serial.print("CRC2 is not valid! \n");
    return;
    }

Но на серваке получаю вот такие строки:







1 datchik 2454 2 datchik 0
1 datchik 2453 2 datchik 0
1 datchik 2456 2 datchik 0
1 datchik 2454 2 datchik 0
.....

т.е. первый датчик работает, а второй не измеряет(((что не так в коде?всё же по аналогии...не могу разобраться(

 

попробоваал и так тоже(((результат тот же((

#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>

byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEA };
IPAddress server(192,168,0,1); // ip web_server


EthernetClient client;
OneWire ds1(7);
OneWire ds2(5);



void setup() {
  // start the serial library:
  Serial.begin(9600);
  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    for(;;)
      ;
  }
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println("connecting...");

}


void loop()
{
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];
  byte addr2[8];
  int HighB,LowB,TRead, Tc_1, Tc_2, Holod; 
  int Celch1, Drobch1, Celch2, Drobch2;
  //ds7
  if (!ds1.search(addr)){
    ds1.reset_search();
    return;
    }
    for (i = 0;i<8;i++){
  Serial.print(" ");
  }
  if (OneWire::crc8( addr, 7) != addr[7]){
    Serial.print("CRC is not valid! \n");
    return;
    }
  if (addr[0] == 0x28) {
  }
  ds1.reset();
  ds1.select(addr);
  ds1.write(0x44,1);
  present = ds1.reset();
  ds1.select(addr);
  ds1.write(0xBE);
  for (i = 0;i<9;i++){
  data[i] = ds1.read();
  }

  LowB = data[0];
  HighB = data[1];
  TRead = (HighB << 8) + LowB;
  Holod = TRead & 0x8000;
  if (Holod){
   TRead =(TRead ^ 0xffff)*1;
  }
  Tc_1 = (6*TRead)+TRead/4;
  Celch1 = Tc_1/100;
  Drobch1 = Tc_1 % 100;
  delay(1000);
  Serial.print("TEMPERATURA1 = "+Tc_1);
  if (Holod){
  Serial.print("-");
  }
 //------------------ds5
 memset(addr,0,8);
 if (!ds2.search(addr)){
    ds2.reset_search();
    return;
    }
    for (i = 0;i<8;i++){
  Serial.print(" ");
  }
  if (OneWire::crc8( addr, 7) != addr[7]){
    Serial.print("CRC2 is not valid! \n");
    return;
    }
  if (addr[0] == 0x28) {
  }
  ds2.reset();
  ds2.select(addr);
  ds2.write(0x44,1);
  present = ds1.reset();
  ds2.select(addr);
  ds2.write(0xBE);
  for (i = 0;i<9;i++){
  data[i] = ds2.read();
  }

  LowB = data[0];
  Serial.print(data[0]);
  Serial.println();
  HighB = data[1];
  Serial.print(data[1]);
  TRead = (HighB << 8) + LowB;
  Holod = TRead & 0x8000;
  if (Holod){
   TRead =(TRead ^ 0xffff)*1;
  }
  Tc_2 = (6*TRead)+TRead/4;
  Celch2 = Tc_2/100;
  Drobch2 = Tc_2 % 100;
  delay(1000);
  Serial.print("TEMPERATURA2 = "+Tc_2);
  if (Holod){
  Serial.print("-");
  }
  //----------------------------
 client.connect(server, 8888);
  char bufer[32];
  memset(bufer,0,32);
  sprintf(bufer,"1 datchik %i 2 datchik %i",Tc_1, Tc_2);
  client.println(bufer);
  client.println();
  client.stop();
  Serial.println();
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
    
  }

}

 

__Alexander
Offline
Зарегистрирован: 24.10.2012

дык. CRC вычисляется всегда одинаково. Зачем вы ищете ее в addr[5] когда она в addr[7] для всех датчиков.

Dsr
Offline
Зарегистрирован: 11.06.2013

я так пробовал-см выше 2-ой вариант проги...вс1 равно по 0 считает 2 датчик((почему?((пробовал менять местами датчики-по 7-ому пину идёт температура, а по 5-ому нет((0 показывает

__Alexander
Offline
Зарегистрирован: 24.10.2012

жестко насильно, как из под топора, без чтения типа создал переменных для обеих датчиков... работает. проверяйте свой код.

И вопрос к знатокам.

Есть код в лупе

  if ( !ds1.search(addr1)) {
    ds1.reset_search();
    delay(250);
    return;
  }

Куда ретурнится собака? На setup?

 

 

 

#include <OneWire.h>

// 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  ds1(7);  // on pin 10 (a 4.7K resistor is necessary)
OneWire  ds2(5);


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

void loop(void) {
  byte i;
  byte present1 = 0, present2 = 0;
  byte type_s;
  byte data1[12];
  byte addr1[8];
  byte data2[12];
  byte addr2[8];
  
  float celsius1, fahrenheit1;
  float celsius2, fahrenheit2;
    
    
  if ( !ds1.search(addr1)) {
    ds1.reset_search();
    delay(250);
    return;
  }
   if ( !ds2.search(addr2)) {
    ds2.reset_search();
    delay(250);
    return;
  }
  
  

  if (OneWire::crc8(addr1, 7) != addr1[7]) {
      Serial.println("CRC1 is not valid!");
      return;
  }
    if (OneWire::crc8(addr2, 7) != addr2[7]) {
      Serial.println("CRC2 is not valid!");
      return;
  }
  
  
  Serial.println();
 

  ds1.reset();
  ds1.select(addr1);
  ds1.write(0x44, 1);        // start conversion, with parasite power on at the end
  ds2.reset();
  ds2.select(addr2);
  ds2.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.
  
  present1 = ds1.reset();
  ds1.select(addr1);    
  ds1.write(0xBE);         // Read Scratchpad
  present2 = ds2.reset();
  ds2.select(addr2);    
  ds2.write(0xBE);         // Read Scratchpad

  Serial.print("  Data1 = ");
  Serial.print(present1, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data1[i] = ds1.read();
    Serial.print(data1[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data1, 8), HEX);
  Serial.println();
  Serial.print("  Data2 = ");
  Serial.print(present2, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data2[i] = ds2.read();
    Serial.print(data2[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data2, 8), HEX);
  Serial.println();
  // 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 = (data1[1] << 8) | data1[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data1[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data1[6];
    }
  } else {
    byte cfg = (data1[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
  }
   
  
  celsius1 = (float)raw / 16.0;
  fahrenheit1 = celsius1 * 1.8 + 32.0;
  Serial.print("  Temperature1 = ");
  Serial.print(celsius1);
  Serial.print(" Celsius1, ");
  Serial.print(fahrenheit1);
  Serial.println(" Fahrenheit1");
  
  
    int16_t raw2 = (data2[1] << 8) | data2[0];
  if (type_s) {
    raw2 = raw2 << 3; // 9 bit resolution default
    if (data2[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw2 = (raw2 & 0xFFF0) + 12 - data2[6];
    }
  } else {
    byte cfg = (data2[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw2 = raw2 & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw2 = raw2 & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw2 = raw2 & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
   
  
  celsius2 = (float)raw2 / 16.0;
  fahrenheit2 = celsius2 * 1.8 + 32.0;
  Serial.print("  Temperature2 = ");
  Serial.print(celsius2);
  Serial.print(" Celsius2, ");
  Serial.print(fahrenheit2);
  Serial.println(" Fahrenheit2");
  
  
}