Здравствуйте, написал код для выключателя света с плавным включением и выключением Может кому пригодится. Работает следующим образом: нажимаем кнопку свет плавно включается и горит до тех пор, пока еще раз не нажмем на кнопку, после повторного нажатия на кнопку он плавно гаснет. Код рабочий, проверен в живую. #define but 8 //Button Pin #define led 11 //LED Pin int vol=0; int old_vol=0; int state=0; int old_state=0; int y=0; //LED Level int s=8; //speed of the LED Level change (mS) void setup() { pinMode (but,INPUT); pinMode (led,OUTPUT); } void loop() {vol=digitalRead (but); if((vol==HIGH)&&(old_vol==LOW)) {state=!state; //Button's Trigger delay(200); } old_vol=vol; if((state==0)&&(old_state==0)) //Condition when LED OFF {analogWrite(led,0);} if((state==1)&&(old_state==1)) //Condition when LED ON {analogWrite(led,255);} if((state==1)&&(old_state==0)) //Condition when LED increase LED Level for(y=0;y<255;y++) {analogWrite (led,y); delay(s); //Speed of the increasing LED Level old_state=state;} if((state==0)&&(old_state==1)) //Condition when LED decrease LED Level for(y=255;y>0;y--) {analogWrite (led,y); delay(s); //Speed of the decreasing LED Level old_state=state;} }
Можно вместо светодиода подключить нагрузку посерьезнее, например лампу накала на 220 вольт, только понадобится мощный транзистор
Только не нужно пытаться коммутировать переменное напряжение, в особенности высоковольтное, транзисторным ключом, это очень быстро и плохо закончится. Для коммутации переменного напряжения используются симисторы с управлением через оптодрайвер, но в силу принципа их работы, выдавать в качестве управляющего сигнала высокочастотный ШИМ бессмысленно, там используется другой принцип управления мощностью.
Есть еще метод пропуска полупериодов, он позволяет меньше шуметь в сети, но требует расчета оптимальной скважности для выдачи управляющего сигнала.
Ни кто и не собирался комутировать переменное напряжение через транзистор, тем более 220в, есть вот например такачя схема, она конечно не идеальна согласен, можно и через микросхему
А лучше всего я думаю лучше применить микросхему КР1182ПМ1 фазовый регулятор мощности, щас схемку поищу, где то завалялась
на полевиках тоже можно, да только дороже, вроде как вторая схема как раз в хабрастатье упоминается а третья - ну, если есть готовая к употреблению схема - вперед
Можно и просто выпрямить переменку диодным мостом и уже потом пустить через полевик, так и ВЧ ШИМ из примера сгодится.
Входной каскад импульсного блока питания так и работает. Ему без разницы переменное на входе напряжение или постоянное - все равно он его выпрямляет и генерирует свою переменку от сотен герц и дальше вместо исходных 50Гц, которую уже потом и понижает через трансформатор значительно меньшего размера, чем понадобился бы для низкой частоты.
if((state==0)&&(old_state==0)) //Condition when LED OFF {analogWrite(led,0);} if((state==1)&&(old_state==1)) //Condition when LED ON {analogWrite(led,255);} А эти строки зачем? Не нужно в каждом цикле выставлять уровень на ногу, он у Вас и так останется таким же, какой был после последнего увеличения/уменьшения яркости. Достаточно по первому нажатию крутить цикл увеличения яркости, а по второму - уменьшения.
Не нужно в каждом цикле писать уровень на ногу, он и так с нее никуда не денется, останется таким же, какой был после последней записи. Код (Text): boolean _state = LOW; int i; void setup() { // ... } void loop() { if(BUTTON_PRESSED) { state = !state; if(state) { for(i = 0; i < 255; i++) { analogWrite(PIN, i); delay(10); } } else { for(i = 255; i > 0; i--) { analogWrite(PIN, i); delay(10); } } } }