Всем привет. Есть устройства с 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; } Спасибо.
Самый большой минус. Это вы захотите что то воткнуть туда, то вам придется переписывать если не всю а хотя бы половину программы. У меня нет аналога вашей программы. Так что подброшу вариант 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(); }
У меня задача была что бы функция выдавала от 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, все норм, работает и новое устройство довесить не проблема, функция вроде получилась довольно универсальная, вопрос можно ли ее упростить? ))