Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*Данный скетч позволит превратить ардуинку, полевой транзистор и светодиодную ленту в "умную" подсветку.
- Что она умеет:
- При нажатии и кратковременном удержании кнопки увеличения или уменьшения яркости яркость будет плавно убавляться,
- если удерживать кнопку длительное время, яркость будет изменяться ощутимо быстрее.
- При достижении максимальной яркости, подсветка будет мигать, пока не будет отпущена кнопка увеличения яркости.
- При одновременном кратковременном нажатии двух кнопок сразу, подсветка включится в полную яркость или выключится, в зависимости от текущей яркости
- (если подсветка горит меньше, чем на 15%, подсветка загорится в полную силу, а если текущая яркость больше 15%, то подсетка выключится)
- При одновременном удержании обеих кнопок, подсветка начнет мигать, данная индикация будет значить, что включен 20 секундный таймер выключения.
- (по истечении 20 секунд подсветка самостоятельно выключится)
- */
- int LedPin = 11, BT1 = 3, BT2 = 2; //Пин управления яркостью, пин кнопки уменьшени яркости, пин кнопки увеличения яркости
- int Analog = 0, kup = true, kpress = 0, bpress = 0, presstime; // Переменные, которые необходимы для работы "умных" функций
- //Яркость, нажаты ли 2 кнопки сразу, время удержания, время удержания одной из кнопок, время удержания после отпускания кнопок
- int timer = 0, timerOn=false; //Переменные для работы таймера
- void setup(){
- pinMode(BT1, INPUT);digitalWrite(BT1, HIGH);
- pinMode(BT2, INPUT);digitalWrite(BT2, HIGH);
- TCCR2B = TCCR2B & 0b11111000 | 0x01;
- Serial.begin(9600);
- }
- void blink(int current){ // Функция 2 раза мигающая 2 раза
- analogWrite(LedPin,current-40); delay(100); analogWrite(LedPin,current); delay(100); analogWrite(LedPin,current-40); delay(100); analogWrite(LedPin,current); delay(100);
- }
- void loop(){
- if(digitalRead(BT1)==1 && digitalRead(BT2) == 0 && Analog>0){delay(3); if(bpress<70)delay(32); Analog--;bpress++;} //Уменьшение
- if(digitalRead(BT1)==0 && digitalRead(BT2) == 1 && Analog<255){delay(3); if(bpress<70)delay(32); Analog++;bpress++;} //Увеличение
- if(digitalRead(BT1)==0 && digitalRead(BT2) == 0) bpress=0; //Обнуляем удержание, если отпускаем кнопки
- if(digitalRead(BT2) != digitalRead(BT1))bpress++; //Сколько удерживается кнопка
- if(digitalRead(BT1)==0 && digitalRead(BT2) == 1 && Analog==255 && bpress>50) blink(255); //Если достигнута максиммальная яркость, мигаем
- if(digitalRead(BT1)==1 && digitalRead(BT2) == 1) {kpress++; kup = false;} // Если нажаты обе кнопки, накапливаем значение
- else {if (kup == false)presstime=kpress; kup = true; kpress=0;} //когда кнопки отпустили, записываем накопленное
- if (presstime != 0 && kup == true){ // Если время удержания больше нуля и кнопка отпущена
- if (presstime <= 60 || Analog < 15){ //Если удержание меньше 5 секунд или яркость меньше 12/255
- 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 и обнуляем переменные
- else { for(int i=Analog; i>0; i--){analogWrite(LedPin,i); delay(4);} Analog = 0, presstime = 0, timerOn=false, timer=0;}} //Если яркость больше 40, то плавно гасим ее и обнуляем переменные
- }
- if (kpress>60 && Analog > 100 && kup == false){timerOn=true, presstime = 0, timer=0; blink(255);} //Если удержание больше 5 секунд, включаем таймер сна и мигаем 2 раза
- if (timerOn == true){ //Если тайер включен, то в фоне считаем время, когда оно доходит до 15 секунд, выключаем подсветку, обнуляем переменные
- if (timer<2500) timer++;
- 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;}
- }
- Serial.print(bpress); Serial.print(" "); Serial.print(Analog); Serial.print(" "); Serial.print(timerOn); Serial.print(" "); Serial.print(timer); Serial.print("\n");
- analogWrite(LedPin,Analog); //Ставим яркость
- }
Add Comment
Please, Sign In to add comment