Доброго времени суток! Уважаемые форумчане, помогите пожалуйста в создании универсального устройства. Я фотолюбитель увлекаюсь фотографией и всем что с этим связано однажды наткнулся на устройство очень необходимое мне в данный момент, не помню в каком уголке сети, триггер работает, но слишком мало в нем функций, я решил попробывать расширить его возможности. Но смотрю я опять запутался с кодом помогите разобраться почему он не работает? Код получился большой загружу двумя частями. В коде все по максимальному закомментировано и должно быть понятно. Код (Text): #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); #define ENABLE_SOUND_TRIGGER #define ENABLE_LASER_TRIGGER #define ENABLE_DIST_TRIGGER #define CAM_TRIGGER_PIN 7 //реле затвора #define CAM_FOCUS_PIN 11// реле фокусировки #define FLASH_TRIGGER_PIN 8 //вспышка1 #define fFLASH_TRIGGER_PIN 13 //вспышка2 #define LASER_PIN 2 // питание лазера отключаем во время экспонирования #define Rred_DiodPIN 4 #define Blue_DiodPIN 12 #define WORKLIGHT_RELAY 9 // реле освещения #define START_PIN 5 #define BTN_PLUS 6 #define BTN_MINUS 10 #define BTN_Set 3 #define DEBOUNCE_INTERVAL 10 // Задаем используемые аналоговые выходы #define LASER_TRIGGER_ANALOG_PIN 1 #define SOUND_TRIGGER_ANALOG_PIN 0 #define DIST_TRIGGER_ANALOG_PIN 2 #define PRINT_MESSAGES // Для отладки и настройки датчиков // уровни датчиков #define LASER_THRESHHOLD 795 // порог срабатывания laser #define SOUND_THRESHHOLD 800 // порог срабатывания sound //#define DISTsetup 0 // порог срабатывания DISTsetup =0; long flashDelayMS =0; // Установка задержки long DISTsetup =0; // установка порога срабатывания // давилка дребезга uint8_t debounce(int pin, long int interval = DEBOUNCE_INTERVAL) { long int prev_millis = millis(); uint8_t state = digitalRead(pin); uint8_t new_state = !state; while (state != new_state) { if ((millis()-prev_millis)>DEBOUNCE_INTERVAL) { prev_millis = millis(); new_state = digitalRead(pin); } } return state; } // режимы #define STANDBY 0 #define ACTIVElaser 1 #define ACTIVEsound 2 #define ACTIVEdist 3 #define MODE_INIT 4 #define MODE_SETUP 5 #define MODE_SELECT 6 #define THRESHHOLDdist 7 int mode = MODE_INIT; void setup() { lcd.init();lcd.backlight();lcd.clear(); pinMode(START_PIN, INPUT); pinMode(BTN_PLUS, INPUT); pinMode(BTN_MINUS, INPUT); pinMode(BTN_Set, INPUT); pinMode(CAM_TRIGGER_PIN, OUTPUT); // затвор камеры pinMode(CAM_FOCUS_PIN, OUTPUT); // фокусировка pinMode(FLASH_TRIGGER_PIN, OUTPUT); // вспышка1 pinMode(fFLASH_TRIGGER_PIN, OUTPUT); // вспышка2 pinMode(LASER_PIN, OUTPUT); // питание лазера digitalWrite(LASER_PIN, HIGH); pinMode(Rred_DiodPIN, OUTPUT);// индикатор активации digitalWrite(Rred_DiodPIN, LOW); pinMode(Blue_DiodPIN,OUTPUT);// индикатор вспышки digitalWrite(Blue_DiodPIN, LOW); pinMode(WORKLIGHT_RELAY, OUTPUT); // рабочий свет digitalWrite(WORKLIGHT_RELAY, HIGH); //#ifdef PRINT_MESSAGES // Serial.begin(9600); // Для отладки и настройки датчиков //#endif } void hello() { lcd.setCursor(0, 0);lcd.print(" FotoTrigger ");delay(700); lcd.setCursor(0, 1);lcd.print(" Speed Sunchro "); delay(1800);lcd.clear(); lcd.setCursor(0, 0);lcd.print(" Delay setting ");delay(100); lcd.setCursor(0, 1);lcd.print(" "); }
Код (Text): void loop() { switch (mode) { case MODE_INIT: { hello(); mode = STANDBY; break; } case MODE_SETUP: if (debounce(BTN_Set)) { mode = MODE_SELECT; } break; case MODE_SELECT: //Установка задержки lcd.setCursor(0, 0);lcd.print(" Delay setting "); if (debounce(BTN_PLUS)) // чтение кнопки + { if (flashDelayMS < 1000) flashDelayMS ++; // установка задержки + lcd.setCursor(0,1);lcd.print(" Set Flash"); lcd.print(flashDelayMS); } if (debounce(BTN_MINUS))// чтение кнопки - { if (flashDelayMS > 0) flashDelayMS --; // установка задержки- lcd.setCursor(0,1); lcd.print(" Set Flash"); lcd.print(flashDelayMS); } if (debounce(BTN_Set)) { mode = THRESHHOLDdist; // установка порога срабатывания } break; case THRESHHOLDdist: { lcd.setCursor(0, 0);lcd.print(" Delay setting "); if (debounce(BTN_PLUS)) // чтение кнопки + { if (DISTsetup < 1000) DISTsetup ++; // установка чуствительности + lcd.setCursor(0,1);lcd.print(" sensitivity"); lcd.print(DISTsetup); } if (debounce(BTN_MINUS))// чтение кнопки - { if (DISTsetup > 0) DISTsetup --; // установка чуствительности - lcd.setCursor(0,1);lcd.print(" sensitivity"); lcd.print(DISTsetup); } if (debounce(BTN_Set)) { mode = STANDBY; } break; } case STANDBY: mode = ACTIVElaser; lcd.setCursor(0, 0);lcd.print(" Laser "); if ((mode == ACTIVElaser) && ((debounce (START_PIN)))) { laser(); } else if ((mode == ACTIVElaser) &&((debounce(BTN_PLUS)))) { lcd.setCursor(0, 0);lcd.print(" Sound "); mode = ACTIVEsound; } else if ((mode == ACTIVEsound) &&((debounce(START_PIN)))) { sound(); mode = ACTIVEsound; } else if ((mode == ACTIVEsound) &&((debounce(BTN_PLUS)))) { lcd.setCursor(0, 0);lcd.print(" Universal "); mode = ACTIVEdist; } else if ((mode == ACTIVEdist) &&((debounce(START_PIN)))) { dist(); } else if ((mode == ACTIVEdist) &&((debounce(BTN_PLUS)))) { mode = ACTIVElaser; } else if (debounce(BTN_Set)) { mode = MODE_SETUP; } break; } }
Изначально был такой код : Он рабочий Код (Text): //Переключение между разными типами триггера #define ENABLE_LASER_TRIGGER #define ENABLE_SOUND_TRIGGER //Пороговые значения для срабатывания триггера //Определяются в зависимости от окружающих факторов #define LASER_THRESHHOLD 500 #define SOUND_THRESHHOLD 100 //Выводит сообщения, помогает при определинии //пороговых необходимых пороговых значений #define PRINT_MESSAGES // Задает используемые цифровые выходы #define CAMERA_FLASH_PIN 4 #define LASER_PIN 5 // Задает используемые аналоговые выходы #define LASER_TRIGGER_ANALOG_PIN 0 #define SOUND_TRIGGER_ANALOG_PIN 1 void setup() { pinMode(CAMERA_FLASH_PIN, OUTPUT); digitalWrite(CAMERA_FLASH_PIN, LOW); pinMode(LASER_PIN, OUTPUT); digitalWrite(LASER_PIN, LOW); #ifdef ENABLE_LASER_TRIGGER digitalWrite(LASER_PIN, HIGH); // включить лазер #endif #ifdef PRINT_MESSAGES Serial.begin(9600); // открыть серийный порт #endif } void loop() { int soundVal; int laserVal; } Потом я его как смог переделал работает, но не очень хорошо , Хотелось бы чтоб через управление переключались режимы лазер отдельно или звук отдельно и хотел добавить еще один режим с настраиваемым порогом через кнопки.. Понял что нужно добавлять антидребезг на кнопки и попытался сделать режимы через case Но увы плохо разбираюсь, я думаю что ошибка где то как раз в этом цикле. Вот код который у меня работает в нем есть возможность настройки задержки но режимы работают совместно Код (Text): #include <LiquidCrystal_I2C.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); #define ENABLE_SOUND_TRIGGER #define ENABLE_LASER_TRIGGER // #define ENABLE_DIST_TRIGGER #define CAM_TRIGGER_PIN 11 //реле затвора #define CAM_FOCUS_PIN 7// реле фокусировки #define FLASH_TRIGGER_PIN 8 //вспышка1 #define LASER_PIN 2 // питание лазера отключаем во время экспонирования #define Rred_DiodPIN 4 #define Blue_DiodPIN 12 #define WORKLIGHT_RELAY 9 // реле освещения #define BUTTON_PIN 5 #define PIN_BTN_PLUS 6 #define PIN_BTN_MINUS 10 #define PIN_BTN_R 3 // Задаем используемые аналоговые выходы #define LASER_TRIGGER_ANALOG_PIN 1 #define SOUND_TRIGGER_ANALOG_PIN 0 // режимы #define STANDBY 0 #define ACTIVE 1 // уровни датчиков #define LASER_THRESHHOLD 100 // порог срабатывания вместо 100 0 добавить переменную long LASERsetup =0; #define SOUND_THRESHHOLD 15 // порог срабатывания вместо 15 0 добавить переменную long SOUNDsetup =0; #define PRINT_MESSAGES int mode = STANDBY; long flashDelayMS =0; // Установка задержки void setup() { lcd.init();lcd.backlight();lcd.clear(); lcd.setCursor(0, 0);lcd.print(" FlashTrigger ");delay(700); lcd.setCursor(0, 1);lcd.print(" Speed Sunchro "); delay(1800);lcd.clear(); pinMode(BUTTON_PIN, INPUT); pinMode(PIN_BTN_PLUS, INPUT); pinMode(PIN_BTN_MINUS, INPUT); pinMode(PIN_BTN_R, INPUT); // pinMode(PIN_BTN_SELECT, INPUT);// добавить кнопку pinMode(CAM_TRIGGER_PIN, OUTPUT); // затвор камеры pinMode(CAM_FOCUS_PIN, OUTPUT); // фокусировка pinMode(FLASH_TRIGGER_PIN, OUTPUT); // вспышка1 // pinMode(fFLASH_TRIGGER_PIN, OUTPUT); // вспышка2 pinMode(LASER_PIN, OUTPUT); // питание лазера digitalWrite(LASER_PIN, HIGH); pinMode(Rred_DiodPIN, OUTPUT);// индикатор активации digitalWrite(Rred_DiodPIN, LOW); pinMode(Blue_DiodPIN,OUTPUT);// индикатор вспышки digitalWrite(Blue_DiodPIN, LOW); pinMode(WORKLIGHT_RELAY, OUTPUT); // рабочий свет digitalWrite(WORKLIGHT_RELAY, HIGH); // #ifdef PRINT_MESSAGES Serial.begin(9600); // #endif } // Для отладки и настройки датчиков // #ifdef PRINT_MESSAGES //Serial.print("Sound: "); // Serial.println(soundVal, DEC); // Serial.print("Laser: "); //Serial.println(int laserVal, DEC); // #endif #endif }
Работа проста при включении после заставки, режим STANDBY в этом режиме ждем нажатие кнопки start, или кнопкой + переключаем режимы триггера между sound, laser , universal переключение по кругу при нажатии кнопки set входим в case с настройками устанавливаем, задержку нажимаем set далее настраиваем уровень порога, нажимаем set выход из настроек, ждем нажатие start или + по умолчанию устанавливается режим лазер .Как это сделать? Помогите пожалуйста!
нече не понял.. есть фототригер на звук, тот что на просторах интернета http://mattrichardson.com/Arduino-Photo-Trigger/ там все правильно. а как оно должно работать у вас я не пойму, зачем это все разом подключать и использовать? и что этим фотографировать? да и нужно выкинуть реле и поставить оптроны.
У меня и стоят оптроны реле в этом коде срабатывает при режиме STANDBY оно влючает рабочий свет чтоб не в темноте копаться. Тема и названа универсальный хочешь звук ( что кстати мне редко нужно) хочешь лазер или другой какой либо датчик вешай...
sanik, это уже не первый раз же, в прошлом обсуждении на этом же моменте встряли. У вас в голове есть некоторая умозрительная картина, как всё должно быть устроено. По ней вы пишете код и показываете его нам. Т.е. есть желаемое и есть действительное. Первое известно исключительно вам. Второе вот здесь чуть выше лежит. Вот вы видите, что желаемое и действительное не совпадают, но не можете найти 10 отличий. А потом спрашиваете у нас, в чем они заключаются. Но на этот вопрос нельзя ответить, потом у как известен только код, а замысел неизвестен, не с чем сравнить.
Не сочтите за брюзжание, скорее наоборот, этот проект мной отложен до лучших времён, и может быть после этого обсуждения родится... Вопрос надо начинать не с кода. Любой технический вопрос надо начинать с фразы: "Я хочу!" Правда может случится, что мы так ничего и не узнаем, потому как вы осознав задачу сами её решите и никому не расскажете Напишите список функций с пометками реализовано и работает, не работает, нет ваще надо добавить. Как всё это должно выглядеть, можно по коду восстановить схему устройства, но скорее всего это будет третья схема, первая автора, вторая ваша...
Дело в том что все кусочки по отдельности работают там все налажено Единственное на что меня не хватает это все соединить в один код .Задумка такая Включаем дежурный режим, загорается рабочий свет WORKLIGHT_RELAY 9 Подается питание на лазер LASER_PIN 2 и в это время предоставляется выбор режимов кнопкой BTN_PLUS последовательно нажал 1ый режим(void sound()) нажал 2ой режим(void laser()) нажал 3ий режм (void dist()) нажал снова 1ый режим а при нажатии кнопки BTN_Set входим в пошаговое меню настроек 1 шаг настройка задержки flashDelayMS кнопками BTN_PLUS и BTN_MINUS далее при нажатии кнопки BTN_Set 2 шаг настройка порога срабатывания DISTsetup кнопками BTN_PLUS и BTN_MINUS снова нажимаем кнопку BTN_Set выходим в дежурный режим. Еще если в дежурном режиме нажал кнопку START_PIN то по умолчанию выполняется (void laser()); Тоесть получается в дежурном режиме отслеживаем две кнопки START_PIN и BTN_PLUS Думаю что так понятней .
Вот вроде понял как надо отслеживать кнопки старт и сет а вот с переключениями загвоздка Код (Text): void loop() { switch (mode) { case MODE_STANDBY: mode = STANDBY; if (debounce(BTN_Set)) { mode = SETUP; } case MODE_SETUP: lcd.setCursor(0, 0);lcd.print(" Delay setting "); if (debounce(BTN_PLUS)) // чтение кнопки + { if (flashDelayMS < 1000) flashDelayMS ++; // установка задержки + lcd.setCursor(0,1);lcd.print(" Set Flash"); lcd.print(flashDelayMS); } if (debounce(BTN_MINUS))// чтение кнопки - { if (flashDelayMS > 0) flashDelayMS --; // установка задержки- lcd.setCursor(0,1); lcd.print(" Set Flash"); lcd.print(flashDelayMS); } if (debounce(BTN_Set)) { mode = THRESHHOLDdist; // установка порога срабатывания } break; case THRESHHOLDdist: { lcd.setCursor(0, 0);lcd.print(" Delay setting "); if (debounce(BTN_PLUS)) // чтение кнопки + { if (DISTsetup < 1000) DISTsetup ++; // установка чуствительности + lcd.setCursor(0,1);lcd.print(" sensitivity"); lcd.print(DISTsetup); } if (debounce(BTN_MINUS))// чтение кнопки - { if (DISTsetup > 0) DISTsetup --; // установка чуствительности - lcd.setCursor(0,1);lcd.print(" sensitivity"); lcd.print(DISTsetup); } if (debounce(BTN_Set)) { mode = STANDBY; } break; if (debounce(BTN_PLUS)) { mode = ACTIVElaser; lcd.setCursor(0, 0);lcd.print(" Laser "); } case ACTIVElaser: if ((mode == ACTIVElaser) && ((debounce (START_PIN)))) { laser(); }
Вот как и бещал в прошлый раз видео того что получилось А это видео для чего все делалось . Нашелся человек который помог мне.
Я все движки заказывал на EBAY у меня сделано универсальное крепление и движки меняются на раз два три секунд пять, движки несколько штук 8RPM 10RPM 15RPM 25RPM 70RPM очень удобно
смысла нет, электроотвертка стоит столько же и не нужно ждать.. ладно, не будем отходить от темы, чем не нравится описание языка на http://arduino.ru/Reference/FunctionDeclaration ?
Я далек от программирования мне непонятно описание. Все что не пробовал не получается. Получается только одну часть сделать а объединить не выходит наверное плохо развита логика сложно это все для меня. Не могу разобраться где ставить скобки где нет. Кое как разобрался в case да и то не получается полностью все предусмотреть.