Вопрос по использованию Millis()

Ардуинна
Offline
Зарегистрирован: 16.09.2021

Всем привет!

подскажите плиз начинающему. 

Ниже приведен пример кода мигания светодиода, в котором вместо delay используется millis.

Но в данном скрипте интервал включения и интервала между включениями одинаковый - 1000 мсек.

Вопрос - что нужно добавить в код, чтобы длительность включения была 1000 мсек, а интервал между включениями  - 3000 мес?

const int ledPin =  13;      // номер выхода, подключенного к светодиоду
// Variables will change:
int ledState = 0;             // этой переменной устанавливаем состояние светодиода
long previousMillis = 0;        // храним время последнего переключения светодиода
 
long interval = 1000;           // интервал между включение/выключением светодиода (1 секунда)
 
void setup() {
  // задаем режим выхода для порта, подключенного к светодиоду
  pinMode(ledPin, OUTPUT);     
}
 
void loop()
{
  // здесь будет код, который будет работать постоянно
  // и который не должен останавливаться на время между переключениями свето
  unsigned long currentMillis = millis();
  
  //проверяем не прошел ли нужный интервал, если прошел то
  if(currentMillis - previousMillis > interval) {
    // сохраняем время последнего переключения
    previousMillis = currentMillis; 
 
    // если светодиод не горит, то зажигаем, и наоборот
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;
 
    // устанавливаем состояния выхода, чтобы включить или выключить светодиод
    digitalWrite(ledPin, ledState);
  }
}

 

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

Ардуинна пишет:

Вопрос - что нужно добавить в код, чтобы длительность включения была 1000 мсек, а интервал между включениями  - 3000 мес?

это викторина?

ответ - нужно добавить изменение интервала с 1сек на 3 и наоборот в нужный момент

Ардуинна
Offline
Зарегистрирован: 16.09.2021

нет, не викторина.

непонятно, как и куда вписать 3000 мсек...

rkit
Онлайн
Зарегистрирован: 23.11.2016

Может ты курс введения в язык какой-нибудь прочитаешь? А то дальше будет еще сложнее. а делать за тебя никто не будет.

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

Ардуинна пишет:

Вопрос - что нужно добавить

Ответ: немножко знаний и совсем чуть-чуть мозгов.

Ардуинна
Offline
Зарегистрирован: 16.09.2021

Так я же не заказываю выполнение работы с нуля.

Речь идет о том чтобы несколько строк в нужное место добавить.

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

Ардуинна пишет:

непонятно, как и куда вписать 3000 мсек...

мне тут нравится вопрос "как"?

А как вы умеете? - так и впишите

 

Что касается вопроса "куда?" - очевидно, что 3000мсек надо вписывать  в момент выключения диода, а 1000 - в момент включения.

да-да, вписывать придется не только 3000, но и 1000, иначе вы просто поменяете период с 1 сек на 3 и все

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

Ардуинна, попытайтесь представить, что вместо контроллера Arduino посадили Вас - Ардуинна - и именно Вам с помощью секундомера и тумблера нужно выполнить условие задачи. Опишите подробно, как Вы будете действовать. По русски. А потом просто переведите написанное на Си.

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

существует 99 способов, Евгений Петрович говорит, что сто, студенты с галёрки, что сто один:
 

const int ledPin =  13;      // номер выхода, подключенного к светодиоду
// Variables will change:
int ledState = 0;             // этой переменной устанавливаем состояние светодиода
unsigned long previousMillis = 0;        // храним время последнего переключения светодиода

unsigned long interval = 1000;           // интервал между включение/выключением светодиода (1 секунда)

void setup() {
  // задаем режим выхода для порта, подключенного к светодиоду
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  // здесь будет код, который будет работать постоянно
  // и который не должен останавливаться на время между переключениями свето
  unsigned long currentMillis = millis();

  //проверяем не прошел ли нужный интервал, если прошел то
  if (currentMillis - previousMillis > interval) {
    // сохраняем время последнего переключения
    previousMillis = currentMillis;

    // если светодиод не горит, то зажигаем, и наоборот
    if (ledState == LOW) {
      ledState = HIGH;
      interval = 1000;
    }  else {
      ledState = LOW;
      interval = 3000;
    }
    // устанавливаем состояния выхода, чтобы включить или выключить светодиод
    digitalWrite(ledPin, ledState);
  }
}

 

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

Скобок не хватает, работать не будет. 

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

sadman41 пишет:

Скобок не хватает, работать не будет. 

а так?

PS вопрос то был - что нужно добавить в код... а как добавить вопроса не было )))

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

ua6em пишет:

а так?

Вот, компилятор же честно предупреждает, что в 20-ой строке не всё "слава Богу",

D:\GoogleD\Soft\Kaka\Kaka1\Kaka1.ino:20:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if (currentMillis - previousMillis > interval) {

но нет, нам пофиг на его предупреждения :-(

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

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

ua6em пишет:

а так?

Вот, компилятор же честно предупреждает, что в 20-ой строке не всё "слава Богу",

D:\GoogleD\Soft\Kaka\Kaka1\Kaka1.ino:20:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if (currentMillis - previousMillis > interval) {

но нет, нам пофиг на его предупреждения :-(

каюсь )))
у меня до компилятора дело не дошло и, эти баги в исходном скетче, надеялся, что там все правильно , честно и откровенно - исходник не смотрел, переменную интервал глянул, не понравилось что не беззнаковая, но это ТС пусть уж сам учится на ошибках, если желание возникнет )))
PS выходит и пример без ошибок скопировать не могут, да уж...
PPS да я там провёл работу на ошибками и не поленился посмотрел исходник, там так:

// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;        // will store last time LED was updated

// constants won't change:
const long interval = 1000;           // interval at which to blink (milliseconds)

 

PPPS как любил приговаривать Будовский Валерий Павлович...(преподавал релейную защиту)
можно сделать защиту от дурака...но не от изобретательного

Ардуинна
Offline
Зарегистрирован: 16.09.2021

Большое спасибо!

Все работает как надо :)

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

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

Евгений Петрович, пятница, может далее потрём тему
 

const long interval = 1000;

А если период более 25 дней? Понятно, что ситуация по факту абсурдна но ведь физически может быть...
А ведь это в примерах...

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

ua6em пишет:

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


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

Green
Онлайн
Зарегистрирован: 01.10.2015

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

Но для проверки усвоенного можно попросить причесать и сократить этот пример. Хотя бы строк на 5.

Pyotr
Offline
Зарегистрирован: 12.03.2014

Green пишет:

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

Но для проверки усвоенного можно попросить причесать и сократить этот пример. Хотя бы строк на 5.


И чтоб начальное состояние лед было включено.

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

ua6em пишет:

А ведь это в примерах...

И что?

А вот здесь "в уроках" заботливые учителя учат "return loop(); " использовать. Бывает.

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

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

А вот здесь "в уроках" заботливые учителя учат "return loop(); " использовать. Бывает.

Это чтобы китайская ардуина не своевольничала, а возвращал управление куда положено. Иначе знаем мы их. Через одну все поддельные и в каждую недокладено...

Ардуинна
Offline
Зарегистрирован: 16.09.2021

Во нафлудили!
Не иначе народу общения не хватает :)

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

вы бы не выступали. Второй раз подсказки не будет...

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

Ардуинна пишет:
Во нафлудили! Не иначе народу общения не хватает :)

ТС, твоё присуцтвие в этой теме больше не обязательно, она уже сама по себе развиваеца. 

Ардуинна
Offline
Зарегистрирован: 16.09.2021

b707 пишет:

вы бы не выступали. Второй раз подсказки не будет...

А я здесь больше писать не буду, поэтому второй раз мне до лампочки.

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

Ардуинна пишет:
А я здесь больше писать не буду, поэтому второй раз мне до лампочки.

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

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

b707 пишет:

Ардуинна пишет:
А я здесь больше писать не буду, поэтому второй раз мне до лампочки.

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

ты не злопамятный...просто злой и память хорошая?