Два ds18b20 управление с пульта (нужна помощь)

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
165
3
@poty, Вот спасибо огромное, встало как надо. Если мне надо вставить в конце строки °C я делаю так?
C++:
String(sensors_1.getTempCByIndex(0) - tempOffset, 1)+"°C";
и правлю здесь?
C++:
if (tempLength == 5) {
    matrix.drawChar( 32-5-5-5-6-6, y, temp[0], HIGH, LOW, 1);
    curSymbol = 1;
    tempLength--;
 

poty

★★★★★★✩
19 Фев 2020
3,237
942
У Вас получается 7 символов по 5 пикселей шириной. Даже если их размещать без интервала это - 35 пикселей. А у Вас - всего 32.
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
165
3
Можно уменьшить точку, С занимает 4 точки. Вот здесь помещается 1614454474663.jpg

И можно объяснить как отобразить + при плюсовой температуре?
 

poty

★★★★★★✩
19 Фев 2020
3,237
942
@S_Sergey_G, я не против, но используемая Вами библиотека не позволяет использовать шрифты других размеров. Конечно, можно нарисовать эти буквы и точку командами рисования...
И можно объяснить как отобразить + при плюсовой температуре?
Всё тоже самое, только увеличиваете количество символов на 1 при положительном значении числа и вместо символа выводите "+".
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
165
3
Спасибо Вам огромное. Теперь можно и в корпус оформлять. Цифры и точку я в библиотеке glcdfont.c уже менял.
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
165
3
Уважаемый @poty, мы хотели с сыном сами разобраться в коде который Вы нам дали. Но пока не получается, могли бы Вы прокомментировать этот код .
C++:
byte tempLength = temp.length();
  byte curSymbol = 0;
if (tempLength == 5) {
    matrix.drawChar( 32-5-5-5-6-6, y, temp[0], HIGH, LOW, 1);
    curSymbol = 1;
    tempLength--;
}
if (tempLength == 4) {
    matrix.drawChar( 32-5-5-5-6, y, temp[curSymbol], HIGH, LOW, 1);
    curSymbol++;
    tempLength--;
}
matrix.drawChar( 32-5-5-5, y, temp[curSymbol++], HIGH, LOW, 1);
matrix.drawChar( 32-5-5,   y, temp[curSymbol++], HIGH, LOW, 1);
matrix.drawChar( 32-5,        y, temp[curSymbol++], HIGH, LOW, 1);
 

poty

★★★★★★✩
19 Фев 2020
3,237
942
@S_Sergey_G, мне стыдно за этот код, если честно! :) Но я пытался мимикрировать под существующий код, который был изначально, чтобы не вводить Вас в непонятки, но, похоже, всё равно не достиг своей цели. Я уже писал, что нам нужно вывести от 3-х до 5 знаков. Я посчитал количество точек в горизонтальном ряду на дисплее = 32. Одно знакоместо занимает 5 точек, все знакоместа, кроме точки, отделяются единичным пустым столбцом из одной точки. Таким образом, последний знак по горизонтали будет располагаться начиная с точки 32-5 (справа пустой столбец не добавляем), далее идёт точка в позиции 32-5-5 (между точкой и последним символом столбец не добавляем), далее - третий обязательный знак - 32-5-5-5 (между знаком и точкой спайсер не добавляем), если есть четвёртый, то он уже будет размещаться в 6 столбцах - 32-5-5-5-6, аналогично пятый - 32-5-5-5-6-6. Надеюсь, найдёте эти комбинации в моём коде.
Теперь сам код:
templength хранит длину строки (напоминаю, она может быть от 3 до 5 символов).
curSymbol указывает на первый символ, подлежащий выводу.
Допустим, длина строки - tempLength = 4 символа. if(tempLength == 5) не сработает, зато сработает if(tempLength == 4), он выведет символ, на который указывает curSymbol (в нашем случае это = первый символ в строке) в позицию четвёртого знака на экране, увеличит curSymbol на единицу (перейдёт на следующий символ). Затем идёт вывод символа 2 в строке на третью позицию на экране, символа 3 - на вторую, символа 4 - на первую. Позиции я отсчитывал от правого края экрана. Вот, в-общем-то, и всё.
Пятизначное число буде выполняться, начиная с условия if(tempLength == 5), трёхзначное - пропустив все условия.
На самом деле, все эти вещи избыточны. Нужно просто выводить символы от правого края экрана и проверять, не достигли ли позиции tempLength. А ещё проще - вывести строку целиком, такая функция тоже есть в классе matrix, только тогда мы теряем контроль над расстоянием между символами.
 

bort707

★★★★★★✩
21 Сен 2020
3,066
914
Нужно просто выводить символы от правого края экрана и проверять, не достигли ли позиции tempLength. А ещё проще - вывести строку целиком, такая функция тоже есть в классе matrix, только тогда мы теряем контроль над расстоянием между символами.
как вариант - можно еще каждый символ выводить в заранее заданную позицию. Десятые доли градуса - начиня с 26-того символа по горизонтали, чуть левее - точку, потом единицы и тд
Для маленьких матриц и небольшого разнообразия информации это один из простейших способов форматирования
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
165
3
@bort707, Можно пример ?

@poty, Спасибо за объяснение кода! Проверьте пожалуйста правильно ли я сделал отобразив символ градусов? Получилось так.1614588161687.jpg
C++:
  temp = String(sensors_1.getTempCByIndex(0) - tempOffset, 1)+"C";  //  знак "С" перерисовал в °
C++:
if (tempLength == 6) {  // изменил 5 на 6
    matrix.drawChar( 32-5-5-5-6-6-6, y, temp[0], HIGH, LOW, 1); // добавил -6
    curSymbol = 1;
    tempLength--;
}
if (tempLength == 5) {   // изменил 4 на 5
    matrix.drawChar( 32-5-5-5-6-6, y, temp[curSymbol], HIGH, LOW, 1); //добавил -6
    curSymbol++;
    tempLength--;
}

matrix.drawChar( 32-5-5-5-6, y, temp[curSymbol++], HIGH, LOW, 1);  // добавил строку
matrix.drawChar( 32-5-5-5,   y, temp[curSymbol++], HIGH, LOW, 1);
matrix.drawChar( 32-5-5,        y, temp[curSymbol++], HIGH, LOW, 1);
matrix.drawChar( 32-5,        y, temp[curSymbol++], HIGH, LOW, 1);
 

poty

★★★★★★✩
19 Фев 2020
3,237
942
@S_Sergey_G, идея правильная, но есть неточности.
1. Суммарный размер вывода оказывается 5+5+5+6+6+6=33 точки, а доступны Вам только 32. Предлагаю десятичную точку выводить со смещением 4 единицы, а не 5 (третья строчка снизу и соответствующая цифра во всех строчках выше).
2. Цифра единиц сейчас отодвинута от десятичной точки на 6 единиц, а нужно на 5 (4-ая строчка снизу и соответствующая цифра во всех строчках выше).
3. Строку 9 нужно убрать, всё равно tempLength после этой строки не используется.
4. Не увидел, где Вы добавляете + при положительных числах (на выводе он тоже отсутствует).
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
165
3
@poty, Спасибо, поправил.
4. Не увидел, где Вы добавляете + при положительных числах (на выводе он тоже отсутствует).
С "+" не разобрался, ко всему этому надо еще увеличить количество символов? Или это отдельная команда для + типа такого (if(temp[0]!='-')temp="+"?
 

poty

★★★★★★✩
19 Фев 2020
3,237
942
Нет, не совсем. Здесь мы определяем длину преобразованной из числа строки, как она представлена после преобразования из числа функцией String():
C++:
byte tempLength = temp.length();
В случае положительного числа в эту строку плюс не добавляется. По условию, что основное число может быть только в двух форматах x.y° и zx.y°, знаки могут стоять в пятой или шестой позиции. Т.о, если число не отрицательное и исходной длиной 5 символов, то нужно вывести знак в 6-ой позиции, если не отрицательное и длиной 4 символа, то в пятой. Что это нам даёт:
  • если длина числа = 6, то это число с отрицательным знаком, в этом условии ничего не меняем:
  • если длина числа = 5, то это может быть число с положительным знаком, и тогда нужно добавить в 6-ой позиции знак "+", либо число с отрицательным знаком и добавлять ничего не нужно; т.е.:
C++:
if (tempLength == 5) {   // изменил 4 на 5
    if (temp[0] ! ="-" && curSymbol == 0) matrix.drawChar( 32-5-5-4-5-6-6, y, "+", HIGH, LOW, 1);
    matrix.drawChar( 32-5-5-4-5-6, y, temp[curSymbol], HIGH, LOW, 1); //добавил -6
    curSymbol++;
}
- если первоначальная длина числа = 4 (при этом curSymbol будет равен 0), то это может быть только число с положительным знаком, нужно добавить в пятой позиции знак "+":
C++:
matrix.drawChar( 32-5-5-4-5, y, temp[curSymbol++], HIGH, LOW, 1);  // добавил строку
if (curSymbol == 0) matrix.drawChar( 32-5-5-4-5-6, y, "+", HIGH, LOW, 1);  // добавляем плюс в предыдущей позиции
 
Изменено:

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
165
3
@poty, Вставил эти строки в код, поругался на
C++:
if (temp[0] ! ="-"
после ! убрал пробел правильно? После компиляции вместо + цифра 9.
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
165
3
Пробел правильно убрал? Заменил кавычки на одинарные,
C++:
if (temp[0] !='-'
все равно цифра.

Эта цифра появлялась и при минусовой температуре. При таких ~ -9.4. После смены кавычек в минусах пропала.

@bort707, Заменил кавычки "+" на одинарные появился +. Спасибо вам большое!!!
 

poty

★★★★★★✩
19 Фев 2020
3,237
942
Извиняйте за ошибку. Всё между дел, невнимательно отнёсся.
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
165
3
@poty, Все хорошо, мне наоборот интересно хоть, что то исправить. Спасибо большое за помощь!!!
Вот полный код термометра на двух датчиках ds18b20 и матрицах max7219 с переключением между датчиками пультом IR.
Код:
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
#include <DallasTemperature.h>
#include "IRremote.h"
IRrecv irrecv(A0);              // Указываем вывод, к которому подключен ИК приемник
decode_results results;
uint32_t Key1 = 0xFFA25D;      // Код кнопки ПДУ 1 датчик, подставляем свой код
uint32_t Key2 = 0xFFE21D;      // Код кнопки ПДУ 2 датчик, подставляем свой код

uint8_t updCnt = 0;
uint8_t dots = 0;
long dotTime = 0;
long clkTime = 0;

const uint8_t DS18B20_1 = 8;     // Указываем, к какому выводу подключен 1 датчик
const uint8_t DS18B20_2 = 7;     // Указываем, к какому выводу подключен 2 датчик
long previousMillis = 0;
uint8_t val=0;

uint8_t knopka = 0;               // Если не нажата на ПДУ 0 ((показ первый датчик)), иначе 1 (показ второй датчик)
uint8_t spacer = 2;
uint8_t width = 5 + spacer;       // Регулируем расстояние между символами
uint8_t refresh=0;
const uint8_t  pinCS = 10;                 // Подключение пина CS
uint8_t numberOfHorizontalDisplays = 4;    // Количество светодиодных матриц по Горизонтали
uint8_t numberOfVerticalDisplays = 1;      // Количество светодиодных матриц по Вертикали
String temp;                               // температура

Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
OneWire oneWire_1(DS18B20_1);
OneWire oneWire_2(DS18B20_2);               
DallasTemperature sensors_1(&oneWire_1);
DallasTemperature sensors_2(&oneWire_2);
byte brightness = 5;                        // Яркость матрицы от 0 до 15
// ===================================================================================================================================
void setup(void) {
  Serial.begin( 9600 ); 
  irrecv.enableIRIn();                      // запускаем прием ИК приемника

  sensors_1.begin();
  sensors_2.begin();
  matrix.setIntensity(brightness);            // Яркость матрицы от 0 до 15
  matrix.setRotation(matrix.getRotation()+2); // 1 - 90  2 - 180   3 - 270 угол поворота
                                   // начальные координаты матриц 8*8
  matrix.setRotation(0, 1);        // 1 матрица
  matrix.setRotation(1, 1);        // 2 матрица
  matrix.setRotation(2, 1);        // 3 матрица
  matrix.setRotation(3, 1);        // 4 матрица
}
// =======================================================================
void loop(void)
{ 
  DisplayTime();

  if ( irrecv.decode( &results )){         // Если данные с ПДУ пришли

//==================== для двух кнопок начало кода =============       
    if (results.value == Key1)                                     // если нажата кнопка 1
      {knopka = 1;}                                                // 1 датчик
    if (results.value == Key2)                                     // если нажата кнопка 2
      {knopka = 0;}                                                // 2 датчик
//==================== для двух кнопок конец кода =============     

    irrecv.resume();   // принимаем следующую команду
  }
}

void DisplayTime()
{
float tempOffset = 1.0;              // поправка датчика
  sensors_1.requestTemperatures();    // Считываем показания температуры 1 датчика
  sensors_2.requestTemperatures();    // Считываем показания температуры 2 датчика
  if(knopka == 0)
  {
  temp = String(sensors_1.getTempCByIndex(0) - tempOffset, 1)+"C";  // темп в стринг 1 датчика
  }
  else{
  temp = String(sensors_2.getTempCByIndex(0) - tempOffset, 1)+"C";  // темп в стринг 2 датчика
  }

  matrix.fillScreen(LOW);
  int y = (matrix.height() - 6) / 2;     // Центрируем текст по Вертикали по нижнему краю. По верхнему краю делаем так (int y = (matrix.height() - 8) / 2;

  byte tempLength = temp.length();
  byte curSymbol = 0;

if (tempLength == 6) {
    matrix.drawChar( 32-4-4-5-6-6-6, y, temp[0], HIGH, LOW, 1);
    curSymbol = 1;
    tempLength--;
}
if (tempLength == 5) {   // 
    if (temp[0] !='-' && curSymbol == 0) matrix.drawChar( 32-5-5-4-5-6-6, y, '+', HIGH, LOW, 1);
    matrix.drawChar( 32-5-5-4-5-6, y, temp[curSymbol], HIGH, LOW, 1); //
    curSymbol++;
}

matrix.drawChar( 32-5-5-4-5, y, temp[curSymbol++], HIGH, LOW, 1);  // 
if (curSymbol == 0) matrix.drawChar( 32-5-5-4-5-6, y, '+', HIGH, LOW, 1);  // добавляем плюс в предыдущей позиции
matrix.drawChar( 32-4-5-5,   y, temp[curSymbol++], HIGH, LOW, 1);
matrix.drawChar( 32-5-5,        y, temp[curSymbol++], HIGH, LOW, 1);
matrix.drawChar( 32-5,        y, temp[curSymbol++], HIGH, LOW, 1);

matrix.write();                                     // Вывод на дисплей
}
Знак градуса " ° " нарисовал вместо " С " в " glcdfont.c " в библиотеке " Adafruit-GFX-Library-master "
 

Вложения

Изменено: