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

seve_len

✩✩✩✩✩✩✩
13 Сен 2018
70
3
40
@feniragon, Да. Но проверки вроде не мешают друг другу и ошибок не вносят. И в fillLED() я перетащил проверку из обработки кнопок. Тут ведь как получается (как я вижу): если дополнительной проверки не будет, будь она либо в обработке кнопок, либо в fillLED(), то при подведении времени выйдем за необходимые диапазоны значений m и h. А так вроде все в рамках приличий
 

feniragon

✩✩✩✩✩✩✩
31 Июл 2018
87
5
@seve_len, опять "вроде". Это ж программинг, а не лишний стежок на рубашке. В minuteperiod она лишняя - дубликат. Присмотрись.
 

seve_len

✩✩✩✩✩✩✩
13 Сен 2018
70
3
40
Угу....
тогда вот это
if (m > 59) {
m = 0;
h++;
}
if (h>11) {
h = 0;
}

надо заменить на
if (m < 1) {
h++;
}
Или m = 0, я пока не знаю, где может быть подвох ( но вроде числа у нас целые).

нет, неверно. Ни то, ни другое
 
Изменено:

seve_len

✩✩✩✩✩✩✩
13 Сен 2018
70
3
40
@feniragon, Пожалуй, да. Мне пока не хватает мозгов, попрактиковаться еще надо. А то вполне логичные вещи не замечаю. Пойду накачу, все-таки немного обмыть надо)
 

feniragon

✩✩✩✩✩✩✩
31 Июл 2018
87
5
@seve_len, ахась. Работает и отлично. Эта правка на функционал не влияет) Бушь должен))))))
 

Юрий Бронников

✩✩✩✩✩✩✩
25 Май 2020
3
0
C++:
/*Проект ЧАСЫ-ОБРУЧ
 *использовано:
 *60 диодов ленты (2 метра ленты 30 диодов на метр)
 *модуль РТС
 *ардуинка
*/
#include <iarduino_RTC.h>     //подключаем библиотеку для работы с модулем реального времени
#include <FastLED.h>          //подключаем библиотеку для работы с лентой
#define NUM_LEDS 60           //количество светодиодов в ленте
#define DATA_PIN 12           //пин подключения ленты
CRGB leds[NUM_LEDS];          //нуууу, вот.
iarduino_RTC watch(RTC_DS1302, 2, 4, 3);    //пины подключения модуля РТС
int i = 0;                    //переменная для указания цифр (0, 5, 10, 15 и т.д.)
int H = 0;                    //переменная для хранения ПОЛОЖЕНИЯ часовой стрелки
float M = 0;                  //переменная для промежуточного хранения положения часовой стрелки
int s = 0;                    //переменная для хранения положения часовой стрелки
int m = 0;                    //переменная для хранения положения часовой стрелки
int h = 0;                    //переменная для хранения ЗНАЧЕНИЯ часовой стрелки поступающего с модуля РТС
void setup() {
  delay(500);                 //задержка для очухивания модуля РТС
  Serial.begin(9600);         //это понятно
  FastLED.addLeds<WS2812, DATA_PIN, GRB>(leds, NUM_LEDS); //установки для ленты
  LEDS.setBrightness(250);    //яркость ленты
  watch.begin();              //для модуля часов
}
void loop() {
  watch.gettime();        // Считываем текущее время из модуля в буфер библиотеки.
  h = watch.hours;        // Получаем из буфера библиотеки текущие часы        0-12.
  m = watch.minutes;      // Получаем из буфера библиотеки текущие минуты      0-59.
  s = watch.seconds;      // Получаем из буфера библиотеки текущие секунды     0-59.
  M = m / 12;             // каждые 12 минут часовая стрелка смещается на один сектор
  ceil(M);                // округляем после деления
  H = h * 5 + M;          // ну всё понятно
  Serial.println((String) H + ":" + h + ":" + m + ":" + s); //для проверки
  for (i = 0; i < 60; i = i + 5) leds[i] = CRGB::White;     //каждый пятый заливаем белым (можно любым)
  leds[H] = CRGB::Blue;                  //часовая стрелка синяя
  if (millis() % 1 == 0) {               //              плавное затухание//
    leds[H - 1].nscale8(200);            //        предыдущего диода после//
    leds[59].nscale8(200);               //того как стрелка убежала дальше//
  }
  leds[m] = CRGB::Green;                 //минутная стрелка зеленая
  if (millis() % 1 == 0) {
    leds[m - 1].nscale8(200);
    leds[59].nscale8(200);
  }
  if (m == H)leds[H] = CRGB::Yellow;    //если минутная стрелка и часовая совпадают то диод желтый
  leds[s] = CRGB::Red;
  if (millis() % 1 == 0) {
    leds[s - 1].nscale8(200);
    leds[59].nscale8(200);
  }
  LEDS.setBrightness(250);   //яркость ленты (зачем второй раз? я забыл и не помню, а проверять и исправлять лень)
  FastLED.show();            //отправляем на ленту
}
 

seve_len

✩✩✩✩✩✩✩
13 Сен 2018
70
3
40
Оформи код соответствующим тэгом
Извиняйте, бояре, давно не заглядывал. Немного доработал свой говнокод под работу с модулем частично точных (гыыы) часов DS3231 и подстройку
с помощью кнопок, потому что разбираться с модулем тупо было лень ) Думал, батарейку вотыкнуть еще, но времени нет. Самоизоляция заизолировала меня на работе. За код не пинать, еси е претензии - замутите свой.

А на текущий момент - офигенный ночничок, да еще и с возможностью корректировать ход.
На сим с кодировкой закончил, меня устраивает. А вот с внешностью - экспериментируйте, если понравилось)
Всем бобра!)

И еще раз огромное спасибо, feniragon!




#include <Wire.h>
#include "RTClib.h"

int nowhour;
int nowminutes;
int nowsecond;
int s;
RTC_DS3231 rtc;

#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 R = 6; //сделано для упрощения подбора цветов и яркости
const int G = 6;
const int B = 6;
const int FIRSTLEDID = 30;
const int LEDCOUNT = 60;
//const unsigned int MINUTEPERIOD = 60000; // минута в ms
const unsigned int PAUSEPERIOD = 200;
const int PLUS = 20;
unsigned long currentMillis;
unsigned long timing; //для счетчика времени
unsigned long pause; //для обработки кнопок
int m = 0; //минуты
int h = 0; //часы
int hoursDelta = 0;
int m1 = 0; //поправка минуты
int h1 = 0; //поправка часы

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

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

#ifndef ESP8266
while (!Serial); // for Leonardo/Micro/Zero
#endif

delay(4000); // wait for console opening

if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}

if (rtc.lostPower()) {
Serial.println("RTC lost power, lets set the time!");
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
}

void fillLED(){

h = nowhour+h1;
m = nowminutes+m1;
s = nowsecond;
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, R, G + PLUS, B); // заливаем зеленые разделители

hoursDelta = round(m/12.0);
int currentHourLed;

currentHourLed = FIRSTLEDID + h*5; //для всех остальных часов

strip.setPixelColor((currentHourLed - 1 + hoursDelta)%LEDCOUNT, 250, 20, 0); / выбираем цвета "стрелок" и их габарит. Тут часовая на 3 пикселя
strip.setPixelColor((currentHourLed + hoursDelta)%LEDCOUNT, 250, 20, 0);
strip.setPixelColor((currentHourLed + 1 + hoursDelta)%LEDCOUNT, 250 ,20 ,0);

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

strip.setPixelColor((FIRSTLEDID+s) % LEDCOUNT, 250, 250, 0); //Рисуем "second"

strip.show();
DateTime now = rtc.now();
nowhour = now.hour();
nowminutes = now.minute();
nowsecond = now.second();

}

void loop() {
fillLED();


Serial.print(nowhour);
Serial.print(":");
Serial.print(nowminutes);


Serial.println();



// обработка кнопок
currentMillis = millis();
if (currentMillis - pause > PAUSEPERIOD) {
pause = currentMillis;
if (!digitalRead(keyHor)){
h1++;

}
if (!digitalRead(keyMin)){
m1++;

}
}
}
 
Изменено: