Помогите!

Best4ar4
Offline
Зарегистрирован: 30.11.2017

Народ, никак не могу разобраться с задержками, суть такова:два пина, 5в подается на вход, диод на выход, когда на входе появляется сигнал, загорается диод. Как сделать так, что бы при условии отсутсвия сигнала на входе, диод продолжал гореть еще несколько секунд, а потом гас. Пытаюсь сделать через функцию millis, но что то не могу ее осилить, обьясните пожалуйста, как правильно написать скетч. Спасибо.

sadman41
Offline
Зарегистрирован: 19.10.2016
Best4ar4
Offline
Зарегистрирован: 30.11.2017
int ACC = 6;
int cACC =7;
unsigned long pauseTimecACC = 0;
void setup()
{
  pinMode(ACC, INPUT);
  pinMode(cACC, OUTPUT);
        
}
void loop()
{ 
  digitalWrite(cACC, HIGH);
  pauseTimecACC = millis();
  if (millis()-pauseTimecACC>=3000)
  { digitalWrite(cACC, LOW);
  
  }}

 

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

Ну, давайте разбираться. 

Вопрос #1: в которой строке у вас выполняется "когда на входе появляется сигнал, загорается диод"?

Best4ar4
Offline
Зарегистрирован: 30.11.2017

Это часть кода, что вспомнил, много вопросов не нужно, я второй день этим занимаюсь и много чего не понимаю)))) , мне бы в самой сути millis разобраться, что за что принимается в функции. И если можно,как на основе этих 2х пинов ее записать. Что не читал так толком и не разобрался.

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

"Разобраться в сути millis()" вам не поможет в решении проблемы, так как в вашем скетче нет основного функционала. 

Для тех, кому нет времени разбираться или учиться, а результат нужен прямо сейчас - существует раздел "Обмен рублей на готовый код". Я так понимаю, что ваша задача связана с выдержкой таймаута при пропадании напряжения во время включения зажигания? Готовый код на этот случай имеется. Но в этом разделе ему не место. Сюда пишут те, кто хочет научится сам что-то делать.

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

Best4ar4 пишет:
Что не читал так толком и не разобрался.

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

1. Выкладывайте полный код или хотя бы ту часть, о которой идет речь. Если речь идет про "приходящий сигнал" - он должен быть в коде.

2. Вопросов к вам будет много. Как и посылов в документацию. Здесь не дают готового кода, здесь принято ЗАСТАВИТЬ новичка найти ответ самостоятельно. Если не готовы работать в таком стиле - идите на другой форум.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Best4ar4 пишет:
много вопросов не нужно
А что нужно?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Какое именно из слов в описании функции тебе непонятно?

===================================

millis()

Возвращает количество миллисекунд с момента начала выполнения текущей программы на плате Arduino. Это количество сбрасывается на ноль, в следствие переполнения значения, приблизительно через 50 дней.

Параметры

нет

Возвращаемое значение

Количество миллисекунд с момента начала выполнения программы. (unsigned long)

feartat
Offline
Зарегистрирован: 01.11.2017

я бы ввел переменную счетчик в которую в цикле добавлял 1 за каждый проход loop. ну и собственно проверка если счетчик больше равно нужного количества милисекунд переводим пин в лоу. Может не очень экономично по ресурсам но за то стабильно)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

feartat пишет:

я бы ввел переменную счетчик в которую в цикле добавлял 1 за каждый проход loop. ну и собственно проверка если счетчик больше равно нужного количества милисекунд переводим пин в лоу. 

Кто вам сказал, что loop вызывается строго каждую миллисекунду?

feartat
Offline
Зарегистрирован: 01.11.2017

Я сначала написал, а потом вспомнил что такт от частоты а не от таймера идет ) Асоциативка сработала )))

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

feartat пишет:

Я сначала написал, а потом вспомнил что такт от частоты а не от таймера идет ) Асоциативка сработала )))

опять пальцем в небо... время исполнения loop никак (почти) не связано с тактом

Best4ar4
Offline
Зарегистрирован: 30.11.2017

В общем попробую еще раз, пытаюсь сделать блок питания для планшета в авто, чтобы последовательно после включения зажигания подключалась переферия. А при несоблюдении некоторых условий выключалась. Через delay схема работает как то неуверенно . Основной проблемой стала часть кода где нужно реализовать поддержание питания на выходе 7, при отсутствии сигнала на входе 5.

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

int analogInput = A5;
int ACC = 6;
int plansh = 2;
int otg =3;
int videoreg = 4;
int zarad = 5;
int cACC =7;
float vin = 0;
unsigned long pauseTimeACC = 0;



void setup()
{
  Serial.begin(9600);
  pinMode(plansh, OUTPUT);
  pinMode(otg, OUTPUT);
  pinMode(videoreg, OUTPUT);
  pinMode(zarad, OUTPUT);
  pinMode(ACC, INPUT);
  pinMode(cACC, OUTPUT);
    
}
void loop()
{ vin = float(analogRead(analogInput))/18.6;
  Serial.print("v = " );
  Serial.println(pauseTimeACC);
  delay(500);
 
  digitalWrite(cACC, 1);
 pauseTimeACC = millis();
  if (millis()-pauseTimeACC>=3000)
    digitalWrite(cACC, 0);
   
  
    
  if (vin>=12)
{
  delay(10);
  digitalWrite(zarad, HIGH);
  delay(500);
  digitalWrite(otg, HIGH);
  delay(500);
  digitalWrite(plansh, HIGH);
  delay(500);
  digitalWrite(videoreg, HIGH);
}
else
{
  digitalWrite(zarad, LOW);
  delay(1000);
  digitalWrite(otg, LOW);
  delay(1500);
  digitalWrite(plansh, LOW);
  delay(2000);
  digitalWrite(videoreg, LOW);
}}
  

Подскажите как это правильно реализовать.

Best4ar4
Offline
Зарегистрирован: 30.11.2017

1 ошибку нашел, сACC принудительно запускаю, без наличия сигнала на асс

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

Отлично, вопрос #1 вы поняли.

Проиллюстрируйте, как вы решили эту проблему и, если всё правильно, получите следующую подсказку.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

#18

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
В 31_й строке Вы думаете что фиксируете (pauseTimeACC = millis();), но это не так. При каждом следующем проходе "pauseTimeACC" обновляется и условие, 32_я строчка "if (millis()-pauseTimeACC>=3000)", не будет истинным НИКОГДА, поэтому "digitalWrite(cACC, 0);"- миссия не выполнима.
И второе, зачем вам millis(), если в коде столько delay(). я посчитал в случае "else" - 5 секунд  а Вы хотите  (millis()-pauseTimeACC>=3000)"
 Что надо сделать:
1-е и главное избавиться от delay()
2-е Правильно научиться фиксировать время
3-е Начните просто с одного диода который будет включаться через millis() и когда  поймете как это работает - свой код напишете за пол часа
Best4ar4
Offline
Зарегистрирован: 30.11.2017

if (digitalRead(ACC) == HIGH)
{
digitalWrite(cACC, HIGH) ;
}

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

ACC у вас подвязан к pin 6, а речь вы ведете про pin 5.

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

Итак, вопрос #2 - вы думали о физическом смысле условия (millis()-pauseTimeACC>=3000), как вы его понимаете?

 

Best4ar4
Offline
Зарегистрирован: 30.11.2017

Насколько я понял millis() это время от начала выполнения кода, когда мы пишем pauseTimeACC = millies, pausetimeacc приравнивается ко времени выполнения кода. Ага, если я правильно понимаю это значение будет всегда равно 0.

Best4ar4
Offline
Зарегистрирован: 30.11.2017

Как тогда обозначить что pauseTime это время после изменения состояния на входе?

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

Best4ar4 пишет:
Насколько я понял millis() это время от начала выполнения кода, когда мы пишем pauseTimeACC = millies, pausetimeacc приравнивается ко времени выполнения кода. Ага, если я правильно понимаю это значение будет всегда равно 0.

Все правильно, кроме последнего предложения.

Зайдем с другой стороны. Вы, когда яйца варите 3 минуты, как определяете, что время варки вышло?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Best4ar4 пишет:
когда мы пишем pauseTimeACC = millies, pausetimeacc приравнивается ко времени выполнения кода. Ага, если я правильно понимаю это значение будет всегда равно 0.

Как всё запущено-то.

Давайте. Вы для начала прочитаете-таки вот этот раздел. Узнаете, что означает оперция "=", а заодно много чего ещё, а то сдаётся мне Вы вообще ничего не читали, и надеетесь, что обо всём можно спросить - так не получится. Обо всём не спросишь. Да и ответов не поймёшь. Работайте сами.

Best4ar4
Offline
Зарегистрирован: 30.11.2017

Когда прошло 3 минуты с того момента как яйца опустил в воду. Прочитал про = ( спасибо ЕвгенийП) получается когда пишем pauseTimeacc=millis(), это грубо говоря время когда мы закинули яйца в воду, получается после этой строчки из если millis вычесть pauseTimeacc, millis уже будет больше?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

millis() постоянно становится больше. Каждую миллисекунду. Она неумолима как само время.

arduinec
Offline
Зарегистрирован: 01.09.2015

ЕвгенийП пишет:

millis() постоянно становится больше. Каждую миллисекунду. Она неумолима как само время.

Он (она, оно) ещё и переполняется :)

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

Best4ar4 пишет:
Когда прошло 3 минуты с того момента как яйца опустил в воду. Прочитал про = ( спасибо ЕвгенийП) получается когда пишем pauseTimeacc=millis(), это грубо говоря время когда мы закинули яйца в воду, получается после этой строчки из если millis вычесть pauseTimeacc, millis уже будет больше?

millis(), как правильно подметили без меня, всегда больше. Во всяком случае - на протяжении 49-ти с небольшим дней.

Итак, если pauseTimeacc - это не pauseTimeacc, а, например, powerOffStartTime и millis() - текущее время, то (millis() - powerOffStartTime) - это продолжительность события, так?

Теперь у вас есть знание о том, когда сигнал появляется (#18), из этого можно вывести условие, описывающее пропадание сигнала - необходимого вам события. Так же вы знаете, как засечь время начала этого события, вычислить продолжительность и сравнить с заданной величиной. В принципе - вам известно всё, что нужно для отключения нагрузки через определенный промежуток времени. Осталось только оформить это в виде инструкций микроконтроллеру. 

Best4ar4
Offline
Зарегистрирован: 30.11.2017

Спасибо, буду пробовать.

bwn
Offline
Зарегистрирован: 25.08.2014

arduinec пишет:

ЕвгенийП пишет:

millis() постоянно становится больше. Каждую миллисекунду. Она неумолима как само время.

Он (она, оно) ещё и переполняется :)

Лопатку к вентилятору несешь?)))))

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

bwn пишет:

arduinec пишет:

ЕвгенийП пишет:

millis() постоянно становится больше. Каждую миллисекунду. Она неумолима как само время.

Он (она, оно) ещё и переполняется :)

Лопатку к вентилятору несешь?)))))

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

arduinec пишет:

Он (она, оно) ещё и переполняется :)

Да? Чего только не посылает нам Господь, дабы испытать прочность нашей Веры! Воистину нет предела его креативности :)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
Причастие о святом millis().
--Веруете Вы в millis() ?
 --Веруем!!
Веруете в наполнение millis() ?
 --Веруем!!
Веруете вы в переполнение  millis() ?
 --Веруем!!
Веруете вы к код, которому не страшно переполнение millis() ?
 --Веруем!!

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Осталось уверовать в опустошение millis().

arduinec
Offline
Зарегистрирован: 01.09.2015

andriano пишет:

Осталось уверовать в опустошение millis().

Ну так при правильном использовании (http://arduino.ru/tutorials/BlinkWithoutDelay) миллис не переполняется потому, что от него отнимается и он (она, оно) опустошается :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

arduinec пишет:

миллис не переполняется потому, что от него отнимается и он (она, оно) опустошается :)

Пойду накачу за это дело!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

создаю Секту Свидетелей Переполнения Святого Миллиса.  Есть ли жизнь после обнуления?  Нада напица. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

создаю Секту Свидетелей 

Я уже создавал и даже писал куда их следует посылать.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ну вот я туда и пойду.