| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- #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;
-
- }
|