Урок №13. Радар. Массивы.

## Массивы

**Массив** —это область памяти, способная последовательно хранить несколько значений. Он создается почти как и обычная переменная. Количество элементов входящих в массив при записи заключается в фигурные скобки. После {} перечисляются элементы массива через запятую.

Его можно представить так:

Другими словами массив - это упорядоченное множество, в котором мы можем брать элементы, ссылаясь на его номер расположения.

**Синтаксис**

```
тип_переменных имя_массива[число_переменных]

```

**Пример**

```
int tab[10]; // массив для хранения 10 переменных типа int

```

```
int tab[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // объявление и заполнение массива

```

```
int a=tab[0]; // в этом случае а = 1

```

```
int b=tab[9];//в этом случае b = 10

```

**Особенности**

Важно запомнить, что в массивах могут храниться только данные одного типа int или float. (float - тип данных с плавающей запятой, а int-тип целочисленных данных)

Так же очень важно, что элементы массива индексируются начиная с 0, то есть если наш массив состоит из восьми элементов, то последний индекс, которым будет обозначит элемент это - семь.

## Ультразвуковой дальномер

### Определение

   Ультразвуковой датчик расстояния определяет расстояние до объекта, измеряя время отображения звуковой волны от объекта. Типичный ультразвуковой датчик расстояния состоит из двух мембран, одна из которых генерирует звук, а другая принимает отображенное эхо. Звуковой генератор (первая мембрана) создает маленький, с некоторым периодом ультразвуковой импульс и запускает таймер. Вторая мембрана регистрирует прибытие отображенного импульса и останавливает таймер. От времени таймера по скорости звука можно вычислить пройденное расстояние звуковой волны. Расстояние объекта приблизительно равно половине пройденного пути звуковой волны.

### Распиновка

 TRIG
 ECHO
 GND

Итак, подключение происходит довольно просто: VCC и GND подключаем к портам питания, TRIG и ECHO подключаются к цифровым пинам, настроив их как выход и вход соответственно.

### Пример кода

Для работы с дальномером не обязательно использовать отдельные библиотеки, хоть такие и имеются (см. NewPing). Считывание показаний происходит по одному алгоритму. Для удобства считывания этот алгоритм можно записать его в виде отдельной функции. Рассмотрим подробно этот алгоритм:

```
#define Trig 12 //Обозначаем пин подачи импульса

#define Echo 11 // Обозначаем пин приема импульса

unsigned int impulseTime = 0;

unsigned int distance_sm = 0;

void setup()
{
pinMode(Trig, OUTPUT); //инициируем как выход

pinMode(Echo, INPUT); //инициируем как вход

Serial.begin(9600); // устанавливаем скорость порта
}

 void loop()
{
 digitalWrite(Trig, HIGH); // Подаем импульс на вход trig дальномера

 delayMicroseconds(10); // Импульс длится 10 микросекунд

 digitalWrite(Trig, LOW); // Отключаем подачу импульса

impulseTime= pulseIn(Echo, HIGH); //Принимаем импульс и подсчитываем его длину

distance_sm = impulseTime/58; // Пересчитываем его значение в сантиметры

Serial.println(distance_sm); // Выводим значение на порт программы

delay(200); //задержка между измерениями
 }

```

## Пьезоэлемент

### Определение

Пьезоэлемент — электромеханический преобразователь, одним из разновидностей которого является пьезоизлучатель звука,  который также называют пьезодинамиком, просто звонком  или английским buzzer. Пьезодинамик переводит электричеcкое напряжение в колебание мембраны. Эти колебания и создают звук (звуковую волну).

### Подключение и код

Пищалка обладает всего двумя контактами. Один из них подключается к цифровому порту, а второй к земле.

Звук определенной частоты можно получить, используя функцию tone(номер пина, частота). Для отключения звука используем функцию noTone(номер пина). Пример кода:

```
void setup() // процедура setup
{
pinMode(11, OUTPUT); // объявляем пин 11 как выход
}

void loop() // процедура loop
{

tone(11, 600); // включаем на пьезодинамик 600 Гц

delay(1000); // ждем 1 секунду

tone(11, 900); // включаем на пьезодинамик 900 Гц

delay(1000); // ждем 1 секунду

noTone(11); // отключаем пьезодинамик на пин 11

delay(1000); // ждем 1 секунду

}

```

## Сборка радара. Практическое задание.

Итак ,для сборки радара необходимы следующие **компоненты:**

* Ультразвуковой датчик расстояния.

* Сервопривод.
* Пьезоэлемент.

#### Задание:

с помощью данных компонентов, необходимо фиксировать изменения расстояния в радиусе 180 градусов(границы сервопривода) от ранее фиксированных. При первом запуске наш радар записывает в массив данные о расстоянии в начальный момент времени. После калибровки радар повторяет процедуру снова и снова, поворачивая сервопривод на 180 градусов. При считывании изменения радар издает звук и останавливается на несколько секунд.

1. Собрать схему, состоящую из сервопривода, дальномера и пьезопищалки.
2. Закрепить дальномер на сервоприводе.
3. Написать код, выполняющий функции радара. Программа должна реализовать считывание данных с дальномера, каждые два градуса поворота сервопривода на старте программы, а потом сравнивал изначальные данные с новыми.
4. Если новые данные отличаются от старых на значительную разницу(например 3 сантиметра и больше), то радар останавливается на этом градусе и пищит несколько секунд.

#### Подсказки:

В данном задании применяется очень интересный метод работы с массивами. Для задания понадобятся 2 массива: 1-ый массив создан для калибровки,в него Arduino записывает показания с ультразвукового датчика расстояния от 0 градусов до 180(Например,массив состоит из 90 элементов с шагом в 2 градуса), 2-ой массив нужен чтобы постоянно проверять и записывать в него значения в реальном времени. Значения этих массивов сравниваются поэлементно например с помощью цикла FOR и оператора IF ELSE.