Бегущий огонек (помогите новичку...)

prohor-nastya
Offline
Зарегистрирован: 16.01.2017

Доброго времени суток всем любителям и профессионалам работающим в среде ардуино. Купил сыну конструктор Амперка, там есть эксперимент: "бегущий огонек" ( http://wiki.amperka.ru/%D0%BA%D0%BE%D0%BD%D1%81%D0%BF%D0%B5%D0%BA%D1%82-... ), собрали... переписали скетч..., огенек дествительно бежит в одном направлении от начала до конца шкалы и снова от начала , а нам бы хотелось, чтобы он бегал туда и обратно. Попробовал переписать скетч по своему разумению. НО получилось, что огоньки бежгут с двух концов сведодиодной шкалы навстречу друг другу до середины шкалы, и снова так же... Результат для меня не ожиданный, тк я думал вообще работать не будет. Подскажите пожалуйста решение для того, чтобы огонек бегал туда и обратно... Заранее спасибо! вот мой скетч, почему-то не копируются номера строк, если кто подскажет ак их копировать, буду очень признателен.


[code]
#define FIRST_LED_PIN 2
#define LAST_LED_PIN 11
void setup() 
{
for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin)
pinMode(pin, OUTPUT);
}
void loop() 
{
unsigned long int ms = millis();
int vpered, nazad;
vpered = FIRST_LED_PIN + (ms / 120) % 10;
nazad = LAST_LED_PIN - (ms / 120) % 10;

int pin = vpered;

digitalWrite(pin, HIGH);
delay(10);
digitalWrite(pin, LOW);

if (vpered = 11)

{int pin = nazad;
digitalWrite(pin, HIGH);
delay(10);
digitalWrite(pin, LOW);
}



}

[/code]

 

prohor-nastya
Offline
Зарегистрирован: 16.01.2017

с номерами строк понятно, сайт их сам подписал... =)

Внимание ошибка в первом сообщении! Огоньки бегут на встречу друг другу, сталкиваются на середине бегут в обратном направлении и снова бегут на встречу друг другу... =0

kalapanga
Offline
Зарегистрирован: 23.10.2016

По ссылке в самом конце эксперимента есть "Задания для самостоятельного решения". Вы бы их сделали. :) А именно 3 и 4. Из того, что у Вас в них получится, ну совсем просто сделать то, что Вы сейчас хотите.

Сделаете цикл в котором бежит в одну сторону (задание 3), измените цикл так чтобы бежало в обратную (задание 4), потом просто вставляете эти циклы в скетч один за другим и всё!

prohor-nastya
Offline
Зарегистрирован: 16.01.2017

Спасибо, попробуем... 

prohor-nastya
Offline
Зарегистрирован: 16.01.2017

видео к первому скетчу:

https://yadi.sk/i/os9w5evJ3Kz4UL

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

стр. 22 вместо "=" надо "==". Но это мелочи, нужен признак как мы работаем в данный момент. Если вперед, то должны выполнятся строки 18-20 а иначе строки 25-27, но не одновременно.

prohor-nastya
Offline
Зарегистрирован: 16.01.2017

Да, я так же подумал... но решения не нашел... т.е. я думал: она и будет выполнять по порядку весь скетч, а получилось она выполняет одновременно.

 

prohor-nastya
Offline
Зарегистрирован: 16.01.2017

Доброго времени суток, всем...

Спасибо, kalapanga, сделал как вы сказали. Скетч в таком виде на много проще. Зачем было привязывать его к счетчику времени? вот видео:

https://yadi.sk/i/gNp9UNwU3L6TcJ

#define FIRST_LED_PIN 2
#define LAST_LED_PIN 11
void setup() 
{
for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin)
pinMode(pin, OUTPUT);
}

void loop() 
{
  
for (int pin = FIRST_LED_PIN; pin <= 11; pin++ )
{digitalWrite(pin, HIGH);
delay(120);
digitalWrite(pin, LOW);}

for (int pin = LAST_LED_PIN; pin >= 2; pin-- )
{digitalWrite(pin, HIGH);
delay(120);
digitalWrite(pin, LOW);}
}

Ну и просьба: если есть не коррекности пожалуйста укажите, кто чем может... =)

kalapanga
Offline
Зарегистрирован: 23.10.2016

Уря! Заработало! 

В самом простейшем варианте, когда огоньки бежали в одну сторону, бесконечно выполнялся всего один цикл. В качестве этого цикла использовался собственно цикл loop. Когда программа огоньков усложнилась, одним циклом уже стало не обойтись. Решить задачу можно было многими способами. 

Под счётчиком времени Вы по видимому millis() имеете ввиду? Оно Вам в будущем всё равно пригодится. Смотрите в примерах скетчи Blink и BlinkWithoutDelay. 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
const byte pins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11};// массив ног
const byte num = 10;// колличество ног
const uint32_t time = 100; // шаг 0.1сек
int ii = 0;// текущая нога
bool dir = 1; // направление движения 1 вперед / 0 назад

void setup() {
  for (int i = 0; i < num; ++i) {
    pinMode(pins[i], OUTPUT);
    digitalWrite(pins[i], LOW);
  }
}
void loop() {
  static uint32_t past = 0;
  if (millis() - past >= time) {
    digitalWrite(pins[ii], LOW);
    if (dir) {
    ++ii; if (ii >= num) dir = 0; ii = ii - 2;}
    else {
      --ii; if (ii < 0) dir = 1; ii = 1;
    }
    digitalWrite(pins[ii], HIGH);
  }
}

 

prohor-nastya
Offline
Зарегистрирован: 16.01.2017

qwone, спасибо за вариант решения. 

для меня, честно сказать очень сложно... 

const byte - зачем константам приставка byte, ?

bool - вообще в справочнике не нашел...

и сам цикл к сожалению не понял как работает. 

если не трудно подпишите коментарии к работе цикла.

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

prohor-nastya
Offline
Зарегистрирован: 16.01.2017

Последняя просьба по бегущим огонькам:

У меня 9 светодиодов, 3 - зеленых, 3 - желтых, 3 - красных (см. видео) . Я могу заставить бегать огонек по зеленым , по желтым , по красным по отдельности,

а как заставить бегать огонек одновременно (синхронно) по трем цветам?

т.е. 3 вариации, 2-х  циклов for , должны выполнятся одновременно... ???

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

prohor-nastya пишет:

Последняя просьба по бегущим огонькам:

У меня 9 светодиодов, 3 - зеленых, 3 - желтых, 3 - красных (см. видео) . Я могу заставить бегать огонек по зеленым , по желтым , по красным по отдельности,

а как заставить бегать огонек одновременно (синхронно) по трем цветам?

т.е. 3 вариации, 2-х  циклов for , должны выполнятся одновременно... ???

Не зацикливайтесь на циклах! :) Вы можете свою программу поведения светодиодов вообще кучей идущих друг за другом включений-выключений описать. И всё это будет благополучно крутиться в цикле loop. Всё остальное делается для сокращения текста кода, его удобочитаемости, переносимости. А так мало ли какое поведение светодиодов вы задумаете.

По поводу последней модификации, ну смотрите. Сейчас у Вас каждое состояние характеризуется тем, что горит один светодиод. Возможных состояний 9. Вы крутите цикл 9 раз. А будет гореть за раз 3 светодиода, состояний получается 3. Вот вам и нужно прокрутить в цикле 3 состояния.

Зажигаете 1-й зелёный, 1-й желтый, 1-й красный, пауза, гасите их, зажигаете 2-е ....

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

prohor-nastya
Offline
Зарегистрирован: 16.01.2017

ААА. не могу понять как это сделать... 

как ключить сразу 3 светодиода?

Простите я не соображаю.

prohor-nastya
Offline
Зарегистрирован: 16.01.2017

надо, наверное, массив нужных пинов прописать и оттуда брать номер пина который должен работать??? 

kalapanga
Offline
Зарегистрирован: 23.10.2016

prohor-nastya пишет:

надо, наверное, массив нужных пинов прописать и оттуда брать номер пина который должен работать??? 

Да ну какой массив!

Сейчас Вы в цикле устанавливаете высокий уровень на пине pin, ждёте паузу, низкий уровень на pin, всё повторяем 9 раз. А сейчас вам нужно: Установить выс.уровень на пине pin, установить высокий уровень на пине pin+3, установить высокий уровень на пине pin+6, пауза, установить низкий уровень на пине pin, установить низкий уровень на пине pin+3, установить низкий уровень на пине pin+6, повторить 3 раза.

prohor-nastya
Offline
Зарегистрирован: 16.01.2017

kalapanga, я не понимаю как это в коде записать... Вы уж простите, но у меня каша в голове, даже идеи нормальной нет как это можно записать в программе. 

они у меня все время друг за другом бегут...

Пожалуйста дайте код... если не трудно. 

prohor-nastya
Offline
Зарегистрирован: 16.01.2017

Вот на что у меня хватило мозгов: 

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

#define FIRST_LED_PIN 2
#define LAST_LED_PIN 11
void setup() 
{
for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin)
pinMode(pin, OUTPUT);
}

void loop() 
{
  
int pin = FIRST_LED_PIN;
{digitalWrite(pin, HIGH);
delay(120);
digitalWrite(pin, LOW);}


{digitalWrite(pin+3, HIGH);
delay(120);
digitalWrite(pin+3, LOW);}

{digitalWrite(pin+6, HIGH);
delay(120);
digitalWrite(pin+6, LOW);}
}

 

prohor-nastya
Offline
Зарегистрирован: 16.01.2017

Все до меня до перло...!!!

prohor-nastya
Offline
Зарегистрирован: 16.01.2017

Вот как я хотел: 

#define FIRST_LED_PIN 2
#define LAST_LED_PIN 11
void setup() 
{
for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin)
pinMode(pin, OUTPUT);
}

void loop() 
{
  
int pin = FIRST_LED_PIN;
{digitalWrite(pin, HIGH);
digitalWrite(pin+3, HIGH);
digitalWrite(pin+6, HIGH);
delay(200);
digitalWrite(pin, LOW);
digitalWrite(pin+3,LOW );
digitalWrite(pin+6,LOW );
delay(200);}
{digitalWrite(pin+1, HIGH);
digitalWrite(pin+4, HIGH);
digitalWrite(pin+7, HIGH);
delay(200);
digitalWrite(pin+1, LOW);
digitalWrite(pin+4,LOW );
digitalWrite(pin+7,LOW );
delay(200);}
{digitalWrite(pin+2, HIGH);
digitalWrite(pin+5, HIGH);
digitalWrite(pin+8, HIGH);
delay(200);
digitalWrite(pin+2, LOW);
digitalWrite(pin+5,LOW );
digitalWrite(pin+8,LOW );
delay(200);}
}

 

prohor-nastya
Offline
Зарегистрирован: 16.01.2017

Я просто не знал, что в одних скобках надо писать... 

Код очень громоздкий надо применять какойто алгоритм... Я думаю...

kalapanga
Offline
Зарегистрирован: 23.10.2016

Так а цикл-то зачем выкинули?

#define FIRST_LED_PIN 2
#define LAST_LED_PIN 11
void setup()
{
  for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin)
    pinMode(pin, OUTPUT);
}

void loop()
{
  for (int pin = FIRST_LED_PIN; pin < FIRST_LED_PIN + 3 ; ++pin)
  {
    digitalWrite(pin, HIGH);
    digitalWrite(pin + 3, HIGH);
    digitalWrite(pin + 6, HIGH);
    delay(200);
    digitalWrite(pin, LOW);
    digitalWrite(pin + 3, LOW );
    digitalWrite(pin + 6, LOW );
    delay(200);
  }
}

 

prohor-nastya
Offline
Зарегистрирован: 16.01.2017

Вот вот, я же говорю...
Спасибки!!!
Вот теперь я понял как работает цикл for.

iudi
Offline
Зарегистрирован: 27.01.2022

бегущий огонек должен светиться  таким образом, что сначала загорается 1 светодиод потом 2, потом 3, и т.д. до 10-го

Потом обратно от 10 до 1, и так огонек должен пробежать туда и обратно 20 раз. помогите как это сделать

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

iudi пишет:

бегущий огонек должен светиться  таким образом, что сначала загорается 1 светодиод потом 2, потом 3, и т.д. до 10-го

Потом обратно от 10 до 1, и так огонек должен пробежать туда и обратно 20 раз. помогите как это сделать

Написать программу по заданному лагаритму

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

iudi пишет:

бегущий огонек должен светиться  таким образом, что сначала загорается 1 светодиод потом 2, потом 3, и т.д. до 10-го

Потом обратно от 10 до 1, и так огонек должен пробежать туда и обратно 20 раз. помогите как это сделать

Ставишь 10 СД на макетке в шеренгу по одному. Берешь 18650. "+" к анодам СД. К минусу подпаиваешь проволочку и водишь ей по катодам туда-сюда. Я проверил, у меня работает! 

ЗЫ: резисторы не обязательно - на 20 раз и так сойдет

iudi
Offline
Зарегистрирован: 27.01.2022

можете написать в виде кода

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

Здесь код ЗА ТЕБЯ пишуть тока за деньги.  Поэтому, 1000р

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

каждому!

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

iudi пишет:

можете написать в виде кода

Легко!

Ставишь 10 СД на макетке в шеренгу по одному. 
Берешь 18650. 
"+" к анодам СД. 
К минусу подпаиваешь проволочку и водишь ей по катодам туда-сюда. 

//Я проверил, у меня работает! 

//ЗЫ: резисторы не обязательно - на 20 раз и так сойдет

 

iudi
Offline
Зарегистрирован: 27.01.2022

я новенькая поэтому не знала как это сделать, если это Задел вас то простите 

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Вы пользуетесь google-translate? 

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

iudi пишет:

я новенькая поэтому не знала как это сделать

Если ты не ходило на лекции, это не наши проблемы

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

DetSimen пишет:

iudi пишет:

я новенькая поэтому не знала как это сделать

Если ты не ходило на лекции, это не наши проблемы

Та скоро строем походит.

bwn
Offline
Зарегистрирован: 25.08.2014

Logik пишет:

Та скоро строем походит.

Если новенькАЯ и не зналА, то вряд ли.

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

bwn пишет:

Logik пишет:

Та скоро строем походит.

Если новенькАЯ и не зналА, то вряд ли.

То еще проверить надо, пол определяется концом, а не окончанием.