Меню с помощью библиотеки m2tklib
- Войдите на сайт для отправки комментариев
Сб, 07/04/2012 - 09:34
Я так понял, что библиотека m2tklib заточена на работу с конпками. Но кнопки должны подключаться каждая к своему входу, что меня не устраивает т.к. я экономлю входы.
Но была некая доработка библиотеки, после чего библиотека стала работать с событиями Arduino. Но как заставить библиотеку вопринимать эти события я не понимаю. Подскажите пожалуйста разобраться с примером!
За основу возьмем пример идущий в составе самой библиотеки под названием Combo
#include <glcd.h> // inform Arduino IDE that we will use GLCD library
#include "M2tk.h"
#include "utility/m2ghglcd.h"
uint8_t uiKeySelectPin = 3;
uint8_t uiKeyDownPin = 2;
uint8_t uiKeyUpPin = 1;
uint8_t uiKeyExitPin = 0;
uint8_t select_color = 0;
uint8_t select_priority = 0;
void fn_ok(m2_el_fnarg_p fnarg) {
/* accept selection */
}
void fn_cancel(m2_el_fnarg_p fnarg) {
/* discard selection */
}
const char *fn_idx_to_color(uint8_t idx)
{
if ( idx == 0 )
return "red";
else if (idx == 1 )
return "green";
return "blue";
}
const char *fn_idx_to_priority(uint8_t idx)
{
switch(idx)
{
case 0: return "lowest";
case 1: return "low";
case 2: return "medium";
case 3: return "high";
case 4: return "highest";
}
return "";
}
M2_LABEL(el_label1, NULL, "Color:");
M2_COMBO(el_combo1, NULL, &select_color, 3, fn_idx_to_color);
M2_LABEL(el_label2, NULL, "Priority: ");
M2_COMBO(el_combo2, "v1", &select_priority, 5, fn_idx_to_priority);
M2_BUTTON(el_cancel, NULL, "cancel", fn_cancel);
M2_BUTTON(el_ok, NULL, " ok ", fn_ok);
M2_LIST(list) = {
&el_label1, &el_combo1,
&el_label2, &el_combo2,
&el_cancel, &el_ok
};
M2_GRIDLIST(list_element, "c2",list);
M2tk m2(&list_element, m2_es_arduino, m2_eh_2bs, m2_gh_glcd_ffs);
void setup() {
m2.setPin(M2_KEY_SELECT, uiKeySelectPin);
m2.setPin(M2_KEY_NEXT, uiKeyDownPin);
m2.setPin(M2_KEY_PREV, uiKeyUpPin);
m2.setPin(M2_KEY_EXIT, uiKeyExitPin);
}
void loop() {
m2.checkKey();
if ( m2.handleKey() ) {
m2.draw();
}
}
Кусок скетча отвечающего за распознование нажатия определенной кнопки:
uint8_t readButtons()
{
int b,c = 0;
c=analogRead (A0);
if (c == 0)
{
//Serial.println("KeyNone");
return M2_KEY_NONE;
}
else
if (c>615 && c<630)
{
// Serial.println("KeySelect");
return M2_KEY_EVENT(M2_KEY_SELECT);
}
else
if (c>685 && c<700)
{
// Serial.println("KeyExit");
return M2_KEY_EVENT(M2_KEY_EXIT);
}
else
if (c>765 && c<785)
{
// Serial.println("KeyNext");
return M2_KEY_EVENT(M2_KEY_NEXT);
}
else
if (c>875 && c<893)
{
// Serial.println("KeyPrev");
return M2_KEY_EVENT(M2_KEY_PREV);
}
else
if (c==1023)
{
// Serial.println("KeyDataUp");
return M2_KEY_EVENT(M2_KEY_DATA_UP);
}
}
Как их связать, подскажите пожалуйста, заранее благодарен!!!
Примеров у автора я не нашел, кроме этого (m2esarduinoir.c).
В иделе, хочу объеденить m2tklib и Matrix Keypad 4x4
Всем спасибо, очень помогли, но я разобрался.
а это не поможет?
http://arduino.ru/forum/programmirovanie/menyu-dlya-tekstovogo-lcd-pomogite-optimizirovat
rln.nnov.ru/index.php
Всем спасибо, очень помогли, но я разобрался.
Подскажи как ты это реализовал.
Кому интересно - реализация работы меню m2tklib с аналоговой кнопки.
adc_key_in - установите свои значения
#include <glcd.h> // inform Arduino IDE that we will use GLCD library #include "M2tk.h" #include "utility/m2ghglcd.h" #include "fonts/Arial14.h" uint32_t number = 1234; //********************************Начало #define pinKnopki A8 int read_LCD_buttons() { uint16_t adc_key_in = analogRead(pinKnopki); // read the value from the sensor // Serial.println(analogRead(A8)); if (adc_key_in >85 && adc_key_in<95)return M2_KEY_EXIT; // отмена if (adc_key_in >160 && adc_key_in<175) return M2_KEY_NEXT; //в право if (adc_key_in >230 && adc_key_in<240) return M2_KEY_SELECT; // ок if (adc_key_in >280 && adc_key_in<300) return M2_KEY_DATA_UP; //в верх if (adc_key_in >335 && adc_key_in<350) return M2_KEY_PREV; //в лево if (adc_key_in >370 && adc_key_in<390) return M2_KEY_DATA_DOWN; //в низ return M2_KEY_NONE; // default } uint8_t m2_es_arduino_analog_input(m2_p ep, uint8_t msg) { switch(msg) { case M2_ES_MSG_GET_KEY: return read_LCD_buttons(); case M2_ES_MSG_INIT: return 0; } return 0; } M2_U32NUM(el_num, "a1c4", &number); M2tk m2(&el_num, m2_es_arduino_analog_input, m2_eh_4bs, m2_gh_glcd_ffs); void setup() { Serial.begin(115200); pinMode(12, OUTPUT); analogWrite(12,40); //***********************Конец } void loop() { //Serial.println(analogRead(A8)); m2.checkKey(); m2.checkKey(); if ( m2.handleKey() ) m2.draw(); m2.checkKey(); }Доброго времени суток.
Уважаемые форумчане помогите советом или примером. Я в программировании и микроконтроллерах новенький.
Для одного проекта мне нужно реализовать своего рода меню. В проекте используется ардуино, LCD, энкодер с кнопкой и датчики с исполнительными механизмами. Как мне организовать такую вещь - после включения нужно выбрать один из 3х вариантов при помощи энкодера и после нажатия на кнопкувыбрать тот или иной параметр который в последствии будет учавствовать в исполнении программы
Скетч в качестве примера меню при помощи энкодера.
По скетчу думаю понятно к каким пинам подключается дисплей и энкодер с кнопкой.
Спасибо большое буду разбираться