Матричкая клавиатура и BM085

Тема в разделе "Arduino & Shields", создана пользователем KellaKilla, 26 фев 2015.

  1. KellaKilla

    KellaKilla Нерд

    Доброго времени суток.
    Захотел подключить в проект матричную клавиатуру (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;
         

        }
        }
     
     
    Последнее редактирование: 26 фев 2015
  2. KellaKilla

    KellaKilla Нерд

    Ага сам уже разобрался. Чуть позже выложу подробный листинг с комментами, вдруг у кого то будут такие же грабли.
     
  3. KellaKilla

    KellaKilla Нерд

    Ага, готовый скетч. те косяки которые были в вопросе исправлены, скетч работает.

    Код (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;
         
        }
        }