Часы на трех матрицах 8x8 MAX7219

S_Sergey_G
Ст. сержант
Ст. сержант
Аватара
S_Sergey_G
Ст. сержант
Ст. сержант
Сообщения: 92
Зарегистрирован: 28 января 2021
С нами: 3 года 1 месяц

#141 S_Sergey_G » 28 февраля 2021, 18:18

Ну подправить то мы сможем? Я поставил знак "С", но мне кажется, что как то не так.
Здесь менял

Код: Выделить всё

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);
}

Но у них все ровненько а у меня от-3 до 16 цифры.


Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#142 Дим » 28 февраля 2021, 18:24

S_Sergey_G писал(а):поставил знак "С"
Вроде ранее уже его вставляли.
[center]i love you [s]mxIni[/s] Mysql[/center]

S_Sergey_G
Ст. сержант
Ст. сержант
Аватара
S_Sergey_G
Ст. сержант
Ст. сержант
Сообщения: 92
Зарегистрирован: 28 января 2021
С нами: 3 года 1 месяц

#143 S_Sergey_G » 28 февраля 2021, 19:25

Так теперь ребята убрали его. Если вставляю его то все сдвигается куда то в право и видны только начальные цифры. Я конечно все это сдвигал. но не знаю правильно или нет. Ну и плюсик хотелось бы.

S_Sergey_G
Ст. сержант
Ст. сержант
Аватара
S_Sergey_G
Ст. сержант
Ст. сержант
Сообщения: 92
Зарегистрирован: 28 января 2021
С нами: 3 года 1 месяц

#144 S_Sergey_G » 28 февраля 2021, 19:27

Вот выдержка их размышлений. "Имеем длину дисплея в 32 точки. Исходя из первоначального скетча ширина цифр - 5 точек + одна точка - интервал между символами. Была произведена попытка исключить интервал до и после знака десятичной точки.
Форматирование с помощью функции String ограничивает количество знаков после запятой одним. Длина получающегося числа может быть от трёх символов (0.1, 3.2 и т.п.) до 5 символов .
Первое, что нужно сделать - убрать ненужный пробел в строке:
Второе - нужно определить длину строки и вывести всё с последнего знакоместа"

Про плюс: Всё тоже самое, только увеличиваете количество символов на 1 при положительном значении числа и вместо символа выводите "+".

Хотел сам разобраться ну пока не получается.

S_Sergey_G
Ст. сержант
Ст. сержант
Аватара
S_Sergey_G
Ст. сержант
Ст. сержант
Сообщения: 92
Зарегистрирован: 28 января 2021
С нами: 3 года 1 месяц

#145 S_Sergey_G » 1 марта 2021, 13:36

Вот почти доделал. От знака "С" отказался, оставил только "°" в коде стоит "С" но я перерисовал в glcdfont на градус. Знак "°" там не нашел. Осталось добавить "+"

Код: Выделить всё

#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;         // Центрируем текст по Вертикали

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

if (tempLength == 6) { // изменил на 6
    matrix.drawChar( 32-4-4-5-6-6-6, y, temp[0], HIGH, LOW, 1);
    curSymbol = 1;
    tempLength--;
}
if (tempLength == 5) {
    matrix.drawChar( 32-4-4-5-6-6, y, temp[curSymbol], HIGH, LOW, 1);
    curSymbol++;
    tempLength--;
}

matrix.drawChar( 32-4-4-5-6, y, temp[curSymbol++], 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();                                     // Вывод на дисплей
}

S_Sergey_G
Ст. сержант
Ст. сержант
Аватара
S_Sergey_G
Ст. сержант
Ст. сержант
Сообщения: 92
Зарегистрирован: 28 января 2021
С нами: 3 года 1 месяц

#146 S_Sergey_G » 1 марта 2021, 19:51

Дим
Спасибо Вам большое. Столько внимания мне уделили. Вот Ваш код который уважаемый bort707 привел в порядок. И + есть.

Код: Выделить всё

#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;         // Центрируем текст по Вертикали

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

if (tempLength == 6) { // изменил на 6
    matrix.drawChar( 32-4-4-5-6-6-6, y, temp[0], HIGH, LOW, 1);
    curSymbol = 1;
}
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++;
}

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();                                     // Вывод на дисплей
}

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#147 Дим » 4 марта 2021, 12:42

Рад что получилось.
[center]i love you [s]mxIni[/s] Mysql[/center]

Deniskyn M
Рядовой
Рядовой
Аватара
Deniskyn M
Рядовой
Рядовой
Сообщения: 11
Зарегистрирован: 11 февраля 2021
С нами: 3 года 1 месяц

#148 Deniskyn » 3 апреля 2021, 2:04

Никак не могу понять... тема "Часы на трех матрицах 8x8", а обсуждения про 4 =( так 3 или 4???
Очень хотелось бы компактный вариант на 3х =)

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#149 Дим » 3 апреля 2021, 10:46

Deniskyn писал(а):так 3 или 4
3 это часы а 4 это термометр
[center]i love you [s]mxIni[/s] Mysql[/center]


  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Программирование»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 5 гостей
Боты: MailRu [Bot]