Прошу помощи в первом проекте

mapf44
Offline
Зарегистрирован: 17.05.2015

Добрый день! Прошу Вашей помощи в моем проекте:

Задача такова, имеются жалюзи, ардуино уно, мотор постоянного тока с редуктором, кнопка, часы реального времени 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
}

}
//------------Конец ЦИКЛА-----------------------------

 

mapf44
Offline
Зарегистрирован: 17.05.2015

а, все, разобрался!