Выключатель света с плавным включением и выключением

Тема в разделе "Глядите, что я сделал", создана пользователем grx1a, 4 фев 2013.

  1. grx1a

    grx1a Гик

    Здравствуйте, написал код для выключателя света с плавным включением и выключением
    Может кому пригодится. Работает следующим образом: нажимаем кнопку свет плавно включается и горит до тех пор, пока еще раз не нажмем на кнопку, после повторного нажатия на кнопку он плавно гаснет. Код рабочий, проверен в живую.
    #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;}

    }
     
    nailxx нравится это.
  2. grx1a

    grx1a Гик

    Можно вместо светодиода подключить нагрузку посерьезнее, например лампу накала на 220 вольт, только понадобится мощный
    транзистор
     
  3. Unixon

    Unixon Оракул Модератор

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

    hibiki Гик

    Unixon нравится это.
  5. Unixon

    Unixon Оракул Модератор

    Есть еще метод пропуска полупериодов, он позволяет меньше шуметь в сети, но требует расчета оптимальной скважности для выдачи управляющего сигнала.
     
  6. grx1a

    grx1a Гик

    Ни кто и не собирался комутировать переменное напряжение через транзистор, тем более 220в, есть вот например такачя схема, она конечно не идеальна согласен, можно и через микросхему
     

    Вложения:

    • 12345.jpg
      12345.jpg
      Размер файла:
      234 КБ
      Просмотров:
      1.592
  7. grx1a

    grx1a Гик

    или так
     

    Вложения:

    • 4545.png
      4545.png
      Размер файла:
      106,2 КБ
      Просмотров:
      1.270
  8. grx1a

    grx1a Гик

    А лучше всего я думаю лучше применить микросхему КР1182ПМ1 фазовый регулятор мощности, щас схемку поищу, где то завалялась
     
  9. grx1a

    grx1a Гик

    КР1182ПМ1
     

    Вложения:

    • 6666666.png
      6666666.png
      Размер файла:
      144 КБ
      Просмотров:
      1.411
  10. hibiki

    hibiki Гик

    на полевиках тоже можно, да :) только дороже, вроде как :)
    вторая схема как раз в хабрастатье упоминается
    а третья - ну, если есть готовая к употреблению схема - вперед :)
     
  11. Unixon

    Unixon Оракул Модератор

    Можно и просто выпрямить переменку диодным мостом и уже потом пустить через полевик, так и ВЧ ШИМ из примера сгодится.
     
    hibiki нравится это.
  12. hibiki

    hibiki Гик

    мсье знает толк :)
    что-то я не подумал о таком даже
     
  13. Unixon

    Unixon Оракул Модератор

    Входной каскад импульсного блока питания так и работает. Ему без разницы переменное на входе напряжение или постоянное - все равно он его выпрямляет и генерирует свою переменку от сотен герц и дальше вместо исходных 50Гц, которую уже потом и понижает через трансформатор значительно меньшего размера, чем понадобился бы для низкой частоты.
     
  14. hibiki

    hibiki Гик

    ну, это-то я и сам знаю. просто не сообразил
     
  15. Megakoteyka

    Megakoteyka Оракул Модератор

    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);}

    А эти строки зачем? Не нужно в каждом цикле выставлять уровень на ногу, он у Вас и так останется таким же, какой был после последнего увеличения/уменьшения яркости.
    Достаточно по первому нажатию крутить цикл увеличения яркости, а по второму - уменьшения.
     
  16. Megakoteyka

    Megakoteyka Оракул Модератор

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

    Код (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);
          }  
        }
      }
    }
     
    grx1a нравится это.
  17. grx1a

    grx1a Гик

    Мне тоже эта часть сразу не понравилась, чувствую что то не то, как то не красиво. Спасибо за совет!