Ардуино игнорирует инструкцию if!
- Войдите на сайт для отправки комментариев
Втр, 10/07/2018 - 13:05
Здравствуйте!
Я хочу сделать меню на Ардуино и дисплее 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 программа продолжает выполняться...
Помогите, пожалуйста!
Заранее спасибо.
Добавьте рядом с выводом значения pos еще и вывод значения len - и вы удивитесь....
Спасибо, не ожидал такого. В setup() выводил длину, всё работало правильно... Как можно это объяснить и что с этим делать?
строка 46 - вы ищете конец массива как значение "-1" - а откуда в этом массиве -1?
Это как код ошибки.
Это как код ошибки.
Кто должен вернуть "код ошибки минус 1"., когла вы просто читаете значения из массива? Вы с каким-нибудь Паскалем не путаете? В Си при чтении за границей массива никаких ошибок не возникает. В вашем коде этот while просматривает всю доступную память, пока не найдет в ней "минус 1".
Ясно, спасибо!
Ардуино игнорирует инструкцию if!
Патамушта китайская?
Нет, у меня в логике проблемка была)
Нет, у меня в логике проблемка была)
Я бы на Вашем месте не стал столь категорично использовать единственное число и прошедшее время.