Круглые часы на адресной светодиодной ленте

seve_len

✩✩✩✩✩✩✩
13 Сен 2018
70
3
40
@feniragon, Меня этикету оптимизированного кода не научили:), энергосбережение дуинки на фоне ленты - капля в море. Хрен с ним, пусть закрашивает все каждый раз по новой, все равно от сети будет работать. Жёваная часовая стрелка - чистая притча во языцах, душу ее мотылял.
 

feniragon

✩✩✩✩✩✩✩
31 Июл 2018
87
5
@seve_len, так этот код тоже не работает? И меня осенил вопрос... А зачем использовать модуль времени если можно использовать delay (60000) ?
 

seve_len

✩✩✩✩✩✩✩
13 Сен 2018
70
3
40
@feniragon, В чистом виде - нет. Тут нету счетчика на millis и команды заливки ленты strip.show() . Они ща два раза в сутки точное время показывают:D А со скобками все ништяк
 

feniragon

✩✩✩✩✩✩✩
31 Июл 2018
87
5
@seve_len, Блин, ну так добавь что нужно и попробуй. Я ж не для красоты код переписал. И повторюсь. Поясни что за код с кнопками? Лучше ж delay на минуту а не каждую милисекунду все переписывать
 

seve_len

✩✩✩✩✩✩✩
13 Сен 2018
70
3
40
@feniragon, И минуты не тикают. Тут исполнительный кусочек
if (millis() - timing > 50997) { //опытным путем подобранная "минута"
timing = millis();
m++;
if (m > 59){
m = 0;
}
if (m == 30){
h++;
}
отсутствует
 

seve_len

✩✩✩✩✩✩✩
13 Сен 2018
70
3
40
Дык я и так все вкручиваю, все хорошо получается, красиво. Код с кнопками работает, я им после каждой перепрошивки время подвожу.
При зажатии кнопки без (millis() - pause > 200) значания начинают очень быстро меняться. Одно нажатие - и пять минут или часов проскочило
 

feniragon

✩✩✩✩✩✩✩
31 Июл 2018
87
5
@seve_len, так у тебя просто две кнопки по которым ты выставляешь время? И уже работает с поправками выше ?
 

feniragon

✩✩✩✩✩✩✩
31 Июл 2018
87
5
@seve_len, :eek: а нельзя было нормально описать? при чем тут модуль времени тогда? Неужели мне нужно из тебя клещами ответы вытягивать, что б тебе же помочь? понятно, почему народ не отвечал.. Нормально описать не можешь и такие же ответы
 

seve_len

✩✩✩✩✩✩✩
13 Сен 2018
70
3
40
@feniragon, Я вроде и писал нормально. И суть проблемы описал.
Я так полагаю, что вот это:
" В обычных мех. часах часовая стрелка плавно шевелится, как полагается. В данной конструкции можно смещать только каждые 12 минут, и вроде все растёт, но переход через 0 (12) часов - и писесь. Как его победить? Во вложенном скетче этого нету, ибо меня этот кусочек выбесил и я его даже не сохранял. "
крайне непонятно.

Вот это:
"Циферблат такой конструкции подразумевает плавное (или относительно плавное) перемещение
часовой стрелки, а тут она резко перепрыгивает с, например, 6 на 7 часов. Я же же хотел реализовать
смещение на один диод каждые 12 минут. "
так же.
ТАк каким образом мне описать ПЛАВНОЕ (в рамках конструкции) перемещение часовой стрелки?
 

feniragon

✩✩✩✩✩✩✩
31 Июл 2018
87
5
@seve_len, 1.про кнопки я спрашивал. 2. твой писесь в 0 часов описывает эмоции, а не факт что именно происходит. Этот баг и надо исправить для начала. Мои правки исправили? 3. Да, плавное смещение раз в 12 минут. Можно добавить плавное изменение цвета и яркости стрелок
 

seve_len

✩✩✩✩✩✩✩
13 Сен 2018
70
3
40
@feniragon,
1. Кнопки - уже ответил, они работают.
2. Согласен, эмоция.
if (h == 0){
strip.setPixelColor(59, 250 ,0 ,0 ); //вот это для корректного отображения 12 часов
strip.setPixelColor(h*5, 250 ,0 ,0 );
strip.setPixelColor(h*5+1, 250 ,0 ,0 );
}
Собственно и есть заплатка в текущем режиме отображения.
3. Нет смещения. Прыгает сразу на следующий час.

Изменения цвета - это уже наляпистость, максимум - изменение яркости от освещенности, но это может быть потом
 

seve_len

✩✩✩✩✩✩✩
13 Сен 2018
70
3
40
Вот с такой доработкой:
if (millis() - timing > 50) {
timing = millis();
m++;
if (m > 59){
m = 0;
h++;
}
reg = m/12; // "сдвигающая" переменная
}
.............
strip.setPixelColor(h*5-1+reg, 250 ,0 ,0 ); // отображение часовой стрелки.
strip.setPixelColor(h*5+reg , 250 ,0 ,0 );
strip.setPixelColor(h*5+1+reg, 250 ,0 ,0 );

получается следующая картина

https://cloud.mail.ru/public/DLh7/QCqevtMrG
 

seve_len

✩✩✩✩✩✩✩
13 Сен 2018
70
3
40
Эх, спасибо за стимуляцию мозга, дорогой @feniragon, !
Добавил в заплатку

if (h == 0 && reg < 1){ // вот такое условие
strip.setPixelColor(59, 250 ,0 ,0 );
strip.setPixelColor(h*5, 250 ,0 ,0 );
strip.setPixelColor(h*5+1, 250 ,0 ,0 );

и стало почти то, что нужно.
Одна проблемка осталась - часы перевернуты на 180 градусов, точка отсчета внизу. Нахрен, обойду эту проблему путем замены подставки на подвесной крепёж.
 

seve_len

✩✩✩✩✩✩✩
13 Сен 2018
70
3
40
Ну, я пока могу только так. Поумнею - переделаю. А если заюзать map? хм, надо покурить над этим...
 

feniragon

✩✩✩✩✩✩✩
31 Июл 2018
87
5
C++:
#include <SPI.h>
#include "Adafruit_NeoPixel.h"
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, 12, NEO_GRB + NEO_KHZ800);

#define keyHor 5 //кнопки
#define keyMin 4
const int RED = 10; //сделано для упрощения подбора цветов и яркости
const int GREEN = 10;
const int BLUE = 10;
const int FIRSTLEDID = 0;
const int LEDCOUNT = 60;
const unsigned int MINUTEPERIOD = 60000; // минута в ms
const unsigned int PAUSEPERIOD = 200;
const int PLUS = 50;
unsigned long currentMillis;
unsigned long timing; //для счетчика времени
unsigned long pause; //для обработки кнопок
int m = 0; //минуты
int h = 0; //часы
int hoursDelta = 0;

void setup() {
    strip.begin(); // Функция begin() настроит порт Arduino и выставит значения по умолчанию.
    strip.show(); // Функция show() передаст команду на выключение всем пикселям.

    pinMode(keyHor, INPUT_PULLUP);
    pinMode(keyMin, INPUT_PULLUP);
    timing = millis();
    pause = millis();
}

void fillLED(){
    int i = 0;
    for (i = 0; i < LEDCOUNT; i++)
        strip.setPixelColor(i, R, G, B); //заливаем контур (60 светодиодов)
    for (i = FIRSTLEDID%5; i < FIRSTLEDID%5+LEDCOUNT; i = i+5)
        strip.setPixelColor(i, 0, G + PLUS, B); // заливаем зеленые разделители

    hoursDelta = m/12;
    int currentHourLed;
    if (h == 0){
        currentHourLed = FIRSTLEDID + LEDCOUNT; //вот это для корректного отображения 12 часов
    } else {
        currentHourLed = FIRSTLEDID + h*5; //для всех остальных часов
    }

    strip.setPixelColor((currentHourLed - 1)% LEDCOUNT + hoursDelta, 250, 0, 0);
    strip.setPixelColor((currentHourLed )% LEDCOUNT + hoursDelta, 250, 0, 0);
    strip.setPixelColor((currentHourLed + 1)% LEDCOUNT + hoursDelta, 250 ,0 ,0);

    strip.setPixelColor((FIRSTLEDID+m) % LEDCOUNT, 250, 0, 250); //Рисуем "минуту"
    strip.show();
}

void loop() {
    currentMillis = millis();
    if (currentMillis - timing >= MINUTEPERIOD) {
        timing = currentMillis;
        m++;
        if (m > 59) {
            m = 0;
            h++;  
        }
        if (h>11) {
            h = 0;
        }

        fillLED();
    }

    // обработка кнопок
    currentMillis = millis();
    if (currentMillis - pause > PAUSEPERIOD) {
        pause = currentMillis;
        if (!digitalRead(keyHor)){
            h++;
        }
        if (!digitalRead(keyMin)){
            m++;
        }
    }
}
 
Изменено:

seve_len

✩✩✩✩✩✩✩
13 Сен 2018
70
3
40
Высшие материи, я чет затупил......

О, через минуту проснулись) Какое коварство!
 

feniragon

✩✩✩✩✩✩✩
31 Июл 2018
87
5
@seve_len, посмотри таймеры, я ж поставил каждую минуту.
пар сек, еще пару правок внесу с первым диодом
 

feniragon

✩✩✩✩✩✩✩
31 Июл 2018
87
5
@seve_len, замечательно. А ты пока попробуй разобраться в чем отличия в моем варианте кода от твоего (не считая firstLedID, пару минут и поправлю его)