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

Arduino:Примеры/Calibration

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

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

Контакты:

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


Калибровка [1]

В данном примере демонстрируется один из методов для калибровки входных сенсорных данных. В течение первых пяти секунд с момента запуска Arduino считывает данные, поступающие от сенсора, отслеживая самые высокие и низкие значения – они будут определены как максимум и минимум этого 5-секундного цикла.

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

  • Плата Arduino;
  • Светодиод;
  • Аналоговый сенсор (к примеру, фотоэлемент или потенциометр);
  • Резистор на 10 кОм;
  • Резистор на 220 Ом;
  • Макетная плата Breadboard;
  • Провода-перемычки;

Цепь

Calibration Circuit.png

Светодиод подсоедините к 9-ому цифровому контакту и к «земле» (через 220-омовый резистор). Одну ногу фотоэлемента подсоедините к 5-вольтовому контакту, а другую – к 0-ому аналоговому контакту и к «земле» (через 10 кОм резистор).

Схема

Calibration sch.png

Код

Перед секцией setup()‎ задаем начальные значения для минимума и максимума.

int sensorMin = 1023;        // минимальное значение от сенсора
int sensorMax = 0;           // максимальное значение от сенсора

Может показаться, что тут нет никакой логики – максимум обозначен как 0, а минимум как 1023. Но дело в том, что это лишь исходные значения, от которых программа будет отталкиваться, определяя реальные максимум и минимум. То есть в переменной sensorMin изначально задается самый высокий минимум (1023), и самое маленькое число, которое будет ниже этого минимума, будет определено как новый минимум. В то же время в переменной sensorMax изначально задается самый низкий максимум (0), и самое большое число, которое будет выше этого максимума, будет определено как новый максимум. Делается это при помощи следующего фрагмента:

// считываем данные в течение первых пяти секунд:
 while (millis() < 5000) {
   sensorValue = analogRead(sensorPin);

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

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

Таким образом, полученные максимум и минимум можно подогнать под диапазон между 0 и 255:

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

Вся программа будет выглядеть следующим образом:

  1. /*
  2.   Калибровка
  3.  
  4.  Демонстрирует один из методов для калибровки входных данных от сенсора. В течение первых 5 секунд программа определяет максимальное и минимальное значение этих данных.
  5.  Может показаться, что в исходных минимуме (1023) и максимуме (0) нет никакой логики. Но дело в том, что это лишь исходные значения, от которых программа будет отталкиваться, определяя реальные максимум и минимум.
  6.  То есть в переменной sensorMin изначально задается самый высокий минимум (1023), и самое маленькое число, которое будет ниже этого минимума, будет определено как новый минимум. В то же время в переменной sensorMax изначально задается самый низкий максимум (0), и самое большое число, которое будет выше этого максимума, будет определено как новый максимум.
  7.  
  8.  Цепь:
  9.  * Аналоговый сенсор (например, потенциометр) подсоединен к 0-ому входному контакту, 5-вольтовому напряжению и «земле»
  10.  * Светодиод подсоединен к 9-ому цифровому контакту и «земле»
  11.  
  12. Создан 29 октября 2008 Дэвидом А. Меллисом (David A Mellis),
  13. модифицирован 30 августа 2011 Томом Иго (Tom Igoe)
  14.  
  15.  http://arduino.cc/en/Tutorial/Calibration
  16.  
  17.  Этот код не защищен авторским правом.
  18.  
  19.  */
  20.  
  21. // это константы – значения, которые не изменятся:
  22. const int sensorPin = A0;    // контакт, к которому подсоединен сенсор
  23. const int ledPin = 9;        // контакт, к которому подсоединен светодиод
  24.  
  25. // переменные:
  26. int sensorValue = 0;         // значение, полученное от сенсора
  27. int sensorMin = 1023;        // минимальное значение от сенсора
  28. int sensorMax = 0;           // максимальное значение от сенсора
  29.  
  30.  
  31. void setup() {
  32.   // включаем светодиод, чтобы оповестить о начале калибровочного периода:
  33.   pinMode(13, OUTPUT);
  34.   digitalWrite(13, HIGH);
  35.  
  36.   // считываем данные в течение первых пяти секунд:
  37.   while (millis() < 5000) {
  38.     sensorValue = analogRead(sensorPin);
  39.  
  40.     // записываем максимальное значение, считанное от сенсора:
  41.     if (sensorValue > sensorMax) {
  42.       sensorMax = sensorValue;
  43.     }
  44.  
  45.     // записываем минимальное значение, считанное от сенсора:
  46.     if (sensorValue < sensorMin) {
  47.       sensorMin = sensorValue;
  48.     }
  49.   }
  50.  
  51.   // выключаем светодиод, оповещая о конце калибровочного периода:
  52.   digitalWrite(13, LOW);
  53. }
  54.  
  55. void loop() {
  56.   // считываем данные от сенсора:
  57.   sensorValue = analogRead(sensorPin);
  58.  
  59.   // калибруем данные от сенсора:
  60.   sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255);
  61.  
  62.   // на тот случай, если данные от сенсора будут за пределами необходимого диапазона, делаем так:
  63.   sensorValue = constrain(sensorValue, 0, 255);
  64.  
  65.   // задаем светодиоду уровень яркости, опираясь на откалиброванное значение:
  66.   analogWrite(ledPin, sensorValue);
  67. }

См.также

  1. while
  2. millis()
  3. constrain()
  4. map()
  5. if
  6. AnalogInput
  7. AnalogInOutSerial
  8. Fade
  9. Smoothing

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

  1. Arduino - Calibration