Часы на адресных светодиодах WS2812B

Valex60
Offline
Зарегистрирован: 14.11.2019

Добрый день.Сделал часы на адресной светодиодной ленте.Показывают время,год,месяц,день и температуру окружающей среды.Работают хорошо,но сыну не понравилась бегущая строка,попросил убрать ее и оставить только часы.Я кое-что убрал из кода,остались часы и температура,но не могу убрать временную паузу,которая образовалась вместо года,месяца,дня.Может кто-то сможет помочь?Оставить нужно просто часы.

 

/*
   Часы матрица на Arduino v1.01
   Страница проекта: https://arduino-tex.ru/news/30/chasy-matrica-na-arduino-i-adresnyh-sveto...
   Сайт разработчика https://portal-pk.ru/
   Проекты на Arduino https://portal-pk.ru/page-17/proekty-na-arduino.html
   Проекты на ESP https://arduino-tex.ru/menu/10/11/proekty-na-esp8266-esp32.html
   ЧПУ на Arduino и ESP32 https://cnc-tex.ru/
*/
#define FASTLED_ALLOW_INTERRUPTS 0

// uncomment following lines if using rtc (A4 = SDA, A5 = SCL)
#include <DS3232RTC.h>
#include <Wire.h>

#include <FastLED.h>
#include <TimeLib.h>

#include <EEPROM.h>

#define RESX 18                       // 18 столбцов
#define RESY 6                        //  6 строк
#define DIGITX 3                      // ширена символа
#define DIGITY 6                      // высота символа
#define LED_COUNT RESX * RESY         // размер матрицы
#define LED_PIN 6                     // Пин поключения ленты 6

time_t time;
CRGB leds[LED_COUNT];

byte brightness = 145;
byte saturation = 255;
byte startHue = 150;
byte k = 0;
byte digits[16][DIGITX * DIGITY] = {
  { 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1 },        // 0
  { 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0 },        // 1
  { 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1 },        // 2
  { 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1 },        // 3
  { 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1 },        // 4
  { 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1 },        // 5
  { 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1 },        // 6
  { 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1 },        // 7
  { 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1 },        // 8
  { 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1 },        // 9
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 },        // .
  { 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1 },        // t
  { 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }         // градус
};

/* переменные */
boolean lastButten = LOW;     // предыдущее состояние кнопки
boolean currentButten = LOW;  // текущее состояние кнопки

boolean lastButten1 = LOW;     // предыдущее состояние кнопки
boolean currentButten1 = LOW;  // текущее состояние кнопки
byte status = 0;       // текущий статус

byte button_1 = 4;  // кнопка
byte button_2 = 3;  // кнопка

void setup() {
  Serial.begin(9600);
  Serial.println("GridClock v1...");
  // uncomment following 3 lines if using rtc
  // Wire.begin();
  setSyncProvider(RTC.get);
  // setSyncInterval(30);
  FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, LED_COUNT);
  FastLED.setMaxPowerInVoltsAndMilliamps(5, 750);  // Limit power usage to 5V/500mA
  FastLED.setBrightness(brightness);
  // uncomment following 2 lines only to set time on rtc when uploading
  // setTime(21, 51, 45, 26, 2, 2019);  // set clock (24HH,MM,SS,Day,Month,Year)
  // RTC.set(now());
  clearDisplay();
  FastLED.show();
  brightness = EEPROM.read(1);
  startHue = EEPROM.read(2);
  pinMode(button_1, INPUT_PULLUP); // настроить пин кнопки
  pinMode(button_2, INPUT_PULLUP); // настроить пин кнопки
}


void loop() {
  displayTime(startHue);
  FastLED.show();
  delay(100);
  clearDisplay();
  // if (t % 10 == 0)
  //startHue++;
  currentButten = debvance (lastButten); // Передаем функции дребезга значение по умолчанию LOW
  if (lastButten == LOW && currentButten == HIGH) // Проверяем отпускали мы кнопку или нет
  {
    status++; // инвертируем Статус
  }
  lastButten =  currentButten;  // Переприсваеваем прошлое состояние кнопки


  currentButten1 = debvance1 (lastButten1); // Передаем функции дребезга значение по умолчанию LOW
  if (lastButten1 == LOW && currentButten1 == HIGH) // Проверяем отпускали мы кнопку или нет
  {

    if (status == 1)
    {
      brightness = brightness + 10;
      if (brightness > 130)
        brightness = 50;
      EEPROM.write(1, brightness); /// сохроняем в энерго независимую память яркоасть дисплеея

    }
    else if (status == 2)
    {
      sTime(1);
    }
    else if (status == 3)
    {
      sTime(2);
    }
    else if (status == 4)
    {
      sTime(3);
    }
    else if (status == 5)
    {
      sTime(4);
    }
    else if (status == 6)
    {
      sTime(5);
    }
    else if (status == 7)
    {
      sTime(6);
    }

    else
    {
      startHue = startHue + 10;
      if (startHue > 250)
        startHue = 10;
      EEPROM.write(2, startHue); // сохроняеи в энерго независимую память настроику цвета
    }

    if (status > 7)
      status = 0;

  }
  lastButten1 =  currentButten1;  // Переприсваеваем прошлое состояние кнопки

}

void sTime(int num) { // функция настройки часов

  int h = hour();
  int m = minute();
  int d = day();
  int mon = month();
  int y = year();

  if (num == 1)
  {
    h++;
    if (h > 23)
      h = 0;
  }
  if (num == 2)
  {
    m++;
    if (m > 59)
      m = 0;
  }
  if (num == 3)
  {
    d++;
    if (d > 31)
      d = 1;
  }

  if (num == 4)
  {
    mon++;
    if (mon > 12)
      mon = 1;

  }
  if (num == 5)
    y++;

  if (num == 6)
    y--;


  setTime(h, m, second(), d, mon, y);  // set clock (24HH,MM,SS,Day,Month,Year)

  setTime(h, m, second(), d, mon, y); /// обновляем 2 раз так так как увелчиваеться следующее значение.
  RTC.set(now());
}
///// Конец функции настройки часов ///

void displayTime(byte color) { /// выводзначений при настройке часов

  time_t t = now();


  byte colorOffset = 16;
  if (((second(t) > 20) and (second(t) < 30)) and (status < 2) )
  {
    int t = RTC.temperature();
    int celsius = t / 4.0;
    showDigit(11, 1, color);
    showDigit(celsius / 10, 6, color);
    showDigit(celsius % 10, 10, color);
    showDigit(12, 14, color);
  }
  else if (((second(t) < 50) or (status == 2) or (status == 3)) and (status != 4) and (status != 5) and (status != 6) and (status != 7))
  {

    if (status == 2)
    {
      if (second(t) % 2 == 0)
      {
        showDigit((hour(t) / 10), 1, color);
        showDigit((hour(t) % 10), 5, color);
      }
    }
    else
    {
      showDigit((hour(t) / 10), 1, color);
      showDigit((hour(t) % 10), 5, color);
    }
    if (status == 3)
    {
      if (second(t) % 2 == 0)
      {
        showDigit((minute(t) / 10), 11, color);
        showDigit((minute(t) % 10), 15, color);
      }
    }
    else
    {
      showDigit((minute(t) / 10), 11, color);
      showDigit((minute(t) % 10), 15, color);
    }
    if ((second(t) % 2 == 0) and (status != 2) and (status != 3)) {
      setPixel(9, 1, color);
      setPixel(9, 4, color);
      //startHue++;
    }
  }
  else if (((status != 2) and (status != 3)) or (status == 4) or (status == 5) or (status == 6) or (status == 7))
  {
    if (status == 4 or status == 5)
      k = 0; // сдвиг на экране
    else if (status == 6 or status == 7)
      k = 20; // сдвиг на экране
    else
      k++; // сдвиг на экране
    if (status == 4)
    {
      if (second(t) % 2 == 0)
      {
        showDigit((day() / 10), (0 - k), color);
        showDigit((day() % 10), (4 - k), color);
      }
    }
    else
    {
      showDigit((day() / 10), (0 - k), color);
      showDigit((day() % 10), (4 - k), color);
    }

    showDigit(10, (7 - k), color);

    if (status == 5)
    {
      if (second(t) % 2 == 0)
      {
        showDigit((month() / 10), (9 - k), color);
        showDigit((month() % 10), (13 - k), color);
      }
    }
    else
    {
      showDigit((month() / 10), (10 - k), color);
      showDigit((month() % 10), (14 - k), color);
    }

    showDigit(10, (17 - k), color);
    if (status == 6 or status == 7)
    {
      if (second(t) % 2 == 0)
      {
        showDigit(2, (20 - k), color);
        showDigit(0, (24 - k), color);
        showDigit(((year() - 2000) / 10), (28 - k), color);
        showDigit(((year() - 2000) % 10), (32 - k), color);
      }
    }
    else
    {
      showDigit(2, (20 - k), color);
      showDigit(0, (24 - k), color);
      showDigit(((year() - 2000) / 10), (28 - k), color);
      showDigit(((year() - 2000) % 10), (32 - k), color);
    }

    if (k == 33)
      k = -16;
  }
}
/// Конец функции - вывод значений при настройке часов

void showDigit(byte digit, byte x, byte color) { /// вывод символов на матрицу
  for (byte i = 0; i < (DIGITX * DIGITY); i++) {
    if (digits[digit][i] == 1) setPixel(x + (i - ((i / DIGITX) * DIGITX)), RESY - 1 - (i / DIGITX), color);
  }
}


void setPixel(byte x, byte y, byte color) {
  if (x < RESX && y < RESY) {

    if ((y % 2) == 0) {
      leds[(y * RESX) + x].setHSV(color, saturation, brightness);
    } else {
      leds[(y * RESX) + (RESX - (x + 1))].setHSV(color, saturation, brightness);
    }
  }
}


void clearDisplay() { /// чистка дисплеея
  for (byte i = 0; i < LED_COUNT; i++) {
    leds[i].setHSV(0, 0, 0);
  }
}

boolean debvance (boolean last) //убираем дребизг
{
  boolean current = digitalRead (button_1); // считываем данные с кнопки
  if (last != current) // Если текущее состояни еотличететься от предыдущего
  {
    delay (5);   // Ждем 5 милисек.
    current = digitalRead (button_1); // Присваеваем текущее состояние кнопки
    return current;
  }
}

boolean debvance1 (boolean last) //убираем дребизг
{
  boolean current = digitalRead (button_2); // считываем данные с кнопки
  if (last != current) // Если текущее состояни еотличететься от предыдущего
  {
    delay (5);   // Ждем 5 милисек.
    current = digitalRead (button_2); // Присваеваем текущее состояние кнопки
    return current;
  }
}

 

b707
Offline
Зарегистрирован: 26.05.2017

очередной г. код на тему часов...?  Куча повторов, две одинаковых функции дебонса...

Тут на форуме есть огромная ветка по ттаким часам, там масса вариантов кода, сходите, может что подберете себе. И вопросы по часам лучше задавать там.

Valex60
Offline
Зарегистрирован: 14.11.2019

смотрел я там,не нашел похожего,а поэтому и написал сюда.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А к автору кода обращались? Что говорит?

Valex60
Offline
Зарегистрирован: 14.11.2019

молчит и очень давно,мало того,с такой просьбой обращался не я один,никому не ответил к сожалению.

b707
Offline
Зарегистрирован: 26.05.2017

"перерыв в показе" когда происходит - между 50 и 0-вой секундой каждой минуты?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Valex60 пишет:

молчит и очень давно,мало того,с такой просьбой обращался не я один,никому не ответил к сожалению.

Это к вопросу как брать чужие, неподдерживаемые коды. Бесплатные коды можно брать в серьёзные проекты только под договор с автором. На этом, например, стоит весь бизнес вокруг "свободного ПО".

Valex60
Offline
Зарегистрирован: 14.11.2019

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

Valex60
Offline
Зарегистрирован: 14.11.2019

да,вроде так,я раньше не обращал на это внимание,сейчас посмотрел именно так и длиться это 10 секунд))

Valex60
Offline
Зарегистрирован: 14.11.2019

b 707  спасибо за подсказку,намек понял,осталось убрать температуру))

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

ИМХО в 143 строке 7 поменять на 3

Valex60
Offline
Зарегистрирован: 14.11.2019

Командир,пробовал,ничего не изменилось.То,что я убрал бегущую строку(год,месяц,день),это спасибо товарищу выше.Здорово натолкнул на мысль,осталось убрать t=20(cdth[сверху знак градуса,маленький квадрат).Но я думаю,что если это убрать,то снова появится пауза между временем и температурой))) и табло в это время будет темным.

b707
Offline
Зарегистрирован: 26.05.2017

Valex60 пишет:

b 707  спасибо за подсказку,намек понял,осталось убрать температуру))


температура в строке 205

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Valex60 пишет:

молчит и очень давно,мало того,с такой просьбой обращался не я один,никому не ответил к сожалению.

Неужели этот факт не навел на мысль отказаться от использования этого кода?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Valex60 пишет:

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

Почему автор не хочет "упростить" - совершенно понятно.

А вот почему те, что берет чужие коды, никак не хотят понять, что у них только 3 варианта:

1. Пользоваться тем, что есть, без всякой переделки.

2. Заказать переделку за отдельную плату.

3. Учиться программировать самому, после чего реализовывать не чужой, а свой проект.

b707
Offline
Зарегистрирован: 26.05.2017

Valex60 пишет:

да я понимаю,но он код "выложил" совершенно бесплатно,а вот почему не хочет "упростить" код,это непонятно.

как раз это совершенно прозрачно. По коду видно, что автор написал как умеет, и "упростить" этот код ему просто не под силу

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

 На этом, например, стоит весь бизнес вокруг "свободного ПО".

ага, берёшь - не работает, разбираешься, находишь баг, сам правишь, отписываешь, через месяц правят они, при последующем обновлении баг возвращён на место, плавали-знаем, а платишь денежку восстанавливают за 5 минут, всё рукотворное и специально )))

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Мне кажется, что проще написать 3 программы (потом подпрограммы), выдачи чего угодно на светодиодную ленту, считывание времени и считывание температуры. А далее - просто написать маленькую программу с использованием этих подпрограмм.

Valex60
Offline
Зарегистрирован: 14.11.2019

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А на последок я скажу:

Valex60 пишет:
оставьте Ваши мнения при себе!!
Получили!? Продолжайте дальше "решать вопросы"! :-)

Green
Offline
Зарегистрирован: 01.10.2015

Valex60 пишет:
...оставьте Ваши мнения при себе!!


А не боитесь, что пацан со временем посмотрит и скажет "какая лажа!"? Не стыдно будет?

SLKH
Offline
Зарегистрирован: 17.08.2015

b707 пишет:

Valex60 пишет:

да я понимаю,но он код "выложил" совершенно бесплатно,а вот почему не хочет "упростить" код,это непонятно.

как раз это совершенно прозрачно. По коду видно, что автор написал как умеет, и "упростить" этот код ему просто не под силу

Или ему это просто неинтересно.

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

Мегавольт
Мегавольт аватар
Offline
Зарегистрирован: 10.10.2018

SLKH пишет:

Или ему это просто неинтересно.

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

Вот бы эту глубокую мысль, многим тут , прочувствовать и следовать ей.  Я бы её в  свою тему перенёс... (там кстати тоже речь о часах) ...