Замыкание контакта на пульте

usersat
Offline
Зарегистрирован: 07.12.2019

Абсолютный новичок. Пришла идея (пока не разберусь со считыванием ИК сигналов и отправки их) пока просто замыкать кнопку на пульте ДУ.
Задача такая. Удаленно через Sonoff подается питание на ардуино. Ардуино замыкает контакт на пульте (с помощью оптрона, просто был под рукой понял как работает, вроде устраивает). Контакт замыкается на 600 миллисекунд. Не пойму как сделать всего одну операцию без цикла и желательно чтобы потом, если это возможно ардуино уснул. Ну не страшно если не уснет. просто через пару минут отключу питание на Sonoff. Мне пока хотя бы один раз запустить команду замыкания контакта. 
Алгоритм:
1) Включил питание
2) Замыкается контакт на 0,6 секунд (опытным путем уже проверю потом). Операция выполняется 1 раз.
3) Больше ничего не выполняется или что то типа глубокого сна если возможно.

Пока моих знаний хватило на такой цикл.. Учусь..

void setup()

{
    pinMode(4, OUTPUT);
}
 
void loop()
{
    digitalWrite(4, HIGH);
    delay(600);
    digitalWrite(4, LOW);
    delay(600);
    
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Содержимое loop() перенести в setup()

usersat
Offline
Зарегистрирован: 07.12.2019

с синтаксисом пока слабо. можете показать как правильно перенести?

negavoid
Offline
Зарегистрирован: 09.07.2016
void setup()
{
    pinMode(4, OUTPUT);
    digitalWrite(4, HIGH);
    delay(600);
    digitalWrite(4, LOW);
    delay(600);
}
 
void loop() { }

 

sadman41
Offline
Зарегистрирован: 19.10.2016

К сожалению в ютуб ещё никто не выложил видео того, как делается copy-paste фрагментов кода. 

usersat
Offline
Зарегистрирован: 07.12.2019

Благодарю Вас всех за помощь. То что нужно! Заработало!
Возникла еще одна идея. По нажатию кнопки запускать таймер 30 минут чтобы выключить телевизор и тюнер автоматически. Постараюсь разобраться, если не получится снова приду к Вам)

negavoid
Offline
Зарегистрирован: 09.07.2016
void setup()
{
    pinMode(4, OUTPUT);
    pinMode(10, INPUT_PULLUP);  // кнопка к земле
}
 
void loop()
{
  if ( digitalRead(10) == LOW )
  {
    delay(1000*60*30);
    digitalWrite(4, HIGH);
    delay(600);
    digitalWrite(4, LOW);
    delay(600);
  }
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

usersat пишет:

Благодарю Вас всех за помощь. То что нужно! Заработало!
Возникла еще одна идея. По нажатию кнопки запускать таймер 30 минут чтобы выключить телевизор и тюнер автоматически. Постараюсь разобраться, если не получится снова приду к Вам)

Это да, сегодня все такие добрые )))

usersat
Offline
Зарегистрирован: 07.12.2019

Не ожидал!!! Благодарю!!! Спасибо огромное!!!

usersat
Offline
Зарегистрирован: 07.12.2019

Продолжаю изучать программирование с нуля. Понимаю сейчас, что в таком коде после нажатия кнопки и отработки задачи (отключения) по программе все равно идет циклический опрос до следующего нажатия кнопки. А его больше не будет. Это надо 1 раз в несколько дней например.
 

void setup()
{
    pinMode(4, OUTPUT);
    pinMode(10, INPUT_PULLUP);  // кнопка к земле
}
 
void loop()
{
  if ( digitalRead(10) == LOW )
  {
    delay(1000*60*30);
    digitalWrite(4, HIGH);
    delay(600);
    digitalWrite(4, LOW);
    delay(600);
  }
}

Есть ли какой то код дописать, чтобы программа отработала 1 раз после нажатия кнопки и ардуино уснула, больше не запускала цикл?

Фокус прописать в Setup не получится я так полагаю. Ведь постоянно надо опрашивать циклически (loop) и ждать нажатия кнопки.
Если это возможно. И вообще это нормальный режим, что ардуино например будет целый день ждать нажатия кнопки (или другого действия в других программах) и работать постоянно? 

ВН
Offline
Зарегистрирован: 25.02.2016

Нормальный режим это в строке пользовательского поиска сайта написать например  - "пробуждение ардуины по кнопке"

usersat
Offline
Зарегистрирован: 07.12.2019

благодарю. буду искать

negavoid
Offline
Зарегистрирован: 09.07.2016

Вообще, бесконечное выполнение программы до выключения по питанию - это нормальный режим для микроконтроллера. Если есть желание, можно сэмулировать остановку программы навсегда, пустым бесконечным циклом, но потом ардуину придётся либо передёрнуть по питанию, либо нажать ресет.

while(1) { }

 

b707
Offline
Зарегистрирован: 26.05.2017

ВН пишет:

Нормальный режим это в строке пользовательского поиска сайта написать например  - "пробуждение ардуины по кнопке"

это результат слишком доброго отношения в первых сообщениях ветки. Первый раз спросил - получил готовое, второй - опять подачка, зачем начинать думать, если в третий раз можно тупо спросить?

 

usersat
Offline
Зарегистрирован: 07.12.2019

b707 - это не так. Тем кто разбирается зачастую сложно понять новичков, которым трудно иногда даже сформулировать в поиске как называется то что надо найти. Я перед тем как задать вопрос пробую насколько возможно найти что то, разобраться. Понимаю пока сам не разберусь будет очень сложно и не будут мне все время помогать. Хотя часто помогают. За что большое спасибо.

negavoid - спасибо большое. Буду пробовать, разбираться. 

sudo-serj
sudo-serj аватар
Offline
Зарегистрирован: 27.01.2020

По поводу сна - пробуйте библиотеку "sleep.h"
за одно с прерываниями разберетесь ;)

usersat
Offline
Зарегистрирован: 07.12.2019

Благодарю. Все рекомендованное буду изучать и пробовать.

Atmega328
Offline
Зарегистрирован: 11.02.2020

"Благодарю Вас всех за помощь. То что нужно! Заработало!
Возникла еще одна идея. По нажатию кнопки запускать таймер 30 минут чтобы выключить телевизор и тюнер автоматически. Постараюсь разобраться, если не получится снова приду к Вам)" - смотрите в сторону библиотеки TimerOne.h. ...

Совсем в общих чертах ,идея такая. Таймер (девайс, встроенный в ардуино) будет насчитывать необходимое время, а по его истечению в основном цикле программы произойдет отключение. Если не понятно как, могу подсказать)

Atmega328
Offline
Зарегистрирован: 11.02.2020

-

usersat
Offline
Зарегистрирован: 07.12.2019

atmega328 скажу честно мне сейчас все непонятно) я на первой ступени изучения) Если с компонентами более менее понятно, как подключить чтобы работало - это я могу сделать. Готовые скетчи загружаю, более менее разбираюсь какая команда что делает.
Пока туго с синтаксисом языка программирования. Как правильно изменить и дополнить программу чтобы работало. Я хоть и пишу выше, что спасибо, разберусь и т.д - пока ничего не получается. Мне сейчас помогут только готовые скетчи, в которых я могу разобраться какая строка что делает. Что то написать самому мне пока не под силу. Многие думают что это участь халявщиков сразу получить скетч, но это не так.

Я просто не умею... пока что...

Идея моя простая. Нажал кнопку, через время (указанное в скетче) посылается сигнал на пульт. Хотелось бы чтобы это работало на батарейках а не от сети. Потому хочется чтобы потребление было минимальным.

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

usersat пишет:

Идея моя простая. Нажал кнопку, через время (указанное в скетче) посылается сигнал на пульт. Хотелось бы чтобы это работало на батарейках а не от сети. Потому хочется чтобы потребление было минимальным.

Классический подход. Полагаете, что увидите скетч "со снижением потребления", прочитаете, "разберетесь" и хренак - супердевайс сделан?

Так-то у меня тоже есть простая идея: я, крч, встаю утром, пью кофе, еду на работу. Там нажимаю пару раз на кнопки и возвращаюсь домой, заниматься досугом. А в конце месяца мне 8 тыщ долларов зарплаты перечисляют на карту. Это же просто, да?

Atmega328
Offline
Зарегистрирован: 11.02.2020

"Так-то у меня тоже есть простая идея: я, крч, встаю утром, пью кофе, еду на работу. Там нажимаю пару раз на кнопки и возвращаюсь домой, заниматься досугом. А в конце месяца мне 8 тыщ долларов зарплаты перечисляют на карту. Это же просто, да?"

Смотрите в сторону ГосДумы. Ваш Кэп :)

b707
Offline
Зарегистрирован: 26.05.2017

usersat пишет:

Идея моя простая. Нажал кнопку, через время (указанное в скетче) посылается сигнал на пульт. Хотелось бы чтобы это работало на батарейках а не от сети. Потому хочется чтобы потребление было минимальным.

вы хватаетесь за все и сразу. оставьте пока "минимальное потребление" - это большой и довольно сложный раздел работы с МК.

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

Не надо клянчить готовые коды, практически в каждой статье по программированию есть примеры, учитесь переделывать их под свои нужды.

Atmega328
Offline
Зарегистрирован: 11.02.2020

"Сосредоточтесь на основных приемах программирования, для начала изучите работу с миллис по примеру "блинк без делей" - millis - это  своеобразный суррогат делей) Лучше сразу с таймером ,мне кажется.

b707
Offline
Зарегистрирован: 26.05.2017

Atmega328 пишет:

Совсем в общих чертах ,идея такая. Таймер (девайс, встроенный в ардуино) будет насчитывать необходимое время, а по его истечению в основном цикле программы произойдет отключение. Если не понятно как, могу подсказать)

странноватая идея - использовать аппаратный таймер для отсчета получасовой задержки.... А если такиз задержек будет три или четыре - все, приехали, таймеры кончились? :)

нафига этот хардкор, когда один таймер в МК уже специально выделен для этого, используйте миллис

b707
Offline
Зарегистрирован: 26.05.2017

Atmega328 пишет:

 millis - это  своеобразный суррогат делей

о, это новость :) Может и вам стоит проштудировать эту тему, прежде чем давать советы? :)

Atmega328
Offline
Зарегистрирован: 11.02.2020

b707 пишет:

 

странноватая идея - использовать аппаратный таймер для отсчета получасовой задержки.... А если такиз задержек будет три или четыре - все, приехали, таймеры кончились? :)

Таймеры еще послужат, точнее ОДИН таймер на несколько задержек)

Делители никто не отменял - програмные имею ввиду, в самом обработчике). Таймер настроить на прерывание раз в 10 миллисекунд. Одна переменная-делитель (до 32767) получается задержка до 327 секунд, вторая переменная-делитель до 327*32767 секунд - с избытком хватит.

Код обработчика элементарный - с использованием if'ов.

sadman41
Offline
Зарегистрирован: 19.10.2016

Все ифы и вычисления переносим в обработчик прерывания, тормозя вообще все? Ход конём, ага.

b707
Offline
Зарегистрирован: 26.05.2017

Atmega328 пишет:

ОДИН таймер на несколько задержек)

Делители никто не отменял - програмные имею ввиду, в самом обработчике). Таймер настроить на прерывание раз в 10 миллисекунд.

откройте для себя тайну работы миллис. Таймер вызывает прерывание раз в 1 мс и обновляент переменную, по которовый вы можете отсчитывать хоть 100500 задержек с помощью if-ов

Атмега328 - то что вы предлагаете - это рабочий вариант. Только он практически один в один повторяет миллис - нафига дублировать, тем более криво :)

Atmega328
Offline
Зарегистрирован: 11.02.2020

"тормозя всё?" - что "всё" ? В данном случае тормозить-то нечего, система будет дрыхнуть полчаса по замыслу её создателя :)

Atmega328
Offline
Зарегистрирован: 11.02.2020

" Таймер вызывает прерывание раз в 1 мс и обновляент переменную" - Те же яйца, только в профиль. Однако раз в 1 мс, а если нам хочется реже? А если чаще, то понятно -  micros() :)

 

b707
Offline
Зарегистрирован: 26.05.2017

Atmega328 пишет:

"тормозя всё?" - что "всё" ? В данном случае тормозить-то нечего, система будет дрыхнуть полчаса по замыслу её создателя :)

ну правда - добрый совет - почитайте про миллис. А то несолько смешно выглядит...

b707
Offline
Зарегистрирован: 26.05.2017

Atmega328 пишет:

Однако раз в 1 мс, а если нам хочется реже?

 

вы прикалываетесь? - вы для ТС тоже будете подбирать делитель, чтобы таймер срабатывал раз в полчаса? - или все-таки счетчик используете? :)

Atmega328
Offline
Зарегистрирован: 11.02.2020

"нафига дублировать, тем более криво " - так вроде чел учится) Ясно, что подобный девайс можно  купить "прямой", ничего не изобретая,  а он хочет сделать кривой, но свой :) 

Atmega328
Offline
Зарегистрирован: 11.02.2020

"ТС или счетчик ?" - так ТС - это и есть таймер-счетчик :)

 

b707
Offline
Зарегистрирован: 26.05.2017

Atmega328 пишет:

"нафига дублировать, тем более криво " - так вроде чел учится)

это было не про ТС, а про вас.

b707
Offline
Зарегистрирован: 26.05.2017

Атмега, продолжайте развлекаться... мне надоело.

 

Atmega328
Offline
Зарегистрирован: 11.02.2020

"это было не про ТС, а про вас."

Можно, допустим тупо подсчитать с помощью millis время от начала какого-либо события до текущего момента. millis можно вызвать как функцию с результатом типа long. А значит можно измерить весьма большой интервал времени с точностью до 1-ой миллисекунды. 

И можно вообще не вспоминать ни про какие таймеры (хотя понятно, что millis использует прерывания).

Проще? Проще! Ну тут как говорится- на вкус и цвет :) 

b707
Offline
Зарегистрирован: 26.05.2017

Atmega328 пишет:

Можно, допустим тупо подсчитать с помощью millis время от начала какого-либо события до текущего момента. millis можно вызвать как функцию с результатом типа long. А значит можно измерить весьма большой интервал времени с точностью до 1-ой миллисекунды.

это вы мне пишете? :) спасибо за науку

 

ЗЫ научитесь уже правильно цитировать, программист вроде :)

Atmega328
Offline
Зарегистрирован: 11.02.2020

b707 пишет:
это вы мне пишете? :) спасибо за науку

Да пожалуйста, если не знали)

На самом деле это больше адресовано Топикстартеру.

Он же хочет науку - а основа науки, как известно - поиск наилучшего решения задачи на основе множества разных подходов :)