Часы на ИН-14

disc jokey
Offline
Зарегистрирован: 20.07.2018

Привет друзья! Пожалуйста, помогите мне.

Эта программа - час (Часы на ИН - 14). Я хочу  между 9 утра и 21 часом Вечером , каждые 1 час, 10 секунд, на пин D10 (Или любой свободный контакт)  Включить Управление транзитом.  Помогите мне. 

 

#include "FastLED.h"//библиотека для работы с лентой
#include <iarduino_RTC.h>//библиотека для работы с rtc модулем
iarduino_RTC time(RTC_DS3231);
const int def_pin[] = {A3, A1, A0, A2};//выводы для дешифратора defPin[out1,out2,out4,out8];
const char dictionary_of_number[10][4] = { //словарь цифр
  {1, 0, 0, 1},//0
  {0, 0, 0, 1},//1
  {0, 0, 0, 0},//2
  {1, 0, 1, 0},//3
  {0, 1, 1, 0},//4
  {0, 1, 0, 0},//5
  {1, 1, 0, 0},//6
  {1, 1, 1, 0},//7
  {0, 0, 1, 0},//8
  {1, 0, 0, 0},//9
};
#define LED_COUNT 6// число светодиодов в кольце/ленте
#define LED_DT 9// пин, куда подключен DIN ленты
const int keys_pin[] = {8, 7, 6, 5, 4, 2};// выводы для транзисторных ключей
// ---------------СЛУЖЕБНЫЕ ПЕРЕМЕННЫЕ-----------------
struct CRGB leds[LED_COUNT];
int ledsX[LED_COUNT][3];
 
int idex = 0;                //-LED INDEX (0 to LED_COUNT-1
int ihue = 0;                //-HUE (0-255)
int ibright = 0;             //-BRIGHTNESS (0-255)
int isat = 0;                //-SATURATION (0-255)
int bouncedirection = 0;     //-SWITCH FOR COLOR BOUNCE (0-1)
// ---------------СЛУЖЕБНЫЕ ПЕРЕМЕННЫЕ-----------------
 
String input_string = "";
int time_date[] = {0, 0, 0, 0, 0, 0}; // массив где хранится временя или дата
int mass_brightness[] = {0, 0, 0};//значение светодиодов
bool swap_time_date = true, open_scroll = false; // булевые переменные для органиции смеды даты и времени
unsigned long last_scroll = 0, last_step = 0, interval_scroll = 300000;//переменные для задержек
int p = 7, k = 0; //переменные для счетчиков
int led_mod = 1, quotient_bright = 200, amount_led_mod = 6, this_value  = 255; // переменные для подцветки
 
void setup() {
  // задаем частоту ШИМ на 3 выводе 30кГц
  TCCR2B = TCCR2B & 0b11111000 | 0x01;
  analogWrite(3, 90); //если запитывать от блока питания 9в
  //задаем режим работы выходов микроконтроллера
  for (int i = 0; i < 4; i++) {
    pinMode(def_pin[i], OUTPUT);
  }
  for (int i = 0; i < 6; i++) {
    pinMode(keys_pin[i], OUTPUT);
  }
 
  LEDS.setBrightness(quotient_bright);  // ограничить максимальную яркость
  LEDS.addLeds<WS2811, LED_DT, GRB>(leds, LED_COUNT);  // настрйоки для нашей ленты (ленты на WS2811, WS2812, WS2812B)
  one_color_all(mass_brightness[0], mass_brightness[1], mass_brightness[2]);// погасить все светодиоды
  LEDS.show();// отослать команду
  Serial.begin(9600);
  time.begin();
}
 
void loop() {
  k++;//счетчик для мигания цифрами
  //читаем порт если там что-то есть.
  while (Serial.available() > 0) {
    char c = Serial.read();
    //считываем пока нет перехода на следующую строку
    if (c == '\n') {
      menu(input_string);//передаем строку в обработчик
      input_string = "";
    }
    else {
      input_string += c;
    }
  }
  //смена между датой и временем с эффектом перебора
  if ((millis() - last_scroll >= interval_scroll) || open_scroll) {
    scroll(25);
    if (swap_time_date) {
      interval_scroll = 10000;//время которое будет показывать дату
    }
    else {
      interval_scroll = 300000;//интервал следующего свапа
    }
    swap_time_date = !swap_time_date;
    last_scroll = millis();
    open_scroll = false;
  }
  switch (led_mod) {
    case 1: LEDS.show(); break;                              //один цвет всей ленты
    case 2: rainbow_fade(100, this_value); break;            //плавная смена цветов всей ленты
    case 3: rainbow_loop(300, this_value); break;            //крутящаяся радуга
    case 4: random_burst(90, this_value); break;            //случайная смена цветов
    case 5: pulse_one_color_all_rev(15, this_value); break;  //пульсация со сменой цветов
    case 6: new_rainbow_loop(50); break;                     //крутая плавная вращающаяся радуга
  }
  check_time_date();
  show_numbers(time_date);
}
 
//вывод времени
void show_numbers(int a[]) {
  for (int i = 0; i < 6; i++)
  {
    set_number(a[i]);//передаем сигналы для a[i] цифры
    digitalWrite(keys_pin[i], HIGH);//подаем сигнал на keysPin[i] индикатор
    if (!((i == p || i == p - 1) && (k > 50))) {//задержка между лампами
      delay(2);
    }
    digitalWrite(keys_pin[i], LOW);//потушим keysPin[i] индикатор
    if ((i == p) && (k > 50)) {//задержка для мигания отдельных разрядов
      delay(2);
    }
    if (k > 100) {
      k = 0;
    }
  }
}
 
//пебора всех цифр
void scroll(int pause) {
  for (int i = 0; i < 9; i++) {
    int a[] = {i, i, i, i, i, i};
    show_numbers(a);
    delay(pause);
    show_numbers(a);
  }
}
 
//меню
void menu(String val) {
  String s = val.substring(0, val.indexOf(':'));//отрезаем первый символы до ":" что бы определить какая команда
  if (s == "1") {
    String color = val.substring(val.indexOf(':') + 1, val.length()); //отрезаем от ":" и до конца
    //разрезаем остататко на конкретные цвета раделитель ";"
    mass_brightness[0] = color.substring(0, color.indexOf(';')).toInt();//красный
    mass_brightness[1] = color.substring(color.indexOf(';') + 1, color.lastIndexOf(';')).toInt();//зеленый
    mass_brightness[2] = color.substring(color.lastIndexOf(';') + 1, color.length()).toInt();//синий
  }
  else if (s == "2") {
    quotient_bright = val.substring(val.indexOf(':') + 1, val.length()).toInt();//определяем яркость
    if(quotient_bright>200){
      quotient_bright=200;
    }
    else if(quotient_bright<0){
      quotient_bright=0;
    }
    LEDS.setBrightness(quotient_bright); 
  }
  else if (s == "3") {
    String t = val.substring(val.indexOf(':') + 1, val.length());//определяем в какую сторону менять мод поцветки.
    if (t == "+") {
      led_mod++;
      if (led_mod > amount_led_mod) {
        led_mod = 1;
      }
    }
    else if (t == "-") {
      led_mod--;
      if (led_mod < 1) {
        led_mod = amount_led_mod;
      }
    }
    idex = 0; ihue = 0; ibright = 0; isat = 0;
  }
  else if (s == "4") {
    String val_date = val.substring(val.indexOf(':') + 1, val.length());//парсим время
    time.settime(-1, -1, -1,
                 val_date.substring(0, val_date.indexOf('/')).toInt(),
                 val_date.substring(val_date.indexOf('/') + 1, val_date.lastIndexOf('/')).toInt(),
                 val_date.substring(val_date.lastIndexOf('/') + 1, val_date.length()).toInt());
  }
  else if (s == "5") {
    String val_time = val.substring(val.indexOf(':') + 1, val.length());//парсим дату
    time.settime(val_time.substring(val_time.lastIndexOf('/') + 1, val_time.length()).toInt(),
                 val_time.substring(val_time.indexOf('/') + 1, val_time.lastIndexOf('/')).toInt(),
                 val_time.substring(0, val_time.indexOf('/')).toInt(),
                 -1, -1, -1);
  }
  else if (s == "6") {
    open_scroll = true;//смена времени на дату
  }
  else if (s == "0") {
    //это команда системная, в теории она должна синхранизировать ардуинку с приложениям на телефоне.
    time.gettime();
    Serial.print(String(mass_brightness[0]) + ";" + String(mass_brightness[1]) + ";" + String(mass_brightness[2]) + " ");
    Serial.print(String(quotient_bright) + " ");
    Serial.print(String(time.Hours) + ":" + String(time.minutes) + ":" + String(time.seconds) + " ");
    Serial.print(String(time.day) + ":" + String(time.month) + ":" + String(time.year) + " ");
    Serial.println();
  }
  one_color_all(mass_brightness[0],mass_brightness[1],mass_brightness[2]);
  bouncedirection = 0;
}
 
//обращение к модулю и сохрание времени в массив
void check_time_date() {
  time.gettime(); //считываем время и дату с DS3231
  if (swap_time_date) {//отображения даты или времени
    time_date[0] = time.Hours / 10;
    time_date[1] = time.Hours % 10;
    time_date[2] = time.minutes  / 10;
    time_date[3] = time.minutes  % 10;
    time_date[4] = time.seconds  / 10;
    time_date[5] = time.seconds  % 10;
  }
  else {
    time_date[0] = time.day  / 10;
    time_date[1] = time.day  % 10;
    time_date[2] = time.month  / 10;
    time_date[3] = time.month % 10;
    time_date[4] = time.year / 10;
    time_date[5] = time.year % 10;
  }
}
 
//вывод опеределенной цифры
void set_number(int num) {
  for (int i = 0; i < 4; i++) {//цикл по словарю и взависимости от цифры в словаре подаем сигнал на к155ид1
    digitalWrite(def_pin[i], dictionary_of_number[num][i]); //в теории
  }
}
 
//----------------------функции эффектов светодиодов----------------------------
//один цвет
void one_color_all(int cred, int cgrn, int cblu) {
  for (int i = 0 ; i < LED_COUNT; i++ ) {
    leds[i].setRGB( cred, cgrn, cblu);
  }
}
 
// плавная смена цветов всей ленты
void rainbow_fade(int pause, int bright) {
  if (millis() - last_step > pause) {
    ihue++;
    if (ihue > 255) {
      ihue = 0;
    }
    for (idex = 0 ; idex < LED_COUNT; idex++ ) {
      leds[idex] = CHSV(ihue, 255, bright);
    }
    LEDS.show();
    last_step = millis();
  }
}
 
// крутящаяся радуга
void rainbow_loop(int pause, int bright) {
  if (millis() - last_step > pause) {
    idex++;
    ihue = ihue + 2;
    if (idex >= LED_COUNT) {
      idex = 0;
    }
    if (ihue > 255) {
      ihue = 0;
    }
    leds[idex] = CHSV(ihue, 255, bright);
    LEDS.show();
    last_step = millis();
  }
}
 
//случайная смена цветов
void random_burst(int pause, int bright) {
  if (millis() - last_step > pause) {
    idex = random(0, LED_COUNT);
    ihue = random(0, 255);
    leds[idex] = CHSV(ihue, 255, bright);
    LEDS.show();
    last_step = millis();
  }
}
 
//случайная смена цветов
void color_bounce(int pause, int bright) {
  if (millis() - last_step > pause) {
    if (bouncedirection == 0) {
      idex = idex + 1;
      if (idex == LED_COUNT) {
        bouncedirection = 1;
        idex = idex - 1;
      }
    }
    if (bouncedirection == 1) {
      idex = idex - 1;
      if (idex == 0) {
        bouncedirection = 0;
      }
    }
    for (int i = 0; i < LED_COUNT; i++ ) {
      if (i == idex) {
        leds[i] = CHSV(ihue, 255, bright);
      }
      else {
        leds[i] = CHSV(0, 0, 0);
      }
    }
    LEDS.show();
    last_step = millis();
  }
}
 
// пульсация со сменой цветов
void pulse_one_color_all_rev(int pause, int bright) {
  if (millis() - last_step > pause) {
    if (bouncedirection == 0) {
      isat++;
      if (isat >= 255) {
        bouncedirection = 1;
      }
    }
    if (bouncedirection == 1) {
      isat = isat - 1;
      if (isat <= 1) {
        bouncedirection = 0;
        ihue += 10;
      }
    }
    if (ihue > 360) {
      ihue = 0;
    }
    for (int idex = 0 ; idex < LED_COUNT; idex++ ) {
      leds[idex] = CHSV(ihue, isat, bright);
    }
    LEDS.show();
    last_step = millis();
  }
}
 
// крутая плавная вращающаяся радуга
void new_rainbow_loop(int pause) {
  if (millis() - last_step > pause) {
    ihue -= 1;
    fill_rainbow(leds, LED_COUNT, ihue);
    LEDS.show();
    last_step = millis();
  }
}
mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Красивая программа - мне нравится.

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

У вас есть массив данных int time_date[] = {0, 0, 0, 0, 0, 0} при этом  он кривой. Не понимаю, почему создатель программы использует его первый раз

  time_date[0] = time.Hours / 10;
    time_date[1] = time.Hours % 10;
    time_date[2] = time.minutes  / 10;
    time_date[3] = time.minutes  % 10;
    time_date[4] = time.seconds  / 10;
    time_date[5] = time.seconds  % 10;
А во второй 
time_date[0] = time.day  / 10;
    time_date[1] = time.day  % 10;
    time_date[2] = time.month  / 10;
    time_date[3] = time.month % 10;
    time_date[4] = time.year / 10;
    time_date[5] = time.year % 10;
 
Почему сразу не сделать размерность массива 10. И соответственно все будет выглядеть time_date[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}(после Вашего вмешательства)
time_date[0] = time.Hours / 10;
    time_date[1] = time.Hours % 10;
    time_date[2] = time.minutes  / 10;
    time_date[3] = time.minutes  % 10;
    time_date[4] = time.seconds  / 10;
    time_date[5] = time.seconds  % 10;
    time_date[6 = time.day  / 10;
    time_date[7] = time.day  % 10;
    time_date[8] = time.month  / 10;
    time_date[9] = time.month % 10;
    time_date[10] = time.year / 10;
    time_date[11] = time.year % 10;
А далее вы проверяете "if()" соответствие time_date[1-2] заданным Вами значениям и включаете соответствующий выход.
 
 
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Людям, откровенно нарушающим правила хорошего тона, здесь не очень рады.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

disc jokey пишет:

Я хочу  между 9 утра и 21 часом Вечером , каждые 1 час, 10 секунд, на пин D10 (Или любой свободный контакт)  Включить Управление транзитом.  

Хочешь - включай.

Только, для начала - освой вот это - Вставка программного кода в тему/комментарий

disc jokey пишет:

Помогите мне. 

Есть сэр! Будет исполнено, Ваше прввосходительство!

 

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

andriano пишет:

Людям, откровенно нарушающим правила хорошего тона, здесь не очень рады.

Уважаемый, если это про меня, то объяснитесь, а если про нуба - так объясните ему его ошибки.

disc jokey
Offline
Зарегистрирован: 20.07.2018

Спасибо, друг. Извините, если вы неправильно написали тему. Я плохо говорю по-русски, и не могу понять. Еще раз спасибо.

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

disc jokey пишет:

Спасибо, друг. Извините, если вы неправильно написали тему. Я плохо говорю по-русски, и не могу понять. Еще раз спасибо.

Данунах! Мы  всегда готовы помочь тому, кто готов думать и слушать. А общаемся мы на смеси С++ и русского матерного. Не тушуйся - читай и программируй!

disc jokey
Offline
Зарегистрирован: 20.07.2018

Спасибо, друг. Извините, если вы неправильно написали тему. Я плохо говорю по-русски, и не могу понять. Еще раз спасибо.

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

disc jokey пишет:

Спасибо, друг. Извините, если вы неправильно написали тему. Я плохо говорю по-русски, и не могу понять. Еще раз спасибо.

2 раза - китайский бот что-ли?

disc jokey
Offline
Зарегистрирован: 20.07.2018

Я человек...

 

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

disc jokey пишет:

Я человек...

 

А если ты человек, то прочитай советы продвинутых пользователей, может быть книги. Никто кроме ТЕБЯ не напишет программу. Здесь нет альтруистов, но есть люди готовые помочь. Но для этого ты должен поднять свой левел...

Logik
Offline
Зарегистрирован: 05.08.2014

disc jokey пишет:

Я человек...

 

Человеку написавшему этот код реализовать вашу хотелку - раз плюнуть. Где исходник свиснули?

Logik
Offline
Зарегистрирован: 05.08.2014

mykaida пишет:

Почему сразу не сделать размерность массива 10. 

 
 

Я так понимаю имелось в виду массив на 12 элементов. ;) Нет. не нужно. его массив на 6 элементов это 6 разрядов индикатора. Соответственно в зависимости от того, выводим время или дату они заполняются. Там правда очевидно int не нужен, и саму time_date то как глобальную юзают, то передают параметром. Вобщем ненастоко уж и красиво.

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

Logik пишет:

mykaida пишет:

Почему сразу не сделать размерность массива 10. 

 
 

Я так понимаю имелось в виду массив на 12 элементов. ;) Нет. не нужно. его массив на 6 элементов это 6 разрядов индикатора. Соответственно в зависимости от того, выводим время или дату они заполняются. Там правда очевидно int не нужен, и саму time_date то как глобальную юзают, то передают параметром. Вобщем ненастоко уж и красиво.

Когда писал - был пьян, добродушен и невнимателен :). Понравилась смена цветов. Соглашусь с Вами по поводу красоты и переменных.