Вывод графика с датчика DS18B20 на TFT экран
- Войдите на сайт для отправки комментариев
Ср, 13/01/2016 - 14:11
Здравствуйте! Есть Mega 2560 датчик DS18B20, часы пока едут.
DS18B20 подключил к 17 пину.
Хочу график показаний чтобы был на экране.
Вот скетч для вывода показаний.
#include <UTFT.h> #include <PrintGraph3.h> #include <UTFT_Window2.h> #include <Wire.h> #include <OneWire.h> #define ONE_WIRE_PIN 17 #define DS1307_I2C_ADDRESS 0x68 #define START_INDEX_PRINT 16 #define MAX_DEBUG_PER_LINE 6 byte TmpE1Add[]={0x28, 0xDB, 0x76, 0x35, 0x05, 0x00, 0x00, 0x2F}; OneWire ds(ONE_WIRE_PIN); UTFT myGLCD(ITDB32S,38,39,40,41); char temp_s[8]="-000.0\0"; UTFT_Window Top_Window(0,0,319,START_INDEX_PRINT-3 , 20, 20, 20 , 255, 255, 255 , 255, 0, 0 , &myGLCD); UTFT_Window Status_Window(0,START_INDEX_PRINT-1,MAX_DEBUG_PER_LINE*8+2,239 , 40, 40, 40 , 255, 255, 255 , 255, 0, 0 , &myGLCD); PrintGraph G_1(MAX_DEBUG_PER_LINE*8+3,START_INDEX_PRINT ,319,239-2 ,-2000,11000,false ,"Temp gr C",&myGLCD); void setup() { Wire.begin(); Serial.begin(9600); myGLCD.InitLCD(LANDSCAPE); myGLCD.clrScr(); myGLCD.setFont(SmallFont); Top_Window.drawWindow(); Status_Window.drawWindow();o G_1.SetColorF_B(100,250,100,50,50,50); G_1.Start(); } void loop() { Top_Window.println(getDateTimeDs1307(),CENTER); float temp=DS18x20_Read_Tmp(TmpE1Add); Status_Window.println(dtostrf(temp,4,2,temp_s),LEFT); G_1.PrintValue(temp*100); } float DS18x20_Read_Tmp(byte addr[8]){ byte present = 0; float celsius =0.00; byte data[12]; byte type_s; ds.reset(); ds.select(addr); ds.write(0x44, 1); // start conversion, with parasite power on at the end delay(1000); present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad for ( int i = 0; i < 9; i++) // we need 9 bytes data[i] = ds.read(); switch (addr[0]) { case 0x10: type_s = 1; break; case 0x28: type_s = 0; break; case 0x22: type_s = 0; break; default: Serial.println("Device is not a DS18x20 family device."); return 0; } int16_t raw = (data[1] << 8) | data[0]; if (type_s) { raw = raw << 3; // 9 bit resolution default if (data[7] == 0x10) { // "count remain" gives full 12 bit resolution raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[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 } celsius = (float)raw / 16.0; return celsius; } char *getDateTimeDs1307() { byte second, minute, hour=0; char *buffer="00;00:00 00/00/0000"; Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0x00); Wire.endTransmission(); Wire.requestFrom(DS1307_I2C_ADDRESS, 7); second = bcd_int_conv(Wire.read() & 0x7f); minute = bcd_int_conv(Wire.read()); hour = bcd_int_conv(Wire.read() & 0x3f); bcd_int_conv(Wire.read()); sprintf(buffer,"%02d:%02d:%02d %02d/%02d/%04d",hour,minute,second,bcd_int_conv(Wire.read()),bcd_int_conv(Wire.read()),bcd_int_conv(Wire.read())+2000); return buffer; } int bcd_int_conv(byte data) { int temp = 0 ; temp = data >> 4 ; return temp*10+(data & B00001111); }
Проблема не пойму в чем. Температуру показывает -0,06 Даже если греть датчик, то температура не меняется.
Тестирую через COM порт с компа скетчем:
#include <OneWire.h>// Инициализация библиотеки шины OneWire. #include <DallasTemperature.h>// Инициализация библиотеки термодатчиков. #define ONE_WIRE_BUS 17// Подключение цифрового вывода датчика к 10-му пину Ардуино. OneWire oneWire(ONE_WIRE_BUS);// Запуск интерфейса OneWire для подключения OneWire устройств. DallasTemperature sensors(&oneWire);// Указание, что устройством oneWire является термодатчик от Dallas Temperature. void setup(void){ Serial.begin(9600);// Запуск СОМ порта. Serial.println("Start temperature measurement"); sensors.begin();} // Запуск сенсора. void loop(void){ Serial.print("Please wait..."); sensors.requestTemperatures(); // Команда опроса температуры. Serial.print("T="); Serial.println(sensors.getTempCByIndex(0));} // Печать в порт температуры, "0" в данном случае указывает на первое устройство в шине.
Все правильно показывает, температура меняется. Хелп!!!
Адрес у датчика правильный в коде забит?
Вот сайт проекта, но на итальянском. ((( http://yan1978.blogspot.ru/search?updated-min=2013-01-01T00:00:00%2B02:00&updated-max=2014-01-01T00:00:00%2B02:00&max-results=7
Да хоть на китайском. У тебя в первом скетче жестко забит адрес датчика. Если вписывал его сам, то должно работать, если вписал от балды, то по этому адресу на шине никто не отзовется.
Все правильно подключено к 17 ноге на ардуине. Сопротивление стоит. но показывает не правилно... -0,06 без попротивления 0,00. ((( Грешу на отсутсвие часов.
в первом и во втором случае схему подключения меняете?
и часы и датчик у вас на одних ногах висят? 1варный и и2с?
Пипец. Уж сказали даже в чём проблема, ан нет - грешим на часы :))
Вот к чему приводит бездумный копипаст и леньтяйство... (
Пипец. Уж сказали даже в чём проблема, ан нет - грешим на часы :))
Вот к чему приводит бездумный копипаст и леньтяйство... (
а возможно ли использовать для общения с часами и датчиком только одну ногу микроконтроллера ?
подключить на нее ногу data 18b20, а так же ногу SDA часов?
Нет, нельзя.
Адрес у датчика правильный в коде забит?
Ответа нет...
В строке 12 вы адрес какой ввели ? Домашний или рабочий?
Эх... Сразу лентяйство и бездарный копирайт. Не правы Вы товарищи. Учиться то как?! Лампочки да кнопочки подключать это мы уже умеем. Тут более сложная для меня схема, бьюсь 3 день.
Часы подключаются так: SDA цепляем на 20 пин ардуины, а SCL на 21 (на этих ногах ардуины реализована шина I2C) GND - на землю. Vcc +5V.
DS18B20 подключен по Wire к 17 пину как и указано в скетче.
Вот в битах не не силен точно! Я понял, что в 12 й строке указан не адрес а показания которые выводятся на экран с датчика.
49 - вызов
54 - объявление
Внимательно прочитай код функции.
Вот в битах не не силен точно! Я понял, что в 12 й строке указан не адрес а показания которые выводятся на экран с датчика.
Почитайте про датчики DS18B20 побольше и вы узнаете , что каждый датчик имеет свой уникальный номер.Номер датчика можно узнать , загрузив в ардуино скетч из библиотеки DS18B20 "Search addresses of sensors DS18B20" Скопируйте полученный адрес в 12-ую строку вашего скетча и эксперементируйте дальше.
Во втором скетче адрес датчика не используется. Поэтому он у вас показывает температуру.
Грешу на отсутсвие часов.
А часы - это другая история.
Вот в битах не не силен точно! Я понял, что в 12 й строке указан не адрес а показания которые выводятся на экран с датчика.
Почитайте про датчики DS18B20 побольше и вы узнаете , что каждый датчик имеет свой уникальный номер.Номер датчика можно узнать , загрузив в ардуино скетч из библиотеки DS18B20 "Search addresses of sensors DS18B20" Скопируйте полученный адрес в 12-ую строку вашего скетча и эксперементируйте дальше.
Во втором скетче адрес датчика не используется. Поэтому он у вас показывает температуру.
Грешу на отсутсвие часов.
А часы - это другая история.
Приогромнейшее спасибо!!!!!