Часы на адресных светодиодах WS2812B
- Войдите на сайт для отправки комментариев
Пт, 05/11/2021 - 12:39
Добрый день.Сделал часы на адресной светодиодной ленте.Показывают время,год,месяц,день и температуру окружающей среды.Работают хорошо,но сыну не понравилась бегущая строка,попросил убрать ее и оставить только часы.Я кое-что убрал из кода,остались часы и температура,но не могу убрать временную паузу,которая образовалась вместо года,месяца,дня.Может кто-то сможет помочь?Оставить нужно просто часы.
/* Часы матрица на 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; } }
очередной г. код на тему часов...? Куча повторов, две одинаковых функции дебонса...
Тут на форуме есть огромная ветка по ттаким часам, там масса вариантов кода, сходите, может что подберете себе. И вопросы по часам лучше задавать там.
смотрел я там,не нашел похожего,а поэтому и написал сюда.
А к автору кода обращались? Что говорит?
молчит и очень давно,мало того,с такой просьбой обращался не я один,никому не ответил к сожалению.
"перерыв в показе" когда происходит - между 50 и 0-вой секундой каждой минуты?
молчит и очень давно,мало того,с такой просьбой обращался не я один,никому не ответил к сожалению.
Это к вопросу как брать чужие, неподдерживаемые коды. Бесплатные коды можно брать в серьёзные проекты только под договор с автором. На этом, например, стоит весь бизнес вокруг "свободного ПО".
да я понимаю,но он код "выложил" совершенно бесплатно,а вот почему не хочет "упростить" код,это непонятно.Есть другие схемы часов,много,но именно на адресной ленте нет.
да,вроде так,я раньше не обращал на это внимание,сейчас посмотрел именно так и длиться это 10 секунд))
b 707 спасибо за подсказку,намек понял,осталось убрать температуру))
ИМХО в 143 строке 7 поменять на 3
Командир,пробовал,ничего не изменилось.То,что я убрал бегущую строку(год,месяц,день),это спасибо товарищу выше.Здорово натолкнул на мысль,осталось убрать t=20(cdth[сверху знак градуса,маленький квадрат).Но я думаю,что если это убрать,то снова появится пауза между временем и температурой))) и табло в это время будет темным.
b 707 спасибо за подсказку,намек понял,осталось убрать температуру))
температура в строке 205
молчит и очень давно,мало того,с такой просьбой обращался не я один,никому не ответил к сожалению.
да я понимаю,но он код "выложил" совершенно бесплатно,а вот почему не хочет "упростить" код,это непонятно.Есть другие схемы часов,много,но именно на адресной ленте нет.
Почему автор не хочет "упростить" - совершенно понятно.
А вот почему те, что берет чужие коды, никак не хотят понять, что у них только 3 варианта:
1. Пользоваться тем, что есть, без всякой переделки.
2. Заказать переделку за отдельную плату.
3. Учиться программировать самому, после чего реализовывать не чужой, а свой проект.
да я понимаю,но он код "выложил" совершенно бесплатно,а вот почему не хочет "упростить" код,это непонятно.
как раз это совершенно прозрачно. По коду видно, что автор написал как умеет, и "упростить" этот код ему просто не под силу
На этом, например, стоит весь бизнес вокруг "свободного ПО".
ага, берёшь - не работает, разбираешься, находишь баг, сам правишь, отписываешь, через месяц правят они, при последующем обновлении баг возвращён на место, плавали-знаем, а платишь денежку восстанавливают за 5 минут, всё рукотворное и специально )))
Мне кажется, что проще написать 3 программы (потом подпрограммы), выдачи чего угодно на светодиодную ленту, считывание времени и считывание температуры. А далее - просто написать маленькую программу с использованием этих подпрограмм.
Огромное,человеческое спасибо b707!!Простенько,чтобы не задеть не чьи права и никого этим не обидеть подсказал как решить проблему!!В итоге я сейчас получил то,что хотел.Еще раз респект этому человеку!Благодаря ему я теперь отправлю часы сыну такие,как он хотел!!Вопрос решен,а значит не нужно дальше ничего писать,оставьте Ваши мнения при себе!!
А на последок я скажу:
А не боитесь, что пацан со временем посмотрит и скажет "какая лажа!"? Не стыдно будет?
да я понимаю,но он код "выложил" совершенно бесплатно,а вот почему не хочет "упростить" код,это непонятно.
как раз это совершенно прозрачно. По коду видно, что автор написал как умеет, и "упростить" этот код ему просто не под силу
Он когда-то сделал себе часы, такие, как он хотел. Его эти часы устраивают. Он никому не обещал переписывать свой код под чьи-то условия.
Или ему это просто неинтересно.
Он когда-то сделал себе часы, такие, как он хотел. Его эти часы устраивают. Он никому не обещал переписывать свой код под чьи-то условия.
Вот бы эту глубокую мысль, многим тут , прочувствовать и следовать ей. Я бы её в свою тему перенёс... (там кстати тоже речь о часах) ...