минусовая температура и 18B20 помогите с переменной
- Войдите на сайт для отправки комментариев
Пнд, 04/01/2016 - 09:22
Температура выводится на дисплей 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
перепробывал разные варианты
но ничего не получается....
Anton_Kos87,
celsius = ("-") && (Whole) && (".") && (Fract);что это за самодеятельность?если температура с минусом то "-"Целое"."сотое
celsius = (float)Tc_100 / 100.0;
А то что в скетче это фантазии. Где Вы видели такое? Почему Вы не делаете тоже самое, когда присваиваете значение целым числам? Типа abc = "-" && "524"; Это в каком языке так можно делать?
celsius = (float)Tc_100 / 100.0; - отображает градусы но не показывает отрицательную температуру вся температура положительная
И в чем проблема?
Одиночный & - конкатенация строк в VB. А двойной ... видимо ТС увидел в каких-то кодах, что в С++ зачем-то двойной используют :)
Anton_Kos87,
Вы смешали всё в кучу. У Вас есть ошибки и в работе с далласовским датчиком, и в преобразовании числа в строку, и в выводе строки на экран.
Отделите мух от котлет - напишите отдельный маленький скетч для вывода числа (безо всякого датчика и прочей муры) и убедитесь, что число правильно выводится. Потом напишите отдельный маленький скетч для получения числа с датчика. Только не пример, который Вы сдули не глядя. а нормальный скетч, который и контрольные суммы проверяет и ошибки обрабатывает. Убедитесь, что значение температуры правильно получается. Потом. объедините и всё заработает.