светодиоды+Millis+аналоговый вход+кнопка включения.

twilightwatch
Offline
Зарегистрирован: 03.05.2018

Всем хорошего дня! Я новичок, не шарю и бла-бла-бла. Поставил себе задачу сделать следующее (просто в качестве обучения и понимания):

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

2) Повторное нажатие кнопки останавливает код. 

3) 5 светодиодов по кругу друг за другом по очереди зажигаются и сразу выключаются. (бегущая точка)

(Это сделать удалось, только с помощью Delay, но он не подходит тут, код смысла нет вставлять, он понятен всем. Уроки с millis повторял, но везде только 1 светодиод, как сделать больше уже непонятно)

4) Яркость светодиодов регулируется потенциометром в любой момент.

 (Алгоритм готового известного урока в принципе понятен, но непонятно как его интегрировать) 


#define led 9

#define pot A0

void setup()

{


pinMode(led, OUTPUT);



pinMode(pot, INPUT);

}

void loop()

{



int x;


x = analogRead(pot) / 4;

analogWrite(led, x);

}

Прошу помощи, подсказок, примеров.  Спасибо.

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

twilightwatch пишет:

3) 5 светодиодов по кругу друг за другом по очереди зажигаются и сразу выключаются. (бегущая точка)

(Это сделать удалось, только с помощью Delay, но он не подходит тут, код смысла нет вставлять, он понятен всем. Уроки с millis повторял, но везде только 1 светодиод, как сделать больше уже непонятно)

Вот это заявление просто шокировало.

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

Давайте сделаем так: Вы для меня напишете код с delay(), а я для Вас напишу код той же задачи с millis().

А задача очень простая: первый светодиод должен мигать с полупериодом 125 мс, второй - 81 мс, а третий - 112 мс.

twilightwatch
Offline
Зарегистрирован: 03.05.2018

andriano пишет:

Вот это заявление просто шокировало.

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

Давайте сделаем так: Вы для меня напишете код с delay(), а я для Вас напишу код той же задачи с millis().

А задача очень простая: первый светодиод должен мигать с полупериодом 125 мс, второй - 81 мс, а третий - 112 мс.

Либо я неправильно объяснил, либо Вы меня неправильно поняли. Светодиоды загораются по очереди один за одним. То есть код выполняется в последовательности: включаем первый-ждем(delay)-выключаем первый-включаем второй-ждем(delay)-выключаем второй и тд до пятого, потом снова первый.. То, что Вы задали, это не совсем то и мне не под силу. 

С millis я не понимаю (да и вообще нужен ли тут millis?!) как сделать, чтобы 5 светодиодов загорались в такой же последовательности.

Пытался хотя бы с одним светодиодом и с millis провернуть схему, при которой он постоянно моргает с интервалом 1 секунда, и уровень яркости мигания берется с входа A0 потенциометра, но всё тщетно. 

{
//x = analogRead(pot) / 4;
     currentTime = millis();                    
  if(currentTime >= (loopTime + 500)){  
     digitalWrite(led, !digitalRead(led));
     loopTime = currentTime;                    
  }

Так код работает. Предпоследняя строчка насколько я понимаю отвечает за смену статуса светодиода. Как сюда вкорячить analogWrite(led, x) и выключение digitalWrite(led, LOW) мне не понятно.

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

twilightwatch пишет:

Предпоследняя строчка насколько я понимаю отвечает за смену статуса светодиода. Как сюда вкорячить analogWrite(led, x) и выключение digitalWrite(led, LOW) мне не понятно.

У вас явная проблема в понимании работы analogWrite и digitalWrite, а не миллис.  Для начала попытайтесь сформулировать, зачем вы к одному пину собираетесь применять analogWrite, "смену статуса" и "выключение" :)

twilightwatch
Offline
Зарегистрирован: 03.05.2018

b707 пишет:

У вас явная проблема в понимании работы analogWrite и digitalWrite, а не миллис.  Для начала попытайтесь сформулировать, зачем вы к одному пину собираетесь применять analogWrite, "смену статуса" и "выключение" :)

Не исключаю. Насколько я понимаю digitalWrite подаёт или отключает напряжение на порте. analogWrite подаёт напряжение на порт в пределах от 0 до 5 Вт, которое либо я задам сам, либо считаю с порта.  Я не знаю зачем я хочу сделать так, я хочу узнать как правильно и, к сожалению, в округе объсянить некому, поэтому и спрашиваю как нужно. Хочу, чтобы светодиод мигал например с периодом в 1 секунду, но яркость (т.е. напряжение на порте) регулировалось потенциометром в режиме онлайн. 

Алгоритм я понимаю так :

1)Считывание показания потенциометра

2)Подача напряжения, которое считали на светодиод в течение 1 секунды

3)Отключение напряжения на 1 секунду

4) См.пункт первый.

 

Не смейтесь, если несу что попало. 

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

twilightwatch, я бы не сказал, что Вы все понимаете правильно, скорее - наоборот.

Но если Вам нужно именно тот алгоритм из 4-х пунктов, то возмитете любой blink - не важно, на delay или на millis, и замените в нем

digitalWrite(pin, HIGH);

на 

analogWrite(pin, value);

а 

digitalWrite(pin, LOW);

на 

analogWrite(pin, 0);

Ну, естественно, позаботиться взять value с резистора и не забыть, что analogWrite работает не на любом пине.