Учу пробую и застопорился с вопросом

radetskey
Offline
Зарегистрирован: 07.09.2016

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

хочу сделать последовательное переключение светодиодов а неполучается переключается на 1 и сразу назад

вот код. что сделано не так ? (Ардино уно)

 
#define FIRST_LED_PIN 2
#define LAST_LED_PIN 11
#define button_x 12
#define button_y 13
 
void setup()
{
 for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin)
 pinMode(pin, OUTPUT);
 pinMode(button_x, INPUT);
 pinMode(button_y, INPUT);
}
 void loop()
{
  
int x, y;
if (digitalRead(button_y) == HIGH) 
{
x += 1;
}
if (digitalRead(button_x) == HIGH) 
{
x -= 1;
y = constrain(x, 0, 9);
 int pin = FIRST_LED_PIN + y;
 digitalWrite(pin, HIGH);
 delay(10);
 digitalWrite(pin, LOW);
}
 
 
Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

даже если вдруг  "++pin" и имеет какой-то смысл, то цикл for() организован не правильно.

переменная "х" - сбрасывается каждый цикл loop()

radetskey
Offline
Зарегистрирован: 07.09.2016

ок так и происходит сбрасывает x на 0

как делают чтоб несбрасывало или изначально подход неверный.

А   цикл for() чтоб не прописывать кучу раз теже строки этот кусок рабочий проверял в разных вариантах, играюсь с начальными уроками. 

ptr
Offline
Зарегистрирован: 28.05.2016

radetskey пишет:

хочу сделать последовательное переключение светодиодов а неполучается переключается на 1 и сразу назад

Тут правильно, но читать тяжело. Вместо

for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin)
 pinMode(pin, OUTPUT);

Напишите

for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin)
{
  pinMode(pin, OUTPUT);
}

Раз значение x Вы используете в следующих вызовах loop(), то укажите это компилятору

static int x=0;
int y;

 

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

...

ptr
Offline
Зарегистрирован: 28.05.2016

Можно и так, но правильней x сделать локальной статической.

А переменная y Вам вообще не нужна, как я вижу. Можно ведь так:

int pin = FIRST_LED_PIN + constrain(x, 0, 9);

 

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015
#define FIRST_LED_PIN 4
#define LAST_LED_PIN 13

#define button_x 2
#define button_y 3

int x;

void setup()
{
   for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; ++pin)
   {
      pinMode(pin, OUTPUT);
      digitalWrite(pin, LOW);
   }
   
   pinMode(button_x, INPUT);
   pinMode(button_y, INPUT);
}

void loop()
{
  
if (digitalRead(button_y) == HIGH) x++;
if (digitalRead(button_x) == HIGH) x--;

 int pin = FIRST_LED_PIN + constrain(x, 0, 9);
 
 digitalWrite(pin, HIGH);
 delay(10);
 digitalWrite(pin, LOW);
 
}

 

radetskey
Offline
Зарегистрирован: 07.09.2016

ММ....дя красиво и мусора нет, Практика!. Спасибо за помощь буду дальше учится.  

findeler
Offline
Зарегистрирован: 08.03.2016

Зачем строка 14 ? Разве при инициализации выхода ему не устанавливается нулевое значение.

 

ptr
Offline
Зарегистрирован: 28.05.2016

findeler пишет:

Зачем строка 14 ? Разве при инициализации выхода ему не устанавливается нулевое значение.

Паранойя в программировании, не осуждается, а приветствуется )

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

Я, например, могу написать:

static int i = 0;

Что, вроде бы совершенно излишне для подавляющего большинства реализаций С, так как они область статических переменных всегда инициализируют нулями. Но зато явно видно, что я хотел.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

ptr пишет:

Паранойя в программировании, не осуждается, а приветствуется )

тогда уж так:

#define FIRST_LED_PIN 4
#define LAST_LED_PIN 13

#define BUTTON_X_PIN 2
#define BUTTON_Y_PIN 3


void setup(){
   for (int pin = FIRST_LED_PIN; pin <= LAST_LED_PIN; pin++)   {
      pinMode(pin, OUTPUT);
      digitalWrite(pin, LOW);
   }
   
   pinMode(BUTTON_X_PIN, INPUT);
   pinMode(BUTTON_Y_PIN, INPUT);
}


void loop(){
static int pin = FIRST_LED_PIN;
  
if (digitalRead(BUTTON_Y_PIN) == HIGH){
pin++;
}

if (digitalRead(BUTTON_X_PIN) == HIGH) {
pin--;
}

 pin = constrain(pin, FIRST_LED_PIN, LAST_LED_PIN);
 
 digitalWrite(pin, HIGH);
 delay(10);
 digitalWrite(pin, LOW);
 
}

 

findeler
Offline
Зарегистрирован: 08.03.2016

ptr пишет:

Паранойя в программировании, не осуждается, а приветствуется )

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

Хмм, пожалуй соглашусь.