Arduino:Примеры/WhileLoop

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

Перевод: Максим Кузьмин (Cubewriter) Перевел 364226 статей для сайта.</br>Контакты:</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

Код

 1 /*
 2   Условные конструкции – оператор While
 3  
 4  Этот пример демонстрирует использование оператора while().
 5  
 6  Пока нажата кнопка, в программе будет работать только функция калибровки.
 7  На основе данных от датчика, считанных за это время, будут определены новый максимум и минимум.
 8 
 9  Это вариация примера «Калибровка».
10   
11  Цепь:
12  * фоторезистор подключен к 0-ому аналоговому и 5-вольтовому контактам
13  * 10000-омовый резистор подключен к «земле» и 0-ому аналоговому контакту
14  * светодиод через 220-омовый резистор подключен к 9-ому цифровому контакту, а также к «земле»
15  * кнопка подключена ко 2-ому цифровому и 5-вольтовому контактам
16  * 10000-омовый резистор подключен ко 2-ому цифровому контакту и «земле»
17 
18  Создан 17 января 2009,
19  модифицирован 30 августа 2011 Томом Иго (Tom Igoe). 
20  
21  Этот пример не защищен авторским правом.
22 
23  http://arduino.cc/en/Tutorial/WhileLoop
24  
25  */
26 
27 
28 // это константы, т.е. значения, которые не изменятся:
29 const int sensorPin = A0;       // контакт, к которому подключен датчик 
30 const int ledPin = 9;           // контакт, к которому подключен светодиод 
31 const int indicatorLedPin = 13; // контакт, к которому подключен встроенный светодиод 
32 const int buttonPin = 2;        // контакт, к которому подключена кнопка 
33 
34 
35 // это переменные, т.е. значения, которые изменятся:
36 int sensorMin = 1023;  // минимальное значение от датчика
37 int sensorMax = 0;     // максимальное значение от датчика
38 int sensorValue = 0;         // значение, считанное от датчика
39 
40 
41 void setup() {
42   // задаем контакты светодиодов как выходные,
43   // а контакт кнопки – как входной
44   pinMode(indicatorLedPin, OUTPUT);
45   pinMode (ledPin, OUTPUT);
46   pinMode (buttonPin, INPUT);
47 }
48 
49 void loop() {
50   // пока нажата кнопка, берем данные для калибровки:
51   while (digitalRead(buttonPin) == HIGH) {
52     calibrate();
53   }
54   // даем сигнал о начале калибровочного периода:
55   digitalWrite(indicatorLedPin, LOW);  
56 
57   // считываем данные от датчика:
58   sensorValue = analogRead(sensorPin);
59 
60   // применяем калибровку к считанным данным:
61   sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255);
62 
63   // задаем лимит, если во время калибровки данные от датчика
64   // вышли за пределы нужного диапазона:
65   sensorValue = constrain(sensorValue, 0, 255);
66 
67   // меняем яркость светодиода на основе откалиброванных значений:
68   analogWrite(ledPin, sensorValue);
69 }
70 
71 void calibrate() {
72   // включаем светодиод, оповещая о том, что калибровка завершена:
73   digitalWrite(indicatorLedPin, HIGH);
74   // считываем данные от датчика:
75   sensorValue = analogRead(sensorPin);
76 
77   // записываем максимальное значение:
78   if (sensorValue > sensorMax) {
79     sensorMax = sensorValue;
80   }
81 
82   // записываем минимальное значение:
83   if (sensorValue < sensorMin) {
84     sensorMin = sensorValue;
85   }
86 }

См.также

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

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