Arduino mega2560+TFT 3.2`+ DS18B20 как вывести показания на экран

Brocker
Offline
Зарегистрирован: 14.12.2015

Никак не получается вывести данные с датчика на экран с помощью SevenSegNumFont шрифта 

#include <UTFT.h>
#include <OneWire.h>
#include <DallasTemperature.h>

extern uint8_t SevenSegNumFont[];


UTFT        myGLCD(ITDB32S, 38,39,40,41); 

#define ONE_WIRE_BUS 12 // Номер пина термометра

OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// arrays to hold device address
DeviceAddress insideThermometer;

void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
  myGLCD.setColor(255, 255, 255);
  myGLCD.setFont(SevenSegNumFont);
  myGLCD.printNumI(tempC, CENTER, 60, 0);
}

void setup ()
{
  myGLCD.InitLCD();
  myGLCD.fillScr(0, 0, 0);
  sensors.begin();
  sensors.getAddress(insideThermometer, 0);
  sensors.setResolution(insideThermometer, 12); 
}



void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
  myGLCD.setColor(255, 255, 255);
  myGLCD.setFont(SevenSegNumFont);
  myGLCD.printNumI(tempC, CENTER, 60, 0);
}

  
void loop ()
{
  
}
что делаю не так?
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Brocker пишет:

что делаю не так?

1. Не так публикуете скетч. Его трудно читать и ещё труднее обсуждать, т.к. нет номеров строк.

2. Зачем дважды определяли функцию printTemperature ?

3. А что Вы хотите от этого скетча? Вы хотите увидеть число на экране? А в каком месте Вы его туда выводите? В функции printTemperature? А в каком месте Вы её вызываете? Ни в каком? Так если Вы не печатаете число на экран, то как оно там окажется?

 

Brocker
Offline
Зарегистрирован: 14.12.2015
#include <UTFT.h>
#include <OneWire.h>
#include <DallasTemperature.h>
 
extern uint8_t SevenSegNumFont[];
 
 
UTFT        myGLCD(ITDB32S, 38,39,40,41); 
 
#define ONE_WIRE_BUS 12 // Номер пина термометра
 
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);
 
// arrays to hold device address
DeviceAddress insideThermometer;
 
void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
  myGLCD.setColor(255, 255, 255);
  myGLCD.setFont(SevenSegNumFont);
  myGLCD.printNumI(tempC, CENTER, 60, 0);
}
 
void setup ()
{
  myGLCD.InitLCD();
  myGLCD.fillScr(0, 0, 0);
  sensors.begin();
  sensors.getAddress(insideThermometer, 0);
  sensors.setResolution(insideThermometer, 12); 
}
   
void loop ()
{
  
}

 

 строка 24 должна выводить на экран переменную температуры

http://www.rinkydinkelectronics.com/r_fonts.php вот отсюда хочу скачать SevenSeg_XXXL_Num

вот это шрифт и с помощью него по центру вывести температуру. 

Brocker
Offline
Зарегистрирован: 14.12.2015

при публикации случайно дважды вставил эту функцию

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

Я в упор не вижу вызова функции 19-25 ни в setup ни в loop

Brocker
Offline
Зарегистрирован: 14.12.2015

все понял. вызвал функцию и все заработало, но теперь появился другой вопрос. показывает только целое число без десятых. как 

#include <UTFT.h>
#include <OneWire.h>
#include <DallasTemperature.h>

extern uint8_t SevenSegNumFont[];


UTFT        myGLCD(ITDB32S, 38,39,40,41); 

#define ONE_WIRE_BUS 12 // Номер пина термометра

OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// arrays to hold device address
DeviceAddress insideThermometer;
float tempC = 0;
void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
  myGLCD.setColor(255, 255, 255);
  myGLCD.setFont(SevenSegNumFont);
  myGLCD.printNumI(tempC, CENTER, 60, 0);
}

void setup ()
{
  myGLCD.InitLCD();
  myGLCD.fillScr(0, 0, 0);
  sensors.begin();
  sensors.getAddress(insideThermometer, 0);
  sensors.setResolution(insideThermometer, 12); 
}



  
void loop ()
{
   sensors.requestTemperatures();
  printTemperature(insideThermometer);
}

 

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

Сорсы смотрят трусы!

void    printNumI(long num, int x, int y, int length=0, char filler=' ');
void    printNumF(double num, byte dec, int x, int y, char divider='.', int length=0, char filler=' ');

Тип первого параметра видишь?

Brocker
Offline
Зарегистрирован: 14.12.2015

я не силен в програмировании :( глумится не надо.

изменил с printNumI на printNumF десятые появились но с переди появился ноль а вместо точки каракули. если можешь обьясни почему

Brocker
Offline
Зарегистрирован: 14.12.2015

тема закрыта, все разобрался.

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

 

Всё равно не расскажет.

Brocker
Offline
Зарегистрирован: 14.12.2015
#include <UTFT.h>
#include <OneWire.h>
#include <DallasTemperature.h>

extern uint8_t SevenSegNumFont[];


UTFT        myGLCD(ITDB32S, 38,39,40,41); 

#define ONE_WIRE_BUS 12 // Номер пина термометра

OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// arrays to hold device address
DeviceAddress insideThermometer;
float tempC = 0;
void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
  myGLCD.setColor(255, 255, 255);
  myGLCD.setFont(SevenSegNumFont);
  myGLCD.printNumF(tempC, 1, CENTER, 0);
}

void setup ()
{
  myGLCD.InitLCD();
  myGLCD.fillScr(0, 0, 0);
  sensors.begin();
  sensors.getAddress(insideThermometer, 0);
  sensors.setResolution(insideThermometer, 12); 
}



  
void loop ()
{
  sensors.requestTemperatures();
  printTemperature(insideThermometer);
}

теперь возникла другая проблема 

#include <UTFT.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <UTFT_Buttons.h>
#include <UTouch.h>

extern uint8_t SevenSegNumFont[];
extern uint8_t BigFont[];


UTFT        myGLCD(ITDB32S, 38,39,40,41);

UTouch        myTouch(6,5,4,3,2);
UTFT_Buttons  myButtons(&myGLCD, &myTouch);
#define ONE_WIRE_BUS 12 // Номер пина термометра

OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// arrays to hold device address
DeviceAddress insideThermometer;
void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
  myGLCD.setColor(255, 255, 255);
  myGLCD.setFont(SevenSegNumFont);
  myGLCD.printNumF(tempC, 1, CENTER, 0);
}

void setup ()
{
 myGLCD.InitLCD();
  myGLCD.clrScr();
  myTouch.InitTouch();
  myTouch.setPrecision(PREC_MEDIUM);
  sensors.begin();
  sensors.getAddress(insideThermometer, 0);
  sensors.setResolution(insideThermometer, 12);
  myButtons.setTextFont(BigFont);
 }

void loop ()
{
  printTemperature(insideThermometer);
  sensors.requestTemperatures();
  int but1;
  boolean default_colors = true;
  
  but1 = myButtons.addButton( 10,  60, 300,  30, "Button 1");
  myButtons.drawButtons()
}

кнопки моргают все глючит

switch
Offline
Зарегистрирован: 07.12.2015

ошибки:

1) в цикле постоянно все перерисовываете. Перерисовка - процесс длительный на ардуине, поэтому заметен невооруженным глазом. А вы перерисовываете стопицот раз в секунду.

2) каждый раз вы не только перерисовываете  изображение, но еще и  добавляете кнопки. В итоге превышаете лимит в классе UTFT_Buttons. Нужно  рисовать один раз и потом проверять нажали или нет. 

ну и вообще этот класс UTFT_Buttons очень не экономный: жрет в памяти около 300..500 байт.

Brocker
Offline
Зарегистрирован: 14.12.2015

Спасибо за ответ, то есть лучше прорисовать кнопки средствами библиотеки UTFT, и средствами UTouch задать координаты нажатия и действие? 

switch
Offline
Зарегистрирован: 07.12.2015

это если памяти не будет хватать. Пока хватает - этот класс удобен. 

Brocker
Offline
Зарегистрирован: 14.12.2015

switch пишет:

это если памяти не будет хватать. Пока хватает - этот класс удобен. 

"2) каждый раз вы не только перерисовываете  изображение, но еще и  добавляете кнопки. В итоге превышаете лимит в классе UTFT_Buttons. Нужно  рисовать один раз и потом проверять нажали или нет."

помогите как исправить код?  

 

 

switch
Offline
Зарегистрирован: 07.12.2015

вынесите рисование кнопок в отдельную фунцию, которую вызывайте только если что-то поменялось. В остальных случаях - опрашивайте нажатия. 

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

switch пишет:

это если памяти не будет хватать. Пока хватает - этот класс удобен. 

Золотые слова! Относятся не только к это класссу, а ко всему - философия! А то меня холивар в сосддей ветке задолбал уже.