минусовая температура и 18B20 помогите с переменной

Anton_Kos87
Offline
Зарегистрирован: 07.03.2014

Температура выводится на дисплей 128х64

#include "U8glib.h"
#include "my5x7rus.h"   //русский шрифт
#include <OneWire.h>
#define DS18S20_ID 0x10
#define DS18B20_ID 0x28
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius;
  byte  address_1[8] = {0x28, 0xFF, 0x00, 0x47, 0x64, 0x14, 0x01, 0x9C};
  byte  address_2[8] = {0x28, 0xFF, 0x34, 0x2A, 0x15, 0x15, 0x02, 0x68};
  byte  address_3[8] = {0x28, 0xFF, 0x96, 0x2B, 0x15, 0x15, 0x01, 0xB5};
  byte  address_4[8] = {0x28, 0xFF, 0x5F, 0x49, 0x69, 0x14, 0x04, 0x5C};
float T1;
float T2;
float T3;
float T4;
OneWire ds (10); // все OneWire устройства на pin 10

U8GLIB_ST7920_128X64_4X u8g(5, 9, 8); // SPI Com: SCK = en = 5, MOSI = rw = 9, CS = di = 8

 void draw_graphics(void) {
  reeds();
  u8g.setFont(my5x7rus);  // Выставляем шрифт
   
 if (!memcmp(address_1, addr, 8)) 
  { //(address == '28FF00476414019C')
    Serial.print  ("T1 = ");
    Serial.println  (celsius);
    T1=celsius;
  }

  if (!memcmp(address_2, addr, 8)) 
  { //(address == '28FF342A15150268')
    Serial.print  ("T2 = ");
    Serial.println  (celsius);
    T2=celsius;
  }
   
 if (!memcmp(address_3, addr, 8)) 
  { //(address == '28FF962B151501B5')
    Serial.print  ("T3 = ");
    Serial.println  (celsius);
    T3=celsius;
  }
    if (!memcmp(address_4, addr, 8)) 
  { //(address == '28FF5F496914045C')
    Serial.print  ("T4 = ");
    Serial.println  (celsius);
    Serial.println("------------");
    T4=celsius;
  }
  
       u8g.setPrintPos(0, 7); 
       u8g.print("Скважина:  ");
       u8g.print (T1);
       
       u8g.setPrintPos(0, 17); 
       u8g.print("Канализация:  ");
       u8g.print (T2);
       
       u8g.setPrintPos(0, 27); 
       u8g.print("Дома:  ");
       u8g.print (T3);

       u8g.setPrintPos(0, 37); 
       u8g.print("Улица:  ");
       u8g.print (T4);
  
 delay(10);
}

void setup() {
    Serial.begin  (9600);
  }
 
void loop(void) {
  // picture loop
  u8g.firstPage(); 
  do {
    draw_graphics();
    delay(100);  
  } while( u8g.nextPage() );
    delay(500);
}

void reeds()
{
  if(ds.search(addr) != 1) 
  {
    ds.reset_search();
    delay(150);
    for(byte i = 0; i < 10; i++) addr[i] = 0;
    return;
  }
   if (OneWire::crc8( addr, 7) != addr[7]) {
      Serial.print("CRC is not valid!\n");
      return;
  }
  
  if (addr[0] != DS18S20_ID && addr[0] != DS18B20_ID) {
      Serial.print("Device is not a DS18x20 family device.\n");
      return;
  }
  ds.reset();
  ds.select(addr);

  //Serial.println("----------");
  //Serial.print("Addr: ");
  //for(byte i = 0; i < 8; i++)
  //  {
  // Serial.print("0x");
  // if(addr[i] < 0x10) Serial.print("0");
  // Serial.print(addr[i], HEX);
  //if(i == 8) Serial.println();
  // else Serial.print(", ");
  //}

  ds.write(0x44, 1);  // запускаем конвертацию

  delay(750);   // ждем 750ms
       // we might do a ds.depower  () here, but the reset will take care of it.

  present = ds.reset  ();
  ds.select(addr);
  ds.write(0xBE);    // Считываем ОЗУ датчика

  for(i = 0; i < 9; i++) data[i] = ds.read ();

  // Высчитываем температуру :)
  int HighByte, LowByte, TReading, Tc_100, SignBit, Whole, Fract;
  LowByte = data[0];
  HighByte = data[1];

   TReading = (HighByte << 8) + LowByte;
   
   // Проверяем дубак там или нет
   SignBit = TReading & 0x8000; 
   
   // Если на улице дубак :)
   if (SignBit) { 
       TReading = (TReading ^ 0xffff) + 1; 
   }
   
   // Умножаем на (100 * 0.0625) или 6.25
   Tc_100 = (6 * TReading) + TReading / 4;

   // Отделяем целые от дробных чисел
   Whole = Tc_100 / 100;
   Fract = Tc_100 % 100;
if (SignBit) { 
     celsius = ("-") && (Whole) && (".") && (Fract);
    Serial.print("Temperature = -");
  Serial.print (Whole);
  Serial.print (".");
  Serial.println (Fract);
  Serial.println("***********");
   }
else {  
  celsius = (Whole) && (".") && (Fract);
  Serial.print("Temperature = ");
  Serial.print (Whole);
  Serial.print (".");
  Serial.println (Fract);
  Serial.println("***********");
}
 //Serial.flush(); //очищаем значения порта

}

В сериале получаем:

Temperature = 6.87
***********
T1 = 1.00
Temperature = 5.56
***********
T2 = 1.00
Temperature = 19.37
***********
T3 = 1.00
Temperature = -13.93
***********
T4 = 1.00
------------
 
не могу добится чтобы Т1 было то же число что Temperature =

догадываюсь что дело в переменной float

перепробывал разные варианты

но ничего не получается....

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Anton_Kos87,    celsius = ("-") && (Whole) && (".") && (Fract); что это за самодеятельность?

 

Anton_Kos87
Offline
Зарегистрирован: 07.03.2014

если температура с минусом то "-"Целое"."сотое

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

celsius = (float)Tc_100 / 100.0;
А то что в скетче это фантазии. Где Вы видели такое? Почему Вы не делаете тоже самое, когда присваиваете значение целым числам? Типа abc = "-" && "524"; Это в каком языке так можно делать?

Anton_Kos87
Offline
Зарегистрирован: 07.03.2014

celsius = (float)Tc_100 / 100.0; - отображает градусы но не показывает отрицательную температуру вся температура положительная

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

И в чем проблема?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

kisoft пишет:
Типа abc = "-" && "524"; Это в каком языке так можно делать?

Одиночный & - конкатенация строк в VB. А двойной ... видимо ТС увидел в каких-то кодах, что в С++ зачем-то двойной используют :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Anton_Kos87, 

Вы смешали всё в кучу. У Вас есть ошибки и в работе с далласовским датчиком, и в преобразовании числа в строку, и в выводе строки на экран.

Отделите мух от котлет - напишите отдельный маленький скетч для вывода числа (безо всякого датчика и прочей муры) и убедитесь, что число правильно выводится. Потом напишите отдельный маленький скетч для получения числа с датчика. Только не пример, который Вы сдули не глядя. а нормальный скетч, который и контрольные суммы проверяет и ошибки обрабатывает. Убедитесь, что значение температуры правильно получается. Потом. объедините и всё заработает.