#define CLK 2 #define DIO 3 #define RELEY_PIN 10 #include "GyverTM1637.h" const int DISP_PIN = A1; /**Переменная для хранения значения аналогового входа A1 */ int val = 0; /**Переменная, для хранения заданного значения таймера */ int timer = 1; /**Переменная, для хранения статуса реле*/ bool relayOpened = false; /**Настройка сегментного экрана */ GyverTM1637 disp(CLK, DIO); /**Метод запускающийся при старте */ void setup() { // put your setup code here, to run once: pinMode(RELEY_PIN, OUTPUT); closeRelay(); Serial.begin(9600); disp.clear(); disp.brightness(0); } /**Метод работы платы */ void loop() { // put your main code here, to run repeatedly: val = analogRead(DISP_PIN); switch (buttonFromValue(val)) { case 1: addTimer(); break; case 2: declineTimer(); break; case 3: shoot(); break; case 4: workingLight(); break; } disp.displayInt(timer); } /** Открыть реле - подать значение для соединения выводов COM с NO * Прим.: в моем случае использовалось реле низкого уровня, поэтому * подается низкий логический уровень */ void openRelay() { digitalWrite(RELEY_PIN, LOW); relayOpened = true; } /**Закрыть реле - соединяет выводы COM с NC */ void closeRelay(){ digitalWrite(RELEY_PIN, HIGH); relayOpened = false; } /**Добавить значение таймеру - может не лучшим образом проверяет не было * ли нажатие на кнопку долгим, при долгом умножает значение таймера * (удобно для фотоувеличителя как изменение экспозиции на один стоп), * при коротком прибавляет единицу. */ void addTimer() { delay(500); if (buttonFromValue(analogRead(DISP_PIN)) == 1) { timer = timer * 2; } else { timer++; } } /**Убавить значение таймера - при коротком нажатии убавляет единицу, * при длинном делит на двое. Минимальное значение таймера - 1. */ void declineTimer() { if(timer > 1) { delay(500); if (buttonFromValue(analogRead(DISP_PIN)) == 2) { timer = timer / 2; } else if (timer>1) { timer--; } } } /**Функция активации фотоувеличителя на заданное таймером время * Предварительно закрывает реле, если фотоувеличитель находился в пилотном режиме */ void shoot() { closeRelay(); int ms = timer * 1000; delay(1000); openRelay(); while (ms>0) { delay(1000); ms = ms - 1000; disp.displayInt(ms/1000); } closeRelay(); } /**Пероключатель пилотного режима фотоувеличителя, меняет состояние реле * на противоположное */ void workingLight() { if ( relayOpened == true ) { closeRelay(); } else { openRelay(); } delay(500); } /**Функция получения номера нажатой кнопки, т.к. * кнопки аналоговые, сигнал подвержен помехам, поэтому каждому * значению нажатой кнопки задаеться диапазон измеренного значения на * аналоговом входе */ byte buttonFromValue(int analogValue) { if (analogValue>950) { return 4; } if (analogValue > 713 && analogValue < 950) { return 3; } if (analogValue > 506 && analogValue < 713) { return 2; } if (analogValue > 200 && analogValue < 506) { return 1; } return 0; }