Подключение клавиатуры по I2С

avgustdon
Offline
Зарегистрирован: 28.02.2016

Пытаюсь подключить мембранную клавиатуру через I2C к ардуино уно. Делал все по рецепту. В результате не компилируется. Заметил, что название библиотеки не выделяется красным.

 Как я понял, ардуино эту библиотеку не понимает. Подскажите, как искать ошибку в библиотеке, есть ли какая нить система подсказок наподобие как в скетче. Ну а если просто подскажете, где ошибка, то вообще будет здорово. Заранее спасибо.

avgustdon
Offline
Зарегистрирован: 28.02.2016

Прошу прощения вот ссылка на рецепт.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не нужен "рецепт". Нужен Ваш скетч и сообщение об ошибке. Только не картинкой, на которой ни хрена не видно, а по человечески.

avgustdon
Offline
Зарегистрирован: 28.02.2016
Вот скетч.
 
#include <Wire.h>
#include <i2ckeypad.h>
 
#define ROWS 4
#define COLS 4
 
// With A0, A1 and A2 of PCF8574 to ground I2C address is 0x20
#define PCF8574_ADDR 0x20
 
i2ckeypad kpd = i2ckeypad(PCF8574_ADDR, ROWS, COLS);
 
void setup()
{
  Serial.begin(9600);
 
  Wire.begin();
 
  kpd.init();
 
  Serial.print("Testing keypad/PCF8574 I2C port expander arduino lib\n\n");
}
 
void loop()
{
  char key = kpd.get_key();
 
  if(key != '\0') {
        Serial.print(key);
  }
}
 
 Вот сообщение об ошибке. Извинения если что не так. ---------------------
 
Arduino: 1.6.10 Hourly Build 2016/06/06 08:34 (Windows 7), Плата:"Arduino/Genuino Uno"
 
C:\Users\Андрей\Documents\Arduino\libraries\i2ckeypad\i2ckeypad.cpp: In member function 'void i2ckeypad::pcf8574_write(int, int)':
 
C:\Users\Андрей\Documents\Arduino\libraries\i2ckeypad\i2ckeypad.cpp:209:14: error: no matching function for call to 'TwoWire::write()'
 
   Wire.write();
 
              ^
 
C:\Users\Андрей\Documents\Arduino\libraries\i2ckeypad\i2ckeypad.cpp:209:14: note: candidates are:
 
In file included from C:\Users\Андрей\Documents\Arduino\libraries\i2ckeypad\i2ckeypad.cpp:45:0:
 
C:\Users\Андрей\YandexDisk\arduino-nightly\hardware\arduino\avr\libraries\Wire/Wire.h:66:20: note: virtual size_t TwoWire::write(uint8_t)
 
     virtual size_t write(uint8_t);
 
                    ^
 
C:\Users\Андрей\YandexDisk\arduino-nightly\hardware\arduino\avr\libraries\Wire/Wire.h:66:20: note:   candidate expects 1 argument, 0 provided
 
C:\Users\Андрей\YandexDisk\arduino-nightly\hardware\arduino\avr\libraries\Wire/Wire.h:67:20: note: virtual size_t TwoWire::write(const uint8_t*, size_t)
 
     virtual size_t write(const uint8_t *, size_t);
 
                    ^
 
C:\Users\Андрей\YandexDisk\arduino-nightly\hardware\arduino\avr\libraries\Wire/Wire.h:67:20: note:   candidate expects 2 arguments, 0 provided
 
C:\Users\Андрей\YandexDisk\arduino-nightly\hardware\arduino\avr\libraries\Wire/Wire.h:75:19: note: size_t TwoWire::write(long unsigned int)
 
     inline size_t write(unsigned long n) { return write((uint8_t)n); }
 
                   ^
 
C:\Users\Андрей\YandexDisk\arduino-nightly\hardware\arduino\avr\libraries\Wire/Wire.h:75:19: note:   candidate expects 1 argument, 0 provided
 
C:\Users\Андрей\YandexDisk\arduino-nightly\hardware\arduino\avr\libraries\Wire/Wire.h:76:19: note: size_t TwoWire::write(long int)
 
     inline size_t write(long n) { return write((uint8_t)n); }
 
                   ^
 
C:\Users\Андрей\YandexDisk\arduino-nightly\hardware\arduino\avr\libraries\Wire/Wire.h:76:19: note:   candidate expects 1 argument, 0 provided
 
C:\Users\Андрей\YandexDisk\arduino-nightly\hardware\arduino\avr\libraries\Wire/Wire.h:77:19: note: size_t TwoWire::write(unsigned int)
 
     inline size_t write(unsigned int n) { return write((uint8_t)n); }
 
                   ^
 
C:\Users\Андрей\YandexDisk\arduino-nightly\hardware\arduino\avr\libraries\Wire/Wire.h:77:19: note:   candidate expects 1 argument, 0 provided
 
C:\Users\Андрей\YandexDisk\arduino-nightly\hardware\arduino\avr\libraries\Wire/Wire.h:78:19: note: size_t TwoWire::write(int)
 
     inline size_t write(int n) { return write((uint8_t)n); }
 
                   ^
 
C:\Users\Андрей\YandexDisk\arduino-nightly\hardware\arduino\avr\libraries\Wire/Wire.h:78:19: note:   candidate expects 1 argument, 0 provided
 
In file included from C:\Users\Андрей\YandexDisk\arduino-nightly\hardware\arduino\avr\cores\arduino/Stream.h:26:0,
 
                 from C:\Users\Андрей\YandexDisk\arduino-nightly\hardware\arduino\avr\libraries\Wire/Wire.h:26,
 
                 from C:\Users\Андрей\Documents\Arduino\libraries\i2ckeypad\i2ckeypad.cpp:45:
 
C:\Users\Андрей\YandexDisk\arduino-nightly\hardware\arduino\avr\cores\arduino/Print.h:54:12: note: size_t Print::write(const char*, size_t)
 
     size_t write(const char *buffer, size_t size) {
 
            ^
 
C:\Users\Андрей\YandexDisk\arduino-nightly\hardware\arduino\avr\cores\arduino/Print.h:54:12: note:   candidate expects 2 arguments, 0 provided
 
C:\Users\Андрей\YandexDisk\arduino-nightly\hardware\arduino\avr\cores\arduino/Print.h:49:12: note: size_t Print::write(const char*)
 
     size_t write(const char *str) {
 
            ^
 
C:\Users\Андрей\YandexDisk\arduino-nightly\hardware\arduino\avr\cores\arduino/Print.h:49:12: note:   candidate expects 1 argument, 0 provided
 
exit status 1
Ошибка компиляции для платы Arduino/Genuino Uno.
 
Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"
 

 

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015
#include <Wire.h>
#include <Keypad_I2C.h>
#include <Keypad.h>
#define I2CADDR 0x38

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};

// Digitran keypad, bit numbers of PCF8574 i/o port
byte rowPins[ROWS] = {0, 1, 2, 3}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {4, 5, 6}; //connect to the column pinouts of the keypad

Keypad_I2C kpd( makeKeymap(keys), rowPins, colPins, ROWS, COLS, I2CADDR, PCF8574 );

void setup(){
	  Wire.begin( );
	  kpd.begin( makeKeymap(keys) );
	  Serial.begin(9600);
	  Serial.println( "start" );
}

void loop(){
	  char key = kpd.getKey();
	  
	  if (key){
		Serial.println(key);
	  }
}

Помоему ты не подключил библиотеку...  (На форуме в окошке где текст есть кнопка @code@ - туда вставляешь код, и он нормально будет отображаться)

avgustdon
Offline
Зарегистрирован: 28.02.2016

Не помогло. Теперь сообщение об ошибке выглядит так.

Arduino: 1.6.10 Hourly Build 2016/06/06 08:34 (Windows 7), Плата:"Arduino/Genuino Uno"
 
C:\Users\Андрей\Documents\Arduino\klava_i2c\klava_i2c.ino:3:24: fatal error: Keypad_I2C.h: No such file or directory
 
compilation terminated.
 
 
p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

avgustdon пишет:

Не помогло. Теперь сообщение об ошибке выглядит так.

Arduino: 1.6.10 Hourly Build 2016/06/06 08:34 (Windows 7), Плата:"Arduino/Genuino Uno"
 
C:\Users\Андрей\Documents\Arduino\klava_i2c\klava_i2c.ino:3:24: fatal error: Keypad_I2C.h: No such file or directory
 
compilation terminated.
 
 

Библиотеки скачай нормальные и добавь в проект - он же пишет - "Нет такого файла или каталога."

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

https://github.com/joeyoung/arduino_keypads

Проверил сам -- бери код с примера и правь под себя.. там есть какие то ошибки походу (разбираться нехочу).

Примеры нормально компилируются... . Разберешься.

 

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

Cessi71 пишет:

Где библиотеки лежат?

Пардон, опередили.

Еще кейпад возможно нужны файлы, но  тут не прикрепляются...

avgustdon
Offline
Зарегистрирован: 28.02.2016

Огромное спасибо. С подключением нормальной библиотеки действительно дело продвинулось.)) Будем ехать дальше.

NovaCat
Offline
Зарегистрирован: 08.12.2016

А есть рабочий код для подключения матричной клавы 4х4 по I2C? Что-то не хочет у меня компилироваться из вот этой ссылки https://github.com/joeyoung/arduino_keypads

#include <Keypad_I2C.h>
#include <Keypad.h>        // GDY120705
#include <Wire.h>

#define I2CADDR 0x21

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
  {'0','1','2','3'},
  {'4','5','6','7'},
  {'8','9','A','B'},
  {'C','D','E','F'}
};
byte rowPins[ROWS] = {3, 2, 1, 0}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {7, 6, 5, 4}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad_I2C customKeypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS, I2CADDR); 

void setup(){
//  Wire.begin( );
  customKeypad.begin( );        // GDY120705
  Serial.begin(9600);
}
  
void loop(){
  char customKey = customKeypad.getKey();
  
  if (customKey != NO_KEY){
    Serial.println(customKey);
  }
}
---------------------
Ошибка:
CustomKeypad_I2C:30: error: 'Keypad_I2C' does not name a type
CustomKeypad_I2C.ino: In function 'void setup()':
CustomKeypad_I2C:34: error: 'customKeypad' was not declared in this scope
CustomKeypad_I2C.ino: In function 'void loop()':
CustomKeypad_I2C:39: error: 'customKeypad' was not declared in this scope
CustomKeypad_I2C:41: error: 'NO_KEY' was not declared in this scope
----------------------
Я не силен в этом. Но мне нужно сделать устройство на 8-мь каналов как минимум, для управления 8-ю устройствами каждой кнопкой. Хотелось бы с обратной связью, для чего нужно достаточно свободных входов микроконтроллера. По этому надо освоить I2C.
knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

Мохровая либа, ей уже 3 года, понижай версию ide пока не заведётся.

NovaCat
Offline
Зарегистрирован: 08.12.2016

Куда ниже. 1.0.5 стоит

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

либа от мая 14го значит

ARDUINO 1.5.6 BETA - 2014.02.20

+\-

bwn
Offline
Зарегистрирован: 25.08.2014

Проверь библиотеки, правильно ли лежат, нет ли вложенных папок, правильно ли поименованы. Чтот подсказывает, что IDE здесь не при делах.

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

bwn пишет:

Проверь библиотеки, правильно ли лежат, нет ли вложенных папок, правильно ли поименованы. Чтот подсказывает, что IDE здесь не при делах.

я вроде то же проверял и в либрари и со счетчем и установка из зип, читал у каких то макаронников она работала только когда это было. ди и что то вариантов не нашол кроме этой либы.

NovaCat
Offline
Зарегистрирован: 08.12.2016

Не работает у меня ни один пример. Ругается постоянно. Из выше упомянутого кода ругается на строку Keypad_I2C customKeypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS, I2CADDR);

Операционка не причем. проверял на XP и на 7-ке. Библиотека и в библиотеке программы лежит и в папке с самим скетчем.

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

либа завелась то?

 

knack
knack аватар
Offline
Зарегистрирован: 27.03.2012

Проверяй подключение, подтягивающие резисторы, равильно ли адресс настроен I2CADDR 0x21.

даташит

bwn
Offline
Зарегистрирован: 25.08.2014

C адресом не горячитесь, лучше I2C сканером считать, PCF-ки сейчас пошли с начальным 3F, а может уже и другие есть.
Подобное железо лучше вообще со сканера начинать, пока адрес четко не считаете, а дальше можно свои хотелки отлаживать.

Не зависимо от адреса и даже наличии периферии на I2C, скетч должен заливаться без ошибок.