/*
*/
// Корекция Таимера при изменение ШИМ D5-D6
//#define micros() (micros() << 4)
//#define millis() (millis() << 4)
#include <EEPROM.h>
#define PinPWM 5 // пин для шим левого сиденья
#define PinPWM1 6 // пин для шим правого сиденья
#define PinBT 12 // Пин левой кнопки
#define PinBT2 11 // Пин правой кнопки
#define PinLed_1 3 //Пин диода левого сиденья
#define PinLed_2 2 //Пин диода левого сиденья
#define PinLed_3 10 //Пин диода левого сиденья
#define PinLed_4 A5 //Пин диода правого сиденья
#define PinLed_5 A3 //Пин диода правого сиденья
#define PinLed_6 A1 //Пин диода правого сиденья
byte PWM = 0; //мощьность левого сиденья
byte PWM1 = 0; //мощьность правого сиденья
byte BT = 0; // счетчик нажатий кнопки левого сиденья
byte BT1 = 0; // счетчик удержания кнопки левого сиденья
byte BT2 = 0; // счетчик нажатий кнопки правого сиденья
unsigned long T = 0; // время работы
unsigned long T1 = 0; // период переключений
unsigned long btnTimer; // таймер нажатия кнопки
bool btnState = 0; // состояние пина кнопки левого сиденья
bool btnState2 = 0; // состояние пина кнопки правого сиденья
bool flag = false; // флаг нажатия кнопки левого сиденья
bool flag1 = true; // флаг удержания кнопки левого сиденья
bool flag2 = false; // флаг нажатия кнопки правого сиденья
void setup()
{
pinMode(PinBT, INPUT_PULLUP);
pinMode(PinBT2, INPUT_PULLUP);
pinMode(PinPWM, OUTPUT);
pinMode(PinPWM1, OUTPUT);
pinMode(PinLed_1, OUTPUT);
pinMode(PinLed_2, OUTPUT);
pinMode(PinLed_3, OUTPUT);
pinMode(PinLed_4, OUTPUT);
pinMode(PinLed_5, OUTPUT);
pinMode(PinLed_6, OUTPUT);
// Пины ШИМ D5 и D6 - 61 Гц
//TCCR0B = 0b00000101; // x1024 (61 Гц)
//TCCR0A = 0b00000011; // fast pwm
// Пины D5 и D6 - 490 Гц
//TCCR0B = 0b00000011; // x64
//TCCR0A = 0b00000001; // phase correct
EEPROM.get(0, T1); //чтение из епром
}
void loop()
{
btnState = !digitalRead(PinBT);
btnState2 = !digitalRead(PinBT2);
//нажатие кнопки
if (btnState && !flag && millis() - btnTimer > 200 && flag1)
{
flag = true;
btnTimer = millis();
BT = BT - 1;
if ( BT > 4)
{
BT = 3;
}
}
if (btnState2 && !flag2 && millis() - btnTimer > 200 )
{
flag = true;
btnTimer = millis();
BT2 = BT2 - 1;
if ( BT2 > 4)
{
BT2 = 3;
}
}
// удержание кнопки
if (btnState && flag && millis() - btnTimer > 1000) // состояние пина кнопки
{
btnTimer = millis();
flag1 = false;
BT1 = BT1 + 1;
if ( BT > 7 )
{
BT1 = 0;
}
if ( BT2 <= 4 )
{
BT2 = 0;
}
BT = 7;
PWM = 0;
PWM1 = 0;
switch (BT1)
{
case 1:
digitalWrite (PinLed_1, LOW);
digitalWrite (PinLed_2, LOW);
digitalWrite (PinLed_3, LOW);
digitalWrite (PinLed_4, LOW);
digitalWrite (PinLed_5, LOW);
digitalWrite (PinLed_6, LOW);
break;
case 2:
digitalWrite (PinLed_1, HIGH);
break;
case 3:
digitalWrite (PinLed_2, HIGH);
digitalWrite (PinLed_3, LOW);
break;
case 4:
digitalWrite (PinLed_1, HIGH);
digitalWrite (PinLed_2, HIGH);
digitalWrite (PinLed_3, HIGH);
break;
case 5:
digitalWrite (PinLed_4, HIGH);
break;
case 6:
digitalWrite (PinLed_4, HIGH);
digitalWrite (PinLed_5, HIGH);
break;
case 7:
digitalWrite (PinLed_4, HIGH);
digitalWrite (PinLed_5, HIGH);
digitalWrite (PinLed_6, HIGH);
break;
}
}
//отпускание кнопки
if (!btnState && flag && millis() - btnTimer > 100)
{
btnTimer = millis();
flag = false;
flag1 = true;
switch (BT1 == 2)
{
case 1:
T1 = 180000;
break;
case 2:
T1 = 240000;
break;
case 3:
T1 = 300000;
break;
case 4:
T1 = 360000;
break;
case 5:
T1 = 420000;
break;
case 6:
T1 = 480000;
break;
}
EEPROM.put(0, T1); //Запись в епром
if (BT1 > 0)
{
digitalWrite (PinLed_1, HIGH);
digitalWrite (PinLed_2, HIGH);
digitalWrite (PinLed_3, HIGH);
digitalWrite (PinLed_4, HIGH);
digitalWrite (PinLed_5, HIGH);
digitalWrite (PinLed_6, HIGH);
BT = 0;
}
BT1 = 0;
T = millis();
}
//Индикация мощьности и установка мошьности
switch (BT)
{
case 1:
PWM = 100;
digitalWrite (PinLed_3, HIGH);
digitalWrite (PinLed_2, LOW);
digitalWrite (PinLed_1, LOW);
break;
case 2:
PWM = 170;
digitalWrite (PinLed_3, HIGH);
digitalWrite (PinLed_2, HIGH);
digitalWrite (PinLed_1, LOW);
break;
case 3:
PWM = 255;
digitalWrite (PinLed_3, HIGH);
digitalWrite (PinLed_2, HIGH);
digitalWrite (PinLed_1, HIGH);
break;
case 0:
PWM = 0;
digitalWrite (PinLed_1, LOW);
digitalWrite (PinLed_2, LOW);
digitalWrite (PinLed_3, LOW);
break;
}
switch (BT2)
{
case 1:
PWM1 = 100;
digitalWrite (PinLed_4, HIGH);
digitalWrite (PinLed_5, LOW);
digitalWrite (PinLed_6, LOW);
break;
case 2:
PWM1 = 170;
digitalWrite (PinLed_4, HIGH);
digitalWrite (PinLed_5, HIGH);
digitalWrite (PinLed_6, LOW);
break;
case 3:
PWM1 = 255;
digitalWrite (PinLed_4, HIGH);
digitalWrite (PinLed_5, HIGH);
digitalWrite (PinLed_6, HIGH);
break;
case 0:
for (;;)
{
if (flag)
break;
PWM1 = 0;
digitalWrite (PinLed_4, LOW);
digitalWrite (PinLed_5, LOW);
digitalWrite (PinLed_6, LOW);
break;
}
}
// таймер
if (millis() - T > T1)
{
T = millis();
if (BT > 1)
{
BT = BT - 1;
}
if (BT2 > 1)
{
BT2 = BT2 - 1;
}
}
// подача шим
analogWrite(PinPWM, PWM);
analogWrite(PinPWM1, PWM1);
}