|
@@ -0,0 +1,163 @@
|
|
|
|
|
+#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;
|
|
|
|
|
+
|
|
|
|
|
+}
|