Вывод графика с датчика DS18B20 на TFT экран

Mazur
Offline
Зарегистрирован: 13.01.2016

Здравствуйте! Есть 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" в данном случае указывает на первое устройство в шине.

Все правильно показывает, температура меняется. Хелп!!!

 

Radjah
Offline
Зарегистрирован: 06.08.2014

Адрес у датчика правильный в коде забит?

Mazur
Offline
Зарегистрирован: 13.01.2016
Radjah
Offline
Зарегистрирован: 06.08.2014

Да хоть на китайском. У тебя в первом скетче жестко забит адрес датчика. Если вписывал его сам, то должно работать, если вписал от балды, то по этому адресу на шине никто не отзовется.

Mazur
Offline
Зарегистрирован: 13.01.2016

Все правильно подключено к 17 ноге на ардуине. Сопротивление стоит. но показывает не правилно... -0,06  без попротивления 0,00. (((   Грешу на отсутсвие часов. 

MacSim
Offline
Зарегистрирован: 28.11.2012

в первом и во втором случае схему подключения меняете?

и часы и датчик у вас на одних ногах висят? 1варный и и2с?

Alexino
Offline
Зарегистрирован: 29.12.2015

Пипец. Уж сказали даже в чём проблема, ан нет - грешим на часы :))

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

MacSim
Offline
Зарегистрирован: 28.11.2012

Alexino пишет:

Пипец. Уж сказали даже в чём проблема, ан нет - грешим на часы :))

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

а возможно ли  использовать для общения с часами и датчиком только одну ногу микроконтроллера ?

подключить на нее ногу data 18b20, а так же ногу SDA часов?

Radjah
Offline
Зарегистрирован: 06.08.2014

Нет, нельзя.

Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015

Radjah пишет:

Адрес у датчика правильный в коде забит?

Ответа нет...

В строке 12 вы адрес какой ввели ? Домашний или рабочий?

Mazur
Offline
Зарегистрирован: 13.01.2016

Эх... Сразу лентяйство и бездарный копирайт. Не правы Вы товарищи. Учиться то как?! Лампочки да кнопочки подключать это мы уже умеем. Тут более сложная для меня схема, бьюсь 3 день. 

Часы подключаются так:  SDA цепляем на 20 пин ардуины, а SCL на 21 (на этих ногах ардуины реализована  шина I2C) GND - на землю. Vcc +5V. 

DS18B20  подключен по Wire к 17 пину как и указано в скетче. 

Вот в битах не не силен точно! Я понял, что в 12 й строке указан не адрес а показания которые выводятся на экран с датчика. 

Radjah
Offline
Зарегистрирован: 06.08.2014

49 - вызов

54 - объявление

Внимательно прочитай код функции.

Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015

Mazur пишет:

Вот в битах не не силен точно! Я понял, что в 12 й строке указан не адрес а показания которые выводятся на экран с датчика. 

Почитайте про датчики DS18B20 побольше и вы узнаете , что каждый датчик имеет свой уникальный номер.Номер датчика можно узнать , загрузив в ардуино скетч из библиотеки DS18B20   "Search addresses of sensors DS18B20" Скопируйте полученный адрес в 12-ую строку вашего скетча и эксперементируйте дальше.

Во втором скетче адрес датчика не используется. Поэтому он у вас показывает температуру.

Mazur пишет:

   Грешу на отсутсвие часов. 

А часы - это другая история.

 

Mazur
Offline
Зарегистрирован: 13.01.2016

Штирлиц пишет:

Mazur пишет:

Вот в битах не не силен точно! Я понял, что в 12 й строке указан не адрес а показания которые выводятся на экран с датчика. 

Почитайте про датчики DS18B20 побольше и вы узнаете , что каждый датчик имеет свой уникальный номер.Номер датчика можно узнать , загрузив в ардуино скетч из библиотеки DS18B20   "Search addresses of sensors DS18B20" Скопируйте полученный адрес в 12-ую строку вашего скетча и эксперементируйте дальше.

Во втором скетче адрес датчика не используется. Поэтому он у вас показывает температуру.

Mazur пишет:

   Грешу на отсутсвие часов. 

А часы - это другая история.

 

 

Приогромнейшее спасибо!!!!!