#define LASER 3
#define BTN_SHOT 12
#define BTN_PLUS 11
#define BTN_MINUS 10
#define CONTACT_BOUNCE_DELAY 10
//--- Сдвиговый регистр 74HC595
const int LATCH_PIN = A0; // 74HC595 pin 12
const int DATA_PIN = A1; // 74HC595 pin 14
const int CLOCK_PIN = A2; // 74HC595 pin 11
boolean lastStateBtnPlus = false;
boolean lastStateBtnMinus = false;
//--- Начальная мощность лазера. Пристрелочный режим.
int laserPowerAimPwm = 1;
//--- Значение мощности лазера установленное пользователем
// значение для вывода в лазер
// 0 - Пристрелочный режим
// 9 - Максимальная мощность (PWM = 255)
int laserShotLevelPwm = laserPowerAimPwm;
//--- Значение мощности лазера установленное пользователем
// значение для вывода на дисплей
int laserShotLevelDisplay = 0;
//--- Значение мощности лазера для выстрела
int laserPowerShotPwm = laserPowerAimPwm;
//--- Таблица отношений laserShotLevelPwm от значения laserShotLevelDisplay
int arPowerValues[10];
//--- Кодировка символов для дисплея
// byte segments[10] = {
// 0b01111101, 0b00100100, 0b01111010, 0b01110110, 0b00100111,
// 0b01010111, 0b01011111, 0b01100100, 0b01111111, 0b01110111
// };
uint8_t segments[10] = {
0b11000000,
0b11111001,
0b10100100,
0b10110000,
0b10011001,
0b10010010,
0b10000010,
0b11111000,
0b10000000,
0b10010000,
};
void setup() {
pinMode(LASER, OUTPUT);
pinMode(BTN_SHOT, INPUT_PULLUP);
pinMode(BTN_PLUS, INPUT_PULLUP);
pinMode(BTN_MINUS, INPUT_PULLUP);
pinMode(DATA_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
//--- Рассчитать таблицу отношений laserShotLevelPwm от значения laserShotLevelDisplay
int stepPwm = (255 - laserPowerAimPwm) / 9;
int stepPwmNext = stepPwm;
arPowerValues[0] = laserPowerAimPwm;
arPowerValues[9] = 255;
for (int i=1; i <= 8; i++){
arPowerValues[i]=stepPwmNext;
stepPwmNext = stepPwmNext + stepPwm;
}
}
void loop() {
//--- Установить мощность лазера (выстрел или прицеливание)
analogWrite(LASER, laserPowerShotPwm);
//--- Отобразить уровень мощности лазера на дисплее
//-------------------------------------------------
//--- Начать передачу
digitalWrite(LATCH_PIN, LOW);
//--- Передать значение
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, segments[laserShotLevelDisplay]);
//--- Отобразить значение на дисплее
digitalWrite(LATCH_PIN, HIGH);
//--- Узнать состояние кнопки выстрела
boolean isBtnShotDown = checkBtnState(BTN_SHOT);
//--- Прочитать пользовательский ввод
int userInputLevel = checkLaserShotLevel();
//--- Если кнопка выстрела была нажата
if( isBtnShotDown ){
laserPowerShotPwm = userInputLevel;
Serial.begin(9600);
Serial.print("Kostya pidor!");
Serial.print('\n');
Serial.end();
}
else {
laserPowerShotPwm = laserPowerAimPwm;
}
}
//--- Функция - Определение нажатия кнопки
boolean checkBtnState(int btnPin) {
boolean result = false;
//--- Кнопка нажата?
boolean isBtnDown = !digitalRead(btnPin);
//--- Успокить дребезг
delay(CONTACT_BOUNCE_DELAY);
//--- Кнопка все еще нажата?
boolean isBtnDown_2 = !digitalRead(btnPin);
//--- Если кнопка выстрела действительно была нажата
if( isBtnDown && isBtnDown_2 ){
result = true;
}
return result;
}
//--- Функция - Определение мощности лазера для выстрела
// на основе пользовательского ввода
int checkLaserShotLevel() {
//--- Узнать состояние кнопки увеличения мощности
boolean isBtnPlusDown = checkBtnState(BTN_PLUS);
//--- Узнать состояние кнопки уменьшения мощности
boolean isBtnMinusDown = checkBtnState(BTN_MINUS);
if( isBtnPlusDown && lastStateBtnPlus == false ) {
if( laserShotLevelDisplay == 9 ){
laserShotLevelDisplay = 0;
}
else {
laserShotLevelDisplay++;
}
}
else if( isBtnMinusDown && lastStateBtnMinus == false ) {
if( laserShotLevelDisplay == 0 ){
laserShotLevelDisplay = 9;
}
else {
laserShotLevelDisplay--;
}
}
lastStateBtnPlus = isBtnPlusDown;
lastStateBtnMinus = isBtnMinusDown;
return arPowerValues[laserShotLevelDisplay];
}