Проблемы с 16-клавишной сенсорной клавиатурой на TTP229

vikontA
Offline
Зарегистрирован: 18.03.2016


http://<iframe width="560" height="315" src="https://www.youtube.com/embed/51jPc_rSlXA" frameborder="0" allowfullscreen></iframe>

Прошу помощи в отладке программы.

С датчиков DS18B20 Temperature Sensor поступает информация о температуре, также есть клавиатура на TTP229 с которой читаются состояния нажатых клавиш, вся информация выводится на экран  LCD-дисплей 16x2.

Схемотехнически все собрано и работает 

Правда не совсем уверен в том достаточно замкнуть 3 перемычку или нужно замыкать 3, 4, 5 перемычки

1.      CMOS or Open Drain selector. Select direct output gate: OD with jumper, CMOS otherwise;

2.      Active High or Active Low selector. This pin manages more than a think. If CMOS output is selected, output is AL with jumper, AH otherwise. If OD output is selected, output is OD pull down with jumper, OD pull up otherwise. Furthermore this pin decides sampling edge for serial communication: rising edge with jumper, falling otherwise;

3.      8 or 16 key selector. Selects number of keys: 16 keys with jumper, 8 otherwise;

4.      Multi-key single key selector 1. Decides if keys 1~8 could be pressed simultaneously. Multi-key with jumper;

5.      Multi-key single key selector 2. As above for keys 9~16;

6.      Sampling rate in sleep mode selector. When device enter in sleep mode it wakes up checking pad periodically. This selects sampling rate when device is in sleep mode: sampling rate 64 Hz with jumper 8Hz otherwise;

7.      Sampling period in sleep selector. Decides how long is sampling time, in sleep mode: 2ms with jumper 4ms otherwise;

8.      Maximum key-on time. If a key is pressed for a long time most likely this is caused by charge accumulation. This option prevent malfunction resetting chip if a button is pressed for to much time: 80s with jumper, infinite otherwise.

Проблема в том что у клавиатуры согласно библиотеке есть всего 2 типа команд:

uint8_t key = ttp229.GetKey16();

uint8_t key = ttp229.ReadKey16();

Get – читает постоянно и выдает данные

Read – ожидает нажатия и пока не нажмут она не выдает ничего и программа ждет.

 

Задача:

Необходимо по результатам данных с клавиатуры обработать информацию о температуре и по результатам  включить нагреватель или не включать.

 

Проблема в том что когда я использую команду  GetKey клавиатура запоминает последнюю нажатую клавишу и некоторое время эти данные выводит на экран, хотя по описанию вроде, если ничего не нажато, то клавиатура должна выдавать «0». Также срабатывание не регулярное приходится нажимать, раз по 5, чтобы клавиатура отреагировала.

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

 

Как можно решить данные проблемы?

1)      обнулять клавиатуру после каждого цикла?

2)      Как обойти ожидание команды ReadKey, пробовал ее поставить в цикл с условиями, чтобы если за 1 секунду если не была нажата клавиша то программа продолжилась, но результат неудовлетворителен, впечатление либо я неправильно задаю условия выхода и входа, либо циклы 
do while ипростое  while не работают, единственное, что надежно работает только if и то без else.

 

// * TTP229 VCC to pin VCC
// * TTP229 GND to pin GND
// * TTP229 SCL to pin 2
// * TTP229 SDO to pin 3
//3, 5, 6, 9, 10, 11
// датчик к 10

#include <TTP229.h> // клавиатура
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // LiquidCrystal_I2C_Viktori
#include <OneWire.h>
#include <DallasTemperature.h> // библиотека Arduino-Temperature-Control-Library-master

//LiquidCrystal_I2C lcd(0x3F,16,2); // Устанавливаем дисплей
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

// Устанавливаем клавиатуру
const int SCL_PIN = 2; // The pin number of the clock pin.
const int SDO_PIN = 3; // The pin number of the data pin.
TTP229 ttp229(SCL_PIN, SDO_PIN); // TTP229(sclPin, sdoPin)

// настраиваем датчики
OneWire oneWire(10); // вход датчиков 18b20
DallasTemperature ds(&oneWire);

DeviceAddress sensorM = {0x28, 0xFF, 0x03, 0x8F, 0xA1, 0x15, 0x03, 0xE9}; // медный провод
DeviceAddress sensorA = {0x28, 0xFF, 0x67, 0xBF, 0x64, 0x15, 0x03, 0xC9}; // алюминий


int in_T1;
int in_T2;
int konT;
int key;
float TA;
float TM;


void setup()
{
Serial.begin(115200);
ds.begin(); // инициализация датчиков температуры 18b20
lcd.begin(16, 2); // initialize the lcd
}

void loop()
{
ds.requestTemperatures(); // считываем температуру с датчиков
TM = ds.getTempC(sensorM);
TA = ds.getTempC(sensorA);
uint8_t key = ttp229.GetKey16(); // считываем данные с клавиатуры
// выводим на lcd экран температуру
lcd.home ();
lcd.print("T1=");
lcd.setCursor(3, 0);
lcd.print(TM);
lcd.setCursor(8, 0);
lcd.print("T2=");
lcd.setCursor(11, 0);
lcd.print(TA);
lcd.setCursor(0, 1);
lcd.print("Klaviat=");

// выводим на lcd экран номер нажатой клавиши
lcd.setCursor(14, 1);
lcd.print(key);
Serial.println(key);
delay(500);
lcd.setCursor(14, 1);
lcd.print(" "); // очищаем индикацию считанных данных с клавиатуры

}

<iframe width="560" height="315" src="https://www.youtube.com/embed/51jPc_rSlXA" frameborder="0" allowfullscreen></iframe>

 

 

 

 

 

 

 

Croaton
Offline
Зарегистрирован: 15.12.2016

получилось победить клавиатуру, а то у меня та же проблема напрашивается?

Croaton
Offline
Зарегистрирован: 15.12.2016

вроде как получилось, ну естественно в loop работать ровно будет только как отдельный поток или через millis, никаких delay

void loop() { 

  key = ttp229.GetKey16(); //постоянно считывает показания клавиатуры
  if (key!=0){             //если клавиша нажата, передает её значение другой глобальной переменной
    key1=key;
  }