Контроллер полетных режимов - прошивка

Собственно на тот удивительный случай, если кому-то надо и на (более вероятный) случай потери исходников - исходники


#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

Крутилка используется для настройки - какое значение выдается после нажатия каждой кнопки

При первом запуске надо зажать и держать первую кнопку - тогда в память запишуться значения по умолчанию

Если надо поменять значение - держим кнопку и крутим крутилку, отпустили - значение крутилки запомнилось, все

  • 1088
Comments
HATUUL

Чето не совсем понял.😵
Это типа переключалки для АРМ?
С потенциометром?
А можно все таки схемку?

kostya-tin

дык в предыдущих записях дневника написано, вроди как

fat_hamster

Завтра будет схема;я на работе пытался нарисовать, думал плату сделать, но забил ; но схемка есть

Но вообще по “словесному описанию” и исходнику можно все сделать (или это мне кажется, что понятно)

Pacific

С жертвенным переменником классно придумали!
Следующая версия, видимо, будет такой: аноды всех светодиодов запитаны через один резистор (типа экономим пять резюков). Светодиоды управляются ШИМом. Это позволит настроить одинаковую яркость светодиодов разных цветов а также замутить ночной и дневной режим свечения.