Arduino:Примеры/WhileLoop
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Цикл While [1]
Иногда требуется, чтобы вся программа остановилась и выполняла одно единственное действие, и сделать это можно при помощи цикла while(). Этот пример демонстрирует, как использовать его для калибровки значений, считанных с аналогового датчика.
В главном цикле цикла (см. скетч ниже) программа считывает значения фоторезистора, подключенного к 0-ому аналоговому контакту, а затем использует их для изменения яркости светодиода, подключенного к 9-ому цифровому контакту. Но в то же время, пока будет нажата кнопка, подключенная ко 2-ому цифровому контакту, в программе будет работать функция calibrate(). Ее задача – отслеживать самые высокие и низкие значения, которые считываются от аналогового датчика. Но стоит отпустить кнопку, как программа снова запустит свой главный цикл.
При помощи этого метода можно обновить минимальные и максимальные значения данных от фоторезистора (это может потребоваться, например, при изменении условий освещения).
Необходимое оборудование
- Плата Arduino;
- Одна кнопка;
- Фоторезистор (или другой аналоговый датчик);
- Два резистора на 10 кОм;
- Один резистор на 220 Ом;
- Макетная плата Breadboard;
Цепь
Подключите аналоговый датчик (например, потенциометр или светочувствительный датчик) к 0-ому входному аналоговому контакту, а также к 5-вольтовому напряжению и, через 10000-омовый резистор, к «земле». Кнопку подключите ко 2-ому цифровому контакту и, опять же, к 5-вольтовому и (через 10000-омовый резистор) заземляющему контактам. Светодиод подключите к «земле» и (через 220-омовый резистор) к 9-ому цифровому контакту.
Схема
Код
/*
Условные конструкции – оператор 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;
}
}
См.также
- while()
- digitalRead()
- digitalWrite()
- analogRead()
- analogWrite()
- map()
- constrain()
- if()
- For Loop
- Switch Case
- Array