Универсальная кнопка
- Войдите на сайт для отправки комментариев
Вс, 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 сек переходит в режим установки и серфинга кол-ва лопастей, но вот не получается в расчетной части
И что? Если у Вас был какой-то вопрос, то Вы забыли его задать. Или Вы написали, просто, чтобы поставить нас в известность? Ну, тогда, принято к сведению :)
Вроде ясно написано что,
не получается в расчетной части
1
time=((
float
)(micros()-lastflash)*N/1000000);
2
lastflash=micros();
Менять (time*N) кол-во лопастей
т.е когда кнопка нахдиться в редиме установки то формула сама не меняется а остоётся прежней
Я вроде ясно спросил, вопрос то Ваш в чём??? ну, не получается у Вас, это мы приняли к сведению. У Вас есть к нам вопросы? Так задавайте. А нет, так и ладно, мы уже приняли к сведению, что у Вас что-то не получается.
Я вроде ясно спросил, вопрос то Ваш в чём??? ну, не получается у Вас, это мы приняли к сведению. У Вас есть к нам вопросы? Так задавайте. А нет, так и ладно, мы уже приняли к сведению, что у Вас что-то не получается.
Как связать настройку кол-ва лопастей с информацией отображаемой на дисплее,т.е. при смене в настройка на N лопастей выводила информацию на дисплее с откорректированной формулой.
Понятно :(
Вроде ясно написано что,
не получается в расчетной части
1
time=((
float
)(micros()-lastflash)*N/1000000);
2
lastflash=micros();
Менять (time*N) кол-во лопастей
т.е когда кнопка нахдиться в редиме установки то формула сама не меняется а остоётся прежней
возьмите свой код и внимательно пробегитесь по строчкам, исполняя их так, будто вы компьютер. Вы очень легко убедитесь, что в вашей программе N не меняется, сколько бы вы кнопку не нажимали и может быть равно только единице.