Ардуино игнорирует инструкцию if!

codingMike
Offline
Зарегистрирован: 14.12.2017

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

Я хочу сделать меню на Ардуино и дисплее 1602. 

У меня есть вот такой код:

#include <LiquidCrystal_I2C.h>
#define pinA 0
#define pinB 1

int aState;
int bState;
int aLastState;
int dir;
int pos = 0;
int counter;
int a;
int len;

String passwords[][2] {
    {"Mail", "1234g"},
    {"GMX", "asdfg"},
    {"PYthon", "fghj"}    
  };

LiquidCrystal_I2C lcd(0x3B, 16, 2);

int lcdClear(byte x) {                                //Моя функция очистки экрана
  if (x == 2) {                                       //2 clear all, 0 clear first line, 1 clear second line
    for (int i = 0; i < 2; ++i) {
      lcd.setCursor(0,i);
      lcd.print("                ");
    }
  }
  else {
    lcd.setCursor(0,x);
    lcd.print("                ");
  }
}

void setup() {
  Serial.begin(9600);
  pinMode(pinA, INPUT);
  pinMode(pinB, INPUT);
  aState = digitalRead(pinA);
  lcd.init();                                         //Инициализация дисплея
  lcd.backlight();                                    //Подсветка дисплея
  lcd.setCursor(1, 0);
  lcd.print(passwords[pos][0]);
  lcd.setCursor(1,1);
  lcd.print(passwords[pos + 1][0]);
  while (passwords[a][0] != -1) { a++; len++;}
}

void getDirection() {
  aState = digitalRead(pinA);                         //Считываем состояние пина А
  if (aState != aLastState) {                         //Если изменилось...
    if (aState == digitalRead(pinB)){                            //Если сигналы равны...
      Serial.println("CW 1");                        //Вращение против часовой стрелки
      dir = 1;                                       //Вращение против ч. с.     
    }
    else {
      Serial.println("CCW 0");                         //Вращение по часовой стрелки
      dir = -1;                                        //Вращение по ч. с.   
    }
  }
  aLastState = aState;                                //Обновляем последнее лог. состояние
}


void loop() {
  getDirection();
  if (dir == 1 || dir == -1) {
    counter++;
    if (counter % 2 == 0) {
      counter = 0;
      if (pos < len) {
        if (dir == 1) {
          lcd.setCursor(0,0);
          lcd.print(" ");
          lcd.setCursor(0,1);
          lcd.print(">");
          pos++;
          Serial.println(pos);
          
        }
        else {
          lcd.setCursor(0,1);
          lcd.print(" ");
          lcd.setCursor(0,0);
          lcd.print(">");
        }
      }
    }
    dir = 0;
  }
}

Проблема следующая: На данном этапе меню должно прекратить менятся, когда pos будет больше len (позиция в массиве > длинны массива). Но этого не происходит! Ардуино надо мной издевается, потому что даже выводит в Serial значение переменной pos после инкрементирования. Тоесть, pos = 7, a программа продолжает выполняться...

Помогите, пожалуйста!

Заранее спасибо.

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

Добавьте рядом с выводом значения pos еще и вывод значения len - и вы удивитесь....

codingMike
Offline
Зарегистрирован: 14.12.2017

Спасибо, не ожидал такого. В setup() выводил длину, всё работало правильно... Как можно это объяснить и что с этим делать?

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

строка 46 - вы ищете конец массива как значение "-1" - а откуда в этом массиве -1?

codingMike
Offline
Зарегистрирован: 14.12.2017

Это как код ошибки.

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

codingMike пишет:

Это как код ошибки.

Кто должен вернуть "код ошибки минус 1"., когла вы просто читаете значения из массива? Вы с каким-нибудь Паскалем не путаете? В Си при чтении за границей массива никаких ошибок не возникает. В вашем коде этот while просматривает всю доступную память, пока не найдет в ней "минус 1".

codingMike
Offline
Зарегистрирован: 14.12.2017

Ясно, спасибо!

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

codingMike пишет:

Ардуино игнорирует инструкцию if!

Патамушта китайская?

codingMike
Offline
Зарегистрирован: 14.12.2017

Нет, у меня в логике проблемка была)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

codingMike пишет:

Нет, у меня в логике проблемка была)

Я бы на Вашем месте не стал столь категорично использовать единственное число и прошедшее время.