Выбрать главу

#define LED 9     // the pin for the LED

#define BUTTON 7  // input pin of the pushbutton

int val = 0; // stores the state of the input pin

int old_val = 0; // stores the previous value of "val"

int state = 0; // 0 = LED off while 1 = LED on

int brightness = 128; // Stores the brightness value

unsigned long startTime = 0; // when did we begin pressing?

void setup() {

  pinMode(LED, OUTPUT); // tell Arduino LED is an output

  pinMode(BUTTON, INPUT); // and BUTTON is an input

}

void loop() {

  val = digitalRead(BUTTON); // read input value and store it

                             // yum, fresh

  // check if there was a transition

  if ((val == HIGH) && (old_val == LOW)) {

    state = 1 - state; // change the state from off to on

                       // or vice-versa

    startTime = millis(); // millis() is the Arduino clock

                          // it returns how many milliseconds

                          // have passed since the board has

                          // been reset.

   // (this line remembers when the button

   // was last pressed)

   delay(10);

}

// check whether the button is being held down

  if ((val == HIGH) && (old_val == HIGH)) {

    // If the button is held for more than 500ms.

    if (state == 1 && (millis() - startTime) > 500) {

      brightness++; // increment brightness by 1

      delay(10); // delay to avoid brightness going

                    // up too fast

      if (brightness > 255) { // 255 is the max brightness

        brightness = 0; // if we go over 255

                        // let's go back to 0

      }

    }

  }

  old_val = val; // val is now old, let's store it

  if (state == 1) {

    analogWrite(LED, brightness); // turn LED ON at the

                                 // current brightness level

  } else {

    analogWrite(LED, 0); // turn LED OFF

  }

}

Попробуйте скетч. Как видно, наша модель взаимодействия обретает форму. Если вы нажмёте и немедленно отпустите кнопку, вы включите или выключите лампу. Если держать кнопку нажатой, яркость светодиода будет изменяться. Просто отпустите кнопку, когда установите желаемую яркость.

А теперь давайте разберёмся как использовать более интересные сенсоры.

5.3 Использование фотодатчика вместо кнопки

Сейчас мы произведём интересный эксперимент. Возьмём фотодатчик, как на рис. 5-5.

В темноте сопротивление светочувствительного датчика весьма высокое. Если на него посветить, сопротивление быстро снижается и становится достаточным для прохождения электричества. Таким образом, у нас есть выключатель, активируемый светом.

Соберите схему для примера 4-2 (см. "Использование кнопки для управления светодиодом" в главе 4), затем загрузите код из примера 4-2 в вашу Arduino.

Теперь подключите фотодатчик в плату вместо кнопки. Вы увидите, что если закрыть датчик рукой, светодиод выключится. Откройте датчик, и светодиод зажжётся. Вы только что собрали схему со светодиодом, управляемым датчиком. Это важно, так как первый раз в книге мы используем электронный компонет, не являющийся просто механическим устройством: это полнофункциональный датчик.

5.4 Аналоговый ввод

Как вы узнали из предыдущего раздела, Arduino может определять, было-ли приложено напряжение к одному из её выводов и сообщать это функции digitalRead(). Тип ответа "да/нет" хорош для многих приложений, но датчик света, который мы недавно использовали, может сообщить нам не только что свет есть, но также и сколько его. В этом и состоит разница между датчиками вкл/выкл (который сообщает что что-то мы что-то имеем) и аналоговым датчиком, данные которого постоянно изменяются. Для чтения таких датчиков нам требуется другой тип выводов.

В правой нижней части платы Arduino вы видите шесть выводов, обозначенных "Analog In"; это специальные выводы, которые могут сообщить нам не только что к ним приложено напряжение, но и его величину. Используя функцию analogRead(), мы можем считывать величину этого напряжения. Данная функция возвращает числа от 0 до 1023, которые соответствуют напряжению в пределах от 0 до 5 вольт. Например, для напряжения величиной 2,5 В, приложенного к выводу 0, функция analogRead(0) вернёт 512.

Теперь, если вы соберёте схему по рис. 5-6, используя резистор 10 кОм и запустите код из примера 5-3, вы увидите что светодиод на плате (также вы можете вставить светодиод в выводы 13 и GND как показано в разделе "Мигающий светодиод" из главы 4) мигает с частотой, зависящей от освещённости фотодатчика.

Рис. 5-6. Схема с аналоговым датчиком

Пример 5-6. Мигание светодиодом со скоростью, зависящей от величины на аналоговом входе

#define LED 13 // the pin for the LED

int val = 0; // variable used to store the value

               // coming from the sensor

void setup() {

  pinMode(LED, OUTPUT); // LED is as an OUTPUT

  // Note: Analogue pins are

  // automatically set as inputs

}

void loop() {

  val = analogRead(0); // read the value from

                       // the sensor

  digitalWrite(13, HIGH); // turn the LED on

  delay(val); // stop the program for

              // some time

  digitalWrite(13, LOW); // turn the LED off

  delay(val); // stop the program for

              // some time

}

Теперь попробуйте пример 5-4, но перед этим вам придётся изменить свою схему. Посмотрите на рис. 5-4 ещё раз и соедините светодиод с выводом 9. Так как у вас уже есть собранная схема, вам надо найти точку платы где светодиод, провод и резистор не будет соединён с фотодатчиком.

Пример 5-4. Установка яркости светодиода, определяемая данными на аналоговом входе.

#define LED 9 // the pin for the LED

int val = 0; // variable used to store the value

              // coming from the sensor

void setup() {

  pinMode(LED, OUTPUT); // LED is as an OUTPUT

  // Note: Analogue pins are

  // automatically set as inputs

}

void loop() {

  val = analogRead(0); // read the value from

                       // the sensor

  analogWrite(LED, val/4); // turn the LED on at

                           // the brightness set

                           // by the sensor

  delay(10); // stop the program for

             // some time

}

Примечание: мы указываем яркость, деля val на 4 из-за того, что analogRead() возвращает число до 1023, а analogWrite() принимает 255 максимум.

5.5 Попробуйте другие аналоговые датчики

Используя ту же схему что вы видели в предыдущем разделе, вы можете подсоединить множество других резистивных датчиков, которые работают более менее подобным образом. Например, вы можете подключить термистор (простое устройство, изменяющее своё сопротивление в зависимости от температуры). В схеме показано как изменение сопротивления изменяет напряжение в ней. Это напряжение может быть измерено Arduino.