Официальный сайт компании Arduino по адресу arduino.cc
Обработчик нажатий кнопки для текстового меню.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Ср, 06/02/2019 - 12:41
Как можно сделать обработку нажатий кнопки для текстового меню на экране 1602? Сколько раз не пытался не получается.
ровно так же, как для любой другой кнопки. От присутствия рядом экрана ничего ровным счетом не меняется.
Если захотите "примерчик кода" - идите в гугль, там этих примеров как грязи
примерно так, как на этом видео, особенно комментарии автора обзора. Бабушка "видит" то, что видит, а китайсы лохов разводят.
b707, прав...
ровно так же, как для любой другой кнопки. От присутствия рядом экрана ничего ровным счетом не меняется.
Если захотите "примерчик кода" - идите в гугль, там этих примеров как грязи
Мне надо сделать чтобы страницы прибавлялись по одной. А у меня сразу по несколько. То есть при нажатии на кнопку переменная pos увеличивалась/уменьшалась на 1 и не более.
Почитайте о способах борьбы с дребезгом контактов.
Как можно сделать обработку нажатий кнопки для текстового меню на экране 1602? Сколько раз не пытался не получается.
ИМХО: флуд. Не представлено ни одной программы, но "Сколько раз не пытался не получается". Да и не получится, пока писать не начнете, а не копирастить. Дам ма..аленький совет - читайте по отпусканию клавиши.
У всех как-то получается, а у Вас - нет. Есть повод задуматься
Мне надо сделать чтобы страницы прибавлялись по одной. А у меня сразу по несколько. То есть при нажатии на кнопку переменная pos увеличивалась/уменьшалась на 1 и не более.
Тут 2 варианта:
1) воспользоваться библиотекой
2) считывать кнопку по отпусканию (если Вы используете кнопку на аналоговом входе). Вариан подпрограммы сейчас дам:
Большое спасибо! Наверное, буду переделывать кнопки на аналоговый вход. Делал похожее для цифровых, но не удачно.
А с чего решили, что на аналоговых будет проще. И еще раз, вы не представили ни одного варианта программы, что у вас там косячит - дребезг, цикл пятьсот раз пробежать успевает или еще 100500 вариантов, неизвестно.
#include <Wire.h>
#include <DHT.h> //библиотеки
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht(3, DHT11);
unsigned long m;
unsigned long m2;
unsigned long m1;
unsigned long Uptime;
int hum2 = 0;
int button = 0;
int button1 = 0;
int st = 0; //строки
int pos = 0; //страницы
int flag = 0;
int flag1 = 0;
int flag3 =0;
int a = 0;
int pinButton2 = 2;
int pinButton3 = 3;
int pinButton4 = 4;
int b = 0;
int const ButtonInterval = 200; // Интервал срабатывания кнопки при удержании
int ButtonPress = 0; // Код нажатой кнопки, или 0 если не нажата
unsigned long ButtonPressTime = 0;
//переменная режимов
void setup() {
pinMode(2,INPUT_PULLUP);
pinMode(3,INPUT_PULLUP);
pinMode(4,INPUT_PULLUP);
pinMode(6,OUTPUT);
pinMode(9,OUTPUT);
pinMode(5,OUTPUT);
pinMode(3,INPUT);
dht.begin();
Serial.begin(9600);
lcd.init();
lcd.backlight();
}
void loop() {
boolean rel1 = digitalRead(6);
boolean rel2 = digitalRead(5);
int x = analogRead(0);
int y = analogRead(1); //управление джостика
boolean but = digitalRead(8);
boolean but1 = !digitalRead(10);
boolean but2 = !digitalRead(11);
int hum = analogRead(A2);
hum = map(hum, 0, 1023, 0, 100);
int temp = dht.readTemperature(); //датчик температуры и влажности воздуха
int hum1 = dht.readHumidity();
Uptime = millis();
if(st==0&pos==0){
lcd.clear();
lcd.print("->Status");
lcd.setCursor(0,1);
lcd.print("Setup");
}
if(st==1&pos==0){
lcd.clear();
lcd.print("Status");
lcd.setCursor(0,1);
lcd.print("->Setup");
} //#Меню страница 0
if(st>1){
st=0;
}
delay(100);
if(st==0&pos==1){
lcd.clear();
lcd.print(">Air");
lcd.setCursor(0,1);
lcd.print("Ground");
}
if(st==1&pos==1){ //#страница 1
lcd.clear();
lcd.print("Air");
lcd.setCursor(0,1);
lcd.print(">Ground");
}
if(st==0&pos==2){
lcd.clear();
lcd.print("Temp:");
lcd.setCursor(5,0);
lcd.print(temp);
lcd.setCursor(7,0);
lcd.print("C°");
lcd.setCursor(9,0);
lcd.print("Hum:");
lcd.setCursor(13,0);
lcd.print(hum1);
lcd.setCursor(15,0);
lcd.print("%");
} //#Меню страница 2
if(st==1&pos==2){
lcd.clear();
lcd.print("Temp:");
lcd.setCursor(5,0);
lcd.print(temp);
lcd.setCursor(7,0);
lcd.print("C°");
lcd.setCursor(9,0);
lcd.print("Hum:");
lcd.setCursor(13,0);
lcd.print(hum1);
lcd.setCursor(15,0);
lcd.print("%");
}
if(pos==3){
lcd.clear();
lcd.print("Hum:");
lcd.setCursor(6,0);
lcd.print(hum); //#Меню страница 3
lcd.setCursor(8,0);
lcd.print("%");
}
if(st==0&pos==4){
lcd.clear();
lcd.print(">Basic setup");
lcd.setCursor(0,1);
lcd.print("Mode");
} //#страница 4
if(st==1&pos==4){
lcd.clear();
lcd.print("Basic setup");
lcd.setCursor(0,1);
lcd.print(">Mode");
}
if(st==0&pos==5){
lcd.clear();
lcd.print(">Time");
} //#страница 5
if(st==1&pos==5){
lcd.clear();
lcd.print("Time");
}
if(st==0&pos==6){
if(a==1){
lcd.clear();
lcd.print(">Mode:auto");
lcd.setCursor(0,1);
lcd.print("Setup auto");
}
}
if(st==1&pos==6){
if(a==1){
lcd.clear();
lcd.print("Mode:auto");
lcd.setCursor(0,1);
lcd.print(">Setup auto");
}
} //#страница 6
if(st==0&pos==6){
if(a==0){
lcd.clear();
lcd.print(">Mode:manual");
lcd.setCursor(0,1);
lcd.print("Setup manual");
}
}
if(st==1&pos==6){
if(a==0){
lcd.clear();
lcd.print("Mode:manual");
lcd.setCursor(0,1);
lcd.print(">Setup manual");
}
}
if(st==0&pos==6){
if(a==2){
lcd.clear();
lcd.print(">Mode:off");
}
}
if(st==0&pos==7){
lcd.clear();
lcd.print(">Set humidity");
lcd.setCursor(0,1);
lcd.print("Set time watering");
} //страница 7
if(st==1&pos==7){
lcd.clear();
lcd.print("Set humidity");
lcd.setCursor(0,1);
lcd.print(">Set time watering");
}
if(st==0&pos==8){
if(rel1==0){
lcd.clear();
lcd.print(">Status:off");
}
} //страница 8
if(st==1&pos==8){
if(rel1==1){
lcd.clear();
lcd.print("Status:on");
}
}
if(st==0&pos==9){
lcd.clear();
lcd.print(hum2);
lcd.setCursor(3,0);
}
if(pos==6&x>600){
st++;
}
if(pos==6&st==0){
if(but==1&flag==0){
a++;
flag=1;
}
}
if(pos==6&st==0){
if(but==0&flag==1){
flag=0;
}
}
if(a>2){
a=0;
}
int buttt =!digitalRead(pinButton2);
int butttt = !digitalRead(pinButton3);
if (ButtonPress == 0) { // Если кнопки не были нажаты ранее
if (buttt) ButtonPress = 2; // Нажата [Prev]
else if (butttt) ButtonPress = 3; // Нажата [Next]
} else {
if (ButtonPressTime == 0) { // Если не замеряли интервал нажатия кнопки
ButtonPressTime = Uptime; // Засекаем когда была нажата кнопка
ButtonClick(ButtonPress); // Вызывается функция обработки нажатия на кнопку
}
if (ButtonPressTime + ButtonInterval < Uptime) { // Если кнопка была нажата раньше чем ButtonInterval ms назад
ButtonPressTime = 0; // Сбрасываем время
ButtonPress = 0; // Отжимаем кнопку (это имитуреет многократное нажатие с интервалом ButtonInterval если кнопку держать)
}
}
/*
if(but1==1&flag1==0){
button=1;
flag1=1;
}
if(button==1){
st++;
button=0;
flag1=0;
}
if(but2==1&flag3==0){
button1=1;
flag3=1;
}
if(pos==0&st==0){
if(button1==1){
pos=1;
button1=0;
flag3=0;
}
}
*/
/*
if(pos==0&st==1){
if(y>750){
st=2;
pos=4;
}
}
if(pos==4){
if(y<350){
pos=0;
}
}
if(pos==1){
if(y<350){
pos=0;
}
}
if(pos==1&st==0){
if(y>750&b==1){
pos=2;
}
}
if(pos==2){
if(y<450){
pos=1;
}
}
if(pos==1&st==1){
if(y>700){
pos=3;
}
}
if(pos==3){
if(y<450){
pos=1;
}
}
if(pos==4&st==0){
if(y>700){
pos=5;
}
}
if(pos==5){
if(y<450){
pos=4;
}
}
if(pos==4&st==1){
if(y>700){
st=2;
pos=6;
}
}
if(pos==6){
if(y<450){
st=2;
pos=4;
}
}
if(pos==6&st==1&a==1){
if(y>700){
st=2;
pos=7;
}
}
if(pos==6&st==1&a==0){
if(y>700){
st=2;
pos=8;
}
}
if(pos==7&st==0){
if(y>700){
pos=9;
}
}
*/
Serial.print("bp ");
Serial.println(ButtonPress);
}
void ButtonClick(int ButtonId) {
delay(20);
//if (ButtonId == 2) MenuEnter = false; // Клик [Menu] Выход из меню
if (ButtonId == 2) pos--; // Клик [Prev] Позицию ниже
if (ButtonId == 3) pos++; // Клик [Next] Позиция выше
//pos = constrain(pos, 0, MenuCount - 1); // Ограничиваем меню
}
Также пробовал использовать джойстик.
Хотелось бы оставить джойстик, с ним удобнее, но иногда есть самопроизвольное переключение на несколько страниц вперед.
Лично мне кажется, что нет фиксации нажатия и цикл успевает пробежать несколько раз. Фактически надо делать двумя способами: первый - одна смена за одно нажатие, зафиксировали изменение от нейтрали, увеличили счетчик. Следующее изменение, только после возврата в нейтральное положение и очередного изменения. Второй - с автоматическим изменением: зафиксировали изменение, увеличили счетчик, запомнили время, если возврата к нейтрали за период в пару секунд не произошло, начинаем циклично, с интервалами, увеличивать счетчик. Какой способ выбрать, решать вам.
Да, и почитайте тему "Работа с кнопками......", там много разных приемов.
Мда (pos==4&st==1) Кто то что то потерял & или && . И не хотелось говорить, но вам видно послушать целый курс - Как писать Меню на Ардуино.
Вот это еще необычно:
if
(470<y<490)
Это лишнее, случайно скинул старый код
Я только изучаю меню, можно поподробнее почему нельзя так как сделал я?
Я только изучаю меню, можно поподробнее почему нельзя так как сделал я?
А можно сделать через флаг?
Лично мне кажется, что нет фиксации нажатия и цикл успевает пробежать несколько раз. Фактически надо делать двумя способами: первый - одна смена за одно нажатие, зафиксировали изменение от нейтрали, увеличили счетчик. Следующее изменение, только после возврата в нейтральное положение и очередного изменения. Второй - с автоматическим изменением: зафиксировали изменение, увеличили счетчик, запомнили время, если возврата к нейтрали за период в пару секунд не произошло, начинаем циклично, с интервалами, увеличивать счетчик. Какой способ выбрать, решать вам.
Да, и почитайте тему "Работа с кнопками......", там много разных приемов.
Можете дать примерный код?
Можете дать примерный код?
Понимаете, я могу помочь с алгоритмом, с кодом, но при условии, что человек основное делает сам. Просто написать за кого-то, нет ни малейшего желания. Это как нищим подавать, низменное чувство. Я не считаю, что вы дурнее меня и не можете это сделать сами. Как то так.
Да, и я не программист, и даже информатику не изучал. Обычный металлург, а потом барыга, в прошлом.
Можете дать примерный код?
Понимаете, я могу помочь с алгоритмом, с кодом, но при условии, что человек основное делает сам. Просто написать за кого-то, нет ни малейшего желания. Это как нищим подавать, низменное чувство. Я не считаю, что вы дурнее меня и не можете это сделать сами. Как то так.
Да, и я не программист, и даже информатику не изучал. Обычный металлург, а потом барыга, в прошлом.
Пока всё на что меня хватило
Можете дать примерный код?
Понимаете, я могу помочь с алгоритмом, с кодом, но при условии, что человек основное делает сам. Просто написать за кого-то, нет ни малейшего желания. Это как нищим подавать, низменное чувство. Я не считаю, что вы дурнее меня и не можете это сделать сами. Как то так.
Да, и я не программист, и даже информатику не изучал. Обычный металлург, а потом барыга, в прошлом.
Я не могу понять как сделать чтобы отсчёт шел только после возвращения к нейтрали
Навскидку и по простому, имеем две функции - одна смотрит за джойстиком и возвращает false-true в зависимости от положения джойстика. Вторая занимается счетчиком, зафиксировали true (условно) прибавили счетчик на единицу и запомнили флаг-true. Пока оно не изменилось, ничего не делаем. Получили от джойстика false, изменили флаг на false и ждем следующего true. И так по кругу.
Желательно сразу сделать задержку считывания на 50-100мС (на том-же millis), чтобы убить дребезг.
P/S И если будете писать, то сразу решите, что вам требуется от джойстика (надо будет как-то перемещаться, подтверждать и т.п.), чтобы сразу писать полную функцию его обработки.
Навскидку и по простому, имеем две функции - одна смотрит за джойстиком и возвращает false-true в зависимости от положения джойстика. Вторая занимается счетчиком, зафиксировали true (условно) прибавили счетчик на единицу и запомнили флаг-true. Пока оно не изменилось, ничего не делаем. Получили от джойстика false, изменили флаг на false и ждем следующего true. И так по кругу.
Желательно сразу сделать задержку считывания на 50-100мС (на том-же millis), чтобы убить дребезг.
P/S И если будете писать, то сразу решите, что вам требуется от джойстика (надо будет как-то перемещаться, подтверждать и т.п.), чтобы сразу писать полную функцию его обработки.
На сколько я понимаю так?
Нет, вы меня не поняли. Почитайте про функции. Первым делом мы создадим функцию обрабатывающую джойстик. Когда она заработает, можно переходить к следующей. Слона кушают кусочками.
... Слона кушают кусочками.
Тока, обычно, выходит он потом зараз весь.
[quote=bwn]
Нет, вы меня не поняли. Почитайте про функции. Первым делом мы создадим функцию обрабатывающую джойстик. Когда она заработает, можно переходить к следующей. Слона кушают кусочками.
[/quote
Мне бы надо чтобы джойстик в одну сторону увеличивал страницу в другую уменьшалась.
Нет, вы меня не поняли. Почитайте про функции. Первым делом мы создадим функцию обрабатывающую джойстик. Когда она заработает, можно переходить к следующей. Слона кушают кусочками.
[/quote
Мне бы надо чтобы джойстик в одну сторону увеличивал страницу в другую уменьшалась.
как это противоречит совету про функции? :)
Это не противоречит. Я вроде бы понял.
От, уже два положения, а как подтверждать будем, что выбрали что-то?
От, уже два положения, а как подтверждать будем, что выбрали что-то?
Ещё не знаю, пока только написал функцию для джойстика возвращающая true/false
От, уже два положения, а как подтверждать будем, что выбрали что-то?
Ещё не знаю, пока только написал функцию для джойстика возвращающая true/false
Что-то со второй функцией не могу разобраться, где счётчик, точнее как сделать минус страницу
От, уже два положения, а как подтверждать будем, что выбрали что-то?
Ещё не знаю, пока только написал функцию для джойстика возвращающая true/false
Что-то со второй функцией не могу разобраться, где счётчик, точнее как сделать минус страницу
Для этого нужен еще один параметр от джойстика. Условно надо ловить вверх, вниз и нейтраль. Да и функций я у вас не вижу. Вижу один луп.
Вам в #7 уже дали пример функции на пять положений. Но лучше, помучайтесь и напишите сами, будет корявее, но вы будете понимать все строчки. Сейчас вы пытаетесь составить заклинание на неведомом языке. ИМХО.
P/S Извиняюсь, ошибся, проморгал функцию val();
Для этого нужен еще один параметр от джойстика. Условно надо ловить вверх, вниз и нейтраль. Да и функций я у вас не вижу. Вижу один луп.
Вам в #7 уже дали пример функции на пять положений. Но лучше, помучайтесь и напишите сами, будет корявее, но вы будете понимать все строчки. Сейчас вы пытаетесь составить заклинание на неведомом языке. ИМХО.
P/S Извиняюсь, ошибся, проморгал функцию val();
Также функция i()
Для этого нужен еще один параметр от джойстика. Условно надо ловить вверх, вниз и нейтраль. Да и функций я у вас не вижу. Вижу один луп.
Вам в #7 уже дали пример функции на пять положений. Но лучше, помучайтесь и напишите сами, будет корявее, но вы будете понимать все строчки. Сейчас вы пытаетесь составить заклинание на неведомом языке. ИМХО.
P/S Извиняюсь, ошибся, проморгал функцию val();
Также функция i()
Спасибо за советы, сделал более адекватное управление меню, но всё равно бывает проскакивает на несколько страниц, как сделать чтобы нажатие(отклонение джойстика) было одно, а не шла череда.
P.S. В ком порте если выводить vl идёт в состоянии покоя всегда 0 ,при отклонении 1 либо -1, но идёт не переставая, мне кажется нужно чтобы останавливалось и не было кучи единиц подряд.
Простите если что-то не понятно объяснил.
Не , меня три кнопки устраивает #44 Ну а дальше надо думать. Не идеально получилось.
Что можно сделать, чтобы прекращало работу после перемещения джойстика, а не шло куча единиц?
Что можно сделать, чтобы прекращало работу после перемещения джойстика, а не шло куча единиц?
bwn, не могли бы вы подсказать, что можно сделать?
#40
#40
Хотелось бы свой до ума довести. Там не понятно, и нет пояснения, а хочется разобраться.
Хотелось бы свой до ума довести. Там не понятно, и нет пояснения, а хочется разобраться.
Текст программы должен быть как письмо, как произведение. С абзацами, отступами... Всё должно быть понятно. Глаз просто должен скользить по тексту и не задерживаться ни на каких фразах, выражениях.)
Ну, что сказать... Раньше всегда считался с мнением окружающих. Но, с какого то момента стало просто по.уй! Главное что бы было своё.) Но к людям, конечно же, стараюсь прислушиваться. И это жИзнь, как говорят в Одессе.)
А я уже извинился.
Не имеет значения.)
Главное в жизни -уметь считаться со своим мнением, иначе по мнению других вы станете тряпкой.
В последнее время у мня появился
И я стал нинадолга щаслив. :-)