Моргание светодиода нужное количество раз

Foster312
Offline
Зарегистрирован: 18.01.2017

Приветствую,можно ли привести пример простенькой программки для nano ,чтобы светодиод моргал сначала 1 раз,потом 2,3 и так далее до бесконечности.Заранее -Спасибо.

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

Foster312 пишет:

Приветствую,можно ли привести пример простенькой программки для nano ,чтобы светодиод моргал сначала 1 раз,потом 2,3 и так далее до бесконечности.Заранее -Спасибо.

Да, конечно. Пример blink (поставлятся с IDE). Запускаете и считаете. Сначала он мигнул один раз, потом два, потом три и так далее.

b707
Онлайн
Зарегистрирован: 26.05.2017

Можно, конечно.

Один раз умеете моргать? Тогда после одного морга делаете паузу и потом выполняете "моргание 1 раз" дважды. Потом делаете паузу... Потом "моргаем 1 раз" трижды. Делаем паузу...

До нужного числа моргов продолжите сами

Foster312
Offline
Зарегистрирован: 18.01.2017

А нельзя ли написать программу так,что бы сама программа после паузы увеличивала количество морганий?

b707
Онлайн
Зарегистрирован: 26.05.2017

Foster312 пишет:

А нельзя ли написать программу так,что бы сама программа после паузы увеличивала количество морганий?

можно

nik182
Offline
Зарегистрирован: 04.05.2015

Программа.

переменная1=1

переменная2=переменная1

моргнуть 1 раз

переменная2 -= 1

если переменная2 >0 пойти и моргнуть ещё 1 раз

подождать паузу

пременная1 += 1

пойти на точку присвоения значения переменной2

Это логика, которую нужно описать на си. Почти теми же словами, только по английски.

 

 

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

Стоп! В первом посте про паузы ничего не было сказано. Значит, подходит пример blink.

а если нужны паузы, ... , там может там ещё чего нужно? 

ТС, Вы не могли бы задачу полностью поставить?

b707
Онлайн
Зарегистрирован: 26.05.2017

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

Стоп! В первом посте про паузы ничего не было сказано. Значит, подходит пример blink.

Евгений, ну это уже как ленинское определение бюрократии - вы должны помнить - "По форме верно, а по сути - издевательство" :)

Foster312
Offline
Зарегистрирован: 18.01.2017

Может есть пример такой программы?

Foster312
Offline
Зарегистрирован: 18.01.2017

nik182,Спасибо

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

b707 пишет:

Евгений, ну это уже как ленинское определение бюрократии - вы должны помнить - "По форме верно, а по сути - издевательство" :)

Я - программист. Из тех, что отвечают "Вы в корзине своего шара" и ставят на прикроватную тумбочку два стакана :)

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

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

Я - программист. Из тех, что отвечают "Вы в корзине своего шара" и ставят на прикроватную тумбочку два стакана :)

Любимый анекдот матшкольной молодости:

Физик и математик пролетали на вертолете над горами.

Физик записывает в блокноте: "Пролетали над горами, населенными стадами черных коз".

Математик записывает в блоктоте: "Пролетали над горами. Видели одну козу. Черную сверху."

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

Что бы быстро и хорошо составить программу , это надо составить внятное ТЗ, даже если это ужасное блеяние заказчика. 

ПС: Надеюсь ТС уже накалякал свой код. Ну ладно я оставлю свой :)

/**/
//-------компоновка----------------------------
const byte pin =/*пин*/13;
//-------main()----------------------------
void setup() {
  pinMode(pin, OUTPUT);
  for (int n = 1;; ++n) {
    for (int i = 0; i < n; ++i) {
      digitalWrite(pin, HIGH);
      delay(/*время вкл*/200);
      digitalWrite(pin, LOW);
      delay(/*время выкл*/200);
    }
    delay(/*пауза между сериями*/500);
  }
}
void loop() {
}
/*Скетч использует 968 байт (3%) памяти устройства. Всего доступно 32256 байт.
  Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2039 байт для локальных переменных. Максимум: 2048 байт.
*/

 

mutolya
Offline
Зарегистрирован: 22.11.2020

Здравствуйте

Нужна помощь.

Нужно что бы при нажатии на кнопку без удержания, светодиод моргнул три раза. При повторном нажатии на кнопку без удержания, снова проморгал три раза.

Написал скечь. Светодиод моргает три раза при нажатии и удержании кнопки. При повторном нажатии кнопки светодиод не моргает. Подозреваю что проблема в строчке №44 при обращении к millis(). Как будто прога зацикливается. В итоги void loop() не идет по кругу. 

Укажите как запустить void loop() в бесконечный цикл.

// Работает при удержании кнопки. При повторном нажатии не работает.

// Эти переменные хранят временной шаблон для интервалов мигания
// и текущее состояние светодиода
int ledPin = 13;                      // номер пина со светодиодом
int ledState = LOW;                   // состояние светодиода
int k = 0;                            // для счетчика
// последний момент времени, когда состояние светодиода изменялось
unsigned long previousMillis = 0;
unsigned long currentMillis;
long OnTime = 800;                    // длительность свечения светодиода (в миллисекундах)
long OffTime = 300;                   // светодиод не горит (в миллисекундах)
bool state =0;                        
//-----------------Для кнопки-------------------------------------------------
bool flag = false;
uint32_t btnTimer = 0;
int ledrun; 
//----------------------------------------------------------------------------
void setup() {
pinMode(ledPin, OUTPUT);         
pinMode(7, INPUT_PULLUP);   //Кнопка
 
 }
 
void loop() {
//----------------------------------------------------------------------------
  // читаем инвертированное значение для удобства
  bool btnState = !digitalRead(7);
  if (btnState && !flag && millis() - btnTimer > 100) {
    flag = true;
    btnTimer = millis();
    ledrun = 1;
  }
  if (!btnState && flag && millis() - btnTimer > 100) {
    flag = false;
    btnTimer = millis();
    ledrun = 0;
    
  }
//----------------------------------------------------------------------------
if(ledrun == 1 ){
 
 // выясняем не настал ли момент сменить состояние светодиода
   unsigned long currentMillis = millis();   // текущее время в миллисекундах
  
  // если светодиод включен и светится больше чем надо
  if((ledState == HIGH) && (currentMillis - previousMillis >= OnTime))
  {
    ledState = LOW;                   // выключаем
    previousMillis = currentMillis;   // запоминаем момент времени
    digitalWrite(ledPin, ledState);   // реализуем новое состояние
    k++;
    if (k > 2 ) state =1;     // если больше переводим в другое состояние
  }
  else if ((ledState == LOW) && (currentMillis - previousMillis >= OffTime) && !state)    //здесь проверяем 3 пунктом это состояние
  {
    ledState = HIGH;                   // включаем
    previousMillis = currentMillis ;   // запоминаем момент времени
    digitalWrite(ledPin, ledState);    // реализуем новое состояние
  }
  
}  
}

 

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

mutolya пишет:

Укажите как запустить void loop() в бесконечный цикл.

Он всегда в бесконечном цикле. Специально устраивать ему цикл не надо никак.

mutolya пишет:

Написал скечь. Светодиод моргает три раза при нажатии и удержании кнопки. 

Зачем? Вроде ж надо было

mutolya пишет:

что бы при нажатии на кнопку без удержания, светодиод моргнул три раза. 

mutolya пишет:
зацикливается. В итоги void loop() не идет по кругу.

Ничего у Вас нигде не зацикливается. Всё идёт как надо. Поставьте в начале loop вывод в сериал чего-нибудь и убедитесь, что всё исправно выводится.

Когда убедитесь, поставьте печати вдоль кода и отследите по ним, что происходит. Тогда и разберётесь.

SLKH
Offline
Зарегистрирован: 17.08.2015

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

b707 пишет:

Евгений, ну это уже как ленинское определение бюрократии - вы должны помнить - "По форме верно, а по сути - издевательство" :)

Я - программист. Из тех, что отвечают "Вы в корзине своего шара" и ставят на прикроватную тумбочку два стакана :)

"Послали программиста за бутылкой, а он одну и принёс. Пустую."

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

mutolya пишет:

Здравствуйте

Нужна помощь.

Нужно что бы при нажатии на кнопку без удержания, светодиод моргнул три раза. При повторном нажатии на кнопку без удержания, снова проморгал три раза.

Как 1 из вариантов

int ledPin = 13;                      // номер пина со светодиодом
bool ledState = 1;                   // состояние светодиода
uint8_t k = 0;                            // для счетчика
unsigned long currentMillis;
long OnTime = 1800;                    // длительность свечения светодиода (в миллисекундах)
long OffTime = 300;                   // светодиод не горит (в миллисекундах)
uint16_t pausa = OnTime;
bool state = 0;
//-----------------Для кнопки-------------------------------------------------
bool flag = false;
uint32_t btnTimer = 0;
int ledrun;
//----------------------------------------------------------------------------
void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(7, INPUT_PULLUP);   //Кнопка
}

void loop() {
  //----------------------------------------------------------------------------
  // читаем инвертированное значение для удобства
  bool btnState = !digitalRead(7);
  if (btnState && !flag && millis() - btnTimer > 100) {
    flag = true;
    btnTimer = millis();
    ledrun = 1;
  }
  if (!btnState && flag && millis() - btnTimer > 100) {
    flag = false;
    btnTimer = millis();

  }
  //----------------------------------------------------------------------------
  if (ledrun == 1) {
    if (millis() - currentMillis >= pausa)
    {
    ledState = !state;
      currentMillis = millis();
      switch (state) {
        case 0 :
          digitalWrite(ledPin, ledState);
          state = 1;
          k++;
          pausa = OffTime;
          break;
        case 1:
          digitalWrite(ledPin, ledState);
          state = 0;
          k++;
          pausa = OnTime;
          break;
      }
    }
    if (k >= 6)
    {
      ledrun = 0;
      k = 0;
      pausa = OnTime;
    }
  }
}

 

mutolya
Offline
Зарегистрирован: 22.11.2020

Спасибо. 

Буду разбираться с millis().

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Если Вам ваша больше понятна, тогда вот подправил ее. Разбирайтесь

// Работает при удержании кнопки. При повторном нажатии не работает.

// Эти переменные хранят временной шаблон для интервалов мигания
// и текущее состояние светодиода
int ledPin = 13;                      // номер пина со светодиодом
int ledState = LOW;                   // состояние светодиода
int k = 0;                            // для счетчика
// последний момент времени, когда состояние светодиода изменялось
uint32_t previousMillis = 0;
uint32_t currentMillis;
uint16_t OnTime = 800;                    // длительность свечения светодиода (в миллисекундах)
uint16_t OffTime = 300;                   // светодиод не горит (в миллисекундах)
bool state = 0;
//-----------------Для кнопки-------------------------------------------------
bool flag = false;
uint32_t btnTimer = 0;
int ledrun;
//----------------------------------------------------------------------------
void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(7, INPUT_PULLUP);   //Кнопка
}

void loop() {
  //----------------------------------------------------------------------------
  // читаем инвертированное значение для удобства
  bool btnState = !digitalRead(7);
  if (btnState && !flag && millis() - btnTimer > 100) {
    flag = true;
    btnTimer = millis();
    ledrun = 1;
  }
  if (!btnState && flag && millis() - btnTimer > 100) {
    flag = false;
    btnTimer = millis();


  }
  //----------------------------------------------------------------------------
  if (ledrun == 1 ) {
    // выясняем не настал ли момент сменить состояние светодиода
    unsigned long currentMillis = millis();   // текущее время в миллисекундах
    // если светодиод включен и светится больше чем надо
    if ((ledState == HIGH) && (currentMillis - previousMillis >= OnTime))
    {
      ledState = LOW;                   // выключаем
      previousMillis = currentMillis;   // запоминаем момент времени
      digitalWrite(ledPin, ledState);   // реализуем новое состояние
      k++;
      if (k >= 3 ) {
        k = 0;  // если больше переводим в другое состояние
        ledrun = 0;
      }
    }
    else if ((ledState == LOW) && (currentMillis - previousMillis >= OffTime))    //здесь проверяем 3 пунктом это состояние
    {
      ledState = HIGH;                   // включаем
      previousMillis = currentMillis ;   // запоминаем момент времени
      digitalWrite(ledPin, ledState);    // реализуем новое состояние
    }
  }
}

 

mutolya
Offline
Зарегистрирован: 22.11.2020

Спасибо

Green
Offline
Зарегистрирован: 01.10.2015

А попроще, не?)

#define KEY       7
#define LED       13
#define ON_TIME   800
#define OFF_TIME  300
#define BLINK     3


void setup() {
  pinMode(KEY, INPUT_PULLUP);
  pinMode(LED, OUTPUT);
}

void loop() {
  static bool old;
  if (old != !digitalRead(KEY) && (old = !old))
    for (uint8_t i = 0; i < BLINK; i++) {
      digitalWrite(LED, HIGH);
      delay(ON_TIME);
      digitalWrite(LED, LOW);
      delay(OFF_TIME);
    }
}

 

mutolya
Offline
Зарегистрирован: 22.11.2020
vosara, и Green.   Большое спасибо.
Все програмки работают.
Хвала спецам.
sadman41
Онлайн
Зарегистрирован: 19.10.2016

Сдал зачет?

Green
Offline
Зарегистрирован: 01.10.2015

Но учиться надо!)

mutolya
Offline
Зарегистрирован: 22.11.2020

Мне почти 40 лет.

Вожкаюсь спарником на даче. Ардуино надеюсь поможет.

mutolya
Offline
Зарегистрирован: 22.11.2020

Green пишет:

Но учиться надо!)

Это точно. Всю жизнь. 

5N62V
Offline
Зарегистрирован: 25.02.2016

qwone пишет:

Что бы быстро и хорошо составить программу , это надо составить внятное ТЗ, даже если это ужасное блеяние заказчика. 

ПС: Надеюсь ТС уже накалякал свой код. Ну ладно я оставлю свой :)

/**/
//-------компоновка----------------------------
const byte pin =/*пин*/13;
//-------main()----------------------------
void setup() {
  pinMode(pin, OUTPUT);
  for (int n = 1;; ++n) {
    for (int i = 0; i < n; ++i) {
      digitalWrite(pin, HIGH);
      delay(/*время вкл*/200);
      digitalWrite(pin, LOW);
      delay(/*время выкл*/200);
    }
    delay(/*пауза между сериями*/500);
  }
}
void loop() {
}
/*Скетч использует 968 байт (3%) памяти устройства. Всего доступно 32256 байт.
  Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2039 байт для локальных переменных. Максимум: 2048 байт.
*/

 

Так ведь заказчик приказал : чтобы светодиод моргал сначала 1 раз,потом 2,3 и так далее до бесконечности.  А у Вас ограничено какими-то жалкими sizeof(int); 

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

Ну, не sizeof(int), конечно, а INT_MAX, но самое интересное даже не это - самое интересное, что будет потом, когда предел будет достигнут.

qwone, не поделитесь секретом, что произойдёт, когда количество миганий (переменная n) перевалит за 215-1?

5N62V
Offline
Зарегистрирован: 25.02.2016

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

Ну, не sizeof(int), конечно, а INT_MAX

Да, сори, прямой угол с температурой кипения перепутал.

 

КМК,  будет  пауза пока n опять не станет нулем.