Собственно на тот удивительный случай, если кому-то надо и на (более вероятный) случай потери исходников - исходники
#include <EEPROM.h>
#define BUTTONS_COUNT 2
#define START_BUTTON_PIN 10
#define LAST_BUTTON_PIN (START_BUTTON_PIN + BUTTONS_COUNT - 1)
#define LONG_PRESS_LOOPS 25
#define ANALOG_READ_PIN 0
#define ANALOG_WRITE_PIN 9
// states
#define STATE_WAIT 0
#define STATE_PRESSED STATE_WAIT + 1
#define STATE_LONG_PRESSED STATE_PRESSED + 1
int curButton = START_BUTTON_PIN;
int pressedButton;
int curState = STATE_WAIT;
int loop_count = 0;
int values[BUTTONS_COUNT];
int defaults[6] = {0, 84, 127, 160, 190, 255};
void setup()
{
// init eeprom
pinMode(START_BUTTON_PIN, INPUT);
digitalWrite(START_BUTTON_PIN, HIGH);
if (digitalRead(START_BUTTON_PIN) == LOW) {
for (int x = 0; x < BUTTONS_COUNT; x++) {
EEPROM.write(x, defaults[x]);
}
}
while (digitalRead(START_BUTTON_PIN) == LOW);
for (int x = 0; x < BUTTONS_COUNT; x++) {
values[x] = EEPROM.read(x);
}
pinMode(curButton, OUTPUT);
digitalWrite(curButton, LOW);
TCCR1B = 0x01; // magic :)
delay(100);
}
void loop()
{
switch (curState) {
case STATE_WAIT: {
for (int x = START_BUTTON_PIN; x <= LAST_BUTTON_PIN; x++) {
pinMode(x, INPUT);
digitalWrite(x, HIGH);
if (digitalRead(x) == LOW) {
curState = STATE_PRESSED;
pressedButton = x;
loop_count = 0;
break;
} else {
pinMode(curButton, OUTPUT);
digitalWrite(curButton, LOW);
}
}
}
break;
case STATE_PRESSED: {
if (++loop_count > LONG_PRESS_LOOPS) {
curState = STATE_LONG_PRESSED;
}
}
case STATE_LONG_PRESSED: {
pinMode(pressedButton, INPUT);
if (digitalRead(pressedButton) == HIGH) {
curButton = pressedButton;
if (curState == STATE_LONG_PRESSED) {
int r = analogRead(ANALOG_READ_PIN) >> 2;
values[curButton - START_BUTTON_PIN] = r;
EEPROM.write(curButton - START_BUTTON_PIN, r);
}
curState = STATE_WAIT;
pressedButton = 0;
for (int x = START_BUTTON_PIN; x <= LAST_BUTTON_PIN; x++) {
if (x != curButton) {
pinMode(x, INPUT);
digitalWrite(x, HIGH);
} else {
pinMode(x, OUTPUT);
digitalWrite(x, LOW);
}
}
}
}
break;
}
analogWrite (ANALOG_WRITE_PIN, values[curButton - START_BUTTON_PIN]);
delay(20);
}
Собственно и схемы не нужно - и так все понятно думаю; кнопки подключаем, начиная с D10 вывода ардуины; провод (средний) к переменному резистору, которым жертвуем, разрезается, и та часть, которая к резистору, подключается к А0, тот провод, который идет “в аппу” - к D9
Крутилка используется для настройки - какое значение выдается после нажатия каждой кнопки
При первом запуске надо зажать и держать первую кнопку - тогда в память запишуться значения по умолчанию
Если надо поменять значение - держим кнопку и крутим крутилку, отпустили - значение крутилки запомнилось, все
Чето не совсем понял.😵
Это типа переключалки для АРМ?
С потенциометром?
А можно все таки схемку?
дык в предыдущих записях дневника написано, вроди как
Завтра будет схема;я на работе пытался нарисовать, думал плату сделать, но забил ; но схемка есть
Но вообще по “словесному описанию” и исходнику можно все сделать (или это мне кажется, что понятно)
С жертвенным переменником классно придумали!
Следующая версия, видимо, будет такой: аноды всех светодиодов запитаны через один резистор (типа экономим пять резюков). Светодиоды управляются ШИМом. Это позволит настроить одинаковую яркость светодиодов разных цветов а также замутить ночной и дневной режим свечения.
{"assets_hash":"a8b26fa7f6e768b07a72c8c9aadb9422","page_data":{"users":{"424810383df9550077791832":{"_id":"424810383df9550077791832","hid":6663,"name":"Pacific","nick":"Pacific","avatar_id":null,"css":""},"4683d68c3df9550077783119":{"_id":"4683d68c3df9550077783119","hid":24868,"name":"HATUUL","nick":"HATUUL","avatar_id":null,"css":""},"4f65b7b03df9550077746b36":{"_id":"4f65b7b03df9550077746b36","hid":116276,"name":"kostya-tin","nick":"kostya-tin","avatar_id":null,"css":""},"51cf6e553df9550077735006":{"_id":"51cf6e553df9550077735006","hid":161340,"name":"fat_hamster","nick":"fat_hamster","avatar_id":null,"css":""}},"settings":{"blogs_can_create":false,"blogs_mod_can_delete":false,"blogs_mod_can_hard_delete":false,"blogs_mod_can_add_infractions":false,"can_report_abuse":false,"can_vote":false,"can_see_ip":false,"blogs_edit_comments_max_time":30,"blogs_show_ignored":false,"blogs_reply_old_comment_threshold":30,"votes_add_max_time":168},"entry":{"_id":"53e4d43599707300771103cf","hid":19226,"title":"Контроллер полетных режимов - прошивка","html":"<p>Собственно на тот удивительный случай, если кому-то надо и на (более вероятный) случай потери исходников - исходники</p>\n<!--cut-->\n<pre class=\"hljs\"><code>\n#include <EEPROM.h>\n\n#define BUTTONS_COUNT 2\n#define START_BUTTON_PIN 10\n#define LAST_BUTTON_PIN (START_BUTTON_PIN + BUTTONS_COUNT - 1)\n#define LONG_PRESS_LOOPS 25\n#define ANALOG_READ_PIN 0\n#define ANALOG_WRITE_PIN 9\n\n// states\n#define STATE_WAIT 0\n#define STATE_PRESSED STATE_WAIT + 1\n#define STATE_LONG_PRESSED STATE_PRESSED + 1\n\nint curButton = START_BUTTON_PIN;\nint pressedButton;\nint curState = STATE_WAIT;\nint loop_count = 0;\nint values[BUTTONS_COUNT];\nint defaults[6] = {0, 84, 127, 160, 190, 255};\n\nvoid setup()\n{\n // init eeprom\n pinMode(START_BUTTON_PIN, INPUT);\n digitalWrite(START_BUTTON_PIN, HIGH);\n if (digitalRead(START_BUTTON_PIN) == LOW) {\n for (int x = 0; x < BUTTONS_COUNT; x++) {\n EEPROM.write(x, defaults[x]);\n }\n }\n while (digitalRead(START_BUTTON_PIN) == LOW);\n\n for (int x = 0; x < BUTTONS_COUNT; x++) {\n values[x] = EEPROM.read(x);\n }\n\n pinMode(curButton, OUTPUT);\n digitalWrite(curButton, LOW);\n\n TCCR1B = 0x01; // magic :)\n delay(100);\n}\n\nvoid loop()\n{\n switch (curState) {\n case STATE_WAIT: {\n for (int x = START_BUTTON_PIN; x <= LAST_BUTTON_PIN; x++) {\n pinMode(x, INPUT);\n digitalWrite(x, HIGH);\n if (digitalRead(x) == LOW) {\n curState = STATE_PRESSED;\n pressedButton = x;\n loop_count = 0;\n break;\n } else {\n pinMode(curButton, OUTPUT);\n digitalWrite(curButton, LOW);\n }\n }\n }\n break;\n case STATE_PRESSED: {\n if (++loop_count > LONG_PRESS_LOOPS) {\n curState = STATE_LONG_PRESSED;\n }\n }\n case STATE_LONG_PRESSED: {\n pinMode(pressedButton, INPUT);\n if (digitalRead(pressedButton) == HIGH) {\n curButton = pressedButton;\n if (curState == STATE_LONG_PRESSED) {\n int r = analogRead(ANALOG_READ_PIN) >> 2;\n values[curButton - START_BUTTON_PIN] = r;\n EEPROM.write(curButton - START_BUTTON_PIN, r);\n }\n curState = STATE_WAIT;\n pressedButton = 0;\n for (int x = START_BUTTON_PIN; x <= LAST_BUTTON_PIN; x++) {\n if (x != curButton) {\n pinMode(x, INPUT);\n digitalWrite(x, HIGH);\n } else {\n pinMode(x, OUTPUT);\n digitalWrite(x, LOW);\n }\n }\n }\n }\n break;\n }\n analogWrite (ANALOG_WRITE_PIN, values[curButton - START_BUTTON_PIN]);\n delay(20);\n}\n\n</code></pre>\n<p>Собственно и схемы не нужно - и так все понятно думаю; кнопки подключаем, начиная с D10 вывода ардуины; провод (средний) к переменному резистору, которым жертвуем, разрезается, и та часть, которая к резистору, подключается к А0, тот провод, который идет “в аппу” - к D9</p>\n<p>Крутилка используется для настройки - какое значение выдается после нажатия каждой кнопки</p>\n<p>При первом запуске надо зажать и держать первую кнопку - тогда в память запишуться значения по умолчанию</p>\n<p>Если надо поменять значение - держим кнопку и крутим крутилку, отпустили - значение крутилки запомнилось, все</p>\n","user":"51cf6e553df9550077735006","ts":"2014-08-08T13:44:21.000Z","st":1,"cache":{"comment_count":4,"last_comment":"53e9c93299707300771335f5","last_comment_hid":4,"last_ts":"2014-08-12T07:58:42.000Z","last_user":"424810383df9550077791832"},"views":1096,"bookmarks":0,"votes":0},"subscription":null},"locale":"en-US","user_id":"000000000000000000000000","user_hid":0,"user_name":"","user_nick":"","user_avatar":null,"is_member":false,"settings":{"can_access_acp":false,"can_use_dialogs":false,"hide_heavy_content":false},"unread_dialogs":false,"footer":{"rules":{"to":"common.rules"},"contacts":{"to":"rco-nodeca.contacts"}},"navbar":{"tracker":{"to":"users.tracker","autoselect":false,"priority":10},"forum":{"to":"forum.index"},"blogs":{"to":"blogs.index"},"clubs":{"to":"clubs.index"},"market":{"to":"market.index.buy"}},"recaptcha":{"public_key":"6LcyTs0dAAAAADW_1wxPfl0IHuXxBG7vMSSX26Z4"},"layout":"common.layout"}