Прошу помощи в первом проекте
- Войдите на сайт для отправки комментариев
Добрый день! Прошу Вашей помощи в моем проекте:
Задача такова, имеются жалюзи, ардуино уно, мотор постоянного тока с редуктором, кнопка, часы реального времени tiny rtc 12c. Я хочу управлять открытием и закрытием жалюзей по времени, плюс вручную кнопкой. Кнопка работает по принципу один раз нажал-жалюзи открылись, еще раз нажал жалюзи закрылись. Схему я собрал, нашел образец таймера для реле. Теперь встала задача- добавить в код кнопку, чтобы при , например, закрытых с кнопки жалюзях мотор не пытался закрыть их еще дальше.
В данны момент я на распутьи: один вариант отлично работает с таймером, другой с кнопкой-но во втором варианте таймер не хочет оживать.
Уважаемые гуру, помогите в моей проблеме!
Первый вариант с работающим таймером
//*************************************************** // Скетч для управления релейным модулем, в котором * // использовано два канала. Используется также RTC * // Релейный модуль - с инверсной логикой на входе * // Автор: ZORS * // Версия 1. Дата 21.12.2013 02:40 * //*************************************************** //----------ИМПОРТ БИБЛИОТЕК------------------------- #include <Wire.h> //Подключаем библиотеку для использования I2C интерфейса с модулем RTC #include <RTClib.h> //Подключаем библиотеку для использования модуля часов реального времени RTC RTC_DS1307 RTC; //Создаем переменную класса - для использования RTC //----------Объявляем разные переменные------------ const int RelayChn1 = 6; //Используем цифровой ПОРТ 6 для ПЕРВОГО канала релейного модуля const int RelayChn2 = 7; //Используем цифровой ПОРТ 7 для ВТОРОГО канала релейного модуля //----------Настройки времени и продолжительности включения реле //----------ПЕРВЫЙ канал---------------------------- const long StartRelCn_1 = 25200; //Время срабатывания в ПЕРВОМ канале релейного модуля (в секундах от начала суток) //в данном случае 25200 - это 7 часов 00 минут = ( 60секунд *60 минут *7 = 25200) const long DurationCh_1 = 10; //ДЛИТЕЛЬНОСТЬ срабатывания реле в ПЕРВОМ канале (в секундах) //----------ВТОРОЙ канал---------------------------- const long StartRelCn_2 = 37800; //Время срабатывания во ВТОРОМ канале релейного модуля (в секундах от начала суток) //В данном случае 10 часов 30 минут = (60 секунд * 60 минут * 10 часов + 60сек*30мин = 37800) const long DurationCh_2 = 15; //ДЛИТЕЛЬНОСТЬ срабатывания реле во ВТОРОМ канале (в секундах) //----------Модуль инициализации setup() - выполняется один раз при инициализации платы при подаче напряжение (и аналогичных событиях) void setup(){ pinMode(RelayChn1,OUTPUT); //Инициализируем порт для ПЕРВОГО канала как ВЫХОД pinMode(RelayChn2,OUTPUT); //Инициализируем порт для ВТОРОГО канала как ВЫХОД digitalWrite(RelayChn1,LOW); //Устанавливаем на входах релейного модуля Низкий уровень digitalWrite(RelayChn2,LOW); Wire.begin(); //Инициируем I2C интерфейс RTC.begin(); //Инициирум RTC модуль // RTC.adjust(DateTime(__DATE__, __TIME__)); //С этой строки необходимо убрать комментарии один раз в начале, //для того, чтобы загрузить в RTC дату и время на момент компиляции программы //Иногда необходимо заливать СКЕТЧ на плату со снятым комментарием - для поправки //времени в RTC, НО оставлять такой СКЕТЧ в работе НЕЛЬЗЯ !!!!!!!!!!!!! } // КОНЕЦ ИНИЦИАЛИЗАЦИИ //-------------------------------------------------- void loop() // ПРОГРАММЫй безусловный ЦИКЛ { DateTime myTime = RTC.now(); //Читаем данные времени из RTC при каждом выполнении цикла //----------Раздел обработки реле по времени ---- long utime = myTime.unixtime(); //сохраняем в переменную - время в формате UNIX utime %= 86400; //Сохраняем в этой же переменной остаток деления на кол-во секнд в сутках, //Это дает количество секунд с начала текущих суток //------------КАНАЛ 1------------------------------ if ((utime >= StartRelCn_1) && (utime < (StartRelCn_1+DurationCh_1))) //Если секунд с начала суток больше, чем задано для включения //Но, одновременно и меньше, чем задано для включения + длительность { digitalWrite(RelayChn1,HIGH); //Устанавливаем на ПЕРВОМ входе релейного модуля ВЫСОКИЙ уровень - реле срабатывает } else //во всех остальных случаях { digitalWrite(RelayChn1,LOW); //Устанавливаем на ПЕРВОМ входе релейного модуля НИЗКИЙ уровень - реле выключается } //------------КАНАЛ 2 - все аналогично ----------- if ((utime >= StartRelCn_2) && (utime < (StartRelCn_2+DurationCh_2))) { digitalWrite(RelayChn2,HIGH); //Устанавливаем на ВТОРОМ входе релейного модуля ВЫСОКИЙ уровень - реле срабатывает } else { digitalWrite(RelayChn2,LOW); //Устанавливаем на ВТОРОМ входе релейного модуля НИЗКИЙ уровень - реле выключается } }//------------Конец ЦИКЛА-----------------------------
Второй вариант с работающей кнопкой:
//*************************************************** // Скетч для управления релейным модулем, в котором * // использовано два канала. Используется также RTC * // Релейный модуль - с инверсной логикой на входе * // Автор: ZORS * // Версия 1. Дата 21.12.2013 02:40 * //*************************************************** //----------ИМПОРТ БИБЛИОТЕК------------------------- #include <Wire.h> //Подключаем библиотеку для использования I2C интерфейса с модулем RTC #include <RTClib.h> //Подключаем библиотеку для использования модуля часов реального времени RTC RTC_DS1307 RTC; //Создаем переменную класса - для использования RTC //----------Объявляем разные переменные------------ int switchPin = 2; char motor_status = 0 ; int val; // Переменная для чтения статуса контактный int val2; // Переменная для чтения с задержкой / подавлением дребезга контактов статус int buttonState; // Переменная провести состояния кнопки int lightMode = 0; // Есть свет включен или выключен? const int RelayChn1 = 6; //Используем цифровой ПОРТ 6 для ПЕРВОГО канала релейного модуля const int RelayChn2 = 7; //Используем цифровой ПОРТ 7 для ВТОРОГО канала релейного модуля //----------Настройки времени и продолжительности включения реле //----------ПЕРВЫЙ канал---------------------------- const int StartRelCn_1 = 25200; //Время срабатывания в ПЕРВОМ канале релейного модуля (в секундах от начала суток) //в данном случае 25200 - это 7 часов 00 минут = ( 60секунд *60 минут *7 = 25200) const int DurationCh_1 = 10; //ДЛИТЕЛЬНОСТЬ срабатывания реле в ПЕРВОМ канале (в секундах) //----------ВТОРОЙ канал---------------------------- const int StartRelCn_2 = 37800; //Время срабатывания во ВТОРОМ канале релейного модуля (в секундах от начала суток) //В данном случае 10 часов 30 минут = (60 секунд * 60 минут * 10 часов + 60сек*30мин = 37800) const int DurationCh_2 = 15; //ДЛИТЕЛЬНОСТЬ срабатывания реле во ВТОРОМ канале (в секундах) //----------Модуль инициализации setup() - выполняется один раз при инициализации платы при подаче напряжение (и аналогичных событиях) void setup() { pinMode(switchPin, INPUT); pinMode(RelayChn1, OUTPUT); //Инициализируем порт для ПЕРВОГО канала как ВЫХОД pinMode(RelayChn2, OUTPUT); //Инициализируем порт для ВТОРОГО канала как ВЫХОД digitalWrite(RelayChn1, LOW); //Устанавливаем на входах релейного модуля НИЗКИЙ уровень digitalWrite(RelayChn2, LOW); Serial.begin(9600); // Установите последовательную связь в 9600 buttonState = digitalRead(switchPin); Wire.begin(); //Инициируем I2C интерфейс RTC.begin(); //Инициирум RTC модуль //RTC.adjust(DateTime(__DATE__, __TIME__)); //С этой строки необходимо убрать комментарии один раз в начале, //для того, чтобы загрузить в RTC дату и время на момент компиляции программы //Иногда необходимо заливать СКЕТЧ на плату со снятым комментарием - для поправки //времени в RTC, НО оставлять такой СКЕТЧ в работе НЕЛЬЗЯ !!!!!!!!!!!!! } // КОНЕЦ ИНИЦИАЛИЗАЦИИ //-------------------------------------------------- void loop() // ПРОГРАММЫй безусловный ЦИКЛ { DateTime myTime = RTC.now(); //Читаем данные времени из RTC при каждом выполнении цикла //----------Раздел обработки реле по времени ---- long utime = myTime.unixtime(); //сохраняем в переменную - время в формате UNIX utime %= 86400; //Сохраняем в этой же переменной остаток деления на кол-во секнд в сутках, //Это дает количество секунд с начала текущих суток //------------КАНАЛ 1------------------------------ if ((utime >= StartRelCn_1) && (utime < (StartRelCn_1 + DurationCh_1))) //Если секунд с начала суток больше, чем задано для включения //Но, одновременно и меньше, чем задано для включения + длительность { if (motor_status == 0 ) { digitalWrite(RelayChn1, HIGH); motor_status = 1 ; } } else //во всех остальных случаях { digitalWrite(RelayChn1, LOW); motor_status = 0 ; } //------------КАНАЛ 2 - все аналогично ----------- if ((utime >= StartRelCn_2) && (utime < (StartRelCn_2 + DurationCh_2))) { if (motor_status == 0 ) { digitalWrite(RelayChn1, HIGH); motor_status = 1 ; } digitalWrite(RelayChn2, HIGH); } else { digitalWrite(RelayChn2, LOW); motor_status = 0 ; } val = digitalRead(switchPin); // читать входное значение и сохранить его в Val delay(10); // 10 миллисекунд хорошее количество времени val2 = digitalRead(switchPin); // читать ввод снова, чтобы проверить отскоков if (val == val2) { // убедиться, что мы получили 2 показания последовательны! if (val != buttonState) { // состояние кнопки изменилось! if (val == LOW) { // проверить, если нажата кнопка if (lightMode == 0) { // эта нагрузка включена? lightMode = 1; // включить нагрузку! digitalWrite(RelayChn1, HIGH); delay(2000); // время до автовыключения digitalWrite(RelayChn1, LOW); } else { lightMode = 0; // turn light off! digitalWrite(RelayChn2, HIGH); delay(2000); // время до автовыключения digitalWrite(RelayChn2, LOW); } } } buttonState = val; // save the new state in our variable } } //------------Конец ЦИКЛА-----------------------------
а, все, разобрался!