Универсальная кнопка
- Войдите на сайт для отправки комментариев
Вс, 14/04/2019 - 19:14
В общем условия создать программу для управления одной уневерсальной кнопкой. При обычном зажатии кнопки идет перелистывание экранов, при удержании её больше 2 сек переходит в режим установки и серфинга кол-ва лопастей, но вот не получается в расчетной части
time=((float)(micros()-lastflash)*N/1000000); lastflash=micros();
Менять (time*N) кол-во лопастей
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20, 16, 2);
#include <Servo.h> //библиотека серво (стандартная)
Servo servo; //объявить серво назвать servo
const uint8_t PIN_button_SET = 4; //универсальная кнопка
uint8_t VAR_mode_SHOW = 1; //вывод экранов
uint8_t VAR_mode_SET = 0; //установка кол-ва оборотов
// unsigned long timing; //хранение времени отсчета для автоматиеской смены
unsigned long lastflash;
int RPM, pos;
unsigned int min_pos=0; //минимальная частота оборотов
unsigned int max_pos=1500; //максимальная частота оборотов
volatile float time = 0;
volatile int rpm_array[5] = {0,0,0,0,0};
//volatile float time = 0; время
//volatile int rpm_array[5] = {0,0,0,0,0}; массив для сглаживания значений
// volatile float time = 0;
// volatile float time_last = 0;
void setup() {
pinMode(PIN_button_SET, INPUT);
lcd.init();
lcd.backlight();
lcd.print("Current RPM:");
attachInterrupt(0 ,sens, FALLING); //подключить прерывание на 2 пин при повышении сигнала
servo.attach(7); //серво на 7 порту
void custom1() // выбор кол-ва лопастей
{
lcd.setCursor(0,0);
lcd.print("number of blades:1");
time=((float)(micros()-lastflash)/1000000);
lastflash=micros();
}
void custom2()
{
lcd.setCursor(0,0);
lcd.print("number of blades:2");
time=((float)(micros()-lastflash)*2/1000000);
lastflash=micros();
}
void custom3()
{
lcd.setCursor(0,0);
lcd.print("number of blades:3");
lcd.print();
time=((float)(micros()-lastflash)*3/1000000);
lastflash=micros();
}
void custom4()
{
lcd.setCursor(0,0);
lcd.print("number of blades:4");
time=((float)(micros()-lastflash)*4/1000000);
lastflash=micros();
}
void custom5()
{
lcd.setCursor(0,0);
lcd.print("number of blades:5");
time=((float)(micros()-lastflash)*5/1000000);
lastflash=micros();
}
void custom6()
{
lcd.setCursor(0,0);
lcd.print("number of blades:6");
time=((float)(micros()-lastflash)*6/1000000);
lastflash=micros();
}
void custom7()
{
lcd.setCursor(0,0);
lcd.print("number of blades:7");
time=((float)(micros()-lastflash)*7/1000000);
lastflash=micros();
}
void sens() {
time=((float)(micros()-lastflash)/1000000);
lastflash=micros();}
}
void loop() {
show_screen();
}
void show_screen() {
pos=map(RPM, min_pos, max_pos, 0, 180); //перевести значение от минимума до максимума в угол поворота сервы (от 0 до 180)
servo.write(pos); //повернуть серву
if (VAR_mode_SHOW == 1){
lcd.setCursor(0, 0);
lcd.print("Current RPM: ");
lcd.print(custom(x));
if ((micros()-lastflash)>1000000){ //если сигнала нет больше секунды
RPM=0; //считаем что RPM 0
}
while(1){ //сглаживание данных
if(time > 0)
{ rpm_array[0] = rpm_array[1];
rpm_array[1] = rpm_array[2];
rpm_array[2] = rpm_array[3];
rpm_array[3] = rpm_array[4];
rpm_array[4] = 60*(1000000/(time)); // (time*N) кол-во лопастей
RPM = (rpm_array[0] + rpm_array[1] + rpm_array[2] + rpm_array[3] + rpm_array[4]) / 5;
}
}
} }
if (VAR_mode_SHOW == 2){
lcd. setCursor(1, 1);
lcd. print("TEXT HERE");
}
Func_buttons_control(); // настройка лопастей кнопкой
}
void Func_buttons_control(){
uint8_t i = 0;
if (VAR_mode_SET) {
if (digitalRead(PIN_button_SET)){
while (digitalRead(PIN_button_SET)){
delay(50);}
switch (VAR_mode_SET){
case 1:custom1();break;
case 2:custom2();break;
case 3:custom3();break;
case 4:custom4();break;
case 5:custom5();break;
case 6:custom6();break;
case 7:custom7();break;
}
}
if (digitalRead(PIN_button_SET)){
while (digitalRead(PIN_button_SET)){
delay(10); // Ждем
if (i < 200) // Если переменная i меньше 200, то...
{i++;}
else {lcd.clear();}
// VAR_mode_SET = 0;}
}
if (i < 200){
VAR_mode_SET++; // Переходим к следующему устанавливаемому параметру
if (VAR_mode_SET > 7){
VAR_mode_SET = 1;
}
}else{ VAR_mode_SET = 0; // Выходим из режима установки
}
}
}
else {
if (digitalRead(PIN_button_SET)) {
while (digitalRead(PIN_button_SET)){ // Ждём когда отпустим кнопку SET
delay(10); // Ждем
if (i < 200) // Если переменная i меньше 200, то...
{ i++; } else // Если кнопка SET нажата дольше 2 секунд, то...
{ lcd.clear(); } // Очищаем экран
}
if (i < 200) // Если кнопка SET удерживалась меньше 2 секунд
{
lcd.clear(); // Очищаем экран
VAR_mode_SHOW++; // Листаем экраны
if (VAR_mode_SHOW > 2) //
{ VAR_mode_SHOW = 1;} }// Отображаем 1 экран
else {// Если кнопка SET удерживалась дольше 2 секунд, то...
VAR_mode_SET = 1; }// Переходим в режим установки
}
}
}
В общем условия создать программу для управления одной уневерсальной кнопкой. При обычном зажатии кнопки идет перелистывание экранов, при удержании её больше 2 сек переходит в режим установки и серфинга кол-ва лопастей, но вот не получается в расчетной части
И что? Если у Вас был какой-то вопрос, то Вы забыли его задать. Или Вы написали, просто, чтобы поставить нас в известность? Ну, тогда, принято к сведению :)
Вроде ясно написано что,
не получается в расчетной части
1time=((float)(micros()-lastflash)*N/1000000);2lastflash=micros();Менять (time*N) кол-во лопастей
т.е когда кнопка нахдиться в редиме установки то формула сама не меняется а остоётся прежней
Я вроде ясно спросил, вопрос то Ваш в чём??? ну, не получается у Вас, это мы приняли к сведению. У Вас есть к нам вопросы? Так задавайте. А нет, так и ладно, мы уже приняли к сведению, что у Вас что-то не получается.
Я вроде ясно спросил, вопрос то Ваш в чём??? ну, не получается у Вас, это мы приняли к сведению. У Вас есть к нам вопросы? Так задавайте. А нет, так и ладно, мы уже приняли к сведению, что у Вас что-то не получается.
Как связать настройку кол-ва лопастей с информацией отображаемой на дисплее,т.е. при смене в настройка на N лопастей выводила информацию на дисплее с откорректированной формулой.
Понятно :(
Вроде ясно написано что,
не получается в расчетной части
1time=((float)(micros()-lastflash)*N/1000000);2lastflash=micros();Менять (time*N) кол-во лопастей
т.е когда кнопка нахдиться в редиме установки то формула сама не меняется а остоётся прежней
возьмите свой код и внимательно пробегитесь по строчкам, исполняя их так, будто вы компьютер. Вы очень легко убедитесь, что в вашей программе N не меняется, сколько бы вы кнопку не нажимали и может быть равно только единице.