Arduino:Примеры/Calibration: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
Нет описания правки
 
(не показано 9 промежуточных версий 1 участника)
Строка 3: Строка 3:
{{Myagkij-редактор}}
{{Myagkij-редактор}}


== Калибровка <ref>[http://www.arduino.cc/en/Tutorial/Calibration Arduino - Calibration]</ref>==
= Калибровка <ref>[http://www.arduino.cc/en/Tutorial/Calibration Arduino - Calibration]</ref>=


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


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


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


== Цепь ==
== Цепь ==


[[File:calibration_Circuit.png]]
[[File:calibration_Circuit.png|frame|center|'''Рис. 1.''' Плата Arduino с подключенным светодиодом и фоторезистором.|alt=Рис. 1. Плата Arduino с подключенным светодиодом и фоторезистором.]]


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


== Схема ==
== Схема ==


[[File:calibration_sch.png]]
[[File:calibration_sch.png|frame|center|'''Рис. 2.''' Схема подключения светодиода и фоторезистора к плате Arduino.|alt=Рис. 2. Схема подключения светодиода и фоторезистора к плате Arduino.]]


== Код ==
== Код ==
Строка 31: Строка 31:
Перед секцией [[Arduino:Справочник языка Arduino/setup()‎|setup()‎]] задаем начальные значения для минимума и максимума.  
Перед секцией [[Arduino:Справочник языка Arduino/setup()‎|setup()‎]] задаем начальные значения для минимума и максимума.  


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
int sensorMin = 1023;        // минимальное значение от сенсора
int sensorMin = 1023;        // минимальное значение от сенсора
int sensorMax = 0;          // максимальное значение от сенсора
int sensorMax = 0;          // максимальное значение от сенсора
</syntaxhighlight>
</syntaxhighlight>


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


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
// считываем данные в течение первых пяти секунд:
// считываем данные в течение первых пяти секунд:
  while (millis() < 5000) {
  while (millis() < 5000) {
Строка 57: Строка 59:
</syntaxhighlight>
</syntaxhighlight>


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


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
// калибруем данные от сенсора:
// калибруем данные от сенсора:
sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255);
sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255);
Строка 66: Строка 68:
Вся программа будет выглядеть следующим образом:
Вся программа будет выглядеть следующим образом:


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
/*
/*
   Калибровка
   Калибровка
Строка 136: Строка 138:
</syntaxhighlight>
</syntaxhighlight>


==См.также==
=См.также=


# [[Arduino:Справочник языка Arduino/Управляющие операторы/while|while]]
# [[Arduino:Справочник языка Arduino/Управляющие операторы/while|while]]
Строка 148: Строка 150:
# [[Arduino:Примеры/Smoothing|Smoothing]]
# [[Arduino:Примеры/Smoothing|Smoothing]]


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


<references />
<references />


{{Навигационная таблица/Справочник языка Arduino}}
{{Навигационная таблица/Портал/Arduino}}
{{Навигационная таблица/Arduino библиотеки}}
{{Навигационная таблица/Arduino продукты}}
{{Навигационная таблица/Телепорт}}


[[Категория:Пример]]
[[Категория:Пример]]

Текущая версия от 18:18, 14 мая 2023

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


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

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

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

Цепь

Рис. 1. Плата Arduino с подключенным светодиодом и фоторезистором.
Рис. 1. Плата Arduino с подключенным светодиодом и фоторезистором.

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

Схема

Рис. 2. Схема подключения светодиода и фоторезистора к плате Arduino.
Рис. 2. Схема подключения светодиода и фоторезистора к плате Arduino.

Код

Перед секцией 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);

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

/*
  Калибровка
 
 Демонстрирует один из методов для калибровки входных данных от сенсора. В течение первых 5 секунд программа определяет максимальное и минимальное значение этих данных. 
 Может показаться, что в исходных минимуме (1023) и максимуме (0) нет никакой логики. Но дело в том, что это лишь исходные значения, от которых программа будет отталкиваться, определяя реальные максимум и минимум. 
 То есть в переменной sensorMin изначально задается самый высокий минимум (1023), и самое маленькое число, которое будет ниже этого минимума, будет определено как новый минимум. В то же время в переменной sensorMax изначально задается самый низкий максимум (0), и самое большое число, которое будет выше этого максимума, будет определено как новый максимум.
 
 Цепь:
 * Аналоговый сенсор (например, потенциометр) подсоединен к 0-ому входному контакту, 5-вольтовому напряжению и «земле»
 * Светодиод подсоединен к 9-ому цифровому контакту и «земле»
 
Создан 29 октября 2008 Дэвидом А. Меллисом (David A Mellis),
модифицирован 30 августа 2011 Томом Иго (Tom Igoe)
 
 http://arduino.cc/en/Tutorial/Calibration
 
 Этот код не защищен авторским правом.
 
 */

// это константы – значения, которые не изменятся:
const int sensorPin = A0;    // контакт, к которому подсоединен сенсор
const int ledPin = 9;        // контакт, к которому подсоединен светодиод

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


void setup() {
  // включаем светодиод, чтобы оповестить о начале калибровочного периода:
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);

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

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

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

  // выключаем светодиод, оповещая о конце калибровочного периода:
  digitalWrite(13, LOW);
}

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

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

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

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

См.также

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

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