Доброго времени суток. Захотел подключить в проект матричную клавиатуру (4x4), датчик давления BM085 и шилд-экран для отображения на нем данных с датчика. Написал скетч, так как это только начало проекта, то на одну кнопку повесил отображение всех данных - давления, температуру, альтметр. Проект компилируется, загружаю, вижу приветственный экран и все. На кнопки не реагирует. Отдельно загружал скетч для проверки клавиатуры, пробовал и связку клавиатура от шилда. Отдельно все работает, вместе- не хотит. Собственно сам скетч: Код (Text): //обозвал по правильному команду очистки экрана #include <Wire.h> #include <LiquidCrystal.h> #include <BMP085.h> #include <Keypad.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //описываем настройки экрана BMP085 dps = BMP085(); //инициируем дачтик давления long Temperature = 0, Pressure = 0, Altitude = 0;//установка нулей датцика //настройка мембарнной клавиатуры const byte ROWS = 4; //четыре строки const byte COLS = 4; //четыре колонны char keys[ROWS][COLS] = { //данный массив для мембранной клавиатуры {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte rowPins[ROWS] = {23, 25, 27, 29}; //пины для строк byte colPins[COLS] = {28, 26, 24, 22}; //пины для колонн Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); byte ledPin = 13; boolean blink = false; //первичная настроойка диода boolean ledPin_state; void setup() { Wire.begin(); //подключение шины Wire delay(1000); //ожидание pinMode(ledPin, OUTPUT); // Sets the digital pin as output. digitalWrite(ledPin, HIGH); // Turn the LED on. ledPin_state = digitalRead(ledPin); // Store initial LED state. HIGH when LED is on. keypad.addEventListener(keypadEvent); dps.init(); //вроде как вывод значения с шины //преветственный экран lcd.begin(16, 2); //установка экрана lcd.setCursor(0, 0); //установка курсора первой строки lcd.print("MeteoStation"); //вывод надписи lcd.setCursor(0, 1); //установка курсора второй строки lcd.print(" v1.2 "); //вывод надписи 2 строки delay(2000); //ожидание lcd.clear();//Очистим дисплей } void loop() { //опрос датчика BM830 dps.getPressure(&Pressure); //запрос на вывод значения давления dps.getAltitude(&Altitude); //запрос на высоту dps.getTemperature(&Temperature); //запрос на температуру lcd.setCursor(0,1); // идем на вторую строку } void keypadEvent(KeypadEvent key){ switch (keypad.getState()){ case PRESSED: //нажато if (key == '#') { lcd.begin(16, 2);//Очистим дисплей до вывода значения //экран значения давления lcd.setCursor(0, 0); //установка курсора первой строки lcd.print("Plessure. mmHg"); //вывод на экран надписи первой строки lcd.setCursor(3,1); //установка курсора второй строки lcd.print(Pressure/133.3); // вывод значения давления с одной цифрой после запятой delay(2000); //ждем 2 секунды lcd.begin(16, 2); //поел убрался :) } break; case RELEASED: //отпущено if (key == '*') { lcd.setCursor(0, 0); lcd.print("Press the button"); lcd.setCursor(0,1); lcd.print("MeteoStation"); } break; case HOLD: //удерживание if (key == '*') {lcd.begin(16, 2);//Очистим дисплей до вывода значения //экран значения альтметра lcd.setCursor(0, 0); //установка курсора первой строки lcd.print(" Alt(m):"); //вывод на экран надписи первой строки lcd.setCursor(3,1); //установка курсора второй строки lcd.print(Altitude/100.,1); // вывод значения высоты с одной цифрой после запятой delay(2000); //ждем 2 секунды lcd.clear(); //поел убрался :) } break; } }
Ага сам уже разобрался. Чуть позже выложу подробный листинг с комментами, вдруг у кого то будут такие же грабли.
Ага, готовый скетч. те косяки которые были в вопросе исправлены, скетч работает. Код (Text): //подключим библиотеки используемые в проекте #include <Wire.h> #include <LiquidCrystal.h> #include <BMP085.h> #include <Keypad.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //описываем настройки экрана BMP085 dps = BMP085(); //инициируем дачтик давления long Temperature = 0, Pressure = 0, Altitude = 0;//установка нулей датцика //настройка мембарнной клавиатуры const byte ROWS = 4; //четыре строки const byte COLS = 4; //четыре колонны char keys[ROWS][COLS] = { //данный массив для мембранной клавиатуры {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; byte rowPins[ROWS] = {23, 25, 27, 29}; //пины для строк byte colPins[COLS] = {28, 26, 24, 22}; //пины для колонн Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); void setup() { Wire.begin(); //подключение шины Wire delay(1000); //ожидание можно поставить меньше keypad.addEventListener(keypadEvent); dps.init(); //вроде как вывод значения с шины //преветственный экран lcd.begin(16, 2); //установка экрана lcd.setCursor(0, 0); //установка курсора первой строки lcd.print("MeteoStation"); //вывод надписи lcd.setCursor(0, 1); //установка курсора второй строки lcd.print(" v1.2 "); //вывод надписи 2 строки delay(2000); //ожидание lcd.clear();//Очистим дисплей } void loop() { char key = keypad.getKey(); //опрос датчика BM830 dps.getPressure(&Pressure); //запрос на вывод значения давления dps.getAltitude(&Altitude); //запрос на высоту dps.getTemperature(&Temperature); //запрос на температуру lcd.setCursor(0,1); // идем на вторую строку } void keypadEvent(KeypadEvent key){ switch (keypad.getState()){ case PRESSED: //нажато if (key == '*') { lcd.clear(); lcd.setCursor(0, 0); //установка курсора первой строки lcd.print("Plessure. mmHg"); //вывод на экран надписи первой строки lcd.setCursor(3,1); //установка курсора второй строки lcd.print(Pressure/133.3); // вывод значения давления с одной цифрой после запятой delay(2000); //ждем 2 секунды lcd.clear(); //поел убрался :) } break; //в своем проекте мне больше не понадобися значение отпущенной клавиатуры, я его закомментил. /* case RELEASED: //отпущено if (key == '*') { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Press the button"); lcd.setCursor(0,1); lcd.print("MeteoStation"); lcd.clear(); } break; */ case HOLD: //удерживание if (key == '*') { lcd.clear();//Очистим дисплей до вывода значения //экран значения альтметра lcd.clear(); lcd.setCursor(0, 0); //установка курсора первой строки lcd.print(" Alt(m):"); //вывод на экран надписи первой строки lcd.setCursor(3,1); //установка курсора второй строки lcd.print(Altitude/100.,1); // вывод значения высоты с одной цифрой после запятой delay(2000); //ждем 2 секунды lcd.clear(); //поел убрался :) } break; } }