Только учусь / "Бегущий огонек"

setup2002
Offline
Зарегистрирован: 03.12.2011

Добрый день.

Вот такая для меня проблема: никак не могу научить кнопку менять переменную, а именно для delay...

Учусь сам по написанному или по видео...

int del = 100; //переменная задержки для delay
int butPin = 12; // кнопка
void setup()
{
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(butPin, INPUT); // кнопка
  
  
}
void loop()
{
  digitalRead(butPin); // читаем
  if (butPin == HIGH) // условие
  {
    del = del + 100; // прибавляем скорость
  }
  if (del > 500) del = 100; // обнуляем скорость до первоначальной
  digitalWrite(10, LOW);
  digitalWrite(2, HIGH);
  delay(del);
  digitalWrite(11, LOW);
  digitalWrite(3, HIGH);
  delay(del);
  digitalWrite(2, LOW);
  digitalWrite(4, HIGH);
  delay(del);
  digitalWrite(3, LOW);
  digitalWrite(5, HIGH);
  delay(del);
  digitalWrite(4, LOW);
  digitalWrite(6, HIGH);
  delay(del);
  digitalWrite(5, LOW);
  digitalWrite(7, HIGH);
  delay(del);
  digitalWrite(6, LOW);
  digitalWrite(8, HIGH);
  delay(del);
  digitalWrite(7, LOW);
  digitalWrite(9, HIGH);
  delay(del);
  digitalWrite(8, LOW);
  digitalWrite(10, HIGH);
  delay(del);
  digitalWrite(9, LOW);
  digitalWrite(11, HIGH);
  delay(del);
//  digitalWrite(10, LOW); для удобства восприятия
}

 Думаю тут все и так понятно... Что я делаю не так? Помогите пожалуйста.

Заранее благодарен.

 

step962
Offline
Зарегистрирован: 23.05.2011

setup2002 пишет:

 Думаю тут все и так понятно... Что я делаю не так?

1. Не пишете, что же идет "не так". У вас огонек не бежит? Не в ту сторону бежит? Не замечаете изменения скорости его бега?

2. Не приводите схемы подключения кнопки. Может у вас там проблема.

3. Хоть вы и пишете, что учитесь по написанному и видео, но почему-то хочется сказать вслед за Станиславским: не верю. Посмотрите, как расписано применение функции digitalread() ну хотя бы на этом сайте. Сравните со своим случаем (строка 21). "Читаем". Читать, конечно не вредно, но еще полезнее все прочитанное либо использовать сразу, либо сохранять для дальнейшего использования. А для этого в языке имеется оператор присваивания.

4. Что за переменная butPin у вас? Номер ножки, с которой считывается состояние кнопки? Хорошо, пусть будет так. Что за сравнение стоит в строке 22? "Если номер ножки (равный 12) равен HIGH, то ...". Не видите логического несоответствия?

Так шта-а-а-а...

Попробуйте объявить еще одну переменную, ну, например, butPinState.

Попробуйте переписать строку 21:

butPinState = digitalRead(butPin);

Попробуйте переписать строку 22:

if (butPinState == HIGH)

Либо, если лень вносить такие глобальные изменения, затрите 21-ю строку, а 22-ю перепишите

if (digitalRead(butPin) == HIGH)

===============================

После этого расскажите, что еще "не так". Только поподробнее - все гадалки мобилизованы на подготовку к Рождеству.

 ЗЫ: И почему "бегущий огонек"? Судя по значениям для delay(), он у вас должен быть ползущим.. 

ЗЗЫ: Еще одну полезную ссылку по вашей теме нашел - как раз про подключение кнопки и правильное чтение ее состояния. Тута.

 

 

setup2002
Offline
Зарегистрирован: 03.12.2011

step962 пишет:

setup2002 пишет:

 Думаю тут все и так понятно... Что я делаю не так?

1. Не пишете, что же идет "не так". У вас огонек не бежит? Не в ту сторону бежит? Не замечаете изменения скорости его бега?

2. Не приводите схемы подключения кнопки. Может у вас там проблема.

3. Хоть вы и пишете, что учитесь по написанному и видео, но почему-то хочется сказать вслед за Станиславским: не верю. Посмотрите, как расписано применение функции digitalread() ну хотя бы на этом сайте. Сравните со своим случаем (строка 21). "Читаем". Читать, конечно не вредно, но еще полезнее все прочитанное либо использовать сразу, либо сохранять для дальнейшего использования. А для этого в языке имеется оператор присваивания.

4. Что за переменная butPin у вас? Номер ножки, с которой считывается состояние кнопки? Хорошо, пусть будет так. Что за сравнение стоит в строке 22? "Если номер ножки (равный 12) равен HIGH, то ...". Не видите логического несоответствия?

Так шта-а-а-а...

Попробуйте объявить еще одну переменную, ну, например, butPinState.

Попробуйте переписать строку 21:

butPinState = digitalRead(butPin);

Попробуйте переписать строку 22:

if (butPinState == HIGH)

Либо, если лень вносить такие глобальные изменения, затрите 21-ю строку, а 22-ю перепишите

if (digitalRead(butPin) == HIGH)

===============================

После этого расскажите, что еще "не так". Только поподробнее - все гадалки мобилизованы на подготовку к Рождеству.

 ЗЫ: И почему "бегущий огонек"? Судя по значениям для delay(), он у вас должен быть ползущим.. 

ЗЗЫ: Еще одну полезную ссылку по вашей теме нашел - как раз про подключение кнопки и правильное чтение ее состояния. Тута.

 

 1. Тут Вы правы не расписал практически ничего, тут рассматриваются проблемы более серьезными вещами, потому счел моё творение не столь серьезным.

ПРОБЛЕМА: не меняется скорость бега при нажатии кнопки.

2. Кнопка подключена к +5V и к 12 контакту

3. Прочитал, этот вариант я делал и понял что мне надо что то с "if", я не дебил, мне просто начальную логику не понять и подсказать некому, и программировал я лет 14 назад на TurboPascal... (не сочтите за сопли)

4. Как раз не вижу, я хочу " Если на butPin будет регестрироваться HIGHT (пускай пока что и с дребезжанием), то  к переменной del надо плюсовать 100, до тех пор пока не будет 500, а как только станет сбросить до 100, вот моя логика решения.

5.После этого расскажите, что еще "не так". Только поподробнее - все гадалки мобилизованы на подготовку к Рождеству.

С наступающем)))

Ну вышло не совсем как я хотел по Вашему первому варианту и по второму.

первый вариант решения:  вроде, что то и проскакиевает в смысле меняет скорость (пробовал напрямую проводами замыкать +5v и 12 контакт)

второй вариант интереснее, не зависимо от  времени, скорость сама меняется хаотично. т.е. задерживается на каком то делее, мне трудно сказать но скорее всего на 100 и на 500

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

Ссылки читаю... Потому как от кнопки не делает то что я хочу...

 

 

Fibber
Fibber аватар
Offline
Зарегистрирован: 29.12.2011

Впервые попал в руки Arduino Mega 1280. .. .опыта =0. .. . 

Моя версия "бегущего огонька":

int ledPin = 22;
int i = 0;

void setup()
{
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin +1, OUTPUT);
  pinMode(ledPin +2, OUTPUT);
  pinMode(ledPin +3, OUTPUT);
  pinMode(ledPin +4, OUTPUT);
  pinMode(ledPin +5, OUTPUT);
  pinMode(ledPin +6, OUTPUT);
  pinMode(ledPin +7, OUTPUT);
  pinMode(ledPin +8, OUTPUT);
}

void loop()
  {
     if ( i < 9 ) {
       digitalWrite(ledPin +i, HIGH);
       delay(100);
       digitalWrite(ledPin +i, LOW);
       i ++;
     }
     else {
       for (int a=2; a <= 8; a++) {
         digitalWrite(ledPin +i -a, HIGH);
         delay(100);
         digitalWrite(ledPin +i -a, LOW);
       }
       i = 0;
     }
}

Вопросы:

 1- Есть ли возможность? при определении pinMode не писать эту строку для каждого используемого ПИНа, а задать Их типо:

For ( int a=0; a<=9; a++) 

{

  pinMode (ledPin +a, OUTPUT);

} //ругается на синтаксис

 2- Есть ли возможность упростить программу, при тех же результатах?

step962
Offline
Зарегистрирован: 23.05.2011

Fibber пишет:

 1- Есть ли возможность? при определении pinMode не писать эту строку для каждого используемого ПИНа, а задать Их типо:

For ( int a=0; a<=9; a++) 

{

  pinMode (ledPin +a, OUTPUT);

} //ругается на синтаксис

 2- Есть ли возможность упростить программу, при тех же результатах?

1. попробуйте вместо For написать for. На будущее запомните: язык Си чУВСтвИтелеН к регИСТРу.

2. как правило, всегда

Цитата:

//ругается на синтаксис

В этом случае стоит приводить текст ругани.

ЗЫ: При вставке кодов в текст сообщения пользуйтесь кнопочкой code (между "Источник" и "В"). Существенно повышает читабельность и обсудибельность.

Fibber
Fibber аватар
Offline
Зарегистрирован: 29.12.2011

спасибо

 

Fibber
Fibber аватар
Offline
Зарегистрирован: 29.12.2011
// сработало
// программа стала меньше, эффект сохранился

int ledPin = 22; 
int i = 0;

void setup()
{ for ( int b=0; i <= 8; b++)
  pinMode(ledPin +i, OUTPUT);
}

void loop()
  { 
     if ( i < 9 ) {
       digitalWrite(ledPin +i, HIGH);
       delay(100);
       digitalWrite(ledPin +i, LOW);
       i ++;
     }
     else { 
       for (int a=2; a <= 8; a++) {
         digitalWrite(ledPin +i -a, HIGH);
         delay(100);
         digitalWrite(ledPin +i -a, LOW);
       }
       i = 0;
     }
}