Помогите доработать код таймера

vadim82
Offline
Зарегистрирован: 12.05.2018

Всем привет ! Загорелся этими ардуинами и т.п, но в жизни не программировал, а хочется аж кушать не могу. Help!!!. Вопрос по таймеру: Их миллионы в сети, а как реализовать то что нужно не найду. Можно ли доработать код ниже для разных интервалов вкл./выкл? к примеру: Вкл - 2000мс; Выкл - 3000мс ;Вкл - 4000мс ;Выкл - 10000мс и так по кругу. У меня получается только с Delay.. а Millis темный лес. Спасибо!

int ledPin =  3;      // the number of the LED pin
int ledState = LOW;             // ledState used to set the LED
unsigned long previousMillis = 0;        // will store last time LED was updated
long OnTime = 2000;           // milliseconds of on-time
long OffTime = 3000;          // milliseconds of off-time
 
void setup() 
{
  // set the digital pin as output:
  pinMode(ledPin, OUTPUT);      
}
 
void loop()
{
  // check to see if it's time to change the state of the LED
  unsigned long currentMillis = millis();
 
  if((ledState == HIGH) && (currentMillis - previousMillis >= OnTime))
  {
    ledState = LOW;  // Turn it off
    previousMillis = currentMillis;  // Remember the time
    digitalWrite(ledPin, ledState);  // Update the actual LED
  }
  else if ((ledState == LOW) && (currentMillis - previousMillis >= OffTime))
  {
    ledState = HIGH;  // turn it on
    previousMillis = currentMillis;   // Remember the time
    digitalWrite(ledPin, ledState);    // Update the actual LED

  }
}

 

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

vadim82 пишет:
Можно ли доработать код ниже для разных интервалов вкл./выкл?
Можно.

vadim82
Offline
Зарегистрирован: 12.05.2018

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

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

Кому-то придется уступить, раз логика не совпадает...

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

vadim82, несколько настораживает, что Вы не можете четко сформулировать по-русски, что же Вам на самом деле надо.

Ну ладно, по доработке кода.

Вам нужен конечный автомат. Т.е. программа должна уметь отслеживать текущее состояние и переходить из одного состояния в другое.

Сейчас у Вас состояние описывается логичееской переменной ledState, которая может принимать всего два значения. Поэтому и последовательность действий ограничена двумя интервалами. Заменитье эту переменную целой, которая может принимать большее количество значений. Решите, какое количество состояний Вам нужно, и включите в код переходы между состояниями.

Дальнейшей доработкой может являться перевод логики программы на работу с массивами (полезно при большом количестве состояний).

vadim82
Offline
Зарегистрирован: 12.05.2018

Спасибо за наводку!!! на форуме нашел топик в тему

 

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

vadim82 пишет:

Можно то оно можно, но моя логика не совпадает ....

Вы задали вопрос "можно ли ..." и получили на него чёткий и однозначный ответ. Других вопросов Вы в стартовом посте не задавали.