Коррекция показаний датчика температуры

Прошу прощения. Я новичок в этом деле. Собрал схемку. Термометр на базе датчика DS18B20 выводит показания на дисплей.
 © (https://robohobby.by/lessons/ds18b20_tutorial/?ysclid=mm3434a48w921702849 )
Скетч выше. Немного переделал его на дисплей 128х64 символа. Все вроде бы работает, но либо датчик врет, либо показания кривые. 
Подскажите как внести корректировку показаний температуры?

// подключение библиотек для работы с OLED
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// подключение библиотек для работы с DS18B20
#include <OneWire.h>
#include <DallasTemperature.h>
/------------------------------------------------/
#define OLED_RESET 7
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define ONE_WIRE_BUS 7 // вывод, к которому подключён DS18B20
#define TEMPERATURE_PRECISION 12 // точность измерений (9 … 12)

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensor(&oneWire);
DeviceAddress Thermometer;

float temp = 0.0; // текущее значение температуры
float min_temp = 100.0; // минимальное значение температуры
float max_temp = 0.0; // максимальное значение температуры
/------------------------------------------------/
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // инициализация дисплея по интерфейсу I2C, адрес 0x3C (для OLED 128x64)
display.clearDisplay(); // очистка дисплея
display.setTextColor(WHITE); // установка цвета текста
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

sensor.begin(); // инициализация DS18B20
sensor.getAddress(Thermometer, 0); // адрес DS18B20 (поиск по индексу)
#define TEMPERATURE_PRECISION 11// точность измерений (9 … 12)
}
/------------------------------------------------/
void loop() {

sensor.requestTemperatures(); // считывание значение температуры
temp = sensor.getTempC(Thermometer); // температура в градусах Цельсия

if (temp > max_temp) max_temp = temp; // обновление минимального значения температуры
if (temp < min_temp) min_temp = temp; // обновление максимального значения температуры

display.clearDisplay(); // очистить дисплей
display.setTextSize(1); // установка размера шрифта
display.setCursor(0, 0); // установка курсора в позицию X = 0; Y = 0
display.setTextSize(3); // установка размера шрифта
display.print(String(temp)); // выводим значение температуры на экран
display.print((char)247); // и рисуем
display.println(“C”); // знак цельсия
display.setTextSize(2); // установка размера шрифта
display.println("Max " + String (max_temp)); // выводим на OLED максимальную температуру
display.print("Min " + String (min_temp)); // и минимальную температуру
display.display(); // всё это отображаем на экране
}




Начните с этого

либо руки.

2 лайка

Я вижу вы всем так отвечаете.

Спасибо. Я читал правила. три ``` сверху хода и снизу я вставлял. Почему они не применились, извините, не знаю.

Потому что неправильно вставили. Или не те апострофы. Специально для этого на панели есть кнопка </>

они применились! Да только не там где надо… У вас сообщение внутри тегов кода, а код как обычный текст

что поделать, если 80% новичков читать не умеют…

1 лайк

Прям, как в том анекдоте:

– Мыкола, ты коня поил?
– Поил.
– А чего у него морда сухая?
– Та, он до воды не достал.

В украинском оригинале звучит красивее, уж извините за мой кривой перевод.

2 лайка

// подключение библиотек для работы с OLED
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// подключение библиотек для работы с DS18B20
#include <OneWire.h>
#include <DallasTemperature.h>
/------------------------------------------------/
#define OLED_RESET 7
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define ONE_WIRE_BUS 7 // вывод, к которому подключён DS18B20
#define TEMPERATURE_PRECISION 12 // точность измерений (9 … 12)

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensor(&oneWire);
DeviceAddress Thermometer;

float temp = 0.0; // текущее значение температуры
float min_temp = 100.0; // минимальное значение температуры
float max_temp = 0.0; // максимальное значение температуры
/------------------------------------------------/
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // инициализация дисплея по интерфейсу I2C, адрес 0x3C (для OLED 128x64)
display.clearDisplay(); // очистка дисплея
display.setTextColor(WHITE); // установка цвета текста
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

sensor.begin(); // инициализация DS18B20
sensor.getAddress(Thermometer, 0); // адрес DS18B20 (поиск по индексу)
#define TEMPERATURE_PRECISION 11// точность измерений (9 … 12)
}
/------------------------------------------------/
void loop() {

sensor.requestTemperatures(); // считывание значение температуры
temp = sensor.getTempC(Thermometer); // температура в градусах Цельсия

if (temp > max_temp) max_temp = temp; // обновление минимального значения температуры
if (temp < min_temp) min_temp = temp; // обновление максимального значения температуры

display.clearDisplay(); // очистить дисплей
display.setTextSize(1); // установка размера шрифта
display.setCursor(0, 0); // установка курсора в позицию X = 0; Y = 0
display.setTextSize(3); // установка размера шрифта
display.print(String(temp)); // выводим значение температуры на экран
display.print((char)247); // и рисуем
display.println(“C”); // знак цельсия
display.setTextSize(2); // установка размера шрифта
display.println("Max " + String (max_temp)); // выводим на OLED максимальную температуру
display.print("Min " + String (min_temp)); // и минимальную температуру
display.display(); // всё это отображаем на экране
}

​​Ответить

Не получилось, попробуйте ещё раз.

1 лайк

оть я и говорю, шота с руками.

2 лайка

Ну ведь читали же

Код должен быть МЕЖДУ ```, а не после них. Пробуйте еще раз

@porhovich
Чтоб было понятнее - вот как выглядит ваше сообщение:

сначала пустой блок для кода, а потом собственно код.

Неужели трудно вставить код ВНУТРЬ ?

Вообще, это такой тест для начинающих программистов. Если не пройдете - не связывайтесь с программированием, это слишком сложно…

2 лайка

В крайнем случае можно вставить код просто текстом, потом выделить его весь и нажать кнопку </> на панели

1 лайк

```

// подключение библиотек для работы с OLED
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// подключение библиотек для работы с DS18B20
#include <OneWire.h>
#include <DallasTemperature.h>
/------------------------------------------------/
#define OLED_RESET 7
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define ONE_WIRE_BUS 7 // вывод, к которому подключён DS18B20
#define TEMPERATURE_PRECISION 12 // точность измерений (9 … 12)

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensor(&oneWire);
DeviceAddress Thermometer;

float temp = 0.0; // текущее значение температуры
float min_temp = 100.0; // минимальное значение температуры
float max_temp = 0.0; // максимальное значение температуры
/------------------------------------------------/
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // инициализация дисплея по интерфейсу I2C, адрес 0x3C (для OLED 128x64)
display.clearDisplay(); // очистка дисплея
display.setTextColor(WHITE); // установка цвета текста
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

sensor.begin(); // инициализация DS18B20
sensor.getAddress(Thermometer, 0); // адрес DS18B20 (поиск по индексу)
#define TEMPERATURE_PRECISION 11// точность измерений (9 … 12)
}
/------------------------------------------------/
void loop() {

sensor.requestTemperatures(); // считывание значение температуры
temp = sensor.getTempC(Thermometer); // температура в градусах Цельсия

if (temp > max_temp) max_temp = temp; // обновление минимального значения температуры
if (temp < min_temp) min_temp = temp; // обновление максимального значения температуры

display.clearDisplay(); // очистить дисплей
display.setTextSize(1); // установка размера шрифта
display.setCursor(0, 0); // установка курсора в позицию X = 0; Y = 0
display.setTextSize(3); // установка размера шрифта
display.print(String(temp)); // выводим значение температуры на экран
display.print((char)247); // и рисуем
display.println(“C”); // знак цельсия
display.setTextSize(2); // установка размера шрифта
display.println("Max " + String (max_temp)); // выводим на OLED максимальную температуру
display.print("Min " + String (min_temp)); // и минимальную температуру
display.display(); // всё это отображаем на экране
}

```


// подключение библиотек для работы с OLED
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// подключение библиотек для работы с DS18B20
#include <OneWire.h>
#include <DallasTemperature.h>
/*------------------------------------------------*/
#define OLED_RESET 7
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define ONE_WIRE_BUS 7 // вывод, к которому подключён DS18B20
#define TEMPERATURE_PRECISION 12 // точность измерений (9 … 12)

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensor(&oneWire);
DeviceAddress Thermometer;

float temp = 0.0; // текущее значение температуры
float min_temp = 100.0; // минимальное значение температуры
float max_temp = 0.0; // максимальное значение температуры
/*------------------------------------------------*/
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // инициализация дисплея по интерфейсу I2C, адрес 0x3C (для OLED 128x64)
display.clearDisplay(); // очистка дисплея
display.setTextColor(WHITE); // установка цвета текста
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

sensor.begin(); // инициализация DS18B20
sensor.getAddress(Thermometer, 0); // адрес DS18B20 (поиск по индексу)
#define TEMPERATURE_PRECISION 11// точность измерений (9 … 12)
}
/*------------------------------------------------*/
void loop() {

sensor.requestTemperatures(); // считывание значение температуры
temp = sensor.getTempC(Thermometer); // температура в градусах Цельсия

if (temp > max_temp) max_temp = temp; // обновление минимального значения температуры
if (temp < min_temp) min_temp = temp; // обновление максимального значения температуры

display.clearDisplay(); // очистить дисплей
display.setTextSize(1); // установка размера шрифта
display.setCursor(0, 0); // установка курсора в позицию X = 0; Y = 0
display.setTextSize(3); // установка размера шрифта
display.print(String(temp)); // выводим значение температуры на экран
display.print((char)247); // и рисуем
display.println(“C”); // знак цельсия
display.setTextSize(2); // установка размера шрифта
display.println("Max " + String (max_temp)); // выводим на OLED максимальную температуру
display.print("Min " + String (min_temp)); // и минимальную температуру
display.display(); // всё это отображаем на экране
}
1 лайк

а то ведь опять скажут, что тут все злые

// подключение библиотек для работы с OLED
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// подключение библиотек для работы с DS18B20
#include <OneWire.h>
#include <DallasTemperature.h>
/ ------------------------------------------------ /
#define OLED_RESET 7
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define ONE_WIRE_BUS 7 // вывод, к которому подключён DS18B20
#define TEMPERATURE_PRECISION 12 // точность измерений (9 … 12)

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensor(&oneWire);
DeviceAddress Thermometer;

float temp = 0.0; // текущее значение температуры
float min_temp = 100.0; // минимальное значение температуры
float max_temp = 0.0; // максимальное значение температуры
/ ------------------------------------------------ /
void setup() {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // инициализация дисплея по интерфейсу I2C, адрес 0x3C (для OLED 128x64)
  display.clearDisplay(); // очистка дисплея
  display.setTextColor(WHITE); // установка цвета текста
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

  sensor.begin(); // инициализация DS18B20
  sensor.getAddress(Thermometer, 0); // адрес DS18B20 (поиск по индексу)
#define TEMPERATURE_PRECISION 11// точность измерений (9 … 12)
}
/ ------------------------------------------------ /
void loop() {

  sensor.requestTemperatures(); // считывание значение температуры
  temp = sensor.getTempC(Thermometer); // температура в градусах Цельсия

  if (temp > max_temp) max_temp = temp; // обновление минимального значения температуры
  if (temp < min_temp) min_temp = temp; // обновление максимального значения температуры

  display.clearDisplay(); // очистить дисплей
  display.setTextSize(1); // установка размера шрифта
  display.setCursor(0, 0); // установка курсора в позицию X = 0; Y = 0
  display.setTextSize(3); // установка размера шрифта
  display.print(String(temp)); // выводим значение температуры на экран
  display.print((char)247); // и рисуем
  display.println(“C”); // знак цельсия
  display.setTextSize(2); // установка размера шрифта
  display.println("Max " + String (max_temp)); // выводим на OLED максимальную температуру
  display.print("Min " + String (min_temp)); // и минимальную температуру
  display.display(); // всё это отображаем на экране
}

ну поехали
зачем дублируется дефайны в строках 28,29 и 33?

А какие тут все?