51

Re: Часы на адресной ленте WS2812 (Разработка)

khvalyuk пишет:

День добрый.
Большое спасибо за разработку.
Часы собрал (7 сегментов x  4 LED) x 4 цифры + 2 LED на точки = 114 диодов, WS2813).
Внес поправки на  4 диода в сегменте. Все работает.

Но есть вопрос.
В программировании, мягко говоря, слаб.

Как я понял, вот этот фрагмент

switch(mode){
    case 0: r_led=1,g_led=1,b_led=1; break;
    case 1: r_led=1,g_led=0,b_led=0; break;
    case 2: r_led=0,g_led=1,b_led=0; break;
    case 3: r_led=0,g_led=0,b_led=1; break;
    case 4: r_led=1,g_led=1,b_led=0; break;
    case 5: r_led=1,g_led=0,b_led=1; break;
    case 6: r_led=0,g_led=1,b_led=1; break;
    case 7: r_led=0,g_led=0,b_led=0; break;
    }

переключает цвета при нажатии соответствующей кнопки.
Вопрос: что означают значения 1 и 0 для  r_red, g_led b b_led ?

Экспериментально я выяснил, что при включении питания диоды загораются с цветом, соответствующим сase 1.

Какими должны быть значения r_red, g_led b b_led, чтобы исходным был зеленый цвет? красный цвет? синий цвет?

Вы всё поняли абсолютно правильно. Данные значения вкупе с цветом означают тоже самое, что и в массиве цифр. 1 - включено, 0 - выключено. Только здесь указан конкретный код для конкретного цвета.  Чтобы при старте часов включился зелёный поставьте приоритет на     case 2: r_led=0,g_led=1,b_led=0; break;

52

Re: Часы на адресной ленте WS2812 (Разработка)

Только я к этим часам прикрутил GPS модуль. Время тянет со спутников. Точность хода по сравнению с часами на Wemos - 1 секунда

53

Re: Часы на адресной ленте WS2812 (Разработка)

Спасибо за ответ.
Но ничего не понял от слова совсем.
Что значит "ставьте приоритет"?
Где и как я его могу поставить?

54

Re: Часы на адресной ленте WS2812 (Разработка)

khvalyuk пишет:

Спасибо за ответ.
Но ничего не понял от слова совсем.
Что значит "ставьте приоритет"?
Где и как я его могу поставить?

Быть может у автора проекта будет возможность ответить на вопрос о том, где и как в программе задать начальный (после включения питания) цвет диодов.

55

Re: Часы на адресной ленте WS2812 (Разработка)

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

56

Re: Часы на адресной ленте WS2812 (Разработка)

liman324 пишет:

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

Так а как его выбрать? Что определяет начальный выбор? те значения, которые стоят для случая "case 1"?

57

Re: Часы на адресной ленте WS2812 (Разработка)

У меня вот какая ситуация сложилась. Включаю часы, они загораются условно красным цветом. Все нормально. Я нажимаю кнопку выбора цвета и при этом цвет по кругу меняется. Допустим, я остановился на синем. После этого я выключаю питание, а затем его включаю. Часы загораются синим цветом, а через 1-2 секунды сами снова возвращаются в красный цвет. Может я что-то нахомутал при корректировке программы или как-то надо по другому делать, чтобы цвет изменился на постоянно.

58

Re: Часы на адресной ленте WS2812 (Разработка)

Перед
switch(mode){

укажите mode =1;

или другое число от 0 до 7

59

Re: Часы на адресной ленте WS2812 (Разработка)

liman324 пишет:

Перед
switch(mode){

укажите mode =1;

или другое число от 0 до 7

Спасибо.

60

Re: Часы на адресной ленте WS2812 (Разработка)

Что-то не то.
Если жестко задать mode=2, то нельзя кнопкой изменять цвет..

Да и не сохраняются значения mode и brig в EEPROM.
Они, как я понял, должны считываться вначале, перед бесконечным циклом, чтобы восстановить предыдущий режим работы диодов.
Сложно для чайника.

61

Re: Часы на адресной ленте WS2812 (Разработка)

Все верно.

Проверьте эту строку, должно быть так

if(EEPROM_read(100)!=0){for(int i1=0;i1<101;i1++){EEPROM_write(i1,0);}}// очистка памяти при первом включении

была ошибка

if(EEPROM_read(100)!=0){for(int i1=0;i1<101;i1++){EEPROM_write(i1,1);}}// очистка памяти при первом включении

62

Re: Часы на адресной ленте WS2812 (Разработка)

Все равно непонятно.
Если мы запишем все 0, то и mode=0 и brig=0 в начальный момент.
Т.е. яркость 0 и ничего не горит.

Потом, почему-то, в EEPROM новые (если нажимать кнопку) значения не записываются.

Нужно ковыряться ибо что-то там не  так.

Вот еще вопрос.
Что такое (times-times0)>10000  в конце цикла?

В коде times увеличивается на 1 при каждом аппаратном прерывании, а они происходят через 1 мс.
Т.е. (times-times0)>10000 становится true каждых 10 сек?

63

Re: Часы на адресной ленте WS2812 (Разработка)

if(EEPROM_read(100)!=0){for(int i1=0;i1<101;i1++){EEPROM_write(i1,0);}}

Эта строка будет работать только один раз, запишет в ячейку памяти 100 0, и более не будет исполняться.

В коде times увеличивается на 1 при каждом аппаратном прерывании, а они происходят через 1 мс.
Т.е. (times-times0)>10000 становится true каждых 10 сек?

нет, только после нажатия любой кнопки

64

Re: Часы на адресной ленте WS2812 (Разработка)

if(EEPROM_read(100)!=0){for(int i1=0;i1<101;i1++){EEPROM_write(i1,0);}}

Эту строку Вы можете удалить, она нужна только для новой ардуинки, в которой во всех ячейках памяти записано 255

65

Re: Часы на адресной ленте WS2812 (Разработка)

Получается, что запись в EEPROM значений mode и brig (в конце цикла) будет происходить только после 10000 нажатий кнопки?

А в каком месте программы происходит считывание записанных после нажатия кнопки значений mode и brig из предыдущей сессии (типа после выключения питания)?

66

Re: Часы на адресной ленте WS2812 (Разработка)

if(times-times0>10000&&w==1){EEPROM_write(0,mode);EEPROM_write(1,brig);w=0;}

times-times0>10000 это условие нужно чтобы отложить запись в память после нажатия кнопки на 10 секунд.

67

Re: Часы на адресной ленте WS2812 (Разработка)

mode = EEPROM_read(0);brig = EEPROM_read(1);

вот момент считывания памяти после включения

68

Re: Часы на адресной ленте WS2812 (Разработка)

Спасибо за пояснения.
У меня, наверное, какая-то проблема с записью в EEPROM. Может память на кристалле дефектная
Пойду ковыряться. Уж, извините, что отвлекаю.

69

Re: Часы на адресной ленте WS2812 (Разработка)

Просто удалите строку

if(EEPROM_read(100)!=0){for(int i1=0;i1<101;i1++){EEPROM_write(i1,0);}}

и все у Вас заработает правильно

70

Re: Часы на адресной ленте WS2812 (Разработка)

Спасибо, разобрался после вашего разъяснения.
В EEPROM измененные значения записываются через 10 секунд.
Я, естественно, нажимал кнопку и через 1-2 секунды вынимал вилку из розетки, желая проверить записалось ли новое значение. Оно, естественно, не записалось из-за моей нетерпеливости. Сейчас я поставил  1000  (1 сек) и все стало на свои места.
Спасибо еще раз за терпение.