Переключение между страницами кнопками

vladimirkolpino
Offline
Зарегистрирован: 19.11.2016

Добрый всем день/ночь.

История такова:

Не догоняю вроде бы простых вещей, Help me pls.

Как создать несколько экранов и сделать переключение между ними кнопками "BTN_LEFT" и "BTN_RIGHT".
А так же на одном из экранов сделать, а именно на экране 3(так назван в скетче) сделать изменение параметра "n" в онлайн режиме кнопками "UP" и "DOWN". Например: нажимаешь "OK" и число "3000" начинает мигать(или не обязательно, но так будет интуитивно понятнее что собрались менять число) и кнопками "UP" и "DOWN" ставишь сколько нужно(например от 0 до 9000) и повторным нажатием OK подтверждаем выбор и перестаёт мигать, а следовательно, все вычисления уже будут идти с учётом выбранного "n". Козырно было бы если б ещё при долгом нажатии на кнопку "UP" или "DOWN" изменение числа происходило бы быстрее...а то с 9000 до 250 кнопка быстрее перестанет работать...или терпение :D

//библиотеки

#include <LiquidCrystal.h>


//------------------------------------------------------------------------------------------------------------------------------
//соединение платы с дисплеем
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);


//------------------------------------------------------------------------------------------------------------------------------
//кнопки
#define BTN_UP   1
#define BTN_DOWN 2
#define BTN_LEFT 3
#define BTN_RIGHT 4
#define BTN_OK 5
#define BTN_NONE 10

//------------------------------------------------------------------------------------------------------------------------------
//соединение платы с аксилирометром

const int osevaya = A1; //X акселерометра - А1

const int gorizont = A2; //Y акселерометра - А2

const int vertical = A3; //Z акселерометра - А3

//------------------------------------------------------------------------------------------------------------------------------
//определяем, какая кнопка нажата (А0)
int detectButton() {
  int keyAnalog =  analogRead(A0);
  if (keyAnalog < 100) {
    // Значение меньше 100 – нажата кнопка right
    return BTN_RIGHT;
  } else if (keyAnalog < 200) {
    // Значение больше 100 (иначе мы бы вошли в предыдущий блок результата сравнения, но меньше 200 – нажата кнопка UP
    return BTN_UP;
  } else if (keyAnalog < 400) {
    // Значение больше 200, но меньше 400 – нажата кнопка DOWN
    return BTN_DOWN;
  } else if (keyAnalog < 600) {
    // Значение больше 400, но меньше 600 – нажата кнопка LEFT
    return BTN_LEFT;
  } else if (keyAnalog < 800) {
    // Значение больше 600, но меньше 800 – нажата кнопка SELECT
    return BTN_OK;
  } else {
    // Все остальные значения (до 1023) будут означать, что нажатий не было
    return BTN_NONE;
  }
}


//------------------------------------------------------------------------------------------------------------------------------
//ПЕРИОД СЧИТЫВАНИЯ

int pause = 500;

//------------------------------------------------------------------------------------------------------------------------------
//переменные
float aX = 0; 
float aY = 0; 
float aZ = 0; 

float Gx = 0; //ускорение в м/сек2
float Gy = 0; //ускорение в м/сек2
float Gz = 0; //ускорение в м/сек2

float Vx = 0; //виброскорость в мм/с
float Vy = 0; //виброскорость в мм/с
float Vz = 0; //виброскорость в мм/с

float Vxm = 0; // модуль виброскорости
float Vym = 0; // модуль виброскорости
float Vzm = 0; // модуль виброскорости

float Sx = 0; //виброперемещение в мкм
float Sy = 0; //виброперемещение в мкм
float Sz = 0; //виброперемещение в мкм

int Sxm = 0; // модуль виброперемещения
int Sym = 0; // модуль виброперемещения
int Szm = 0; // модуль виброперемещения

float VskzX = 0; //виброскорость СКЗ
float VskzY = 0; //виброскорость СКЗ
float VskzZ = 0; //виброскорость СКЗ

float VskzXm = 0; //модуль виброскорости СКЗ
float VskzYm = 0; //модуль виброскорости СКЗ
float VskzZm = 0; //модуль виброскорости СКЗ

float SskzXm = 0; //модуль виброперемещения СКЗ
float SskzYm = 0; //модуль виброперемещения СКЗ
float SskzZm = 0; //модуль виброперемещения СКЗ

//-----------------------------------------------------------------------------------------
//Меняющаяся переменная

float f; // частота вращения в Гц (50 Гц = 3000 об/мин)
int n = 3000;

//-----------------------------------------------------------------------------------------

void setup() {  // подготовка
  // initialize serial communications at 9600 bps:
  Serial.begin(9600);
  // initialize lcd communications:
  lcd.begin(16, 2);
}
    
void loop() { // Работа

  f = n / 60; // частота вращения ротора

//-----------------------------------------------------------------------------------------
//Снимаем показания с аксилирометра

  aX = analogRead(gorizont); // Чтение параметра по оси X
  aY = analogRead(vertical); // Чтение параметра по оси Y
  aZ = analogRead(osevaya); // Чтение параметра по оси Z

  //52 это показание акселерометра в состоянии покоя от нулевой точки(пока в теории, для каких ниюудь наглядных данных

  Gx = (aX - 512) / 52; //Перевод параметра в виброускорение(м/с2) по оси X
  Gy = (aY - 512) / 52; //Перевод параметра в виброускорение(м/с2) по оси Y
  Gz = (aZ - 512) / 52; //Перевод параметра в виброускорение(м/с2) по оси Z

  //-----------------------------------------------------------------------------------------
  //Вычисление виброскорости

  Vx = 112.5 * Gx / f; //Перевод ускорения в виброскорость(мм/с) по оси X на определённой частоте
  Vy = 112.5 * Gy / f; //Перевод ускорения в виброскорость(мм/с) по оси Y на определённой частоте
  Vz = 112.5 * Gz / f; //Перевод ускорения в виброскорость(мм/с) по оси Z на определённой частоте

  Vxm = abs(Vx); //модуль значения
  Vym = abs(Vy); //модуль значения
  Vzm = abs(Vz); //модуль значения

  //-----------------------------------------------------------------------------------------
  //Вычисление виброперемещения

  Sx = 50712 * Gx / sq(f); //Перевод ускорения в виброперемещение(мкм) по оси X на определённой частоте
  Sy = 50712 * Gy / sq(f); //Перевод ускорения в виброперемещение(мкм) по оси Y на определённой частоте
  Sz = 50712 * Gz / sq(f); //Перевод ускорения в виброперемещение(мкм) по оси Z на определённой частоте

  Sxm = abs(Sx); //модуль значения
  Sym = abs(Sy); //модуль значения
  Szm = abs(Sz); //модуль значения

  

  //-----------------------------------------------------------------------------------------
  //Вычисление среднеквадратичных значений ??????????????????????????





  //--------------------------------------------------------------------------------------------
  //Вывод значений в порт

  Serial.print("Vxm = " );
  Serial.print(Vxm);

  Serial.print("  ");

  Serial.print("Vym = " );
  Serial.print(Vym);

  Serial.print("  ");

  Serial.print("Vzm = " );
  Serial.print(Vzm);
  
  Serial.print("  ");

  Serial.print("Sxm = " );
  Serial.print(Sxm);

  Serial.print("  ");

  Serial.print("Sym = " );
  Serial.print(Sym);

  Serial.print("  ");

  Serial.print("Szm = " );
  Serial.print(Szm);

  Serial.println();

  //Вывод значений на дисплей. Экран 1
  //Виброскорость - СКЗ
  //lcd.setCursor(0, 0);
  //lcd.print("Vibration mm/sec");

  //lcd.setCursor(0, 1);
  //lcd.print((float)Vxm,1);
  //lcd.setCursor(6, 1);
  //lcd.print((float)Vym,1);
  //lcd.setCursor(12, 1);
  //lcd.print((float)Vzm,1);
  
  //delay(pause);
  
  //lcd.setCursor(0, 1);
  //lcd.print("                ");
  
  //Вывод значений на дисплей. Экран 2
  //Виброперемещение - СКЗ

  //lcd.setCursor(0, 0);
  //lcd.print("Vibration mkm");

  //lcd.setCursor(0, 1);
  //lcd.print(Sxm);
  //lcd.setCursor(6, 1);
  //lcd.print(Sym);
  //lcd.setCursor(12, 1);
  //lcd.print(Szm);

  //delay(pause);

  //lcd.setCursor(0, 1);
  //lcd.print("                ");

  //Вывод значений на дисплей. Экран 3
  //Виброскорость на определённой частоте
  lcd.setCursor(0, 0);
  lcd.print("Speed=");
  lcd.setCursor(6, 0);
  lcd.print(n);

  
  lcd.setCursor(0, 1);
  lcd.print((float)Vxm,1);
  lcd.setCursor(5, 1);
  lcd.print((float)Vym,1);
  lcd.setCursor(11, 1);
  lcd.print((float)Vzm,1);

  delay(pause);

  lcd.setCursor(0, 1);
  lcd.print("                ");
 
  //--------------------------------------------------------------------------------------------
  

}

 

ЧБ
Offline
Зарегистрирован: 26.09.2020
MaksVV
Offline
Зарегистрирован: 06.08.2015

для начала научиться избавляться  от delay. Помигайте диодом без delay. потом переменной на экране, ну и далее по списку.  Слона едят по кускам. 

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