diff --git a/firmware/notamesh4_gyver_v1.1/1main.ino b/firmware/notamesh4_gyver_v1.1/1main.ino index c471152..307dee6 100644 --- a/firmware/notamesh4_gyver_v1.1/1main.ino +++ b/firmware/notamesh4_gyver_v1.1/1main.ino @@ -19,10 +19,8 @@ #endif #if KEY_ON == 1 //Для аналоговых кнопок -int key_input = 0; //Последнее нажатие кнопки -int key_input_new; //только что пришедьшее нажатие кнопки -bool key_bounce = 0; //для антидребезга -uint32_t key_time; //время последнего нажатия +#include "analog_keys.h" +Analog_Keys_t analog_keys; #endif #if IR_ON == 1 @@ -178,7 +176,7 @@ GButton btn(BTN_PIN); void setup() { #if KEY_ON == 1 - pinMode(PIN_KEY, INPUT); //Для аналоговых кнопок + analog_keys_setup(); //Для аналоговых кнопок #endif #if LOG_ON == 1 @@ -349,13 +347,13 @@ void loop() { Serial.print(F("New Palette: ")); Serial.println(gCurrentPaletteNumber); #endif } - gTargetPalette = gGradientPalettes[gCurrentPaletteNumber]; // We're just ensuring that the gTargetPalette WILL be assigned. + gTargetPalette = gGradientPalettes[gCurrentPaletteNumber]; // We're just ensuring that the gTargetPalette WILL be assigned. } } #endif #if DIRECT_TIME > 0 - EVERY_N_SECONDS(DIRECT_TIME) { // Меняем направление + EVERY_N_SECONDS(DIRECT_TIME) { // Меняем направление thisdir = thisdir * -1; } #endif @@ -371,14 +369,14 @@ void loop() { #if CHANGE_SPARK == 4 sparkler(rand_spark); #else - sparkler(CHANGE_SPARK); // бенгальский огонь + sparkler(CHANGE_SPARK); // бенгальский огонь #endif } #endif } #if CHANGE_ON == 1 - EVERY_N_MILLISECONDS(CHANGE_TIME * 1000 / NUM_LEDS) { // Движение плавной смены эффектов + EVERY_N_MILLISECONDS(CHANGE_TIME * 1000 / NUM_LEDS) { // Движение плавной смены эффектов if ( StepMode < NUM_LEDS) { StepMode++; if (StepMode == 10) strobe_mode(newMode, 1); @@ -394,92 +392,21 @@ void loop() { } #endif - if (glitter) addglitter(10); // If the glitter flag is set, let's add some. + if (glitter) addglitter(10); // If the glitter flag is set, let's add some. #if CANDLE_KOL >0 if (candle) addcandle(); #endif - if (background) addbackground(); // Включить заполнение черного цвета фоном + if (background) addbackground(); // Включить заполнение черного цвета фоном } -#if KEY_ON == 1 //Для аналоговых кнопок - key_input_new = analogRead(PIN_KEY); //прочитаем аналоговые кнопки - if ( ( ( (key_input - KEY_DELTA) > key_input_new) || //Пришло новое значение отличное от прошлого - ( (key_input + KEY_DELTA) < key_input_new) ) && - !key_bounce ) { // и еще ничего не приходило - key_bounce = 1; //Начинаем обрабатывать - key_time = millis(); //Запомним время - } - else if ( key_bounce && //Обрабатываем нажатия - ((millis() - key_time) >= 50 ) ) { //Закончилось время дребезга - key_bounce = 0; //Больше не обрабатываем - key_input = key_input_new; -#if LOG_ON == 1 - Serial.print(F("Analog Key: ")); Serial.println(key_input); -#endif - -#if KEY_0 >= KEY_DELTA - if ( ( (KEY_0 - KEY_DELTA) < key_input) && - ( (KEY_0 + KEY_DELTA) > key_input) ) { //Нашли нажатую кнопку KEY_0 - Protocol = 1; - Command = KEY_0; - } -#endif -#if KEY_1 >= KEY_DELTA - if ( ( (KEY_1 - KEY_DELTA) < key_input) && - ( (KEY_1 + KEY_DELTA) > key_input) ) { //Нашли нажатую кнопку KEY_1 - Protocol = 1; - Command = KEY_1; - } -#endif -#if KEY_2 >= KEY_DELTA - if ( ( (KEY_2 - KEY_DELTA) < key_input) && - ( (KEY_2 + KEY_DELTA) > key_input) ) { //Нашли нажатую кнопку KEY_2 - Protocol = 1; - Command = KEY_2; - } -#endif -#if KEY_3 >= KEY_DELTA - if ( ( (KEY_3 - KEY_DELTA) < key_input) && - ( (KEY_3 + KEY_DELTA) > key_input) ) { //Нашли нажатую кнопку KEY_3 - Protocol = 1; - Command = KEY_3; - } -#endif -#if KEY_4 >= KEY_DELTA - if ( ( (KEY_4 - KEY_DELTA) < key_input) && - ( (KEY_4 + KEY_DELTA) > key_input) ) { //Нашли нажатую кнопку KEY_4 - Protocol = 1; - Command = KEY_4; - } -#endif -#if KEY_5 >= KEY_DELTA - if ( ( (KEY_5 - KEY_DELTA) < key_input) && - ( (KEY_5 + KEY_DELTA) > key_input) ) { //Нашли нажатую кнопку KEY_5 - Protocol = 1; - Command = KEY_5; - } -#endif -#if KEY_6 >= KEY_DELTA - if ( ( (KEY_6 - KEY_DELTA) < key_input) && - ( (KEY_6 + KEY_DELTA) > key_input) ) { //Нашли нажатую кнопку KEY_6 - Protocol = 1; - Command = KEY_6; - } -#endif -#if KEY_7 >= KEY_DELTA - if ( ( (KEY_7 - KEY_DELTA) < key_input) && - ( (KEY_7 + KEY_DELTA) > key_input) ) { //Нашли нажатую кнопку KEY_7 - Protocol = 1; - Command = KEY_7; - } -#endif - } +#if KEY_ON == 1 // Для аналоговых кнопок + analog_keys_tick(&analog_keys, &Protocol, &Command); #endif -#if ( IR_ON == 1 || KEY_ON == 1 || USE_BTN == 1 ) - if ( (IR_Time_Mode > 0) && //Идет отчет времени - ((millis() - IR_Time_Mode) >= 2000 ) ) { //И прошло больше 2 секунд +#if (IR_ON == 1 || KEY_ON == 1 || USE_BTN == 1) + if ((IR_Time_Mode > 0) && // Идет отчет времени + ((millis() - IR_Time_Mode) >= 2000)) { // И прошло больше 2 секунд IR_Time_Mode = 0; if (IR_New_Mode <= maxMode) SetMode(IR_New_Mode); IR_New_Mode = 0; @@ -487,7 +414,7 @@ void loop() { #endif #if IR_ON == 1 - while (!irrecv.isIdle()); // if not idle, wait till complete + while (!irrecv.isIdle()); // if not idle, wait till complete if (irrecv.decode(&results)) { /* respond to button */ @@ -520,16 +447,17 @@ void strobe_mode(uint8_t mode, bool mc) { // mc stands for 'Mod if (mc) { fill_solid(leds, NUM_LEDS, CRGB(0, 0, 0)); // Clean up the array for the first time through. Don't show display though, so you may have a smooth transition. -#if LOG_ON == 1 +# if LOG_ON == 1 Serial.print(F("Mode: ")); Serial.println(mode); Serial.println(millis()); -#endif -#if PALETTE_TIME>0 +# endif + +# if PALETTE_TIME>0 if (palchg == 0) palchg = 3; -#else +# else if (palchg == 0) palchg = 1; -#endif +# endif } @@ -876,8 +804,8 @@ void strobe_mode(uint8_t mode, bool mc) { // mc stands for 'Mod case 100: if (mc) { palchg = 0; } fill_solid(leds, NUM_LEDS, solid); break; //Установить цвет - case 200: fill_solid(leds, MAX_LEDS, CRGB::Black); fill_solid(leds, NUM_LEDS, CRGB(255, 255, 255)); break; //Зажеч гирлянду длинной NUM_LEDS (регулировка длинны гирлянды) - case 201: fill_solid(leds, MAX_LEDS, CRGB::Black); fill_solid(leds, meshdelay, CRGB(255, 255, 255)); break; //Зажеч гирлянду длинной meshdelay + case 200: fill_solid(leds, MAX_LEDS, CRGB::Black); fill_solid(leds, NUM_LEDS, CRGB(255, 255, 255)); break; //Зажечь гирлянду длинной NUM_LEDS (регулировка длинны гирлянды) + case 201: fill_solid(leds, MAX_LEDS, CRGB::Black); fill_solid(leds, meshdelay, CRGB(255, 255, 255)); break; //Зажечь гирлянду длинной meshdelay default : ledMode = 0; break; //нет такого режима принудительно ставим нулевой } // switch mode diff --git a/firmware/notamesh4_gyver_v1.1/analog_keys.h b/firmware/notamesh4_gyver_v1.1/analog_keys.h new file mode 100644 index 0000000..9ebfa01 --- /dev/null +++ b/firmware/notamesh4_gyver_v1.1/analog_keys.h @@ -0,0 +1,115 @@ +#ifndef _ANALOG_KEYS_H +#define _ANALOG_KEYS_H + +#define _PIN_KEY A3 +#ifndef PIN_KEY +#define PIN_KEY _PIN_KEY +#endif + +//Зачения смотреть в протоколе после строки Analog Key +#define KEY_0 10 // Значение соответствующее нажатой 0 кнопке +// если значение меньше KEY_DELTA, то кнопка не используется +#define KEY_1 70 // Значение соответствующее нажатой 1 кнопке +// если значение меньше KEY_DELTA, то кнопка не используется +#define KEY_2 140 // Значение соответствующее нажатой 2 кнопке +// если значение меньше KEY_DELTA, то кнопка не используется +#define KEY_3 280 // Значение соответствующее нажатой 3 кнопке +// если значение меньше KEY_DELTA, то кнопка не используется +#define KEY_4 360 // Значение соответствующее нажатой 4 кнопке +// если значение меньше KEY_DELTA, то кнопка не используется +#define KEY_5 520 // Значение соответствующее нажатой 5 кнопке +// если значение меньше KEY_DELTA, то кнопка не используется +#define KEY_6 700 // Значение соответствующее нажатой 6 кнопке +// если значение меньше KEY_DELTA, то кнопка не используется +#define KEY_7 900 // Значение соответствующее нажатой 7 кнопке +// если значение меньше KEY_DELTA, то кнопка не используется +#define KEY_DELTA 5 // погрешность значения кнопки, тоесть от -KEY_DELTA до +KEY_DELTA + +typedef struct { + int input; // Последнее нажатие кнопки + int input_new; // только что пришедшее нажатие кнопки + bool bounce; // для антидребезга + uint32_t key_time; // время последнего нажатия +} Analog_Keys_t; + +void analog_keys_setup() { + pinMode(PIN_KEY, INPUT); +} + +void analog_keys_tick(Analog_Keys_t *analog_keys, uint8_t *protocol, uint32_t *command) { + analog_keys->input_new = analogRead(PIN_KEY); //прочитаем аналоговые кнопки + if ((((analog_keys->input - KEY_DELTA) > analog_keys->input_new) || //Пришло новое значение отличное от прошлого + ((analog_keys->input + KEY_DELTA) < analog_keys->input_new)) && + !analog_keys->bounce) { // и еще ничего не приходило + analog_keys->bounce = 1; //Начинаем обрабатывать + analog_keys->key_time = millis(); //Запомним время + } + else if (analog_keys->bounce && //Обрабатываем нажатия + ((millis() - analog_keys->key_time) >= 50)) { //Закончилось время дребезга + analog_keys->bounce = 0; //Больше не обрабатываем + analog_keys->input = analog_keys->input_new; +#if LOG_ON == 1 + Serial.print(F("Analog Key: ")); + Serial.println(analog_keys->input); +#endif + +#if KEY_0 >= KEY_DELTA + if (((KEY_0 - KEY_DELTA) < analog_keys->input) && + ((KEY_0 + KEY_DELTA) > analog_keys->input)) { //Нашли нажатую кнопку KEY_0 + *protocol = 1; + *command = KEY_0; + } +#endif +#if KEY_1 >= KEY_DELTA + if (((KEY_1 - KEY_DELTA) < analog_keys->input) && + ((KEY_1 + KEY_DELTA) > analog_keys->input)) { //Нашли нажатую кнопку KEY_1 + *protocol = 1; + *command = KEY_1; + } +#endif +#if KEY_2 >= KEY_DELTA + if (((KEY_2 - KEY_DELTA) < analog_keys->input) && + ((KEY_2 + KEY_DELTA) > analog_keys->input)) { //Нашли нажатую кнопку KEY_2 + *protocol = 1; + *command = KEY_2; + } +#endif +#if KEY_3 >= KEY_DELTA + if (((KEY_3 - KEY_DELTA) < analog_keys->input) && + ((KEY_3 + KEY_DELTA) > analog_keys->input)) { //Нашли нажатую кнопку KEY_3 + *protocol = 1; + *command = KEY_3; + } +#endif +#if KEY_4 >= KEY_DELTA + if (((KEY_4 - KEY_DELTA) < analog_keys->input) && + ((KEY_4 + KEY_DELTA) > analog_keys->input)) { //Нашли нажатую кнопку KEY_4 + *protocol = 1; + *command = KEY_4; + } +#endif +#if KEY_5 >= KEY_DELTA + if (((KEY_5 - KEY_DELTA) < analog_keys->input) && + ((KEY_5 + KEY_DELTA) > analog_keys->input)) { //Нашли нажатую кнопку KEY_5 + *protocol = 1; + *command = KEY_5; + } +#endif +#if KEY_6 >= KEY_DELTA + if (((KEY_6 - KEY_DELTA) < analog_keys->input) && + ((KEY_6 + KEY_DELTA) > analog_keys->input)) { //Нашли нажатую кнопку KEY_6 + *protocol = 1; + *command = KEY_6; + } +#endif +#if KEY_7 >= KEY_DELTA + if (((KEY_7 - KEY_DELTA) < analog_keys->input) && + ((KEY_7 + KEY_DELTA) > analog_keys->input)) { //Нашли нажатую кнопку KEY_7 + *protocol = 1; + *command = KEY_7; + } +#endif + } +} + +#endif diff --git a/firmware/notamesh4_gyver_v1.1/notamesh4_gyver_v1.1.ino b/firmware/notamesh4_gyver_v1.1/notamesh4_gyver_v1.1.ino index 4f522d8..d750f36 100644 --- a/firmware/notamesh4_gyver_v1.1/notamesh4_gyver_v1.1.ino +++ b/firmware/notamesh4_gyver_v1.1/notamesh4_gyver_v1.1.ino @@ -73,9 +73,9 @@ #define GLITER_ON 1 // Включить блеск 0 - блеск отключен, 1- блеск включен -#define CANDLE_KOL 3 // если больше 0 то будут включена эмитация свечей +#define CANDLE_KOL 3 // если больше 0 то будут включена имитация свечей // число задает через какое расстояние друг от друга располагать свечи -#define CANDLE_ON 0 // Если включена эмитация свечей то 1 = при запуске она будет включена +#define CANDLE_ON 0 // Если включена имитация свечей то 1 = при запуске она будет включена // 0 = при запуске она будет выключена #define CANDLE_40 1 // Управление 40 эффектом (свечи) 1 = при запуске она будет включена по варианту efimova1969 @@ -113,25 +113,6 @@ #define KEY_ON 0 // Если равен 1 используются кнопки подключенные к аналоговому входу #define PIN_KEY A3 // Номер пина, куда подключены кнопки -//Зачения смотреть в протоколе после строки Analog Key -#define KEY_0 10 // Значение соответствующее нажатой 0 кнопке -// если значение меньше KEY_DELTA, то кнопка не используется -#define KEY_1 70 // Значение соответствующее нажатой 1 кнопке -// если значение меньше KEY_DELTA, то кнопка не используется -#define KEY_2 140 // Значение соответствующее нажатой 2 кнопке -// если значение меньше KEY_DELTA, то кнопка не используется -#define KEY_3 280 // Значение соответствующее нажатой 3 кнопке -// если значение меньше KEY_DELTA, то кнопка не используется -#define KEY_4 360 // Значение соответствующее нажатой 4 кнопке -// если значение меньше KEY_DELTA, то кнопка не используется -#define KEY_5 520 // Значение соответствующее нажатой 5 кнопке -// если значение меньше KEY_DELTA, то кнопка не используется -#define KEY_6 700 // Значение соответствующее нажатой 6 кнопке -// если значение меньше KEY_DELTA, то кнопка не используется -#define KEY_7 900 // Значение соответствующее нажатой 7 кнопке -// если значение меньше KEY_DELTA, то кнопка не используется -#define KEY_DELTA 5 // погрешность значения кнопки, тоесть от -KEY_DELTA до +KEY_DELTA - //Тип пульта на который будет реагировать устройство, ставим 1 у того который используется //это уменьшит используемую память //Чтобы узнать имя пульта запустите в примерах IRremote / IRrecvDump