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

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

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

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

Foster312 пишет:

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

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

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

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

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

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

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

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

b707
Offline
Зарегистрирован: 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
Offline
Зарегистрирован: 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
Offline
Зарегистрирован: 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 опять не станет нулем.

Vaskes
Offline
Зарегистрирован: 25.05.2021

Доброго времени суток. Использовал Ваш код из поста №20. Он мне оооочень помог в работе. Но вот второй день ломаю голову, как сделать так, чтоб программа не стартовала при подаче питания (Управляет воздушной сиреной района города и всех поднимет на уши) А то я уже мудрю таймер задержки на 555, что тоже не очень удобно.

P.S. - с ардуинкой знаком со вчерашнего утра. И это пожалуй единственный случай знакомства с ней.

Logik
Offline
Зарегистрирован: 05.08.2014

//программа не стартовала при подаче питания

как так не стартовала?

Вечный цикл for(;;){} Программа не пройдет дальше. delay(60000) - приостановка на 60 сек.

//Управляет воздушной сиреной района города

)) Удачной отладки!

ПС. Вам учится надо, а не 555 мордовать.

Vaskes
Offline
Зарегистрирован: 25.05.2021

И Вам добрый день, или вечер. Как раз при подачи питания, у меня релюшка на 12 пину сразу начинает свой цикл отрабатывать, потом всё нормально - ждёт нажатия кнопки. но вот этот первый цикл при подаче питания сильно всё портит. Хотелось бы чтоб она как раз и не запускалась сразу при подаче питания. А ждала нажатия кнопочки.

Logik
Offline
Зарегистрирован: 05.08.2014

код в студию! И схему.

Vaskes
Offline
Зарегистрирован: 25.05.2021

Да изучать не вижу смысла, Есть у меня мега - лет 10 лежит бесхозно. Сейчас эту сирену на NANO сделаю, и опять забуду ещё лет на 10 про ардуино. Я только синклер помню до сих пор =))). Потому, мне проще 555 мордовать. Потому и не знаю, куда этот вечный цикл вставлять.

 

Vaskes
Offline
Зарегистрирован: 25.05.2021
01 #define KEY       2
02 #define LED       12
03 #define ON_TIME   3000
04 #define OFF_TIME  7000
05 #define BLINK     3
06  
07  
08 void setup() {
09   pinMode(KEY, INPUT_PULLUP);
10   pinMode(LED, OUTPUT);
11 }
12  
13 void loop() {
14   static bool old;
15   if (old != !digitalRead(KEY) && (old = !old))
16     for (uint8_t i = 0; i < BLINK; i++) {
17       digitalWrite(LED, HIGH);
18       delay(ON_TIME);
19       digitalWrite(LED, LOW);
20       delay(OFF_TIME);
21     }
22 }

А схемы там толком нет, на 12 пине нога релюшки, на 2 кнопочка. Между землёй и 2 пином 10к резюк. всё. А, ну и диод на релющке, но он не считается =))

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

Релюшка, кнопочка, резюк... С кнопки питание что ли подаётся на 2? Тогда в 15 будет не !digitalRead, а digitalRead без !. 

b707
Offline
Зарегистрирован: 26.05.2017
if (old != !digitalRead(KEY) && (old = !old)) 

- прелестно :)

Vaskes пишет:

изучать не вижу смысла,

помогать в таком разе не вижу смысла. Идите в платный раздел

 

 

Logik
Offline
Зарегистрирован: 05.08.2014

пробуй стр.14 static bool old = 1;

Vaskes
Offline
Зарегистрирован: 25.05.2021

Спасибо что не отказали. Когда я купил себе мегу, то изучал. Но за 10 лет всё забыл. Я, зная что на этой нане опять всё закончится, вижу реальные перспективы - что я всё равно забуду коды программирования, да и возраст у меня уже не предполагает к большому объёму информации. Я реалист, потому и написал, что нет смысла сейчас убивать недели для единственного проекта, который забудется через пару лет, а то и месяцев.

Logik
Offline
Зарегистрирован: 05.08.2014

Green пишет:

С кнопки питание что ли подаётся на 2? 

отож. непонятно как у него кнопка включена. 

Vaskes
Offline
Зарегистрирован: 25.05.2021

Благодарю, помогло. Ну теперь дальше начну собирать всю силовую часть. Еще раз спасибо. =)) На этом я прекращаю все терзания Участников.

Vaskes
Offline
Зарегистрирован: 25.05.2021

Ну да, +5V на 2 пин

Vaskes
Offline
Зарегистрирован: 25.05.2021

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

Kakmyc
Offline
Зарегистрирован: 15.01.2018

У китайцев далеко не 1000р
200-250 за нано
Их нужно.... ммм ... одна штука. (Если с мозгами не беда и руки вперёд головы не бегут)

Vaskes
Offline
Зарегистрирован: 25.05.2021

Всё бы хорошо, но я из Крыма - санкции.. Нет у нас алишки больше, а на рынке дерут втридорого, так как больше купить негде.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

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

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Типа вот такого:
https://donbass-post.ru/dostavka-ali-krym.php

Vaskes
Offline
Зарегистрирован: 25.05.2021

Да, когда-то по началу работала. Мы оплачивали, они присылали. Только вот потом заблокировали пункт 3 - Мы не можем оплатить. Как только в адрессе доставки появляется крымский индекс - оплата блокируется вся, коть киви, хоть пай пал, хоть что. Прописывали краснодарские индексы - но и это потом прикрыли, теперь идёт сравнение города и индекса. Кароче все лазейки перекрыли. Самая главная оплата не проходит. Я уже пытался на адресс друга с материка, оплату с киви через VPN один фиг нас блокируют. Только один способ остался, кто-то там всё покупает и оплачивает, а потом обычной почтой отправляет нам. Но при таких мелких заказах нет смысла.

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

Vaskes пишет:

Только один способ остался, кто-то там всё покупает и оплачивает, а потом обычной почтой отправляет нам. Но при таких мелких заказах нет смысла.

можно покупать по инету в москве с доставкой Почтой или СДЕК.

СДЕК Москва -Симферополь для примера - 350р за посылку 20х20х11см независимо от веса (до 12кг), срок доставки 3-5 дней

В итоге даже если заказывать всего одну Нано - будет дешевле 1000 руб

 

В общем, как обычно - "Кто хочет - находит пути, кто не хочет - ищет отговорки"

 

Vaskes
Offline
Зарегистрирован: 25.05.2021

Ну вот сейчас так и покупаю, жду от CDEX блок питания для RD.  Сейчас глянул UNO 250+ доставка. ну, ещё приемлемо. Попробую в гараже откопать АТ MEGA и развлекаться с ней, пока не спалю. Надо датчиков прикупить наборчик.

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

Vaskes пишет:

Всё бы хорошо, но я из Крыма - санкции.. 


Вроде бы хвалят люди https://vezooka.com/. Но я не работал - ничего сказать не могу.