Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/WhileLoop

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Цикл 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

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

  1. Arduino - While Loop