Переключение между страницами кнопками
- Войдите на сайт для отправки комментариев
Добрый всем день/ночь.
История такова:
Не догоняю вроде бы простых вещей, 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(" ");
//--------------------------------------------------------------------------------------------
}
для начала научиться избавляться от delay. Помигайте диодом без delay. потом переменной на экране, ну и далее по списку. Слона едят по кускам.
и вообще странный вопрос "как". детский прям. для этого нужно научиться хоть немного программировать. И такие вопросы станут не актуальны. А ещё можно сделать за деньги, обратившись в ищу исполнителя.