Ардуино игнорирует инструкцию 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!
Патамушта китайская?
Нет, у меня в логике проблемка была)
Нет, у меня в логике проблемка была)
Я бы на Вашем месте не стал столь категорично использовать единственное число и прошедшее время.