DS18B20 вывод на TFT дисплей

Подскажите. Подключил 4 датчика ds18b20 через sensorshield к 4м каналам. Выводит показание -127.00. Подскажите, в чем ошибка?

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

#define ONE_WIRE_BUS 7
#define ONE_WIRE_BUS 6
#define ONE_WIRE_BUS 5
#define ONE_WIRE_BUS 4

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

TFT_eSPI tft = TFT_eSPI();
uint16_t color24to16( uint8_t r, uint8_t g, uint8_t b ){
    uint16_t c = ((r & 0xF8)<<8) | ((g & 0xFC)<<3) | ((b & 0xF8)>>3);
    Serial.println(c, HEX);
    return c;
}
void setup() {

  Serial.begin(115200);

    color24to16(0xC8, 0x8C, 0x1E);
    tft.init(); 
    tft.setRotation(1); 
    tft.fillScreen(TFT_WHITE); 

    tft.setCursor(50, 12); // x,y координаты текста
    tft.setTextColor( color24to16(0,0,0)); 
    tft.setTextSize(3); // размер текста - №2 (7*2 = 14 точек)
    tft.print("Показания температуры"); 


    tft.setCursor(20, 82); // x,y координаты текста
    tft.setTextColor( color24to16(0,0,0) ); 
    tft.setTextSize(3); // размер текста - №2 (7*2 = 14 точек)
    tft.print("Подача"); // вывод текста

    tft.setCursor(20, 146); // x,y координаты текста
    tft.setTextColor( color24to16(0,0,0) ); 
    tft.setTextSize(3); // размер текста - №2 (7*2 = 14 точек)
    tft.print("1"); // вывод текста

    tft.setCursor(20, 208); // x,y координаты текста
    tft.setTextColor( color24to16(0,0,0) ); 
    tft.setTextSize(3); // размер текста - №2 (7*2 = 14 точек)
    tft.print("2"); // вывод текста

    tft.setCursor(20, 268); // x,y координаты текста
    tft.setTextColor( color24to16(0,0,0) ); // цвет текста - КРАСНЫЙ
    tft.setTextSize(3); // размер текста - №2 (7*2 = 14 точек)
    tft.print("Отток"); // вывод текста

    tft.drawRect(2, 64, 475, 60, color24to16(255,255,0));
    tft.drawRect(350, 64, 127, 60, color24to16(255,255,0));
    tft.drawRect(2, 128, 475, 60, color24to16(0,0,255));
    tft.drawRect(350, 128, 127, 60, color24to16(0,0,255));
    tft.drawRect(2, 190, 475, 60, color24to16(0,255,255));
    tft.drawRect(350, 190, 127, 60, color24to16(0,255,255));
    tft.drawRect(2, 254, 475, 60, color24to16(255,0,255));
    tft.drawRect(350, 254, 127, 60, color24to16(255,0,255));

  
}


void loop() {
  sensors.begin();
  sensors.setResolution(10);
  sensors.requestTemperatures();
  float temp1 = sensors.getTempCByIndex(4);
  float temp2 = sensors.getTempCByIndex(5);
  float temp3 = sensors.getTempCByIndex(6);
  float temp4 = sensors.getTempCByIndex(7);
  Serial.println(temp1);
  Serial.println(temp2);
  Serial.println(temp3);
  Serial.println(temp4);
  Serial.println(   );
  delay(100);

  tft.setCursor(352, 72); // x,y координаты текста
  tft.setTextColor( color24to16(0,0,0) ); // цвет текста - ЗЕЛЕНЫЙ
  tft.setTextSize(3); // размер текста - №2 (7*2 = 14 точек)
  tft.print(temp1);
  tft.setCursor(352, 136); // x,y координаты текста
  tft.setTextColor( color24to16(0,0,0) ); // цвет текста - ЗЕЛЕНЫЙ
  tft.setTextSize(3); 
  tft.print(temp2);
  sensors.requestTemperatures();
   tft.setCursor(352, 200); // x,y координаты текста
  tft.setTextColor( color24to16(0,0,0) ); 
  tft.setTextSize(3); // размер текста - №2 (7*2 = 14 точек)
  tft.print(temp3);
   tft.setCursor(352, 264); // x,y координаты текста
  tft.setTextColor( color24to16(0,0,0) ); // цвет текста - ЗЕЛЕНЫЙ
  tft.setTextSize(3); // размер текста - №2 (7*2 = 14 точек)
  tft.print(temp4);

}

Прикольно ))

Слаб, но очень хочу разобраться) Я так понимаю жесткий косяк.

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

Зы: строки 69 и 70 должны располагаться в setup()

Зыы: для начала попробуйте примеры, идущие с библиотекой

Т. е. Каждый датчик к своему пину? А работать пытаетесь, как будто они все на одной линии

Не работал с этой библиотекой, но чисто логически здесь идет получение данных с датчика по его индексу на линии. Откуда у вас там индексы 4…7, если у вас всего четыре датчика? А с учетом того, что на самом деле датчик на линии вообще один…

-127 - это отсутствие датчика, что вполне логично ))

Вот и не могу понять, как вывести 4 датчика. Если поможете, буду безмерно благодарен!)

Точно, поменял индексы на 0,1,2,3 . На “подачу” вывел показание, остальные 3 также не видит. Но показания новые выводит поверх старых.

Повторю вопрос - датчики подключены каждый к своему пину ардуины? Тогда как вы хотите прочитать данные остальных, читая только один канал?

Да, датчики каждый на свой канал.

Тогда и

Нужно объявлять для каждой линии. И работать с каждым отдельно.

Или подключите все датчики на одну линию параллельно друг другу

OneWire  _ow7(7);
DallasTemperature sensors(&oneWire);
OneWire  _ow6(6);
DallasTemperature sensors(&oneWire);
OneWire  _ow4(4);
DallasTemperature sensors(&oneWire);
OneWire  _ow5(5);
DallasTemperature sensors(&oneWire);

По такому примеру?

Ну ведь бредово вышло, не находите?

OneWire  _ow7(7);
DallasTemperature sensors7(&_ow7);
OneWire  _ow6(6);
DallasTemperature sensors6(&_ow6);
OneWire  _ow4(4);
DallasTemperature sensors4(&_ow4);
OneWire  _ow5(5);
DallasTemperature sensors5(&_ow5);

И каждому датчику выполнить begin(), задать разрешение, и запрашивать температуру с каждого отдельно

СПАСИБО БОЛЬШОЕ! Получилось. Единственное идет наложение старых показаний на новые)

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


OneWire  _ow7(7);
DallasTemperature sensors7(&_ow7);
OneWire  _ow6(6);
DallasTemperature sensors6(&_ow6);
OneWire  _ow4(4);
DallasTemperature sensors4(&_ow4);
OneWire  _ow5(5);
DallasTemperature sensors5(&_ow5);
//DeviceAddress Thermometer1 = {0x28, 0x4D, 0x4E, 0x45, 0xD4, 0xD6, 0x38, 0x2};
//DeviceAddress Thermometer2 = {0x28, 0xD9, 0x9C, 0x45, 0xD4, 0x6E, 0x55, 0x5E};
//DeviceAddress Thermometer3 = {0x28, 0x9F, 0xE2, 0x45, 0xD4, 0x8E, 0x6B, 0x82};
//DeviceAddress Thermometer4 = {0x28, 0xD9, 0x9C, 0x45, 0xD4, 0x6E, 0x55, 0x5E};

TFT_eSPI tft = TFT_eSPI();
uint16_t color24to16( uint8_t r, uint8_t g, uint8_t b ){
    uint16_t c = ((r & 0xF8)<<8) | ((g & 0xFC)<<3) | ((b & 0xF8)>>3);
    Serial.println(c, HEX);
    return c;
}
void setup() {

  Serial.begin(115200);

    color24to16(0xC8, 0x8C, 0x1E);
    tft.init(); // инициализация дисплея
    tft.setRotation(1); // вращение на 180 градусов
    tft.fillScreen(TFT_WHITE); // заливка фона чёрным цветом

    tft.setCursor(50, 12); // x,y координаты текста
    tft.setTextColor( color24to16(0,0,0)); // цвет текста - СИНИЙ
    tft.setTextSize(3); // размер текста - №2 (7*2 = 14 точек)
    tft.print("Показания температуры"); // вывод текста


    tft.setCursor(20, 82); // x,y координаты текста
    tft.setTextColor( color24to16(0,0,0) ); // цвет текста - СИНИЙ
    tft.setTextSize(3); // размер текста - №2 (7*2 = 14 точек)
    tft.print("Подача"); // вывод текста

    tft.setCursor(20, 146); // x,y координаты текста
    tft.setTextColor( color24to16(0,0,0) ); // цвет текста - ЖЕЛТЫЙ
    tft.setTextSize(3); // размер текста - №2 (7*2 = 14 точек)
    tft.print("1"); // вывод текста

    tft.setCursor(20, 208); // x,y координаты текста
    tft.setTextColor( color24to16(0,0,0) ); // цвет текста - ЗЕЛЕНЫЙ
    tft.setTextSize(3); // размер текста - №2 (7*2 = 14 точек)
    tft.print("2"); // вывод текста

    tft.setCursor(20, 268); // x,y координаты текста
    tft.setTextColor( color24to16(0,0,0) ); // цвет текста - КРАСНЫЙ
    tft.setTextSize(3); // размер текста - №2 (7*2 = 14 точек)
    tft.print("Отток"); // вывод текста

    tft.drawRect(2, 64, 475, 60, color24to16(255,255,0));
    tft.drawRect(350, 64, 127, 60, color24to16(255,255,0));
    tft.drawRect(2, 128, 475, 60, color24to16(0,0,255));
    tft.drawRect(350, 128, 127, 60, color24to16(0,0,255));
    tft.drawRect(2, 190, 475, 60, color24to16(0,255,255));
    tft.drawRect(350, 190, 127, 60, color24to16(0,255,255));
    tft.drawRect(2, 254, 475, 60, color24to16(255,0,255));
    tft.drawRect(350, 254, 127, 60, color24to16(255,0,255));

    sensors7.begin();
    sensors7.setResolution(10);
    sensors6.begin();
    sensors6.setResolution(10);
    sensors5.begin();
    sensors5.setResolution(10);
    sensors4.begin();
    sensors4.setResolution(10);
}


void loop() {
  sensors7.requestTemperatures();
  float temp1 = sensors7.getTempCByIndex(0);
  sensors6.requestTemperatures();
  float temp2 = sensors6.getTempCByIndex(0);
  sensors5.requestTemperatures();
  float temp3 = sensors5.getTempCByIndex(0);
  sensors4.requestTemperatures();
  float temp4 = sensors4.getTempCByIndex(0);
  
  delay(100);

  tft.setCursor(352, 72); // x,y координаты текста
  tft.setTextColor( color24to16(0,0,0) ); // цвет текста - ЗЕЛЕНЫЙ
  tft.setTextSize(3); // размер текста - №2 (7*2 = 14 точек)
  tft.print(temp1);
  tft.setCursor(352, 136); // x,y координаты текста
  tft.setTextColor( color24to16(0,0,0) ); // цвет текста - ЗЕЛЕНЫЙ
  tft.setTextSize(3); // размер текста - №2 (7*2 = 14 точек)
  tft.print(temp2);
   tft.setCursor(352, 200); // x,y координаты текста
  tft.setTextColor( color24to16(0,0,0) ); // цвет текста - ЗЕЛЕНЫЙ
  tft.setTextSize(3); // размер текста - №2 (7*2 = 14 точек)
  tft.print(temp3);
   tft.setCursor(352, 264); // x,y координаты текста
  tft.setTextColor( color24to16(0,0,0) ); // цвет текста - ЗЕЛЕНЫЙ
  tft.setTextSize(3); // размер текста - №2 (7*2 = 14 точек)
  tft.print(temp4);

}

Наложение решил добавлением второго параметра цвета.

tft.setTextColor( color24to16(0,0,0), color24to16(255,255,255) );
1 лайк

крайне поддерживаю именно такое подключение.

Проще, и схема и реализация.