Универсальная кнопка

DegKL
Offline
Зарегистрирован: 14.04.2019

В общем условия создать программу для управления одной уневерсальной кнопкой. При обычном зажатии кнопки идет перелистывание экранов, при удержании её больше 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; }// Переходим в режим установки 
}
}
      
                 }

 

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

DegKL пишет:

В общем условия создать программу для управления одной уневерсальной кнопкой. При обычном зажатии кнопки идет перелистывание экранов, при удержании её больше 2 сек переходит в режим установки и серфинга кол-ва лопастей, но вот не получается в расчетной части

И что? Если у Вас был какой-то вопрос, то Вы забыли его задать. Или Вы написали, просто, чтобы поставить нас в известность? Ну, тогда, принято к сведению :)

DegKL
Offline
Зарегистрирован: 14.04.2019

Вроде ясно написано что,

не получается в расчетной части

1 time=((float)(micros()-lastflash)*N/1000000); 
2   lastflash=micros();

Менять (time*N) кол-во лопастей

т.е когда кнопка нахдиться в редиме установки то формула сама не меняется а остоётся прежней

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Я вроде ясно спросил, вопрос то Ваш в чём??? ну, не получается у Вас, это мы приняли к сведению. У Вас есть к нам вопросы? Так задавайте. А нет, так и ладно, мы уже приняли к сведению, что у Вас что-то не получается.

DegKL
Offline
Зарегистрирован: 14.04.2019

ЕвгенийП пишет:

Я вроде ясно спросил, вопрос то Ваш в чём??? ну, не получается у Вас, это мы приняли к сведению. У Вас есть к нам вопросы? Так задавайте. А нет, так и ладно, мы уже приняли к сведению, что у Вас что-то не получается.

Как связать настройку кол-ва лопастей с информацией отображаемой на дисплее,т.е. при смене в настройка на N лопастей выводила информацию на дисплее с откорректированной формулой.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Понятно :(

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

DegKL пишет:

Вроде ясно написано что,

не получается в расчетной части

1 time=((float)(micros()-lastflash)*N/1000000); 
2   lastflash=micros();

Менять (time*N) кол-во лопастей

т.е когда кнопка нахдиться в редиме установки то формула сама не меняется а остоётся прежней

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