Например TDA7294

 Форум РадиоКот • Просмотр темы - Таймер отключения на Ардуино
Форум РадиоКот
Здесь можно немножко помяукать :)



Текущее время: Пт окт 20, 2017 23:15:44



Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Таймер отключения на Ардуино
СообщениеДобавлено: Пт май 19, 2017 17:00:10 
Первый раз сказал Мяу!

Зарегистрирован: Ср июл 27, 2016 12:34:49
Сообщений: 22
Рейтинг сообщения: 0
Здавствуйте
В программировании я не соображаю особо)
Но была поставлена задача реализовать управление сервоприводными шаровыми кранами(2 проводные) ардуиной
Суть кода не буду объяснять, ну там и понятно в принципе...
То что у меня не получилось сделать - таймер отключения сигнала через 5-6 сек.(в if, для того что бы кран не сгорел когда он заклинит по какой ни будь причине), автоматическое проворачивание крана время от времени для предотвращения его "закисания"
Подскажите ка это сделать, может кто делал подобное, киньте пример
Мое чудо:
Код:
const int kran = 3;
const int bak = 4;
int nasos = 13;
int kran_open = 12;
int kran_close = 11;
int bak_open = 10;
int bak_close = 9;

void setup() {
  pinMode(kran, INPUT);
  pinMode(bak, INPUT);
  pinMode(nasos, OUTPUT);
  pinMode(kran_open, OUTPUT);
  pinMode(kran_close, OUTPUT);
  pinMode(bak_open, OUTPUT);
  pinMode(bak_close, OUTPUT);
}

void loop() {

  int kranState, bakState;
 
  kranState = digitalRead(kran);
  bakState = digitalRead(bak);
 
  if ((kranState == LOW) && (bakState == LOW))
{
  digitalWrite(nasos, LOW);
  digitalWrite(kran_open, HIGH);
  digitalWrite(kran_close, LOW);
  digitalWrite(bak_open, HIGH);
  digitalWrite(bak_close, LOW);

}
else if ((kranState == HIGH) && (bakState == LOW))
{
  digitalWrite(nasos, HIGH);
  digitalWrite(kran_open, HIGH);
  digitalWrite(kran_close, LOW);
  digitalWrite(bak_open, LOW);
  digitalWrite(bak_close, HIGH);
}
else if ((kranState == LOW) && (bakState == HIGH))
{
  digitalWrite(nasos, HIGH);
  digitalWrite(kran_open, LOW);
  digitalWrite(kran_close, HIGH);
  digitalWrite(bak_open, HIGH);
  digitalWrite(bak_close, LOW);
}
else if ((kranState == HIGH) && (bakState == HIGH))
{
  digitalWrite(nasos, HIGH);
  digitalWrite(kran_open, HIGH);
  digitalWrite(kran_close, LOW);
  digitalWrite(bak_open, LOW);
  digitalWrite(bak_close, HIGH);
}
}


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Таймер отключения на Ардуино
СообщениеДобавлено: Пт май 19, 2017 17:12:19 
Опытный кот
Аватар пользователя

Карма: 12
Зарегистрирован: Пт ноя 11, 2016 06:48:09
Сообщений: 822
Откуда: край интернета... самый край :(
Рейтинг сообщения: 0
в ардуино есть функции, отвечающие за время millis(), например.
при приходе команды сохраняем в переменную текущее время, а когда пройдет нужное время (когда millis станет больше нашей переменной на нужную величину) сбрасываем команду

_________________
В последнее время без ТЗ даже холиварить не интересно


Вернуться наверх
 Профиль  
 
От идеи до готового устройства! Нужен только EasyEDA!

Бесплатный инструмент для проектирования печатных плат - нарисуй свою плату прямо сейчас!

JLCPCB for PCB Prototyping, всего $2 за 10 печатных плат 10×10см. Доставка 2-3 дня.

LCSC Parts: Экономия до 50%, большой выбор компонентов в наличии, отправка заказа в день оплаты.

Не в сети
 Заголовок сообщения: Re: Таймер отключения на Ардуино
СообщениеДобавлено: Сб май 20, 2017 08:59:36 
Первый раз сказал Мяу!

Зарегистрирован: Ср июл 27, 2016 12:34:49
Сообщений: 22
Рейтинг сообщения: 0
Получилось сделать одноразовый таймер) с помощью millis() (т.е. нажал на кнопку светодиоды на время загорелись потом потухли, вроде норм но повторное нажатие не зажигает светодиоды вообще!)
Не могу понять как его по человечески сделать...
Может у кого есть пример подобного?
Или если не сложно покажите на моем коде например на первом if-e :))


Вернуться наверх
 Профиль  
 

Не в сети
 Заголовок сообщения: Re: Таймер отключения на Ардуино
СообщениеДобавлено: Сб май 20, 2017 09:20:32 
Опытный кот
Аватар пользователя

Карма: 12
Зарегистрирован: Пт ноя 11, 2016 06:48:09
Сообщений: 822
Откуда: край интернета... самый край :(
Рейтинг сообщения: 0
а ты переменную снова обновил при приходе следующего сигнала?
переменную надо использовать, потому что в саму функцию millis() ничего записать нельзя (и обнулить тоже) поэтому и нужно задавать точку отсчета, а для нахождения прошедшего времени находить разность переменной и текущего времени.

Добавлено after 6 minutes 49 seconds:
даже проще - вне IFов добав строчку : если (кран1= =выключен) {начало_работы_крана1=millis()};
а для проверки : время_работы_крана1=millis() - начало_работы_крана1;
т.е. если((millis() - начало_работы_крана1)> задержка_крана1) {выключить_кран1};
для второго крана аналогично

_________________
В последнее время без ТЗ даже холиварить не интересно


Вернуться наверх
 Профиль  
 

Не в сети
 Заголовок сообщения: Re: Таймер отключения на Ардуино
СообщениеДобавлено: Вт май 23, 2017 19:23:58 
Первый раз сказал Мяу!

Зарегистрирован: Ср июл 27, 2016 12:34:49
Сообщений: 22
Рейтинг сообщения: 0
Чет вообще не розберусь... так то у меня и delay обычный пойдет но работает во всех if-ах кроме этого:
Код:
  if ((kranState == LOW) && (bakState == LOW))
{
  digitalWrite(nasos, LOW);
  digitalWrite(kran_open, HIGH);
  digitalWrite(kran_close, LOW);
  digitalWrite(bak_open, HIGH);
  digitalWrite(bak_close, LOW);
  delay(6000);
}

Когда все "кнопки" в LOW, светодиоды горят и не тухнут, в остальных случаях все работает как надо
Собрал пока макет, вместо датчиков кнопки, вместо кранов и реле светодиоды


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Таймер отключения на Ардуино
СообщениеДобавлено: Вт май 23, 2017 20:34:00 
Опытный кот
Аватар пользователя

Карма: 12
Зарегистрирован: Пт ноя 11, 2016 06:48:09
Сообщений: 822
Откуда: край интернета... самый край :(
Рейтинг сообщения: 0
с делаями - тупиковый путь (в данном случае) как и с задержками на циклах - на АйтиХаппенс вроде, попадалась история о том как по вине некачественной программы в МК, случился разом пожар, потоп и вакуумный взрыв, там по вине незавершившегося цикла контроллер прозевал закрытие заслонок и компрессор всосал сарайчик, в котором сам и находился.
П.С.: выложи свой "одноразовый" - разберемся

Добавлено after 12 minutes 53 seconds:
нашел историю, ошибся, там только вакуумный взрыв
про потопо-пожар здесь :)) :)) :))

_________________
В последнее время без ТЗ даже холиварить не интересно


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Таймер отключения на Ардуино
СообщениеДобавлено: Вс май 28, 2017 09:17:57 
Первый раз сказал Мяу!

Зарегистрирован: Ср июл 27, 2016 12:34:49
Сообщений: 22
Рейтинг сообщения: 0
Вот, для примера на одну кнопку, работает так - нажал кнопку загорелся светодиод, должен через секунду потухнуть но не тухнет)))
Код:
const int kran = 3;
const int bak = 4;
int nasos = 13;
int kran_open = 9;
int kran_close = 10;
int bak_open = 11;
int bak_close = 12;

unsigned long time;
unsigned long timer;

void setup() {
  pinMode(kran, INPUT);
  pinMode(bak, INPUT);
  pinMode(nasos, OUTPUT);
  pinMode(kran_open, OUTPUT);
  pinMode(kran_close, OUTPUT);
  pinMode(bak_open, OUTPUT);
  pinMode(bak_close, OUTPUT);
  timer = 1000;
 
}

void loop() {
  int kranState, bakState;
  kranState = digitalRead(kran);
  bakState = digitalRead(bak);
  time = millis();

if ((kranState == HIGH) && (bakState == LOW) && (time + timer > millis()))
{
  digitalWrite(kran_open, HIGH);
  digitalWrite(kran_close, LOW);
  digitalWrite(bak_open, LOW);
  digitalWrite(bak_close, HIGH);
}
else if((kranState == HIGH) && (bakState == LOW) && (time + timer <= millis()))
{
  digitalWrite(kran_open, LOW);
  digitalWrite(kran_close, LOW);
  digitalWrite(bak_open, LOW);
  digitalWrite(bak_close, LOW);
  time = millis();
  }
}

Сорян за глупые вопросы)


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Таймер отключения на Ардуино
СообщениеДобавлено: Вс май 28, 2017 13:17:18 
Модератор
Аватар пользователя

Карма: 59
Зарегистрирован: Пт мар 19, 2010 00:09:57
Сообщений: 3576
Откуда: Планета Земля
Рейтинг сообщения: 1
Медали: 1
Получил миской по аватаре (1)
Что то вообще ничего не понятно из постов ТС'а, в чём проблема, что не так, с чем боремся, ...
Первый пост о времени работы крана, второй - уже о каких-то неработающих условиях, в третьем - уже до кнопок со светодиодами добрались ...
Каша какая то, а не вопросы :facepalm:

_________________
Я мненью вашему вращенье придавал, а осью был - мой детородный орган.


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Таймер отключения на Ардуино
СообщениеДобавлено: Вс май 28, 2017 18:17:35 
Друг Кота

Карма: 34
Зарегистрирован: Пн апр 19, 2010 01:04:18
Сообщений: 5510
Откуда: Малороссия
Рейтинг сообщения: 0
с делаями - тупиковый путь (в данном случае) как и с задержками на циклах - на АйтиХаппенс вроде, попадалась история о том как по вине некачественной программы в МК, случился разом пожар, потоп и вакуумный взрыв, там по вине незавершившегося цикла контроллер прозевал закрытие заслонок и компрессор всосал сарайчик, в котором сам и находился.
П.С.: выложи свой "одноразовый" - разберемся

Добавлено after 12 minutes 53 seconds:
нашел историю, ошибся, там только вакуумный взрыв
про потопо-пожар здесь :)) :)) :))

как в том анекдоте про программиста не пришедшего на работу.. 8)


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Таймер отключения на Ардуино
СообщениеДобавлено: Вс май 28, 2017 19:17:00 
Друг Кота

Карма: 37
Зарегистрирован: Чт фев 20, 2014 19:57:55
Сообщений: 7883
Рейтинг сообщения: 0
Вот, для примера на одну кнопку, работает так - нажал кнопку загорелся светодиод, должен через секунду потухнуть но не тухнет)))

А зачем вы 100500 раз таймер этот в time сохраняете ? Ну как то так например (активный уровень LOW) и для кнопки по хорошему нужен бы антидребезг.

int kranState, oldkranState;

kranState = digitalRead(kran);

if ((kranState == LOW) && (oldkranState == HIGH)) // если был выключен, а теперь должен быть включен (нажали кнопку)
{
digitalWrite(kran_open, LOW); // включаем
time = millis(); // запоминаем момент включения
oldkranState == LOW; // текущее состояние вкл
}

if ((millis() > (time + timer)) && (oldkranState == LOW)) // таймер натикал с момента включения timer милиссекунд и текущее состояние вкл
{
digitalWrite(kran_open, HIGH); // выключаем
oldkranState == HIGH; // текущее состояние выкл, можно снова включать
}

обратите внимание, что таймер когда нибудь переполнится и в этот момент возможны всякие бяки


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Таймер отключения на Ардуино
СообщениеДобавлено: Пн май 29, 2017 04:51:35 
Опытный кот
Аватар пользователя

Карма: 12
Зарегистрирован: Пт ноя 11, 2016 06:48:09
Сообщений: 822
Откуда: край интернета... самый край :(
Рейтинг сообщения: 0
если таймер одной размерности с хранящей точку старта переменной — бяки не будет точно (пока мы не соберемся отмерять промежутки, не влезающие в эту размерность).

_________________
В последнее время без ТЗ даже холиварить не интересно


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Таймер отключения на Ардуино
СообщениеДобавлено: Вс июн 04, 2017 09:55:25 
Первый раз сказал Мяу!

Зарегистрирован: Ср июл 27, 2016 12:34:49
Сообщений: 22
Рейтинг сообщения: 0
Morroc сделал как вы написали
Код:
const int kran = 3;
const int bak = 4;
int nasos = 9;
int kran_open = 6;
int kran_close = 5;
int bak_open = 7;
int bak_close = 8;

unsigned long time;
unsigned long timer;

void setup() {
  pinMode(kran, INPUT);
  pinMode(bak, INPUT);
  pinMode(nasos, OUTPUT);
  pinMode(kran_open, OUTPUT);
  pinMode(kran_close, OUTPUT);
  pinMode(bak_open, OUTPUT);
  pinMode(bak_close, OUTPUT);
  timer = 1000;
}

void loop() {
  int kranState, oldkranState;
  kranState = digitalRead(kran);

if ((kranState == HIGH) && (oldkranState == LOW)) // если был выключен, а теперь должен быть включен (нажали кнопку)
{
digitalWrite(kran_open, HIGH); // включаем
time = millis(); // запоминаем момент включения
oldkranState == HIGH; // текущее состояние вкл
}

if ((millis() > (time + timer)) && (oldkranState == HIGH)) // таймер натикал с момента включения timer милиссекунд и текущее состояние вкл
{
digitalWrite(kran_open, LOW); // выключаем
oldkranState == LOW; // текущее состояние выкл, можно снова включать
}

}

вклчаю кран он работает, жду 1 сек должен отключится но не отключается...


Вернуться наверх
 Профиль  
 
Не в сети
 Заголовок сообщения: Re: Таймер отключения на Ардуино
СообщениеДобавлено: Вс июн 04, 2017 11:34:08 
Модератор
Аватар пользователя

Карма: 59
Зарегистрирован: Пт мар 19, 2010 00:09:57
Сообщений: 3576
Откуда: Планета Земля
Рейтинг сообщения: 1
Медали: 1
Получил миской по аватаре (1)
Срочно читать книги по языку, на котором пишите ! Конкретно - переменные, их области видимости и время жизни. Обычно, эта тема в самом начале книг.
Иначе так и будете методом тыка программы писать и по каждой мелочи бегать на форум.

_________________
Я мненью вашему вращенье придавал, а осью был - мой детородный орган.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 



Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y