Объединил скетч блока питания и резистивных кнопок! Может кому пригодится.
PHP код:
// _ ___ _______ ___ ___ ___ ___ _ _ ___ _____ ___
// / |_ )__ / \ / __|_ _| _ \/ __| | | |_ _|_ _/ __|
// | |/ / |_ \ |) | | (__ | || / (__| |_| || | | | \__ \
// |_/___|___/___/ \___|___|_|_\\___|\___/|___| |_| |___/
//
// БП Nexus 7 2012 на Arduino TEST
//
// Made by alexnftut alexnftut
// License: CC-BY-SA 3.0
// Downloaded from: [url]https://123d.circuits.io/circuits/1187863-nexus-7-2012-arduino-test[/url]
//Добавление библиотек из состава avr
#include <avr/sleep.h> //библиотека для засыпания устройства [url]http://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html[/url]
#include <avr/power.h> //библиотека включения/выключения различных устройств, портов usb, и т п, например для энергосбережения
//Объявление переменных и присвоение им значений
int ACCPin = 2; // Пин АСС
int sleepStatus = 0; // Переменная для хранения статуса (спим, проснулись) - не используется в коде
int analogPin=0; // пин для подключения кнопок, по умолчанию A0
int release_button = 855; // значение при отпущенных кнопках
int button_release_range = 50; // диапазон значения + - при отпущенных кнопках
int button_range = 5; // диапазон значения нажатых кнопок + -
int time_holding = 500; // время для удержания кнопок в миллисекундах
int time_tinkling = 30; // время исключающее дребезг контактов в миллисекундах
int vol_up = 50; // значение кнопки увеличить громкость
int vol_down = 130; // значение кнопки уменьшить громкость
int alt_tab = 519; // значение кнопки которая будет работать как Alt + Tab
int next = 235; // значение кнопки которая будет работать как Next при коротком нажатии и Fast Forward при удержании
int previous = 365; // значение кнопки которая будет работать как Previous при коротком нажатии и Rewind при удержании
int play_pause = 777; // значение кнопки которая будет работать как Play/Pause при коротком нажатии и
int data;
unsigned long flag = 0;
unsigned long eventTime = 0;
unsigned long pauseMillis = 0;
//Объявление констант и их значений, на которые будут они заменены при компиляции.
#define pinKIS1 7 // пин управления питанием HUB
#define relePinTablet 9 // OTG + датчик холла
#define ONKIS 100 // время включения HUB
#define ONTablet 2000 // время включения планшета
#define OFFKIS 10000 // время задержки выключения HUB
#define OFFTablet 5000 // время выключения планшета
//Объявление переменных и присвоение им значений
unsigned long duration, off = 0; // Время включения и выключения
boolean stateACC, relestate1, relestate2, relestate3 = 0;
void wakeUpNow() // Прерывание сработает после пробуждения
{
if (sleepStatus) // Если мы спали,
{
sleep_disable(); // то первое, что нужно сделать после просыпания - выключить спящий режим
sleepStatus = 0; // В переменную заносим статус бодрствования
detachInterrupt(1); // Выключаем прерывание - при нормальном режиме wakeUpNow() не будет вызываться
}
}
void setup() //Функция setup() вызывается, когда стартует скетч. Используется для инициализации переменных, определения режимов работы выводов, запуска используемых библиотек и т.д. Функция setup запускает только один раз, после каждой подачи питания или сброса платы Arduino.
{
pinMode(ACCPin, INPUT); //Установка режима работы пина 2 (ACCPin) в режим входа
attachInterrupt(1, wakeUpNow, FALLING); // Используем прерывание 1 (pin 2) для выполнения функции wakeUpNow При появлении сигнала FALLING (изменение сигана с высокого уровня на низкий)
// на прерывании 1, происходит выполнение функции wakeUpNow (прерывание 1 на входе 2 только для Леонардо, у других плат может быть иначе)
pinMode(pinKIS1, OUTPUT); //7 пин выход - управляет работой хаба
pinMode(relePinTablet, OUTPUT); //9 пин выход - управляет датчиком холла и отг
analogReference(DEFAULT); // подключение внутреннего напряжение AVCC к выводу AREF (опорное напряжение)
Keyboard.begin();
}
void sleepNow() // Функция увода ардуины в спячку.
{
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Здесь устанавливается режим сна
sleep_enable(); // Включаем sleep-бит в регистре mcucr. Теперь возможен слип
attachInterrupt(1, wakeUpNow, FALLING); // Используем прерывание 1 (pin 2) для выполнения функции wakeUpNow при появлении низкого уровня на пине 2
sleepStatus = 1; // В переменную заносим статус сна
sleep_mode(); // Здесь устройство перейдет в режим сна!!!
//-------------------------ПОСЛЕ ПРОСЫПАНИЯ ВЫПОЛНЕНИЕ КОДА ПРОДОЛЖИТСЯ ОТСЮДА!!!--------------------------//
}
void loop()
{
Power();
delay(10);
data=analogRead(analogPin);
if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 0)
{
eventTime=millis();
}
//********************** Громкость ************************************
if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= vol_up - button_range && data <= vol_up + button_range && flag == 0)
{
Remote.increase();
flag = 5;
delay(10);
Remote.clear();
}
if(millis()-eventTime>time_holding && data >= vol_up - button_range && data <= vol_up + button_range && flag == 5 || data >= vol_up - button_range && data <= vol_up + button_range && flag && flag == 3)
{
Remote.increase();
flag = 3;
Remote.clear();
delay(100);
}
if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= vol_down - button_range && data <= vol_down + button_range && flag == 0)
{
Remote.decrease();
flag = 6;
delay(10);
Remote.clear();
}
if(millis()-eventTime>time_holding && data >= vol_down - button_range && data <= vol_down + button_range && flag == 6 || data >= vol_down - button_range && data <= vol_down + button_range && flag == 3)
{
Remote.decrease();
flag = 3;
Remote.clear();
delay(100);
}
//********************** AltTab + Ещё что то ************************************
if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= alt_tab - button_range && data <= alt_tab + button_range)
{
flag = 1;
}
if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 1 && pauseMillis == 0)
{
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
flag = 0;
pauseMillis = millis();
}
if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 1 && pauseMillis != 0)
{
Keyboard.press(KEY_TAB);
Keyboard.release(KEY_TAB);
flag = 0;
pauseMillis = millis();
}
if(pauseMillis && millis()-pauseMillis >= 800 && data>=release_button - button_release_range && data<=release_button + button_release_range)
{
flag = 0;
pauseMillis = 0;
Keyboard.releaseAll();
}
if(millis()-eventTime>time_holding && data >= alt_tab - button_range && data <= alt_tab + button_range && flag == 1)
{
flag = 0;
}
//********************** Next и Fast Forward ************************************
if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= next - button_range && data <= next + button_range)
{
flag = 2;
}
if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 2)
{
Remote.next();
flag = 0;
delay(10);
Remote.clear();
}
if(millis()-eventTime>time_holding && data >= next - button_range && data <= next + button_range && flag == 2 || data >= next - button_range && data <= next + button_range && flag == 3)
{
Remote.forward();
flag = 3;
Remote.clear();
delay(100);
}
//********************** Previous и Rewind ************************************
if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= previous - button_range && data <= previous + button_range)
{
flag = 4;
}
if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 4)
{
Remote.previous();
flag = 0;
delay(10);
Remote.clear();
}
if(millis()-eventTime>time_holding && data >= previous - button_range && data <= previous + button_range && flag == 4 || data >= previous - button_range && data <= previous + button_range && flag == 3)
{
Remote.rewind();
flag = 3;
Remote.clear();
delay(100);
}
//********************** Play/pause + Mute ************************************
if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= play_pause - button_range && data <= play_pause + button_range)
{
flag = 7;
}
if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 7)
{
Remote.play_pause();
flag = 0;
delay(10);
Remote.clear();
}
if(millis()-eventTime>time_holding && data >= play_pause - button_range && data <= play_pause + button_range && flag == 7)
{
Remote.mute();
flag = 0;
delay(10);
Remote.clear();
}
if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 3 || data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 5 || data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 6)
{
flag = 0;
}
}
void Power()
{
if (!digitalRead(ACCPin)&&stateACC) //Если асс есть (НЕ высокий уровень)И не был включен
{
stateACC=0; //записываем статус АСС - есть
duration = millis(); //Запоминаем текущее время(с момента включения)
}
if (digitalRead(ACCPin)&&!stateACC) // Если асс нет, И был до этого
{
stateACC=1; //записываем статус асс выкл
off = millis(); // сохраняем время отключения асс
}
if(!digitalRead(ACCPin) && !stateACC && millis ()-duration > ONKIS) //Если АСС есть и был
// и время с момента включения более 0.1 сек
{
digitalWrite(pinKIS1, HIGH); //включаем хаб
// digitalWrite(pinIsoAmp, HIGH);
relestate1 = 1; //записываем статус хаба - включен
// millisold = millis(); //сохраняем время включения хаба
}
if(!digitalRead(ACCPin) && !stateACC && millis ()-duration > ONTablet) //Если асс есть и был
// время с момента включения более 2 сек
{
digitalWrite(relePinTablet, HIGH); // включаем экран и отг
relestate2 = 1; //записываем статус включения экрана
}
if(digitalRead(ACCPin) && stateACC && millis () -off> OFFKIS) // Если нет АСС и не было
//и прошло 10 сек с момента откл-я
{
digitalWrite(pinKIS1, LOW); //отключаем хаб
relestate1 = 0; //записываем статус хаба выкл
delay(100);
sleepNow(); //засыпаем
}
if(digitalRead(ACCPin) && stateACC && millis ()-off > OFFTablet) //если асс нет но был
//и прошло 5 сек с моента пропадания
{
digitalWrite(relePinTablet, LOW); //тушим экран
relestate2 = 0; //сохраняем состояние экрана выкл
}
}