Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactored analog buttons out of the main #6

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
118 changes: 23 additions & 95 deletions firmware/notamesh4_gyver_v1.1/1main.ino
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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);
Expand All @@ -394,100 +392,29 @@ 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;
}
#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 */
Expand Down Expand Up @@ -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
}


Expand Down Expand Up @@ -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
Expand Down
115 changes: 115 additions & 0 deletions firmware/notamesh4_gyver_v1.1/analog_keys.h
Original file line number Diff line number Diff line change
@@ -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
23 changes: 2 additions & 21 deletions firmware/notamesh4_gyver_v1.1/notamesh4_gyver_v1.1.ino
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down