Обработчик нажатий кнопки для текстового меню.

Arduino users
Offline
Зарегистрирован: 27.03.2018

Как можно сделать обработку нажатий кнопки для текстового меню на экране 1602? Сколько раз не пытался не получается.

b707
Offline
Зарегистрирован: 26.05.2017

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

Если захотите "примерчик кода" - идите в гугль, там этих примеров как грязи

Гриша
Offline
Зарегистрирован: 27.04.2014

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

b707, прав... 

Arduino users
Offline
Зарегистрирован: 27.03.2018

b707 пишет:

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

Если захотите "примерчик кода" - идите в гугль, там этих примеров как грязи


Мне надо сделать чтобы страницы прибавлялись по одной. А у меня сразу по несколько. То есть при нажатии на кнопку переменная pos увеличивалась/уменьшалась на 1 и не более.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Почитайте о способах борьбы с дребезгом контактов.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Arduino users пишет:

Как можно сделать обработку нажатий кнопки для текстового меню на экране 1602? Сколько раз не пытался не получается.

ИМХО: флуд. Не представлено ни одной программы, но "Сколько раз не пытался не получается". Да и не получится, пока писать не начнете, а не копирастить. Дам ма..аленький совет - читайте по отпусканию клавиши.

У всех как-то получается, а у Вас - нет. Есть повод задуматься

Arduino users
Offline
Зарегистрирован: 27.03.2018

Мне надо сделать чтобы страницы прибавлялись по одной. А у меня сразу по несколько. То есть при нажатии на кнопку переменная pos увеличивалась/уменьшалась на 1 и не более.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Arduino users пишет:
Мне надо сделать чтобы страницы прибавлялись по одной. А у меня сразу по несколько. То есть при нажатии на кнопку переменная pos увеличивалась/уменьшалась на 1 и не более.

Тут 2 варианта:

1) воспользоваться библиотекой

2) считывать кнопку по отпусканию (если Вы используете кнопку на аналоговом входе). Вариан подпрограммы сейчас дам:

//препроцессору
#define BUTTON_NONE 0
#define BUTTON_RIGHT 1
#define BUTTON_UP 2
#define BUTTON_DOWN 3
#define BUTTON_LEFT 4
#define BUTTON_SELECT 5
  //**********************************ПП Считывание нажатия клавиш*******
  int getPressedButton() {
  int button;
  int buttonValue = analogRead(0); // считываем значения с аналогового входа(A0) 
  if (buttonValue > 1000) {
    return BUTTON_NONE;
  }
  else if (buttonValue < 100) {
    button = BUTTON_RIGHT;  
  }
  else if (buttonValue < 200) {
    button = BUTTON_UP;
  }
  else if (buttonValue < 400){
    button = BUTTON_DOWN;
  }
  else if (buttonValue < 600){
    button = BUTTON_LEFT;
  }
  else if (buttonValue < 800){
    button = BUTTON_SELECT;
  }else {
    return BUTTON_NONE;
  }
  //         BuzzerBeep();
  while (analogRead(0)<1000);
  Serial.println(button);

  return button;
}

 

Arduino users
Offline
Зарегистрирован: 27.03.2018

Большое спасибо! Наверное, буду переделывать кнопки на аналоговый вход. Делал похожее для цифровых, но не удачно.

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

Arduino users пишет:
Большое спасибо! Наверное, буду переделывать кнопки на аналоговый вход. Делал похожее для цифровых, но не удачно.

А с чего решили, что на аналоговых будет проще. И еще раз, вы не представили ни одного варианта программы, что у вас там косячит - дребезг, цикл пятьсот раз пробежать успевает или еще 100500 вариантов, неизвестно.

Arduino users
Offline
Зарегистрирован: 27.03.2018

#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); // Ограничиваем меню
}

Arduino users
Offline
Зарегистрирован: 27.03.2018

Также пробовал использовать джойстик.

#include <Wire.h>
#include <DHT.h>                               //библиотеки
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht(3, DHT11);
int st = 0;                                 //строки
int pos = 0;                                //страницы
int flag = 0;
int flag1 = 0;
int flag3 =0;
int a = 0;
   int b = 0;                              //переменная режимов
   void setup() {
pinMode(8,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);
  int hum = analogRead(A2);
  hum = map(hum, 0, 1023, 0, 100);
  int temp = dht.readTemperature();       //датчик температуры и влажности воздуха
  int hum1 = dht.readHumidity();






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

delay(100);
if(x>600){
  st++;
delay(50);
}
if(st>1){
  st=0;
 }


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(7,0);
lcd.print(temp);
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(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){
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){
lcd.clear();
lcd.print("Mode:manual");
lcd.setCursor(0,1);
lcd.print(">Setup manual");
}
}



if(pos==6&st==0){
if(but==0&flag==0){
a=1;
flag=1;
}
else if(but==0&flag==1) {
flag=0;
a=0;
}
}

if(a>1){
a=0;
}




if(temp>15){
digitalWrite(6, HIGH);
}

















if(pos==0&st==0){
if(y>750){
pos=1;
}
}
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(y>700){
delay(200);
if(y>700){
b=1;
}
else if(470<y<490){        //устранение дребезга джостика
b=0;
}
}
if(y<460){
delay(200);
if(y<460){
b=-1;
}
else if(470<y<490){
b=0;
}
}














Serial.print("x: ");
Serial.print(x);
Serial.print("y: ");
Serial.println(y);
}

 

Arduino users
Offline
Зарегистрирован: 27.03.2018

Хотелось бы оставить джойстик, с ним удобнее, но иногда есть самопроизвольное переключение на несколько страниц вперед.

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

Лично мне кажется, что нет фиксации нажатия и цикл успевает пробежать несколько раз. Фактически надо делать двумя способами: первый - одна смена за одно нажатие, зафиксировали изменение от нейтрали, увеличили счетчик. Следующее изменение, только после возврата в нейтральное положение и очередного изменения. Второй - с автоматическим изменением: зафиксировали изменение, увеличили счетчик, запомнили время, если возврата к нейтрали за период в пару секунд не произошло, начинаем циклично, с интервалами, увеличивать счетчик. Какой способ выбрать, решать вам. 

Да, и почитайте тему "Работа с кнопками......", там много разных приемов.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Мда (pos==4&st==1) Кто то что то потерял  &  или && .  И не хотелось говорить, но вам видно послушать целый курс - Как писать Меню на Ардуино.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Вот это еще необычно: if(470<y<490)

Arduino users
Offline
Зарегистрирован: 27.03.2018

Это лишнее, случайно скинул старый код

Arduino users
Offline
Зарегистрирован: 27.03.2018

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Arduino users пишет:

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

Попытайтесь расставить скобки и поймете сами.

Arduino users
Offline
Зарегистрирован: 27.03.2018

А можно сделать через флаг?

Arduino users
Offline
Зарегистрирован: 27.03.2018

bwn пишет:

Лично мне кажется, что нет фиксации нажатия и цикл успевает пробежать несколько раз. Фактически надо делать двумя способами: первый - одна смена за одно нажатие, зафиксировали изменение от нейтрали, увеличили счетчик. Следующее изменение, только после возврата в нейтральное положение и очередного изменения. Второй - с автоматическим изменением: зафиксировали изменение, увеличили счетчик, запомнили время, если возврата к нейтрали за период в пару секунд не произошло, начинаем циклично, с интервалами, увеличивать счетчик. Какой способ выбрать, решать вам. 

Да, и почитайте тему "Работа с кнопками......", там много разных приемов.

 

Можете дать примерный код?

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

Arduino users пишет:

Можете дать примерный код?

Понимаете, я могу помочь с алгоритмом, с кодом, но при условии, что человек основное делает сам. Просто написать за кого-то, нет ни малейшего желания. Это как нищим подавать, низменное чувство. Я не считаю, что вы дурнее меня и не можете это сделать сами. Как то так.
Да, и я не программист, и даже информатику не изучал.  Обычный металлург, а потом барыга, в прошлом.

Arduino users
Offline
Зарегистрирован: 27.03.2018

bwn пишет:

Arduino users пишет:

Можете дать примерный код?

Понимаете, я могу помочь с алгоритмом, с кодом, но при условии, что человек основное делает сам. Просто написать за кого-то, нет ни малейшего желания. Это как нищим подавать, низменное чувство. Я не считаю, что вы дурнее меня и не можете это сделать сами. Как то так.
Да, и я не программист, и даже информатику не изучал.  Обычный металлург, а потом барыга, в прошлом.

int n = 497 //значение нейтрального положения 
int pos = 0; //страницы меню

 void setup() { 

 } 
void loop() { 
new_val = analogRead(A0);
if(n !=new_val){
pos++;
 int actualKeyValue = analogRead(A0); // Получаем актуальное состояние 
if ((actualKeyValue != n) && (millis() - lastChange > 200)) {
 // Пришло новое значение, и с последнего изменения прошло достаточно времени 
 lastChange = millis();
}
}
}

Пока всё на что меня хватило

Arduino users
Offline
Зарегистрирован: 27.03.2018

bwn пишет:

Arduino users пишет:

Можете дать примерный код?

Понимаете, я могу помочь с алгоритмом, с кодом, но при условии, что человек основное делает сам. Просто написать за кого-то, нет ни малейшего желания. Это как нищим подавать, низменное чувство. Я не считаю, что вы дурнее меня и не можете это сделать сами. Как то так.
Да, и я не программист, и даже информатику не изучал.  Обычный металлург, а потом барыга, в прошлом.

 

Я не могу понять как сделать чтобы отсчёт шел только после возвращения к нейтрали 

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

Навскидку и по простому, имеем две функции - одна смотрит за джойстиком и возвращает false-true в зависимости от положения джойстика. Вторая занимается счетчиком, зафиксировали true (условно) прибавили счетчик на единицу и запомнили флаг-true. Пока оно не изменилось, ничего не делаем. Получили от джойстика false, изменили флаг на false и ждем следующего true. И так по кругу.
Желательно сразу сделать задержку считывания на 50-100мС (на том-же millis), чтобы убить дребезг.

P/S И если будете писать, то сразу решите, что вам требуется от джойстика (надо будет как-то перемещаться, подтверждать и т.п.), чтобы сразу писать полную функцию его обработки.
 

Arduino users
Offline
Зарегистрирован: 27.03.2018
int pos = 0; //страницы меню
int control=false;
int flag=false;
unsigned long m;
 void setup() { 
Serial.begin(9600);
 } 
void loop() { 
/*new_val = analogRead(A0);
if(n !=new_val){
pos++;
 int actualKeyValue = analogRead(A0); // Получаем актуальное состояние 
if ((actualKeyValue != n) && (millis() - lastChange > 200)) {
 // Пришло новое значение, и с последнего изменения прошло достаточно времени 
 lastChange = millis();
}
}
*/
int x = analogRead(A0);
if(x>500){
control=true;   //контроль джойстика, нейтраль = false
}
else if(x<400){
control=true;
}
else{
control=false;
}

if(control==true){
pos++;
flag=true;
}
if(millis()-m>150){
m=millis();
if(control==false){
flag=false;
}
}
Serial.println("x: " + String(x) + "flag: " + String(flag)+ "pos:"+String(pos)+"control: " +String(control)); 



}

bwn пишет:

Навскидку и по простому, имеем две функции - одна смотрит за джойстиком и возвращает false-true в зависимости от положения джойстика. Вторая занимается счетчиком, зафиксировали true (условно) прибавили счетчик на единицу и запомнили флаг-true. Пока оно не изменилось, ничего не делаем. Получили от джойстика false, изменили флаг на false и ждем следующего true. И так по кругу.
Желательно сразу сделать задержку считывания на 50-100мС (на том-же millis), чтобы убить дребезг.

P/S И если будете писать, то сразу решите, что вам требуется от джойстика (надо будет как-то перемещаться, подтверждать и т.п.), чтобы сразу писать полную функцию его обработки.
 

 

На сколько я понимаю так?

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

Нет, вы меня не поняли. Почитайте про функции. Первым делом мы создадим функцию обрабатывающую джойстик. Когда она заработает, можно переходить к следующей. Слона кушают кусочками.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

bwn пишет:

... Слона кушают кусочками.

Тока, обычно, выходит он потом зараз весь. 

Arduino users
Offline
Зарегистрирован: 27.03.2018

[quote=bwn]

Нет, вы меня не поняли. Почитайте про функции. Первым делом мы создадим функцию обрабатывающую джойстик. Когда она заработает, можно переходить к следующей. Слона кушают кусочками.

[/quote

 

Мне бы надо чтобы джойстик в одну сторону увеличивал страницу в другую уменьшалась.

b707
Offline
Зарегистрирован: 26.05.2017

Arduino users]</p> <p>[quote=bwn пишет:

Нет, вы меня не поняли. Почитайте про функции. Первым делом мы создадим функцию обрабатывающую джойстик. Когда она заработает, можно переходить к следующей. Слона кушают кусочками.

[/quote

 

Мне бы надо чтобы джойстик в одну сторону увеличивал страницу в другую уменьшалась.

как это противоречит совету про функции? :)

Arduino users
Offline
Зарегистрирован: 27.03.2018

Это не противоречит. Я вроде бы понял.

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

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

Arduino users
Offline
Зарегистрирован: 27.03.2018

bwn пишет:

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

Ещё не знаю, пока только написал функцию для джойстика возвращающая true/false

Arduino users
Offline
Зарегистрирован: 27.03.2018

Arduino users пишет:

bwn пишет:

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

Ещё не знаю, пока только написал функцию для джойстика возвращающая true/false

Что-то со второй функцией не могу разобраться, где счётчик, точнее как сделать минус страницу

Arduino users
Offline
Зарегистрирован: 27.03.2018

Arduino users пишет:

Arduino users пишет:

bwn пишет:

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

Ещё не знаю, пока только написал функцию для джойстика возвращающая true/false

Что-то со второй функцией не могу разобраться, где счётчик, точнее как сделать минус страницу

 

//int n = 497; //значение нейтрального положения 
int pos = 0; //страницы меню
int control=false;
int flag=false;
unsigned long m;
 void setup() { 
Serial.begin(9600);
 } 
void loop() { 
/*new_val = analogRead(A0);
if(n !=new_val){
pos++;
 int actualKeyValue = analogRead(A0); // Получаем актуальное состояние 
if ((actualKeyValue != n) && (millis() - lastChange > 200)) {
 // Пришло новое значение, и с последнего изменения прошло достаточно времени 
 lastChange = millis();
}
}
*/
int a = val();
//int x = analogRead(A0);
/*if(x>500){
control=true;   //контроль джойстика, нейтраль = false
}
else if(x<400){
control=true;
}
else{
control=false;
}

if(control==true){
pos++;
flag=true;
}
if(millis()-m>150){
m=millis();
if(control==false){
flag=false;
}
}
Serial.println("x: " + String(x) + "flag: " + String(flag)+ "pos:"+String(pos)+"control: " +String(control)); 
*/


Serial.println(a);
}
int val(){
int x = analogRead(A0);
if(x>500){
control=true;   //контроль джойстика, нейтраль = false
}
else if(x<400){
control=true;
}
else{
control=false;
}
return control;
}
int i(){
if(val()==true&flag==0){
if(millis()-m>100){
m=millis();
pos++;
flag=1;
}
}
else if(val()==false&flag==1){
flag=0;
}
}


Вот код


 

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

Для этого нужен еще один параметр от джойстика. Условно надо ловить вверх, вниз и нейтраль. Да и функций я у вас не вижу. Вижу один луп. 
Вам в #7 уже дали пример функции на пять положений. Но лучше, помучайтесь и напишите сами, будет корявее, но вы будете понимать все строчки. Сейчас вы пытаетесь составить заклинание на неведомом языке. ИМХО.

P/S Извиняюсь, ошибся, проморгал функцию val();

Arduino users
Offline
Зарегистрирован: 27.03.2018

bwn пишет:

Для этого нужен еще один параметр от джойстика. Условно надо ловить вверх, вниз и нейтраль. Да и функций я у вас не вижу. Вижу один луп. 
Вам в #7 уже дали пример функции на пять положений. Но лучше, помучайтесь и напишите сами, будет корявее, но вы будете понимать все строчки. Сейчас вы пытаетесь составить заклинание на неведомом языке. ИМХО.

P/S Извиняюсь, ошибся, проморгал функцию val();

Также функция i()

Arduino users
Offline
Зарегистрирован: 27.03.2018

Arduino users пишет:

bwn пишет:

Для этого нужен еще один параметр от джойстика. Условно надо ловить вверх, вниз и нейтраль. Да и функций я у вас не вижу. Вижу один луп. 
Вам в #7 уже дали пример функции на пять положений. Но лучше, помучайтесь и напишите сами, будет корявее, но вы будете понимать все строчки. Сейчас вы пытаетесь составить заклинание на неведомом языке. ИМХО.

P/S Извиняюсь, ошибся, проморгал функцию val();

Также функция i()

 

 

#define right 1
#define left -1
#define up 1
#define down -1
int controly=false;
int control=false;
#include <Wire.h>
#include <DHT.h>                               //библиотеки
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht(3, DHT11);
unsigned long m;
int hum2 = 0;
int st = 0;                                 //строки
int pos = 0;                                //страницы
int flag = 0;
int flag1 = 0;
int flag3 =0;
int a = 0;
int b = 0;  



            //переменная режимов
   void setup() {

pinMode(A0, INPUT);
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);
  boolean but = digitalRead(8);
  int hum = analogRead(A2);
  hum = map(hum, 0, 1023, 0, 100);
  int temp = dht.readTemperature();       //датчик температуры и влажности воздуха
  int hum1 = dht.readHumidity();
  int vl = val();
  int posi = i();  
  int vly = valy();
   




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&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;
}




if(vly==1){
st++;
}






if(pos==0&st==0){
if(vl==1){
st=2;
pos=1;
}
}
if(pos==0&st==1){
if(vl==1){
st=2;
pos=4;
}
}

if(pos==4){
if(vl==-1){
pos=0;
}
}
if(pos==1){
if(vl==-1){
pos=0;
}
}
if(pos==1&st==0){
if(vl==1){
pos=2;
}
}
if(pos==2){
if(vl==-1){
pos=1;
}
}
if(pos==1&st==1){
if(vl==1){
pos=3;
}
}
if(pos==3){
if(vl==-1){
pos=1;
}
}

if(pos==4&st==0){
if(vl==1){
pos=5;
}
}

if(pos==5){
if(vl==-1){
pos=4;
}
}

if(pos==4&st==1){
if(vl==1){
st=2;
pos=6;
}
}

if(pos==6){
if(vl==-1){
st=2;
pos=4;
}
}

if(pos==6&st==1&a==1){
if(vl==1){
st=2;
pos=7;
}
}

if(pos==6&st==1&a==0){
if(vl==1){
st=2;
pos=8;
}
}
if(pos==7&st==0){
if(vl==1){
pos=9;
}
}

Serial.println(vl);    
}
int valy(){
int y = analogRead(A1);
if(y>500){
controly=up;   //контроль джойстика, нейтраль = false
}
else if(y<400){
control=down;
}
else{
controly=false;
}
return controly;
}
int val(){
int x = analogRead(A0);
if(x>500){
control=right;   //контроль джойстика, нейтраль = false
}
else if(x<400){
control=left;
}
else{
control=false;
}
return control;
}
int i(){
if(val()==right&flag3==0){
if(millis()-m>100){
m=millis();
flag3=1;
}
}
else if(val()==left&flag3==0){
flag3=1;
}
else if(val()==false&flag3==1){
flag3=0;
}
if(pos<0){
pos=0;
}
}

Спасибо за советы, сделал более адекватное управление меню, но всё равно бывает проскакивает на несколько страниц, как сделать чтобы нажатие(отклонение джойстика) было одно, а не шла череда. 

P.S.  В ком порте если выводить vl идёт в состоянии покоя всегда 0 ,при отклонении 1 либо -1, но идёт не переставая, мне кажется нужно чтобы останавливалось и не было кучи единиц подряд.

Простите если что-то не понятно объяснил.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Не , меня три кнопки устраивает #44  Ну а дальше надо думать. Не идеально получилось.

Arduino users
Offline
Зарегистрирован: 27.03.2018

Что можно сделать, чтобы прекращало работу после перемещения джойстика, а не шло куча единиц?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Arduino users пишет:

Что можно сделать, чтобы прекращало работу после перемещения джойстика, а не шло куча единиц?

Вы удивитесь . Научится программировать. #60

Arduino users
Offline
Зарегистрирован: 27.03.2018

bwn, не могли бы вы подсказать, что можно сделать?

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

#40

Arduino users
Offline
Зарегистрирован: 27.03.2018

bwn пишет:

#40

Хотелось бы свой до ума довести. Там не понятно, и нет пояснения, а хочется разобраться.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Arduino users пишет:

Хотелось бы свой до ума довести. Там не понятно, и нет пояснения, а хочется разобраться.

Я же ясно написал-"Научитесь программировать". Программисты читают код напрямую, и чаще без комментариев. Если даже Вы не можете читать свой код. Что такое читать код? Это понимать его работу и выявляеть в нем ошибки. Так что пока Вы не научитесь читать код, то никто Вам не поможет.

Green
Онлайн
Зарегистрирован: 01.10.2015

Текст программы должен быть как письмо, как произведение. С абзацами, отступами... Всё должно быть понятно. Глаз просто должен скользить по тексту и не задерживаться ни на каких фразах, выражениях.)

Green
Онлайн
Зарегистрирован: 01.10.2015

Ну, что сказать... Раньше всегда считался с мнением окружающих. Но, с какого то момента стало просто по.уй! Главное что бы было своё.) Но к людям, конечно же, стараюсь прислушиваться. И это жИзнь, как говорят в Одессе.)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

А я уже извинился.  

Green
Онлайн
Зарегистрирован: 01.10.2015

Не имеет значения.)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

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

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

В последнее время у мня появился 

 

И я стал нинадолга щаслив. :-)