Необходимо вывести температуру DS18B20 и положение РЕЛЕ на TFT 2.4 дисплей (ХЕЛП)

dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016
#include <OneWire.h>
 
OneWire  ds(10);  // подключен к 10 пину (резистор на 4.7к обязателен)
 
void setup(void) {
  Serial.begin(9600);
  pinMode(3, OUTPUT);  
  // ВКЛ насос 
  digitalWrite(13, HIGH);   
}
 
void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
  
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
  
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }
 
  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  } 
 
  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // начало коммуникации
  
  delay(1000);
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // читаем значение
 
  Serial.print("  Data = ");
  Serial.print(present, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // смотрим 9 байтов
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();
 
  // Преобразуем получненный данные в температуру
  // Используем int16_t тип, т.к. он равен 16 битам
  // даже при компиляции под 32-х битный процессор
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3;
    if (data[7] == 0x10) {
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw & ~7;
    else if (cfg == 0x20) raw = raw & ~3;
    else if (cfg == 0x40) raw = raw & ~1;
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");
 
  // Если температура достигает температуры кипения (с погрешностью), отключаем кипятильник 
  if (celsius > 40)
  {
    digitalWrite(13, LOW); 
  }
 if (celsius < 40)
 { digitalWrite(13, HIGH);
  } 
}
bwn
Offline
Зарегистрирован: 25.08.2014

Изучаете ваш дисплей, учитесь выводить на него значение переменных, выводите значение celsius и состояние 13 пина. Все.
 

dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016

Спасибо , разобрался ! 

Но, осталась проблемка с затиранием старых значений температуры ! т.е налаживаются по верх старых.... 

Полностью дисплей обновлять функцией tft.fillScreen(BLACK); не вариант (((( Может есть вариант , просто обновить участок ?

 

 

Код сырой программы (TFT+ds18b20)

void setup()
{
 tft.begin(0x9341); 
tft.fillScreen(BLACK);
}
void loop() 
{
 
byte data[2];
ds.reset(); 
ds.write(0xCC);
ds.write(0x44);
delay(750);
ds.reset();
ds.write(0xCC);
ds.write(0xBE);
data[0] = ds.read(); 
data[1] = ds.read();
int Temp = (data[1]<< 8)+data[0];
Temp = Temp>>4; // Запомнили температуру 
 
    tft.setRotation(1);
    tft.drawLine(0, 35, 320, 35, GREEN); 
    tft.setCursor(60, 13);  
    tft.setTextSize(2);
    tft.setTextColor(BLUE);
    tft.print("Temperatyra kotla");
 
    tft.setCursor(0, 60);  
tft.setTextSize(2.5);
tft.setTextColor(CYAN);
tft.print("Temperatyra vodu `C -> ");
 
tft.setCursor(0, 90);  
tft.setTextSize(2.5);
tft.setTextColor(MAGENTA);
tft.print("Polojenie dvigately -> ");
    tft.drawLine(0, 215, 320, 215, GREEN);
 
tft.setCursor(280, 56);  
tft.setTextSize(3);
tft.setTextColor(CYAN);
tft.print(Temp); Вывод 

 

bwn
Offline
Зарегистрирован: 25.08.2014

Молодец! На LCD просто печатают в нужные знакоместа пробелы.

dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016

Не совсем понял о чем вы говорите ! 

По моему вопрос был как избежать накладывания значений старых температур и новых !?

bwn
Offline
Зарегистрирован: 25.08.2014

dovgiy_nikolay пишет:

Не совсем понял о чем вы говорите ! 

По моему вопрос был как избежать накладывания значений старых температур и новых !?

У меня tft не было, может отличаться. На lcd подобную проблему решают методом вывода пробелов, а потом печати новых значений на эти места.

dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016

В том то и проблемма испробовал уже 2 разных метода ... результат тот же (((

Спасибо !

Araris
Offline
Зарегистрирован: 09.11.2012

То есть конструкция вида

tft.setTextSize(3);
tft.setTextColor(CYAN);
tft.setCursor(280, 56);  
tft.print("      ");
tft.setCursor(280, 56);  
tft.print(Temp);

не срабатывает ??

 

Julian Gardna
Offline
Зарегистрирован: 09.03.2015

Так не сработает. В tft.setTextColor(color1, color2) задай два аргумента: первый цвет текста, второй цвет фона. Если вызвать с одним аргументом, то фон прозрачный и текст накладывается на предыдущий

Araris
Offline
Зарегистрирован: 09.11.2012

Проверить не на чем, но уверен, что Вы абсолютно правы. Тогда примерно так

tft.setTextSize(3);
tft.setTextColor(CYAN,BLACK);
tft.setCursor(280, 56);  
tft.print(Temp);

 

dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016

Огроменное спасибо  Araris и Julian Gardna.... Все работает в точности как написали .... 

Я то не учь не допер , сразу .... 

Julian Gardna
Offline
Зарегистрирован: 09.03.2015

Я сам не допер сразу. Ни в одном примере этого нет, на форуме нашел.

dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016

=) Сейчас бы еще нормально русифицировать это дело , последняя задача. 

Julian Gardna
Offline
Зарегистрирован: 09.03.2015

Я библиотеками от адафрута пользуюсь и SWTFT как драйвер дисплея. Там с кирилицей все нормально. Смотри примеры к SWTFT.

dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016

Это да, спасибо ! Тут разобрался без труда , случайно нет ли описаниля библиотеки для тач-скрина ....

Идея в том что бы создать несколько подменю и добавить возможность менять уставки с дисплея ....

Вот и загвоздочка, с ЕЕРОМ разобрался , а вот вывести все это на отдельную подменюшку никак .

 

Julian Gardna
Offline
Зарегистрирован: 09.03.2015

dovgiy_nikolay, пожалуйста! С тачскрином я сам не разобрался, к сожалению, меню для меня мрак полный. Мое одноранговое меню на диплей 1602 заняло 80% программной и 60% оперативной памяти на Ардуино Уно, подменю даже не рассматривал тогда. Так что сам с удовольствием почитаю на эту тему.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Julian Gardna пишет:

Я библиотеками от адафрута пользуюсь и SWTFT как драйвер дисплея. Там с кирилицей все нормально. Смотри примеры к SWTFT.

А интересно было бы посмотреть начало Вашей программы до секции "void loop()"

Я когда искал библиотеку для своего 2.4",  "SWIFT" тоже пытался использовать, но ничего не получилось с такой ошибкой:

Arduino: 1.6.8 Hourly Build 2016/02/19 10:33 (Windows XP), Плата:"Arduino/Genuino Uno"

C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp: In member function 'void Adafruit_GFX::drawChar(int16_t, int16_t, unsigned char, uint16_t, uint16_t, uint8_t)':

C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp:566:14: warning: unused variable 'xa' [-Wunused-variable]

              xa = pgm_read_byte(&glyph->xAdvance);

              ^

C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp: In member function 'boolean Adafruit_GFX_Button::contains(int16_t, int16_t)':

C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp:931:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]

   if ((x < (_x - _w/2)) || (x > (_x + _w/2))) return false;

                      ^

C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp:931:43: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]

   if ((x < (_x - _w/2)) || (x > (_x + _w/2))) return false;

                                           ^

C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp:932:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]

   if ((y < (_y - _h/2)) || (y > (_y + _h/2))) return false;

                      ^

C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp:932:43: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]

   if ((y < (_y - _h/2)) || (y > (_y + _h/2))) return false;

                                           ^

C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp: In member function 'void Adafruit_GFX::drawBitmap(int16_t, int16_t, const uint8_t*, int16_t, int16_t, uint16_t)':

C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp:392:27: warning: 'byte' may be used uninitialized in this function [-Wmaybe-uninitialized]

       if(i & 7) byte <<= 1;

                           ^

C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp: In member function 'void Adafruit_GFX::drawBitmap(int16_t, int16_t, const uint8_t*, int16_t, int16_t, uint16_t, uint16_t)':

C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp:410:27: warning: 'byte' may be used uninitialized in this function [-Wmaybe-uninitialized]

       if(i & 7) byte <<= 1;

                           ^

C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp: In member function 'void Adafruit_GFX::drawBitmap(int16_t, int16_t, uint8_t*, int16_t, int16_t, uint16_t)':

C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp:427:27: warning: 'byte' may be used uninitialized in this function [-Wmaybe-uninitialized]

       if(i & 7) byte <<= 1;

                           ^

C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp: In member function 'void Adafruit_GFX::drawBitmap(int16_t, int16_t, uint8_t*, int16_t, int16_t, uint16_t, uint16_t)':

C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp:443:27: warning: 'byte' may be used uninitialized in this function [-Wmaybe-uninitialized]

       if(i & 7) byte <<= 1;

                           ^

C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp: In member function 'void Adafruit_GFX::drawXBitmap(int16_t, int16_t, const uint8_t*, int16_t, int16_t, uint16_t)':

C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp:462:27: warning: 'byte' may be used uninitialized in this function [-Wmaybe-uninitialized]

       if(i & 7) byte >>= 1;

                           ^

C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp: In member function 'void Adafruit_GFX::drawChar(int16_t, int16_t, unsigned char, uint16_t, uint16_t, uint8_t)':

C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp:600:9: warning: 'bits' may be used uninitialized in this function [-Wmaybe-uninitialized]

         if(bits & 0x80) {

         ^

C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp:604:47: warning: 'yo16' may be used uninitialized in this function [-Wmaybe-uninitialized]

             fillRect(x+(xo16+xx)*size, y+(yo16+yy)*size, size, size, color);

                                               ^

C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Adafruit-GFX-Library-master\Adafruit_GFX.cpp:570:14: warning: 'xo16' may be used uninitialized in this function [-Wmaybe-uninitialized]

     int16_t  xo16, yo16;

              ^

C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\SWTFT-Shield\SWTFT.cpp: In member function 'void SWTFT::drawLine3Byte(int16_t, int16_t, int16_t, int16_t, uint8_t, uint8_t, uint8_t)':

C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\SWTFT-Shield\SWTFT.cpp:629:16: error: 'swap' was not declared in this scope

     swap(x0, y0);

                ^

C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\SWTFT-Shield\SWTFT.cpp:634:16: error: 'swap' was not declared in this scope

     swap(x0, x1);

                ^

exit status 1
Ошибка компиляции.
Неверная библиотека найдена в C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Arduino_TouchScreen: C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Arduino_TouchScreen
Неверная библиотека найдена в C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\TFT-Shield-Example-Code-master: C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\TFT-Shield-Example-Code-master
Неверная библиотека найдена в C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Arduino_TouchScreen: C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\Arduino_TouchScreen
Неверная библиотека найдена в C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\TFT-Shield-Example-Code-master: C:\Documents and Settings\Администратор\Мои документы\Arduino\libraries\TFT-Shield-Example-Code-master

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

 

dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016
#include <Adafruit_GFX.h> // Libreria de graficos
#include <Adafruit_TFTLCD.h> // Libreria de LCD
#include <OneWire.h>
#include <DallasTemperature.h>
#define LCD_CS A3  // Chip Select - Pin analogico 3
#define LCD_CD A2 // Command/Data - Pin Analogico 2
#define LCD_WR A1 // LCD Write - Pin Analogico 1
#define LCD_RD A0 // LCD Read - Pin Analogico 0
#define LCD_RESET A4 // LCD Reset - Pin Analogico 4
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
// Instancia del LCD
Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
#define ONE_WIRE_BUS 11
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
 
void setup()
{
pinMode(13, OUTPUT);
 tft.begin(0x9341);
 tft.fillScreen(BLACK);
 tft.setRotation(1);
sensors.begin();
}
void loop(){
  
sensors.requestTemperatures();

tft.setCursor(0, 30);
tft.setTextColor(YELLOW,BLACK);
tft.setTextSize(3);
tft.print(utf8rus("ОТОПЛЕНИЕ C -> "));
tft.print(sensors.getTempCByIndex(1),0);

tft.setCursor(0, 60);
tft.setTextColor(YELLOW,BLACK);
tft.setTextSize(3);
tft.print(utf8rus("КОТЕЛ C -> "));
tft.print(sensors.getTempCByIndex(3),0);

if (sensors.getTempCByIndex(3) > 25)
  {
    digitalWrite(13, HIGH);
    tft.setTextSize(3);
    tft.drawRoundRect(12, 160, 290, 60, 30, GREEN);
    tft.setTextColor(GREEN,BLACK);
    tft.setCursor(22, 180);  
    tft.print(utf8rus(" ДВИГАТЕЛЬ ВКЛ "));
  }
 else if (sensors.getTempCByIndex(3) < 25)
 { 
  digitalWrite(13, LOW);  
    tft.setTextSize(3);
      tft.drawRoundRect(12, 160, 290, 60, 30, RED);
    tft.setTextColor(RED,BLACK);
    tft.setCursor(32, 180);
    tft.print(utf8rus("ДВИГАТЕЛЬ ВЫКЛ"));
}

tft.setCursor(0, 90);  
tft.setTextSize(3);
tft.setTextColor(YELLOW,BLACK);
tft.print(utf8rus("ДОМ C -> "));
tft.print(sensors.getTempCByIndex(0),0);

tft.drawLine(0, 25, 320, 25, GREEN);
tft.drawLine(0, 115, 320, 115, GREEN);
tft.drawLine(0, 115, 320, 115, GREEN); 
tft.drawLine(0, 140, 320, 140, GREEN);


   tft.setCursor(15, 5);  
    tft.setTextSize(2);
    tft.setTextColor(WHITE);
    tft.print(utf8rus("ТЕМПЕРАТУРА КОТЛА И ДОМА")); 

    tft.setCursor(45, 120);  
tft.setTextSize(2);
tft.setTextColor(WHITE);
tft.print(utf8rus("ПОЛОЖЕНИЕ ДВИГАТЕЛЯ"));
}

 

dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016

 

Что подключено :

1)  Три датчика ds18b20

      * На 11й пин ардуино 

2)  Реле 

       * Пока одна релюха  подлючена к 13 пину 

Как результат выполнения скетча .... Увы пока без коментариев , дорабатываю меню .

И да, внутри используется доп библлиотека для рус языка (utf8rus)

ссылка на библиотеку и рус шрифт :

https://drive.google.com/open?id=0B5CI0lkASPtvQXFiUEN6QWF1MXM

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Красиво! Но я бы лично еще и цифры в ряд выстроил у правой стороны, наряду с "Отоплением" и каждую строчку взял бы в красивую рамочку как "Положение двигателя" . А почему именно "положение", а не "состояние"?  И почему "Двигатель"?  Я так понял у тебя над котлом стоит маленькая турбинка, которая гоняет по системе воду, помогает конвекции. Так этот насос как-то называется... не помню. У нас его называют "Турбина" ))))))

 

И  - ага! SWIFT у тебя-таки тоже не пошёл судя из того что ты заюзал Adafruit_TFTLCD.h Значит дело не в компе или ХР... Спасибо.

Julian Gardna
Offline
Зарегистрирован: 09.03.2015

Buzzer2010, я сейчас сам решил проверить, и у меня не откомпилировался работающий ранее код. На версии 1.5 кажется работало, а теперь

Изменены опции сборки, пересобираем все
C:\Users\Керровитарр\Documents\Arduino\libraries\SWTFT-Shield\SWTFT.cpp: In member function 'void SWTFT::drawLine3Byte(int16_t, int16_t, int16_t, int16_t, uint8_t, uint8_t, uint8_t)':

C:\Users\Керровитарр\Documents\Arduino\libraries\SWTFT-Shield\SWTFT.cpp:629:16: error: 'swap' was not declared in this scope

     swap(x0, y0);

                ^

C:\Users\Керровитарр\Documents\Arduino\libraries\SWTFT-Shield\SWTFT.cpp:634:16: error: 'swap' was not declared in this scope

     swap(x0, x1);

                ^

exit status 1
Ошибка компиляции.

А сам код вот он

#include <Adafruit_GFX.h>    // Core graphics library
#include "SWTFT.h" // Hardware-specific library

#define	BLACK   0x0000
#define	BLUE    0x001F
#define	RED     0xF800
#define	GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

SWTFT tft;
int time=3600;
void setup(void) {
  tft.reset();
  uint16_t identifier = tft.readID();
  tft.begin(identifier);
  tft.fillScreen(BLACK);
}

void loop(void) {
  int disp = time - millis()/1000;
  int h = disp/3600;
  int m = disp/60 - h*60;
  int s = disp - m*60 - h*3600;
  
  tft.setCursor(5, 100);
  tft.setTextColor(WHITE, BLACK);
  tft.setTextSize(5);
  if (h < 10) tft.print("0");
  tft.print(h);
  tft.print(":");
  if (m < 10) tft.print("0");
  tft.print(m);
  tft.print(":");
  if (s < 10) tft.print("0");
  tft.print(s);
}

dovgiy_nikolay, Ваша ссылка на библиотеку просит регистрации:

 

Требуется разрешение

Хотите просмотреть файл? Свяжитесь с его владельцем или войдите в аккаунт с правом доступа. Подробнее…

Поправьте, пожалуйста! Мне бы пригодились рабочие библиотеки для этого дисплея.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Julian Gardna пишет:
Мне бы пригодились рабочие библиотеки для этого дисплея.

Рабочие библиотеки лежат на гитхабе и у Вас тоже, думаю, лежали или до сих пор лежат. Там дело не в библиотеке, а в способе инициализации дисплея. 

Если у Вас такой же китайский шилд как у меня - с SD-ридерм и тачем, то тогда вот как надо запускать этот дисплей:





   tft.begin(0x9341);

И дальше уже выводите на экран то что хотели... Всё! 

Julian Gardna
Offline
Зарегистрирован: 09.03.2015

Buzzer2010, спасибо, но не получилось. Та жеошибка SWTFT.cpp:634:16: error: 'swap' was not declared in this scope, т.е. переменная в библиотеке не объявлена (а как тогда на предыдущих версиях компилировалось?). А дисплейчик у меня внешне такой же. От mcufriend, на чипе spfd5408.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Julian Gardna пишет:

Buzzer2010, спасибо, но не получилось. Та жеошибка SWTFT.cpp:634:16: error: 'swap' was not declared in this scope, т.е. переменная в библиотеке не объявлена (а как тогда на предыдущих версиях компилировалось?). А дисплейчик у меня внешне такой же. От mcufriend, на чипе spfd5408.

А причем тут вообще "SWIFT" ? Вы же видели что в тексте программы, автор уже не использует эту библиотеку и даже перешёл на руссифицированый шрифт от "Adafruit" !

Поменяйте начало программы, что касается графики, на вот такие строки:



// Объявляем библиотеки
#include <Adafruit_GFX.h>
#include <Adafruit_TFTLCD.h>
#include <TouchScreen.h>


// Инициализируем дисплей
Adafruit_TFTLCD tft(A3, A2, A1, A0, A4);

void setup(void) {
tft.begin(0x9341);

.......................................

И только тогда - пробуйте!

dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016
dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016

Ну как я и писал ниже что проэкт еще дорабатывать буду ... 

и ДА, у меня эта библиотека тоже не пошла . Надоело ковырятся , просто заменил на рабоую .

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

Теперь пытаюсь разобратся как написать меню и прочертить тренды .

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

А как, если не секрет, Вы прицепили три датчика к одной ноге ардуино? 

dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016
#define ONE_WIRE_BUS 11
  OneWire oneWire(ONE_WIRE_BUS);
  DallasTemperature sensors(&oneWire)

 

 

void setup()
25 {
 
30 sensors.begin();// Инициализация сенсоров
31 }
void loop(){
33   
34 sensors.requestTemperatures(); 
35  
36 tft.setCursor(0, 30);
37 tft.setTextColor(YELLOW,BLACK);
38 tft.setTextSize(3);
39 tft.print(utf8rus("ОТОПЛЕНИЕ C -> "));
40 tft.print(sensors.getTempCByIndex(1),0);Вывод сенсоров на ТФТ дисплей
41  
42 tft.setCursor(0, 60);
43 tft.setTextColor(YELLOW,BLACK);
44 tft.setTextSize(3);
45 tft.print(utf8rus("КОТЕЛ C -> "));
46 tft.print(sensors.getTempCByIndex(3),0);

Вывод сенсоров на ТФТ дисплей

 

67 tft.setCursor(0, 90); 
68 tft.setTextSize(3);
69 tft.setTextColor(YELLOW,BLACK);
70 tft.print(utf8rus("ДОМ C -> "));
71 tft.print(sensors.getTempCByIndex(0),0);

Можно задать чтение через ИД сенсора , но я подумал и счел это глупой идеей ... Так как можно использовать это sensors.getTempCByIndex .... Как подлючил механически смотрите фото ниже . 

dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016

dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016

Где ножки садим ваши датчики .

Красный --- + 

Оранжевый --- Сигнал

Черный --- Минус .

Перемычка между Оранжевым и Красным это резистор 4.7 кОМ

Но у меня получилось 4.9 , так как на работе небыло подходяшего , пришлось паять кишку .

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

А если можно - схематически )))

dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016

bwn
Offline
Зарегистрирован: 25.08.2014

dovgiy_nikolay пишет:

Но у меня получилось 4.9 , так как на работе небыло подходяшего , пришлось паять кишку .

Резистор от 2К до 10К, чем меньше, тем сильнее нагружен пин, но и меньше шанс на помехи.

dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016

ну при 3.9К херню на выходе получал ))) 

Чет непонятное происходило с датчиком ) 

Спасибо за подсказку, на метиостание проверю как буду лепить ее ) 

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Так. Всё теперь понятно. Осталось только разобраться как программно с одной ноги читать сразу три показания...

СПАСИБО!

dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016

Смотри выше .... бы можешь и 10 поставить .... не суть ))) 

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

dovgiy_nikolay пишет:

Смотри выше .... бы можешь и 10 поставить .... не суть ))) 

Да ладно! О.о Так зачем тогда выдумали ардуины меги с 54-мя выводами или сколько там их у нее.. ))))

dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016

неее, ну я образно говоря ))) Не совсеми шылдами прокатит такой фокус ))) 

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

dovgiy_nikolay пишет:
Можно задать чтение через ИД сенсора , но я подумал и счел это глупой идеей ... Так как можно использовать это sensors.getTempCByIndex .... Как подлючил механически смотрите фото ниже .
А непонятно как "sensors.getTempCByIndex" определяет с какого именно датчика надо считать показания?

А интересно можно ли зацепить на эту "плату расширения" датчик температуры и фоторезистор например?

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Не, с температурными датчиками это очень удачная идея как раз, потому что я уже стал гадать куда бы мне приделать эту ардуину, а то программирование программированием, а практического применения - ноль. А вот, кстати, очень было бы полезно приделть пару датчиков к моему автомобилю. Например для управления воздушной заслонкой карбюратора, а то "местная" автоматика не выдерживает никакой критики уже. Только я слышал что в автомобиле жуткие помехи по питанию идут и надо с этим как-то бороться.

dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016

Незнаю правельно ли я понял , но как я понял эту строку !

после *реквестет сенсор* идет  sensors.getTempCByIndex (0) это и будет твой первый датчик ! 

т.е он якобы читает подряд все что приходит на вход 11пина и сортирует сам т.д  по адресам 

ток как эта хрень происходит для меня пока тоже мрак ! 

Т.е сканирует все - сравнение адресов - вывод по индексам ! 

sensors.getTempCByIndex (0)

sensors.getTempCByIndex (1)

sensors.getTempCByIndex (3)

и т.д 

Дальше нюансы библиотеки , туда я не лез ) 

dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016

Все что могу сказать .... Я пили этот код 

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

#define ONE_WIRE_BUS 9

OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);

DeviceAddress Thermometer1 = { 
  0x28, 0x00, 0x54, 0xB6, 0x04, 0x00, 0x00, 0x92 };  // адрес датчика DS18B20 280054B604000092
DeviceAddress Thermometer2 = { 
  0x28, 0x9E, 0x95, 0xB5, 0x04, 0x00, 0x00, 0x57 }; 

void setup() {

  sensors.begin();
  sensors.setResolution(Thermometer1, 10);
  sensors.setResolution(Thermometer2, 10);

  Serial.begin(9600);
}

void printTemperature(DeviceAddress deviceAddress) {
  float tempC = sensors.getTempC(deviceAddress);
  Serial.println(tempC);
}
void loop() {

  sensors.requestTemperatures();
  Serial.print("Sensor1  ");
  printTemperature(Thermometer1);

  Serial.print("Sensor2  ");
  printTemperature(Thermometer2);
}

 

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Тогда есть только дин способ - практический )))) Ждём тогда когда ты установишь всю эту конструкцию на свой котёл и что будет )))

bwn
Offline
Зарегистрирован: 25.08.2014

Buzzer2010 пишет:

Так. Всё теперь понятно. Осталось только разобраться как программно с одной ноги читать сразу три показания...

СПАСИБО!

Простенько

dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016

Схема работает , лампочки 220в 100ват  подлючал через реле ))) Включаются и тухнут по достижению температуры .... мне то что, только насос переключать ) Не ракеты запускать из дому =D

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

bwn пишет:

Buzzer2010 пишет:

Так. Всё теперь понятно. Осталось только разобраться как программно с одной ноги читать сразу три показания...

СПАСИБО!

Простенько

Жесть, однако. Простенько как все гениальное! Надо намотать на ус (или сохранить на комп). Спасибо, чел.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

dovgiy_nikolay пишет:

Незнаю правельно ли я понял , но как я понял эту строку !

после *реквестет сенсор* идет  sensors.getTempCByIndex (0) это и будет твой первый датчик ! 

т.е он якобы читает подряд все что приходит на вход 11пина и сортирует сам т.д  по адресам 

ток как эта хрень происходит для меня пока тоже мрак ! 

Т.е сканирует все - сравнение адресов - вывод по индексам ! 

sensors.getTempCByIndex (0)

sensors.getTempCByIndex (1)

sensors.getTempCByIndex (3)

и т.д 

Дальше нюансы библиотеки , туда я не лез ) 

Вот где собака порылась: 

Piccy.info - Free Image Hosting

dovgiy_nikolay
Offline
Зарегистрирован: 18.03.2016

Да , спасибо за заметку))) 

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Julian Gardna пишет:

.... А дисплейчик у меня внешне такой же. От mcufriend, на чипе spfd5408.

А можно поинтересоваться - как Вы определили какой чип на вашем дисплее? Очень актуально!

Julian Gardna
Offline
Зарегистрирован: 09.03.2015

С помощью этого скетча читаем ID контроллера, далее ищем в гугле

/*********************************************************************
*
* LCD_ID_Reader
*
* This sketch is meant only to attempt to read the driver ID code
* from inexpensive touchscreen LCDs found on eBay without needing to
* load any additional libraries.  The hope is to identify the most 
* common varieties and choose the best library for the screen you have.
*
* This has been successfully tested so far on 992X and 778X variety
* screens.
*
* Usage: 
*
* Compile the sketch and run it on your board with the screen
* attached.  In the serial monitor, you should see a message containing
* the driver code.  The tricky thing is that if it does not work, the
* results may be undetermined.  However, if we can compile a list,
* the difference between working and not may become more evident.
*
* Please visit http://misc.ws/lcd_information for more information.
*
* Version 1.2 - January 29th, 2015
* 
*********************************************************************/



/*********************************************************************
*
* PIN ASSIGNMENTS
*
* You can alter the pin assignments to reflect any configuration you
* wish.  I've provided the default shield configuration, which works
* on both the Arduino UNO and Mega 2560.
* 
*********************************************************************/
//-- Arduino UNO or Mega 2560 Plugged as shield
#define LCD_RST A4
#define LCD_CS A3
#define LCD_RS A2
#define LCD_WR A1
#define LCD_RD A0

#define LCD_D0 8
#define LCD_D1 9
#define LCD_D2 2
#define LCD_D3 3
#define LCD_D4 4
#define LCD_D5 5
#define LCD_D6 6
#define LCD_D7 7



/*********************************************************************
*
* Attempt to initialize and reset LCD, then read its Driver Code
* at register index 0.
* 
*********************************************************************/
void setup() {
  
  char hexString[7];
  uint16_t id;
  
  Serial.begin(115200);
  Serial.println("Initializing LCD...");
  lcdInit();
  lcdReset();
  
  delay(500);
  
  Serial.print("Reading ID...");
  id = lcdReadID();
  sprintf(hexString, "0x%0.4X", id); 
  Serial.println( hexString );
  
  if( id == 0x7783 ) {
    lcdRegister7783();
    lcdFillScreen(0xF800);
    Serial.println("If your screen filled red, then you may be able to use the library at https://github.com/Smoke-And-Wires/TFT-Shield-Example-Code");
  } else if( id == 0x0154 ) {
    lcdRegister0154();
    lcdFillScreen(0xF800);
    Serial.println("If your screen filled red, please report it at http://misc.ws/lcd_information");
    Serial.println("There is currently no known working library.");
  } else {
    lcdRegisterOther();
    lcdFillScreen(0xF800);
    Serial.println("If your screen filled red, you may be able to use the library at http://misc.ws");
  } 
  
  //print_all_regs();
}


void print_all_regs() {
  char str[60];
  uint16_t i, val;

  for(i=0; i < 256; i++ )
  {
    delay(40);
    val = lcdReadRegister(i);
    sprintf(str, "Register 0x%0.2X : 0x%0.4X", i, val);
    Serial.println( str );
  }  
}

void loop() {
  uint16_t color = random(65535);
  lcdFillScreen(color);
}

/*********************************************************************
*
*   LCD Functions - Inefficient but should be good enough 
*                   to read the ID.
*
*********************************************************************/
void lcdRegister0154() {
  lcdWriteRegister(0x000C, 0x130); 
  lcdWriteRegister(0x0080, 0x8d);
  lcdWriteRegister(0x0092, 0x10);
  lcdWriteRegister(0x0011, 0x1b);
  lcdWriteRegister(0x0012, 0x3101);
  lcdWriteRegister(0x0013, 0x105f);
  lcdWriteRegister(0x0014, 0x667f);
  lcdWriteRegister(0x0010, 0x800);
  delay(20); 
  lcdWriteRegister(0x0011, 0x11b);
  delay(20); 
  lcdWriteRegister(0x0011, 0x31b);
  delay(20); 
  lcdWriteRegister(0x0011, 0x71b);
  delay(20); 
  lcdWriteRegister(0x0011, 0xf1b);
  delay(20); 
  lcdWriteRegister(0x0011, 0xf3b);
  delay(30); 
  lcdWriteRegister(0x0001, 0x2128);
  lcdWriteRegister(0x0002, 0x100);
  lcdWriteRegister(0x0003, 0x1030);
  lcdWriteRegister(0x0007, 0); 
  lcdWriteRegister(0x0008, 0x808);
  lcdWriteRegister(0x000B, 0x1100);
  lcdWriteRegister(0x000F, 0xf01);
  lcdWriteRegister(0x0015, 0);
  lcdWriteRegister(0x0030, 0);
  lcdWriteRegister(0x0034, 319); 
  lcdWriteRegister(0x0035, 0); 
  lcdWriteRegister(0x0036, 239); 
  lcdWriteRegister(0x0037, 0); 
  lcdWriteRegister(0x0038, 319); 
  lcdWriteRegister(0x0039, 0); 
  lcdWriteRegister(0x0050, 0);
  lcdWriteRegister(0x0051, 0xf00);
  lcdWriteRegister(0x0052, 0xa03);
  lcdWriteRegister(0x0053, 0x300);
  lcdWriteRegister(0x0054, 0xc05);
  lcdWriteRegister(0x0055, 0xf00);
  lcdWriteRegister(0x0056, 0xf00);
  lcdWriteRegister(0x0057, 3);
  lcdWriteRegister(0x0058, 0x1f07);
  lcdWriteRegister(0x0059, 0x71f);
  delay(20);
  lcdWriteRegister(0x0007, 0x12);
  delay(20);
  lcdWriteRegister(0x0007, 0x13);
}

void lcdRegisterOther() {
  Serial.println("Loading LCD registers...");
  lcdWriteRegister(0x00e5,0x8000);
  lcdWriteRegister(0x0000,0x0001);
  lcdWriteRegister(0x0001,0x0100);
  lcdWriteRegister(0x0002,0x0700);
  lcdWriteRegister(0x0003,0x1030);
  lcdWriteRegister(0x0004,0x0000);
  lcdWriteRegister(0x0008,0x0202);
  lcdWriteRegister(0x0009,0x0000);
  lcdWriteRegister(0x000a,0x0000);
  lcdWriteRegister(0x000c,0x0000);
  lcdWriteRegister(0x000d,0x0000);
  lcdWriteRegister(0x000f,0x0000);
  lcdWriteRegister(0x0010,0x0000);
  lcdWriteRegister(0x0011,0x0000);
  lcdWriteRegister(0x0012,0x0000);
  lcdWriteRegister(0x0013,0x0000);
  lcdWriteRegister(0x0010,0x17b0);
  lcdWriteRegister(0x0011,0x0037);
  lcdWriteRegister(0x0012,0x0138);
  lcdWriteRegister(0x0013,0x1700);
  lcdWriteRegister(0x0029,0x000d);
  lcdWriteRegister(0x0020,0x0000);
  lcdWriteRegister(0x0021,0x0000);
  lcdWriteRegister(0x0030,0x0001);
  lcdWriteRegister(0x0031,0x0606);
  lcdWriteRegister(0x0032,0x0304);
  lcdWriteRegister(0x0033,0x0202);
  lcdWriteRegister(0x0034,0x0202);
  lcdWriteRegister(0x0035,0x0103);
  lcdWriteRegister(0x0036,0x011d);
  lcdWriteRegister(0x0037,0x0404);
  lcdWriteRegister(0x0038,0x0404);
  lcdWriteRegister(0x0039,0x0404);
  lcdWriteRegister(0x003c,0x0700);
  lcdWriteRegister(0x003d,0x0a1f);
  lcdWriteRegister(0x0050,0x0000);
  lcdWriteRegister(0x0051,0x00ef);
  lcdWriteRegister(0x0052,0x0000);
  lcdWriteRegister(0x0053,0x013f);
  lcdWriteRegister(0x0060,0x2700);
  lcdWriteRegister(0x0061,0x0001);
  lcdWriteRegister(0x006a,0x0000);
  lcdWriteRegister(0x0090,0x0010);
  lcdWriteRegister(0x0092,0x0000);
  lcdWriteRegister(0x0093,0x0003);
  lcdWriteRegister(0x0095,0x0101);
  lcdWriteRegister(0x0097,0x0000);
  lcdWriteRegister(0x0098,0x0000);
  lcdWriteRegister(0x0007,0x0021);
  lcdWriteRegister(0x0007,0x0031);
  lcdWriteRegister(0x0007,0x0173);
}

void lcdRegister7783() {
    
  lcdWriteRegister(0x0001,0x0100);    
  lcdWriteRegister(0x0002,0x0700);    
  lcdWriteRegister(0x0003,0x1030);    
  lcdWriteRegister(0x0008,0x0302);    
  lcdWriteRegister(0x0009,0x0000);   
  lcdWriteRegister(0x000A,0x0008);    
  lcdWriteRegister(0x0010,0x0790);    
  lcdWriteRegister(0x0011,0x0005);    
  lcdWriteRegister(0x0012,0x0000);   
  lcdWriteRegister(0x0013,0x0000); 
  lcdWriteRegister(0x0010,0x12B0);    
  lcdWriteRegister(0x0011,0x0007);  
  lcdWriteRegister(0x0012,0x008C);   
  lcdWriteRegister(0x0013,0x1700);    
  lcdWriteRegister(0x0029,0x0022);    
  lcdWriteRegister(0x0030,0x0000);    
  lcdWriteRegister(0x0031,0x0505);    
  lcdWriteRegister(0x0032,0x0205);    
  lcdWriteRegister(0x0035,0x0206);    
  lcdWriteRegister(0x0036,0x0408);    
  lcdWriteRegister(0x0037,0x0000);   
  lcdWriteRegister(0x0038,0x0504);
  lcdWriteRegister(0x0039,0x0206);    
  lcdWriteRegister(0x003C,0x0206);   
  lcdWriteRegister(0x003D,0x0408);    
  lcdWriteRegister(0x0050,0x0000);
  lcdWriteRegister(0x0051,0x00EF);   
  lcdWriteRegister(0x0052,0x0000);   
  lcdWriteRegister(0x0053,0x013F);   
  lcdWriteRegister(0x0060,0xA700);   
  lcdWriteRegister(0x0061,0x0001);   
  lcdWriteRegister(0x0090,0x0033); 
  lcdWriteRegister(0x0007,0x0133);
  lcdWriteRegister(0x0001,0x0100);
  lcdWriteRegister(0x0002,0x0700);    
  lcdWriteRegister(0x0003,0x1030);    
  lcdWriteRegister(0x0008,0x0302);    
  lcdWriteRegister(0x0009,0x0000);   
  lcdWriteRegister(0x000A,0x0008);    
  lcdWriteRegister(0x0010,0x0790);    
  lcdWriteRegister(0x0011,0x0005);    
  lcdWriteRegister(0x0012,0x0000);  
  lcdWriteRegister(0x0013,0x0000);    
  lcdWriteRegister(0x0010,0x12B0);    
  lcdWriteRegister(0x0011,0x0007);    
  lcdWriteRegister(0x0012,0x008C);    
  lcdWriteRegister(0x0013,0x1700);    
  lcdWriteRegister(0x0029,0x0022);    
  lcdWriteRegister(0x0030,0x0000);    
  lcdWriteRegister(0x0031,0x0505);    
  lcdWriteRegister(0x0032,0x0205);    
  lcdWriteRegister(0x0035,0x0206);    
  lcdWriteRegister(0x0036,0x0408);   
  lcdWriteRegister(0x0037,0x0000);    
  lcdWriteRegister(0x0038,0x0504);
  lcdWriteRegister(0x0039,0x0206);    
  lcdWriteRegister(0x003C,0x0206);    
  lcdWriteRegister(0x003D,0x0408);   
  lcdWriteRegister(0x0050,0x0000);
  lcdWriteRegister(0x0051,0x00EF);   
  lcdWriteRegister(0x0052,0x0000);   
  lcdWriteRegister(0x0053,0x013F);   
  lcdWriteRegister(0x0060,0xA700);   
  lcdWriteRegister(0x0061,0x0001);   
  lcdWriteRegister(0x0090,0x0033);
  lcdWriteRegister(0x0007,0x0133);
}

void lcdInit() {
  pinMode(LCD_CS, OUTPUT);
  digitalWrite(LCD_CS, HIGH);
  pinMode(LCD_RS, OUTPUT);
  digitalWrite(LCD_RS, HIGH);
  pinMode(LCD_WR, OUTPUT);
  digitalWrite(LCD_WR, HIGH);
  pinMode(LCD_RD, OUTPUT);
  digitalWrite(LCD_RD, HIGH);
  pinMode(LCD_RST, OUTPUT);
  digitalWrite(LCD_RST, HIGH);  
}

void lcdReset() {
  digitalWrite(LCD_RST, LOW);
  delay(2); 
  digitalWrite(LCD_RST, HIGH);
  lcdWriteData(0);
  lcdWriteData(0);
  lcdWriteData(0);
  lcdWriteData(0);
}

void lcdWrite8(uint16_t data) {
  digitalWrite(LCD_D0, data & 1);
  digitalWrite(LCD_D1, (data & 2) >> 1);
  digitalWrite(LCD_D2, (data & 4) >> 2);
  digitalWrite(LCD_D3, (data & 8) >> 3);
  digitalWrite(LCD_D4, (data & 16) >> 4); 
  digitalWrite(LCD_D5, (data & 32) >> 5);
  digitalWrite(LCD_D6, (data & 64) >> 6);
  digitalWrite(LCD_D7, (data & 128) >> 7);  
}

uint16_t lcdRead8() {
  uint16_t result = digitalRead(LCD_D7);
  result <<= 1;
  result |= digitalRead(LCD_D6);
  result <<= 1;
  result |= digitalRead(LCD_D5);
  result <<= 1; 
  result |= digitalRead(LCD_D4); 
  result <<= 1;
  result |= digitalRead(LCD_D3);
  result <<= 1;
  result |= digitalRead(LCD_D2); 
  result <<= 1;
  result |= digitalRead(LCD_D1);
  result <<= 1;
  result |= digitalRead(LCD_D0); 
  
  return result;
}

void lcdSetWriteDir() {
  pinMode(LCD_D0, OUTPUT);
  pinMode(LCD_D1, OUTPUT);
  pinMode(LCD_D2, OUTPUT);
  pinMode(LCD_D3, OUTPUT);  
  pinMode(LCD_D4, OUTPUT);  
  pinMode(LCD_D5, OUTPUT);
  pinMode(LCD_D6, OUTPUT);
  pinMode(LCD_D7, OUTPUT);  
}


void lcdSetReadDir() {
  pinMode(LCD_D0, INPUT);
  pinMode(LCD_D1, INPUT);
  pinMode(LCD_D2, INPUT);
  pinMode(LCD_D3, INPUT);  
  pinMode(LCD_D4, INPUT);  
  pinMode(LCD_D5, INPUT);
  pinMode(LCD_D6, INPUT);
  pinMode(LCD_D7, INPUT);    
}

void lcdWriteData(uint16_t data) {
  
  lcdSetWriteDir();
  digitalWrite(LCD_CS, LOW);
  digitalWrite(LCD_RS, HIGH);
  digitalWrite(LCD_RD, HIGH);
  digitalWrite(LCD_WR, HIGH);
  
  lcdWrite8(data >> 8);
  
  digitalWrite(LCD_WR, LOW);
  delayMicroseconds(10);
  digitalWrite(LCD_WR, HIGH);
  
  lcdWrite8(data);
  
  digitalWrite(LCD_WR, LOW);
  delayMicroseconds(10);
  digitalWrite(LCD_WR, HIGH);
  
  digitalWrite(LCD_CS, HIGH);  
}


void lcdWriteCommand(uint16_t command) {
  lcdSetWriteDir(); 
  digitalWrite(LCD_CS, LOW);
  digitalWrite(LCD_RS, LOW);
  digitalWrite(LCD_RD, HIGH);
  digitalWrite(LCD_WR, HIGH);  
  lcdWrite8(command >> 8);
  digitalWrite(LCD_WR, LOW);
  delayMicroseconds(10);
  digitalWrite(LCD_WR, HIGH);
  lcdWrite8(command);
  digitalWrite(LCD_WR, LOW);
  delayMicroseconds(10);
  digitalWrite(LCD_WR, HIGH);
  digitalWrite(LCD_CS, HIGH);    
}


int lcdReadData() {
  uint16_t result;
  lcdSetReadDir();
  digitalWrite(LCD_CS, LOW);
  digitalWrite(LCD_RS, HIGH);
  digitalWrite(LCD_RD, HIGH);
  digitalWrite(LCD_WR, HIGH);
  
  digitalWrite(LCD_RD, LOW);  
  delayMicroseconds(10);
  result = lcdRead8() << 8;
  digitalWrite(LCD_RD, HIGH);
  
  delayMicroseconds(10);
  
  digitalWrite(LCD_RD, LOW);
  delayMicroseconds(10);
  result |= lcdRead8();
  
  digitalWrite(LCD_RD, HIGH);
  digitalWrite(LCD_CS, HIGH);
  
  return result;
}


void lcdWriteRegister(uint16_t addr, uint16_t data) {
  lcdWriteCommand(addr);
  lcdWriteData(data);
}

uint16_t lcdReadRegister(uint16_t reg) {
  lcdWriteCommand(reg);
  return lcdReadData();
}

uint16_t lcdReadID() {
  return lcdReadRegister(0x00);
}


void lcdFillScreen(uint16_t color) {
  
  Serial.println("Filling the screen...");
  
  /*lcdWriteRegister(0x0050, 0);
  lcdWriteRegister(0x0051, 219);  
  lcdWriteRegister(0x0052, 0);
  lcdWriteRegister(0x0053, 319);  
  */
  lcdWriteRegister(0x0020, 0);
  lcdWriteRegister(0x0021, 0);
  lcdWriteCommand(0x0022);
  
  digitalWrite(LCD_CS, LOW);
  digitalWrite(LCD_RS, HIGH);
  digitalWrite(LCD_RD, HIGH);
  digitalWrite(LCD_WR, HIGH);
 
  lcdSetWriteDir();
  
  uint32_t i = 320;
  i *=240;

  while( i-- ) {
    lcdWrite8(color >> 8);
    digitalWrite(LCD_WR, LOW);
    delayMicroseconds(10);
    digitalWrite(LCD_WR, HIGH); 
    lcdWrite8(color);
    digitalWrite(LCD_WR, LOW);
    delayMicroseconds(10);
    digitalWrite(LCD_WR, HIGH); 
  }
  
  digitalWrite(LCD_CS, HIGH); 
  Serial.println("Done filling...");
  
}

код моего 0x7783, этот же код нужно писать при инициализации дислея.

Andreyko
Offline
Зарегистрирован: 15.01.2017

Julian Gardna пишет:

Так не сработает. В tft.setTextColor(color1, color2) задай два аргумента: первый цвет текста, второй цвет фона. Если вызвать с одним аргументом, то фон прозрачный и текст накладывается на предыдущий

 

Спасибо Вам  за Ваш пост. Долго я искал как  решить вывод  значений с датчиков на  экран.