Измерение температуры с выводом на экран

Всем привет! Кто может подсказать, ни как не разберусь

Делаю такую штуку, 5 датчиков которые измеряют температуру и выводят на цветной экран.
Все работает, только при обновлении данных экран обновляется
Кто знает как сделать что бы обновлялись только цифры значений?
Спасибо

Код программы

#include <SPI.h> // Подключаем библиотеку для работы с устройством по интерфейсу SPI
#include <Adafruit_GFX.h> // Подключаем библиотеку для работы с текстом и графикой
#include <TFT_ILI9163C.h> // Подключаем библиотеку программных драйверов для работы с дисплеем 1.44 128x128 SPI
#include <microDS18B20.h> // Подключаем библиотеку термодатчика
#define DS_PIN 2 // пин для термометров

// Уникальные адреса датчиков - считать можно в примере address_read
uint8_t s1_addr = {0x28, 0xDB, 0xB4, 0x80, 0xE3, 0xE1, 0x3C, 0x24}; //0x28, 0xAB, 0x58, 0x80, 0xE3, 0xE1, 0x3C, 0x47
uint8_t s2_addr = {0x28, 0x7F, 0x47, 0x80, 0xE3, 0xE1, 0x3C, 0x4C};
uint8_t s3_addr = {0x28, 0x2E, 0xB2, 0x80, 0xE3, 0xE1, 0x3C, 0x21};
uint8_t s4_addr = {0x28, 0x90, 0xA3, 0x80, 0xE3, 0xE1, 0x3C, 0x84};
uint8_t s5_addr = {0x28, 0x3C, 0xF7, 0x80, 0xE3, 0xE1, 0x3C, 0x2F};
MicroDS18B20<DS_PIN, s1_addr> sensor1; // Создаем термометр с адресацией
MicroDS18B20<DS_PIN, s2_addr> sensor2; // Создаем термометр с адресацией
MicroDS18B20<DS_PIN, s3_addr> sensor3; // Создаем термометр с адресацией
MicroDS18B20<DS_PIN, s4_addr> sensor4; // Создаем термометр с адресацией
MicroDS18B20<DS_PIN, s5_addr> sensor5; // Создаем термометр с адресацией

// В следующих 8-и строках опеределяем названия и соответствующие им RGB обозначения цветов, которые будем выводить на дисплей
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF

#define __CS 10 // Определяем пин к которому подключен разъем CS дисплея
#define __DC 9 // Определяем пин к которому подключен разъем A0 дисплея
#define __RES 8 // Определяем пин к которому подключен разъем RESET дисплея
TFT_ILI9163C display = TFT_ILI9163C(__CS, __DC, __RES); // Связываем объект display с библиотекой TFT_ILI9163C и сообщаем библиотеке определенные для работы с дисплеем пины

// Начало функции обработки кириллических символов
String utf8rus(String source) // Функция для конвертации русских символов из кодировки CP1251 в UTF8
{
int i,k;
String target;
unsigned char n;
char m[2] = { ‘0’, ‘\0’ };
k = source.length(); i = 0;
while (i < k) {
n = source[i]; i++;

if (n >= 0xBF){
  switch (n) {
    case 0xD0: {
      n = source[i]; i++;
      if (n == 0x81) { n = 0xA8; break; }
      if (n >= 0x90 && n <= 0xBF) n = n + 0x2F;
      break;
    }
    case 0xD1: {
      n = source[i]; i++;
      if (n == 0x91) { n = 0xB7; break; }
      if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
      break;
    }
  }
}
m[0] = n; target = target + String(m);

}
return target;
}

// Конец функции обработки кириллических симоволов

void setup() {

display.begin(); // Иницализируем дисплей
Serial.begin(9600);

}

void loop() {
display.fillScreen(); // Очищаем дисплей перед выводом
display.setTextSize(1); // Определяем размер шрифта
display.setCursor(10,5); // Устанавливаем курсор в левый верхний угол области вывода
display.setTextColor(YELLOW); // Определяем цвет вывода на дисплей
display.print(utf8rus(“Температура ленты”)); // Надпись
display.setTextSize(1); // Определяем размер шрифта
display.setCursor(20,22); // Устанавливаем курсор в левый верхний угол области вывода
display.setTextColor(RED); // Определяем цвет вывода на дисплей
display.print(utf8rus(“Д1”)); // Надпись
display.setTextSize(1); // Определяем размер шрифта
display.setCursor(20,34); // Устанавливаем курсор в левый верхний угол области вывода
display.setTextColor(GREEN); // Определяем цвет вывода на дисплей
display.print(utf8rus(“Д2”)); // Надпись
display.setTextSize(1); // Определяем размер шрифта
display.setCursor(20,46); // Устанавливаем курсор в левый верхний угол области вывода
display.setTextColor(BLUE); // Определяем цвет вывода на дисплей
display.print(utf8rus(“Д3”)); // Надпись
display.setTextSize(1); // Определяем размер шрифта
display.setCursor(20,58); // Устанавливаем курсор в левый верхний угол области вывода
display.setTextColor(MAGENTA); // Определяем цвет вывода на дисплей
display.print(utf8rus(“Д4”)); // Надпись
display.setTextSize(1); // Определяем размер шрифта
display.setCursor(20,70); // Устанавливаем курсор в левый верхний угол области вывода
display.setTextColor(CYAN); // Определяем цвет вывода на дисплей
display.print(utf8rus(“Д5”));
// Надпись

datatemp();

//delay(2000);
temperature();

}

void temperature() {
sensor1.requestTemp(); // Запрашиваем преобразование температуры
sensor2.requestTemp();
sensor3.requestTemp();
sensor4.requestTemp();
sensor5.requestTemp();
delay(5000); // ожидаем результат

Serial.print("1 метр: ");
if (sensor1.readTemp()) Serial.println(sensor1.getTemp());
else Serial.println(“error”);
Serial.print("2 метр: ");
if (sensor2.readTemp()) Serial.println(sensor2.getTemp());
else Serial.println(“error”);
Serial.print("3 метр: ");
if (sensor3.readTemp()) Serial.println(sensor3.getTemp());
else Serial.println(“error”);
Serial.print("4 метр: ");
if (sensor4.readTemp()) Serial.println(sensor4.getTemp());
else Serial.println(“error”);
Serial.print("5 метр: ");
if (sensor5.readTemp()) Serial.println(sensor5.getTemp());
else Serial.println(“error”);

}

//
void datatemp() {
display.setTextSize(1);
display.setCursor(40,22);
display.setTextColor(WHITE);
display.print(sensor1.getTemp());
display.setCursor(73,22);
display.setTextColor(WHITE);
display.print(“\x80\C”);
display.setCursor(40,34);
display.setTextColor(WHITE);
display.print(sensor2.getTemp());
display.setCursor(73,34);
display.setTextColor(WHITE);
display.print(“\x80\C”);
display.setCursor(40,46);
display.setTextColor(WHITE);
display.print(sensor3.getTemp());
display.setCursor(73,46);
display.setTextColor(WHITE);
display.print(“\x80\C”);
display.setCursor(40,58);
display.setTextColor(WHITE);
display.print(sensor4.getTemp());
display.setCursor(73,58);
display.setTextColor(WHITE);
display.print(“\x80\C”);
display.setCursor(40,70);
display.setTextColor(WHITE);
display.print(sensor5.getTemp());
display.setCursor(73,70);
display.setTextColor(WHITE);
display.print(“\x80\C”);

}


Выглядит вот так

[display.fillScreen(); если убрать эту строчку, то цифры накладываются на друг друга и вместо показаний температуры получается белые квадратики)

Для начала разберитесь, как правильно вставлять код на форуме (и вставьте нормально), а то в таком виде его “ни как” не получится обсуждать.

#include <Adafruit_GFX.h>   // Подключаем библиотеку для работы с текстом и графикой
#include <TFT_ILI9163C.h>   // Подключаем библиотеку программных драйверов для работы с дисплеем 1.44 128x128 SPI 
#include <microDS18B20.h>   // Подключаем библиотеку термодатчика
#define DS_PIN 2            // пин для термометров

// Уникальные адреса датчиков - считать можно в примере address_read
uint8_t s1_addr[] = {0x28, 0xDB, 0xB4, 0x80, 0xE3, 0xE1, 0x3C, 0x24}; //0x28, 0xAB, 0x58, 0x80, 0xE3, 0xE1, 0x3C, 0x47
uint8_t s2_addr[] = {0x28, 0x7F, 0x47, 0x80, 0xE3, 0xE1, 0x3C, 0x4C};
uint8_t s3_addr[] = {0x28, 0x2E, 0xB2, 0x80, 0xE3, 0xE1, 0x3C, 0x21};
uint8_t s4_addr[] = {0x28, 0x90, 0xA3, 0x80, 0xE3, 0xE1, 0x3C, 0x84};
uint8_t s5_addr[] = {0x28, 0x3C, 0xF7, 0x80, 0xE3, 0xE1, 0x3C, 0x2F};
MicroDS18B20<DS_PIN, s1_addr> sensor1;  // Создаем термометр с адресацией
MicroDS18B20<DS_PIN, s2_addr> sensor2;  // Создаем термометр с адресацией
MicroDS18B20<DS_PIN, s3_addr> sensor3;  // Создаем термометр с адресацией
MicroDS18B20<DS_PIN, s4_addr> sensor4;  // Создаем термометр с адресацией
MicroDS18B20<DS_PIN, s5_addr> sensor5;  // Создаем термометр с адресацией

// В следующих 8-и строках опеределяем названия и соответствующие им RGB обозначения цветов, которые будем выводить на дисплей
#define	BLACK   0x0000
#define	BLUE    0x001F
#define	RED     0xF800  
#define	GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0  
#define WHITE   0xFFFF

#define __CS 10                                           // Определяем пин к которому подключен разъем CS дисплея
#define __DC 9                                            // Определяем пин к которому подключен разъем A0 дисплея
#define __RES 8                                           // Определяем пин к которому подключен разъем RESET дисплея
TFT_ILI9163C display = TFT_ILI9163C(__CS, __DC, __RES);   // Связываем объект display с библиотекой TFT_ILI9163C и сообщаем библиотеке определенные для работы с дисплеем пины

// Начало функции обработки кириллических символов
String utf8rus(String source)     // Функция для конвертации русских символов из кодировки CP1251 в UTF8
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
 
    if (n >= 0xBF){
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x2F;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB7; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
  return target;
}


// Конец функции обработки кириллических симоволов

void setup() {
    
  display.begin();                                       // Иницализируем дисплей
  Serial.begin(9600);
  
}
 
void loop() {
  display.fillScreen();                                         // Очищаем дисплей перед выводом
  display.setTextSize(1);                                         // Определяем размер шрифта
  display.setCursor(10,5);                                        // Устанавливаем курсор в левый верхний угол области вывода
  display.setTextColor(YELLOW);                                   // Определяем цвет вывода на дисплей
  display.print(utf8rus("Температура ленты"));                    // Надпись
  display.setTextSize(1);                                         // Определяем размер шрифта
  display.setCursor(20,22);                                       // Устанавливаем курсор в левый верхний угол области вывода
  display.setTextColor(RED);                                      // Определяем цвет вывода на дисплей
  display.print(utf8rus("Д1"));                                   // Надпись
  display.setTextSize(1);                                         // Определяем размер шрифта
  display.setCursor(20,34);                                       // Устанавливаем курсор в левый верхний угол области вывода
  display.setTextColor(GREEN);                                    // Определяем цвет вывода на дисплей
  display.print(utf8rus("Д2"));                                   // Надпись
  display.setTextSize(1);                                         // Определяем размер шрифта
  display.setCursor(20,46);                                       // Устанавливаем курсор в левый верхний угол области вывода
  display.setTextColor(BLUE);                                    // Определяем цвет вывода на дисплей
  display.print(utf8rus("Д3"));                                   // Надпись
  display.setTextSize(1);                                         // Определяем размер шрифта
  display.setCursor(20,58);                                       // Устанавливаем курсор в левый верхний угол области вывода
  display.setTextColor(MAGENTA);                                    // Определяем цвет вывода на дисплей
  display.print(utf8rus("Д4"));                                   // Надпись
  display.setTextSize(1);                                         // Определяем размер шрифта
  display.setCursor(20,70);                                       // Устанавливаем курсор в левый верхний угол области вывода
  display.setTextColor(CYAN);                                    // Определяем цвет вывода на дисплей
  display.print(utf8rus("Д5"));
                              // Надпись
  
  
  datatemp();
  
  //delay(2000);
  temperature();
   
 
}

 void temperature() {
  sensor1.requestTemp();      // Запрашиваем преобразование температуры
  sensor2.requestTemp();
  sensor3.requestTemp();
  sensor4.requestTemp();
  sensor5.requestTemp();
  delay(5000);           // ожидаем результат 
  
 
  Serial.print("1 метр: ");
  if (sensor1.readTemp()) Serial.println(sensor1.getTemp());
  else Serial.println("error");
  Serial.print("2 метр: ");
  if (sensor2.readTemp()) Serial.println(sensor2.getTemp());
  else Serial.println("error");
    Serial.print("3 метр: ");
  if (sensor3.readTemp()) Serial.println(sensor3.getTemp());
  else Serial.println("error");
    Serial.print("4 метр: ");
  if (sensor4.readTemp()) Serial.println(sensor4.getTemp());
  else Serial.println("error");
    Serial.print("5 метр: ");
  if (sensor5.readTemp()) Serial.println(sensor5.getTemp());
  else Serial.println("error");

  
}

// 
void datatemp() {
  display.setTextSize(1); 
  display.setCursor(40,22);
  display.setTextColor(WHITE);
  display.print(sensor1.getTemp());
  display.setCursor(73,22);
  display.setTextColor(WHITE);
  display.print("\x80\C");
  display.setCursor(40,34);
  display.setTextColor(WHITE);
  display.print(sensor2.getTemp());
  display.setCursor(73,34);
  display.setTextColor(WHITE);
  display.print("\x80\C");
  display.setCursor(40,46);
  display.setTextColor(WHITE);
  display.print(sensor3.getTemp());
  display.setCursor(73,46);
  display.setTextColor(WHITE);
  display.print("\x80\C");
  display.setCursor(40,58);
  display.setTextColor(WHITE);
  display.print(sensor4.getTemp());
  display.setCursor(73,58);
  display.setTextColor(WHITE);
  display.print("\x80\C");
  display.setCursor(40,70);
  display.setTextColor(WHITE);
  display.print(sensor5.getTemp());
  display.setCursor(73,70);
  display.setTextColor(WHITE);
  display.print("\x80\C");

Спасибо за замечание, новичок что сказать)

Возможно есть алгоритм который просто значение меняет без очистки экрана? Кто ни то модет сталкивался с таким
Очень благодарен за помощь новичку
Спасибо

а зачем вы его обновляете? Вот смотрите - прямо с первой строки лупа:

и далее еще примерно 20-30 строк весь экран перерисовываете заново.
Зачем?

Я же новичок, нашел пример и его корректировал просто под свои нужды
Если можно компактно сделать, то как, исправлю все

Обновляйте содержимое экрана раз в 10 сек, например. Тогда мельтешения не будет заметно.

См. “Blink без Delay”

Проблема-то в чем, собственно? Что жить мешает?

1 лайк

Видео запишу, пришлю для примера, что не нравиться

Надо учиться всё своими словами описывать. Иначе и разговаривать то разучимся.

Так вот поясняю, не нравится, что перерисовываются все надписи командой display.fillScreen(); очистка экрана
Вот и хочется что бы надпись Температура ленты, надписи Д1, Д2, Д3, Д4, Д5, обозначение градусы не очищались
А менялись только цифровые значения температуры

Так как более понятно?

А получается, что экран очищается, заново рисуются все надписи и значение температуры меняется и выглядит как мерцание)

  1. выводи реже
    Или
  2. выводи при изменении температуры
    Или
  3. рисуй поверх старой цифры квадратик цветом фона, а не чисти весь экран
1 лайк

Какая функция квадрата?

Ну, друг. Сделай сам что-нибудь. Открой документацию к библиотеке и поищи какой-нить rectangle

Так так и делаю, смотрю варианты и пробую)

ЕЩЕ РАЗ - оно не кем-то “рисуется” , а ты сам это делаешь в коде.
Отсюда вывод - если тебе не нужно перерисовывать все - не перерисовывай.

Или старую цифру цветом фона, так проще, не нужны координаты квадратика.