Вывод графика с датчика 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-ую строку вашего скетча и эксперементируйте дальше.
Во втором скетче адрес датчика не используется. Поэтому он у вас показывает температуру.
Грешу на отсутсвие часов.
А часы - это другая история.
Приогромнейшее спасибо!!!!!