Функция работы по времени с pwm

Тема в разделе "Arduino & Shields", создана пользователем PolakSS, 2 апр 2017.

  1. PolakSS

    PolakSS Нуб

    Всем привет.

    Есть устройства с pwn есть без, но все они работают по времени, например:
    - холодный белый свет с 0 до 255 разгорается с 7 утра до 8 утра, с 8 утра до 21 он просто горит (255), далее с 21 до 22 вечера он затухает (с 255 до 0)
    - есть приборы которые работают ночью с 22 до 7 утра
    - приборов около 5-6
    - по каждому прибору каждую секунду запускается эта функция

    Долго мучился, но все таки добился рабочего решения, все работает, но вопрос - насколько это правильно и можно ли оптимизировать

    Код (C++):
    int WorkPeriod(int timeFrom, int timeToMenu) {
      int currentPWM;
      int timeTo;
      if (timeToMenu == 0){
        timeTo = 23;
      }else{
        timeTo = timeToMenu - 1;
      }
      if (time.Hours == timeFrom) {
        currentPWM = map(time.minutes, 0, 59, 0, 255);
      } else if (time.Hours == timeTo) {
        currentPWM = map(time.minutes, 0, 59, 255, 0);
      } else if (time.Hours > timeFrom && time.Hours < timeTo) {
        currentPWM = 255;
      } else if (time.Hours < timeFrom && time.Hours < timeTo) {
        if (timeFrom <= timeTo){
          currentPWM = 0;
        } else if (timeFrom > timeTo){
          currentPWM = 255;
        }
      } else if (time.Hours > timeFrom && time.Hours > timeTo) {
        if (timeFrom <= timeTo){
          currentPWM = 0;
        } else if (timeFrom > timeTo){
          currentPWM = 255;
        }
      } else if (time.Hours < timeFrom && time.Hours > timeTo) {
        currentPWM = 0;
      }
      return currentPWM;
    }
    Спасибо.
     
  2. rkit

    rkit Гуру

    Можно взять время в минутах с начала дня, и всё решится парой формул.
     
    Tomasina нравится это.
  3. qwone

    qwone Гик

    Самый большой минус. Это вы захотите что то воткнуть туда, то вам придется переписывать если не всю а хотя бы половину программы. У меня нет аналога вашей программы. Так что подброшу вариант RGB гирлянды на две штуки .Пакет здесь https://yadi.sk/d/-8OnW-TS3GZmyM
    Головной на посмотреть здесь
    Код (C++):

    /*R_led_v2.ino
    */

    #include "Cl_analogOut.h"
    Cl_analogOut Out[] = {3, 5, 6, 9, 10, 11};// выводы 3, 5, 6, 9, 10, 11 сделать ШИМ выходами
    #include "Cl_PWM_led.h"
    Cl_PWM_led * PWM_led[] = {
      new Cl_PWM_led(& Out[0]),
      new Cl_PWM_led(& Out[1]),
      new Cl_PWM_led(& Out[2]),
      new Cl_PWM_led(& Out[3]),
      new Cl_PWM_led(& Out[4]),
      new Cl_PWM_led(& Out[5])
    };
    void setup() {
      for (byte i = 0; i < 6; ++i)PWM_led[i]->setup();
    }

    void loop() {
      for (byte i = 0; i < 6; ++i)PWM_led[i]->loop();
    }
     
     
  4. PolakSS

    PolakSS Нуб

    У меня задача была что бы функция выдавала от 0 до 255, а использую я ее типа так

    Код (C++):
    if (DelayTimer(1000000, 5)) {
        TemperatureControl();
        //update LED power
        //update CW
        tmpVar = map(MenuValue[27],MenuValueMin[27],MenuValueMax[27],0,255);
        newCWled = map(WorkPeriod(MenuValue[25],MenuValue[26]),0,255,0,tmpVar);
        //update WW
        tmpVar = map(MenuValue[28],MenuValueMin[28],MenuValueMax[28],0,255);
        newWWled = map(WorkPeriod(MenuValue[25],MenuValue[26]),0,255,0,tmpVar);
        //update R
        newRedRGB = map(WorkPeriod(MenuValue[25],MenuValue[26]),0,255,0,MenuValue[35]);
        //update G
        newGreenRGB = map(WorkPeriod(MenuValue[25],MenuValue[26]),0,255,0,MenuValue[36]);
        //update B
        newBlueRGB = map(WorkPeriod(MenuValue[25],MenuValue[26]),0,255,0,MenuValue[37]);
        //moonligt
        if(WorkPeriod(MenuValue[25],MenuValue[26]) == 0){
          newRedRGB = 0;
          newGreenRGB = 0;
          newBlueRGB = MenuValue[29];
        }
        //Air control
        if(WorkPeriod(MenuValue[48],MenuValue[49]) > 0){
          digitalWrite(AIR_PIN, HIGH);
          airState = 1;
        }else{
          digitalWrite(AIR_PIN, LOW);
          airState = 0;
        }

    У меня менюшка с параметрами и в ней задается значение от 0 до 100% мапами пересчет на pwm 0-255, все норм, работает и новое устройство довесить не проблема, функция вроде получилась довольно универсальная, вопрос можно ли ее упростить? ))