Будильник рассвет

sa355k
Offline
Зарегистрирован: 27.11.2018

Добрый день!

Много буков, помогите советом.

Собрал схему, корпус для светильника, освещение за счет 8 метров rgb ленты, управление с IR пульта, все вприципе уже работает, но сейчас застрял на написании скетча: у светильника 5 режимов 1 - тусклый желтый(ночник), 2 - режим гирлянды, плавные переходы по теплым отенкам (для особых случаев ;-)  ), 3 - просто лампа, белое свечение, 4 - плавный рассвет с переходом по цветам по таймеру (от бледно розового к максимально красному через желтый к белому), 5 - плавный закат, тоже что и рассвет в обратном порядке. Вобщем скетч не нравиться выкладывать не буду, режимы просто включаются нажатим кнопок с пульта, а задача стоит теперь немного другая: При включении, нажатие ON на пульте (от ТВ), (если выключено, то всеравно проверяем будильник и включаем рассвет) переходим в режим 1 на автомате, проверяем есть ли будильник во время работы - есть включаем его (4 режим) точнее плавно переходим к нему сначала уменьшая яркость выходя на страрт рассвета, если с пульта нажимается какойто другой режим также плавно переходим к нему, т.е. плавно уменьшая или увеличивая яркость СД до рабочей выбраного режима, регулировка яркости во всех режимах (кнопки   громкости). НУ и при повторном нажатии ON. Плавно гасим все. 

Мне не нужен готовый скетч мне интересно ваше мнение как бы вы решили задачу просто описав решение.

Дело с ардуино ни когда не имел мой первый опыт как с ардуино так и с электронникой вообще, давным-давно немного писал на РНР.

 

b707
Offline
Зарегистрирован: 26.05.2017

sa355k пишет:

Мне не нужен готовый скетч мне интересно ваше мнение как бы вы решили задачу просто описав решение.

 

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

SLKH
Offline
Зарегистрирован: 17.08.2015

sa355k пишет:

Добрый день!

Много буков, помогите советом.

 

"как бы вы решили задачу просто описав решение."

 

распиши всё отдельными абзацами:

"При включении,

нажатие ON на пульте (от ТВ),

(если выключено, то всеравно проверяем будильник и включаем рассвет)

переходим в режим 1 на автомате,

проверяем есть ли будильник во время работы - есть включаем "

 

потом отредактируй (несколько раз) на русском,

а потом замени "если выключено" на "if (stat==0) {что-то делаем} и т.д.

 

Ещё хороший вариант: нарисуй блок-схему.

 

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

 и вместо пульта можно сначала начать просто с кнопок

Гриша
Offline
Зарегистрирован: 27.04.2014

ВН пишет:

 и вместо пульта можно сначала начать просто с кнопок

Поддерживаю, дебаг на кнопках, гораздо нагляднее, чем с глюками пульта. Да и заменить адресную ленту на простые диоды на этапе обкатки алгоритма можно... Там, конечно, использовать ШИМ для наглядности... А потом прикручивать поочереди ленту и пульт.     

sa355k
Offline
Зарегистрирован: 27.11.2018

Я не использовал адресную ленту

Гриша
Offline
Зарегистрирован: 27.04.2014

sa355k пишет:

 освещение за счет 8 метров rgb ленты, 

sa355k пишет:

Я не использовал адресную ленту

обычная лента? ну тогда все знаяительно упрощается...

sa355k
Offline
Зарегистрирован: 27.11.2018

Не обычная, хотя как посмотреть ... обычная RGB лента, диод состоит (3-х) цветов, которые смешиваясь друг с другом дают 16 млн цветов, лента не адресная она может светится разными цветами, но вся целиком в один момент времени только одним цветом  

Гриша
Offline
Зарегистрирован: 27.04.2014

sa355k пишет:

Не обычная, хотя как посмотреть ... обычная RGB лента, диод состоит (3-х) цветов, которые смешиваясь друг с другом дают 16 млн цветов, лента не адресная она может светится разными цветами, но вся целиком в один момент времени только одним цветом  

это и есть "обычная" RGB лента т.е. без контроллеров, управляется ШИМ по каждому каналу. Есть еще адресная RGB лента WS2812 и прочие аналогичные ленты. 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

А еще можно использовать лямда фунции. Повесить одну фунцию в loop и переключать ИК пультом на нужную лямда функцию режима.

Schwarz78
Offline
Зарегистрирован: 19.01.2019

qwone пишет:

А еще можно использовать лямда фунции. Повесить одну фунцию в loop и переключать ИК пультом на нужную лямда функцию режима.

Вот абсолютно верно. Я бы только так и делал)) Если бы знал как. Неужели ТС неинтересно самому решить? Меня раньше непосильные задачи очень увлекали, да и сейчас увлекают, хотя я давно в курсе, что непосильных задач нет. Бывает лень думать.

sadman41
Offline
Зарегистрирован: 19.10.2016

Квон новую книжку нашёл штоли... В эти ваши лямбды закидывать параметры через список аргументов-то можно или они все void/void ?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Нет, просто старый автомат Пуха под лямды приспособил и получилась ВЕЩЬ.

Schwarz78
Offline
Зарегистрирован: 19.01.2019

qwone пишет:

Нет, просто старый автомат Пуха под лямды приспособил и получилась ВЕЩЬ.

Эта вещь хоть быстрее работает, чем грязный Си? Или просто места больше занимает?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вот возьмем стандарный скетч под ИК польт. http://robotclass.ru/tutorials/arduino-ir-remote-control/

#include "IRremote.h"

IRrecv irrecv(2); // указываем вывод, к которому подключен приемник

decode_results results;

void setup() {
  irrecv.enableIRIn(); // запускаем прием
}

void loop() {
  if ( irrecv.decode( &results )) { // если данные пришли
    switch ( results.value ) {
    case 0xFFA857:
        digitalWrite( 13, HIGH );
        break;
    case 0xFFE01F:
        digitalWrite( 13, LOW );
        break;
    }    
    irrecv.resume(); // принимаем следующую команду
  }
}

Замечательно. Но работает со статическими объектами Вкл-выкл. Может и динамическими но их долго надо описывать. А если взять автомат с лямдой, то накорядать и отладить скетч можно быстро.

/**/
#include "IRremote.h"
IRrecv irrecv(/*пин*/2); // указываем вывод, к которому подключен приемник
decode_results results;
typedef void (*pDo)();
pDo run = {};
const byte ledPin = 13;
enum state_t {sOFF, sON, sblinkOFF, sblinkON};
void stand(state_t s) {
  static unsigned long past;
  past = millis();
  switch (s) {
    case sOFF:
      digitalWrite( ledPin, LOW );
      run = [] {};
      break;
    case sON:
      digitalWrite( ledPin, HIGH );
      run = [] {};
      break;
    case sblinkOFF:
      digitalWrite( ledPin, LOW );
      run = [] {if (millis() - past >= 500)stand(sblinkON );} ;
    break;
  case sblinkON:
    digitalWrite( ledPin, HIGH );
      run = [] {if (millis() - past >= 500)stand(sblinkOFF );} ;
    break;
}//switch
}
//-----------------------------------------------
void setup() {
  pinMode(ledPin, OUTPUT);
  irrecv.enableIRIn(); // запускаем прием
}
void loop() {
  run ();
  if ( irrecv.decode( &results )) { // если данные пришли
    switch ( results.value ) {
      case 0xFFA857:
        stand(sOFF);// выключить
        break;
      case 0xFFE01F:
        stand(sblinkON);//помигать
        break;
    }
    irrecv.resume(); // принимаем следующую команду
  }
}

 

Schwarz78
Offline
Зарегистрирован: 19.01.2019

Ясно, понятно.