MrHerobrine

SmartLight Arduino

May 7th, 2016
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.47 KB | None | 0 0
  1. /*Данный скетч позволит превратить ардуинку, полевой транзистор и светодиодную ленту в "умную" подсветку.
  2. Что она умеет:
  3.   При нажатии и кратковременном удержании кнопки увеличения или уменьшения яркости яркость будет плавно убавляться,
  4.   если удерживать кнопку длительное время, яркость будет изменяться ощутимо быстрее.
  5.   При достижении максимальной яркости, подсветка будет мигать, пока не будет отпущена кнопка увеличения яркости.
  6.  
  7.   При одновременном кратковременном нажатии двух кнопок сразу, подсветка включится в полную яркость или выключится, в зависимости от текущей яркости
  8.   (если подсветка горит меньше, чем на 15%, подсветка загорится в полную силу, а если текущая яркость больше 15%, то подсетка выключится)
  9.  
  10.   При одновременном удержании обеих кнопок, подсветка начнет мигать, данная индикация будет значить, что включен 20 секундный таймер выключения.
  11.   (по истечении 20 секунд подсветка самостоятельно выключится)
  12. */
  13.  
  14. int LedPin = 11, BT1 = 3, BT2 = 2; //Пин управления яркостью, пин кнопки уменьшени яркости, пин кнопки увеличения яркости
  15. int Analog = 0, kup = true, kpress = 0, bpress = 0, presstime; // Переменные, которые необходимы для работы "умных" функций
  16. //Яркость, нажаты ли 2 кнопки сразу, время удержания, время удержания одной из кнопок, время удержания после отпускания кнопок
  17. int timer = 0, timerOn=false; //Переменные для работы таймера
  18.  
  19.  
  20. void setup(){
  21.   pinMode(BT1, INPUT);digitalWrite(BT1, HIGH);
  22.   pinMode(BT2, INPUT);digitalWrite(BT2, HIGH);
  23.   TCCR2B = TCCR2B & 0b11111000 | 0x01;
  24.   Serial.begin(9600);
  25. }
  26.  
  27. void blink(int current){ // Функция 2 раза мигающая 2 раза
  28.   analogWrite(LedPin,current-40); delay(100); analogWrite(LedPin,current); delay(100); analogWrite(LedPin,current-40); delay(100); analogWrite(LedPin,current); delay(100);
  29. }
  30.  
  31. void loop(){
  32.   if(digitalRead(BT1)==1 && digitalRead(BT2) == 0 && Analog>0){delay(3); if(bpress<70)delay(32); Analog--;bpress++;} //Уменьшение
  33.   if(digitalRead(BT1)==0 && digitalRead(BT2) == 1 && Analog<255){delay(3); if(bpress<70)delay(32); Analog++;bpress++;} //Увеличение
  34.   if(digitalRead(BT1)==0 && digitalRead(BT2) == 0) bpress=0; //Обнуляем удержание, если отпускаем кнопки
  35.  
  36.   if(digitalRead(BT2) != digitalRead(BT1))bpress++; //Сколько удерживается кнопка
  37.   if(digitalRead(BT1)==0 && digitalRead(BT2) == 1 && Analog==255 && bpress>50) blink(255); //Если достигнута максиммальная яркость, мигаем
  38.  
  39.  
  40.   if(digitalRead(BT1)==1 && digitalRead(BT2) == 1) {kpress++; kup = false;} // Если нажаты обе кнопки, накапливаем значение
  41.   else {if (kup == false)presstime=kpress; kup = true; kpress=0;} //когда кнопки отпустили, записываем накопленное
  42.  
  43.   if (presstime != 0 && kup == true){ // Если время удержания больше нуля и кнопка отпущена
  44.     if (presstime <= 60 || Analog < 15){ //Если удержание меньше 5 секунд или яркость меньше 12/255
  45.       if (Analog<40){ for(int i=Analog; i<255; i++){analogWrite(LedPin,i); delay(4);} Analog = 255, presstime = 0, timerOn=false, timer=0;} //Если яркость меньше 40, то плавно выкручиваем ее до 255 и обнуляем переменные
  46.       else { for(int i=Analog; i>0; i--){analogWrite(LedPin,i); delay(4);} Analog = 0, presstime = 0, timerOn=false, timer=0;}} //Если яркость больше 40, то плавно гасим ее и обнуляем переменные
  47.   }
  48.  
  49.   if (kpress>60 && Analog > 100 && kup == false){timerOn=true, presstime = 0, timer=0; blink(255);} //Если удержание больше 5 секунд, включаем таймер сна и мигаем 2 раза
  50.  
  51. if (timerOn == true){ //Если тайер включен, то в фоне считаем время, когда оно доходит до 15 секунд, выключаем подсветку, обнуляем переменные
  52.   if (timer<2500) timer++;
  53.   else{ for(int i=Analog; i>0; i--){analogWrite(LedPin,i); delay(5);}  timer=0, timerOn=false, Analog=0, bpress = 0, presstime = 0, kpress = 0, kup = true;}
  54. }
  55.  
  56.  Serial.print(bpress); Serial.print(" "); Serial.print(Analog); Serial.print(" "); Serial.print(timerOn); Serial.print(" "); Serial.print(timer); Serial.print("\n");
  57.  analogWrite(LedPin,Analog); //Ставим яркость
  58. }
Add Comment
Please, Sign In to add comment