среда, 22 февраля 2012 г.

Arduino Uno timer


Сделал первую в мире программу для микроконтоллера.
Использовался набор от матрешки с Arduino Uno.



Как жаль, что у меня небыло такого набора лет 7 назад, пока я учился и делать было нечего. Тогда я все что умел - это общаться с LPT портом. Повешал на двери магниты и подвел герконы, которые подрубались к компу. Комп записывал лог открывания и закрывания двух дверей в квартире.
А у вас был какой-нибудь опыт с аппаратными девайсами?


А вот и сами исходный код.
#define CLOCK_PIN 2
#define RESET_PIN 3
#define ENABLE_OUT_PIN 4
#define BUTTON_1_PIN 8

 int lastValue = -1;
 boolean lastButtonState = LOW;
 boolean state = LOW;

/*
 * Функция showNumber устанавливает показания индикаторов
 * в заданное неотрицательное число `n` вне зависимости
 * от предыдущего значения
 */
void showNumber(int n)
{
  if (lastValue != n) {
    lastValue = n;
    digitalWrite(ENABLE_OUT_PIN, LOW);
   
    // Первым делом обнуляем текущее значение
    // Для этого на мгновение ставим контакт
    // reset в HIGH и возвращаем обратно в LOW
    digitalWrite(RESET_PIN, HIGH);
    digitalWrite(RESET_PIN, LOW);
   

    // Далее быстро «прокликиваем» счётчик до нужного
    // значения
    while (n--) {
        digitalWrite(CLOCK_PIN, HIGH);
        digitalWrite(CLOCK_PIN, LOW);
    }
    digitalWrite(ENABLE_OUT_PIN, HIGH);
   
  }
}

void setup()
{
    pinMode(RESET_PIN, OUTPUT);
    pinMode(CLOCK_PIN, OUTPUT);
    pinMode(ENABLE_OUT_PIN, OUTPUT);
    pinMode(BUTTON_1_PIN, INPUT);
}

void loop()
{
    // Получаем количество секунд в неполной минуте
    // с момента старта и выводим его на индикаторы
   
    boolean buttonState = digitalRead(BUTTON_1_PIN);
    if (buttonState == HIGH && lastButtonState != HIGH) {
      state = !state;
    }
    lastButtonState = buttonState;
 
    if (state == HIGH) {
      showNumber((millis() / 1000) % 100);
    } else {
      showNumber((millis() / 100) % 100);
    }
    delay(30);
}