Arduino:Примеры/WhileLoop

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Цикл While [1]

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

В главном цикле цикла (см. скетч ниже) программа считывает значения фоторезистора, подключенного к 0-ому аналоговому контакту, а затем использует их для изменения яркости светодиода, подключенного к 9-ому цифровому контакту. Но в то же время, пока будет нажата кнопка, подключенная ко 2-ому цифровому контакту, в программе будет работать функция calibrate(). Ее задача – отслеживать самые высокие и низкие значения, которые считываются от аналогового датчика. Но стоит отпустить кнопку, как программа снова запустит свой главный цикл.

При помощи этого метода можно обновить минимальные и максимальные значения данных от фоторезистора (это может потребоваться, например, при изменении условий освещения).

Необходимое оборудование

  • Плата Arduino;
  • Одна кнопка;
  • Фоторезистор (или другой аналоговый датчик);
  • Два резистора на 10 кОм;
  • Один резистор на 220 Ом;
  • Макетная плата Breadboard;

Цепь

Подключите аналоговый датчик (например, потенциометр или светочувствительный датчик) к 0-ому входному аналоговому контакту, а также к 5-вольтовому напряжению и, через 10000-омовый резистор, к «земле». Кнопку подключите ко 2-ому цифровому контакту и, опять же, к 5-вольтовому и (через 10000-омовый резистор) заземляющему контактам. Светодиод подключите к «земле» и (через 220-омовый резистор) к 9-ому цифровому контакту.

While bb.png

Схема

Whileloop schem.png

Код

/*
  Условные конструкции – оператор While
 
 Этот пример демонстрирует использование оператора while().
 
 Пока нажата кнопка, в программе будет работать только функция калибровки.
 На основе данных от датчика, считанных за это время, будут определены новый максимум и минимум.

 Это вариация примера «Калибровка».
  
 Цепь:
 * фоторезистор подключен к 0-ому аналоговому и 5-вольтовому контактам
 * 10000-омовый резистор подключен к «земле» и 0-ому аналоговому контакту
 * светодиод через 220-омовый резистор подключен к 9-ому цифровому контакту, а также к «земле»
 * кнопка подключена ко 2-ому цифровому и 5-вольтовому контактам
 * 10000-омовый резистор подключен ко 2-ому цифровому контакту и «земле»

 Создан 17 января 2009,
 модифицирован 30 августа 2011 Томом Иго (Tom Igoe). 
 
 Этот пример не защищен авторским правом.

 http://arduino.cc/en/Tutorial/WhileLoop
 
 */


// это константы, т.е. значения, которые не изменятся:
const int sensorPin = A0;       // контакт, к которому подключен датчик 
const int ledPin = 9;           // контакт, к которому подключен светодиод 
const int indicatorLedPin = 13; // контакт, к которому подключен встроенный светодиод 
const int buttonPin = 2;        // контакт, к которому подключена кнопка 


// это переменные, т.е. значения, которые изменятся:
int sensorMin = 1023;  // минимальное значение от датчика
int sensorMax = 0;     // максимальное значение от датчика
int sensorValue = 0;         // значение, считанное от датчика


void setup() {
  // задаем контакты светодиодов как выходные,
  // а контакт кнопки – как входной
  pinMode(indicatorLedPin, OUTPUT);
  pinMode (ledPin, OUTPUT);
  pinMode (buttonPin, INPUT);
}

void loop() {
  // пока нажата кнопка, берем данные для калибровки:
  while (digitalRead(buttonPin) == HIGH) {
    calibrate();
  }
  // даем сигнал о начале калибровочного периода:
  digitalWrite(indicatorLedPin, LOW);  

  // считываем данные от датчика:
  sensorValue = analogRead(sensorPin);

  // применяем калибровку к считанным данным:
  sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255);

  // задаем лимит, если во время калибровки данные от датчика
  // вышли за пределы нужного диапазона:
  sensorValue = constrain(sensorValue, 0, 255);

  // меняем яркость светодиода на основе откалиброванных значений:
  analogWrite(ledPin, sensorValue);
}

void calibrate() {
  // включаем светодиод, оповещая о том, что калибровка завершена:
  digitalWrite(indicatorLedPin, HIGH);
  // считываем данные от датчика:
  sensorValue = analogRead(sensorPin);

  // записываем максимальное значение:
  if (sensorValue > sensorMax) {
    sensorMax = sensorValue;
  }

  // записываем минимальное значение:
  if (sensorValue < sensorMin) {
    sensorMin = sensorValue;
  }
}

См.также

  1. while()
  2. digitalRead()
  3. digitalWrite()
  4. analogRead()
  5. analogWrite()
  6. map()
  7. constrain()
  8. if()
  9. For Loop
  10. Switch Case
  11. Array

Внешние ссылки