timer.ino 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #define CLK 2
  2. #define DIO 3
  3. #define RELEY_PIN 10
  4. #include "GyverTM1637.h"
  5. const int DISP_PIN = A1;
  6. /**Переменная для хранения значения аналогового входа A1 */
  7. int val = 0;
  8. /**Переменная, для хранения заданного значения таймера */
  9. int timer = 1;
  10. /**Переменная, для хранения статуса реле*/
  11. bool relayOpened = false;
  12. /**Настройка сегментного экрана */
  13. GyverTM1637 disp(CLK, DIO);
  14. /**Метод запускающийся при старте */
  15. void setup() {
  16. // put your setup code here, to run once:
  17. pinMode(RELEY_PIN, OUTPUT);
  18. closeRelay();
  19. Serial.begin(9600);
  20. disp.clear();
  21. disp.brightness(0);
  22. }
  23. /**Метод работы платы */
  24. void loop() {
  25. // put your main code here, to run repeatedly:
  26. val = analogRead(DISP_PIN);
  27. switch (buttonFromValue(val))
  28. {
  29. case 1:
  30. addTimer();
  31. break;
  32. case 2:
  33. declineTimer();
  34. break;
  35. case 3:
  36. shoot();
  37. break;
  38. case 4:
  39. workingLight();
  40. break;
  41. }
  42. disp.displayInt(timer);
  43. }
  44. /** Открыть реле - подать значение для соединения выводов COM с NO
  45. * Прим.: в моем случае использовалось реле низкого уровня, поэтому
  46. * подается низкий логический уровень
  47. */
  48. void openRelay()
  49. {
  50. digitalWrite(RELEY_PIN, LOW);
  51. relayOpened = true;
  52. }
  53. /**Закрыть реле - соединяет выводы COM с NC */
  54. void closeRelay(){
  55. digitalWrite(RELEY_PIN, HIGH);
  56. relayOpened = false;
  57. }
  58. /**Добавить значение таймеру - может не лучшим образом проверяет не было
  59. * ли нажатие на кнопку долгим, при долгом умножает значение таймера
  60. * (удобно для фотоувеличителя как изменение экспозиции на один стоп),
  61. * при коротком прибавляет единицу.
  62. */
  63. void addTimer()
  64. {
  65. delay(500);
  66. if (buttonFromValue(analogRead(DISP_PIN)) == 1)
  67. {
  68. timer = timer * 2;
  69. }
  70. else
  71. {
  72. timer++;
  73. }
  74. }
  75. /**Убавить значение таймера - при коротком нажатии убавляет единицу,
  76. * при длинном делит на двое. Минимальное значение таймера - 1.
  77. */
  78. void declineTimer()
  79. {
  80. if(timer > 1)
  81. {
  82. delay(500);
  83. if (buttonFromValue(analogRead(DISP_PIN)) == 2)
  84. {
  85. timer = timer / 2;
  86. }
  87. else if (timer>1)
  88. {
  89. timer--;
  90. }
  91. }
  92. }
  93. /**Функция активации фотоувеличителя на заданное таймером время
  94. * Предварительно закрывает реле, если фотоувеличитель находился в пилотном режиме
  95. */
  96. void shoot()
  97. {
  98. closeRelay();
  99. int ms = timer * 1000;
  100. delay(1000);
  101. openRelay();
  102. while (ms>0)
  103. {
  104. delay(1000);
  105. ms = ms - 1000;
  106. disp.displayInt(ms/1000);
  107. }
  108. closeRelay();
  109. }
  110. /**Пероключатель пилотного режима фотоувеличителя, меняет состояние реле
  111. * на противоположное
  112. */
  113. void workingLight()
  114. {
  115. if ( relayOpened == true )
  116. {
  117. closeRelay();
  118. }
  119. else
  120. {
  121. openRelay();
  122. }
  123. delay(500);
  124. }
  125. /**Функция получения номера нажатой кнопки, т.к.
  126. * кнопки аналоговые, сигнал подвержен помехам, поэтому каждому
  127. * значению нажатой кнопки задаеться диапазон измеренного значения на
  128. * аналоговом входе
  129. */
  130. byte buttonFromValue(int analogValue)
  131. {
  132. if (analogValue>950)
  133. {
  134. return 4;
  135. }
  136. if (analogValue > 713 && analogValue < 950)
  137. {
  138. return 3;
  139. }
  140. if (analogValue > 506 && analogValue < 713)
  141. {
  142. return 2;
  143. }
  144. if (analogValue > 200 && analogValue < 506)
  145. {
  146. return 1;
  147. }
  148. return 0;
  149. }