• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Таймеры

ART_HA

Member
Здравствуйте.
Наставьте плиз на путь истинный, потому как малость запутался.
Мне нужна очень простая схема на ESP8266, а именно:
по сигналу на ноге МК должен запускаться таймер0, который по истечении заданного времени должен запускать таймер1 и установку одного из выходов МК в HIGH.
Таймер1 после истечении заданного времени должен сбрасывать ранее установленного выхода МК в LOW.
Вопрос.
Таймер0 и таймер 1 - это программные таймеры, такая задача для них реальна или мне надо использовать аппаратные таймеры?
WiFi в данной схеме не используется.
 

aZholtikov

Active member
Здравствуйте.
Наставьте плиз на путь истинный, потому как малость запутался.
Мне нужна очень простая схема на ESP8266, а именно:
по сигналу на ноге МК должен запускаться таймер0, который по истечении заданного времени должен запускать таймер1 и установку одного из выходов МК в HIGH.
Таймер1 после истечении заданного времени должен сбрасывать ранее установленного выхода МК в LOW.
Вопрос.
Таймер0 и таймер 1 - это программные таймеры, такая задача для них реальна или мне надо использовать аппаратные таймеры?
WiFi в данной схеме не используется.
Библиотека Ticker.h без проблем с этим справится.
 

aZholtikov

Active member
Примерно по памяти набросал.

#include "Ticker.h"

Ticker timer0;
Ticker timer1;

setup
{
}

loop
{
}

обработчик прерывания
{
timer0.once(время, обработчик события таймера0);
что-то ставим в HIGH;
}

обработчик события таймера0
{
timer1.once(время, обработчик события таймера1);
}

обработчик события таймера1
{
что-то ставим в LOW;
}
 

ART_HA

Member
О! А у меня создалось впечатление, что Ticker используется только как генератор прерываний по времени.
Спасибо.

aZholtikov, а нет у ли у Вас под рукой ссылки на развернутое описание этой библиотеки?
Почему-то не удается найти поиском....
 

aZholtikov

Active member
О! А у меня создалось впечатление, что Ticker используется только как генератор прерываний по времени.
Спасибо.

aZholtikov, а нет у ли у Вас под рукой ссылки на развернутое описание этой библиотеки?
Почему-то не удается найти поиском....
В данный момент в функциях обратного вызова Ticker не рекомендуется выполнять блокирующие операции ввода и вывода данных (связанные с сетью, последовательной передачей данных, файлами). Лучше поставьте флаг внутри функции обратного вызова Ticker, а затем обращайтесь к этому флагу из блока loop().

 

ART_HA

Member
:(
Наверное я чего-то не понял, или чего-то не нашел...
Я не обнаружил в описании Ticker операции запуска таймера от ноги МК и не обнаружил выдачи сигнала таймером на ногу МК по окончании заданного ему временного интервала.
Если это решается через прерывания, то эту задачу можно решить и без Ticker, например с помощью millis(), но такое решение грозит слишком большими ошибками.
 

aZholtikov

Active member
:(
Наверное я чего-то не понял, или чего-то не нашел...
Я не обнаружил в описании Ticker операции запуска таймера от ноги МК и не обнаружил выдачи сигнала таймером на ногу МК по окончании заданного ему временного интервала.
Если это решается через прерывания, то эту задачу можно решить и без Ticker, например с помощью millis(), но такое решение грозит слишком большими ошибками.
Там такого нет.
В обработчике прерывания события кнопки? нужно разово запустить таймер0. В обработчике таймера0 "дернуть" ножку и разово запустить таймер1. В обработчике таймера1 "дернуть" ножку.
И да, это можно сделать и через millis(). Но с Ticker.h проще.
 

ART_HA

Member
Значит программный таймер мне однозначно не годится. :(
А у аппаратного таймера возможность таймера от ноги МК и выдача сигнала таймером на ногу МК по окончании заданного ему временного интервала?
 

aZholtikov

Active member
Значит программный таймер мне однозначно не годится. :(
А у аппаратного таймера возможность таймера от ноги МК и выдача сигнала таймером на ногу МК по окончании заданного ему временного интервала?
У Hardware все "монопенисуально" с Software. Включать "ручками".
 

aZholtikov

Active member
Hardware по сравнению с Software просто более точный если требуется учитывать микросекунды. В остальном аналогично.
 

ART_HA

Member
Гм... в конструкции с milles() я в обработчике кнопки считываю показания счетчика и затем в цикле тела программы опрашиваю текущее состояние счетчика пока оно не достигнет заданного. Здесь и происходит ошибка из-за непредсказуемости этого момента.
А в конструкции с Ticker, насколько я Вас понял, счетчик сам вызывает прерывание по достижении заданного значения.
Это действительно так?
И строка: timer0.once(время, обработчик события таймера0); - это оно и есть?
 

CodeNameHawk

Moderator
Команда форума
Здесь и происходит ошибка из-за непредсказуемости этого момента.
Тут нет непредсказуемости, может быть только недостаточная точность.
Кнопку повесте на прерывание, а в основном цикле не должно "долгих" операций.
Но вы не озвучили нужную точность.
 

aZholtikov

Active member
Гм... в конструкции с milles() я в обработчике кнопки считываю показания счетчика и затем в цикле тела программы опрашиваю текущее состояние счетчика пока оно не достигнет заданного. Здесь и происходит ошибка из-за непредсказуемости этого момента.
А в конструкции с Ticker, насколько я Вас понял, счетчик сам вызывает прерывание по достижении заданного значения.
Это действительно так?
И строка: timer0.once(время, обработчик события таймера0); - это оно и есть?
При таком запуске "timer0" через указанное "время" запускается функция "обработчик события таймера0". Он сам "следит" за временем. А запустит он то, что будет написано в "обработчик события таймера0".
 

ART_HA

Member
Тут нет непредсказуемости, может быть только недостаточная точность.
Кнопку повесте на прерывание, а в основном цикле не должно "долгих" операций.
Будут ли в основном цикле долгие операции, и если будут, то насколько долгие, и сколько их будет - в настоящее время непредсказуемо. :)
Сейчас идет отработка поблочно, и первый блок - работа с таймерами.
Особая точность не требуется, но т.к. по отзывам она при использовании программных таймеров "ниочинь", то буду смотреть
этот "джиттер" осциллографом в реале. Конечно, мне очень бы не хотелось бы заморачиваться аппаратным таймером.
 

aZholtikov

Active member
В данный момент в функциях обратного вызова Ticker не рекомендуется выполнять блокирующие операции ввода и вывода данных (связанные с сетью, последовательной передачей данных, файлами). Лучше поставьте флаг внутри функции обратного вызова Ticker, а затем обращайтесь к этому флагу из блока loop().

Не ту ссылку прикрепил... :)
 
Сверху Снизу