Мамичев
ПРОГРАММИРОВАНИЕ
НА АРДУИНО
от простого к сложному
Москва
СОЛОН-Пресс
2018
УДК 621.396.6, 621.86/.87(072)
ББК 32.84,74.262:32.816
М 22
Мамичев Д.
Программирование на Ардуино. От простого к сложному. — М.: COJIOH-Пресс,
2018.-244 с.: ил.
К Н И ГА -П О Ч ТО Й
Книги издательства «СОЛОН-Пресс» можно заказать и оплатить в издательстве с пересылкой
Почтой РФ. Заказ можно оформить одним из перечисленных способов:
1. Оформить заказ на сайте www.solon-press.ru в разделе «Книга — почтой».
2. Заказать книгу потел. (495) 617-39-64, (495) 617-39-65.
3. Отправив заявку на e-mail kniga@solon-press.ru {указать наименование издания, обратный
адрес и ФИО получателя).
4 Послать открытку или письмо по адресу: 123001, Москва, а/я 82.
При оформлении заказа следует правильно и полностью указать адрес, по которому должны
быть высланы книги, а также фамилию, имя и отчество получателя. Желательно указать дополни
тельно свой телефон и адрес электронной почты.
Через Интернет вы можете в любое время получить свежий каталог издательства «СОЛОН-
Пресс», считав его с адреса http://www.solon-press.ru/katalog.
Интернет-магазин размещен на сайте www.solon-press.ru.
ООО «СОЛОН-Пресс»
115487, г. Москва, пр-кт Андропова, дом 38, помещение № 8, комната № 2.
Формат 60x88/16. Объем 12,25 п. л. Тираж 100 экз.
По вопросам приобретения обращаться:
ООО «СОЛОН-Пресс». Тел: (495) 617-39-64, (495) 617-39-65
E-mail: kniga@solon-press.ru, www.solon-press.ru
Предисловие.................................................................................................... 6
Глава 1. «Ардуино-ожидание».........................................................................7
Эксперимент №1. «Мигающий светодиод»................................................. 9
Эксперимент №2. «Переключатель светодиодных гирлянд»..................17
Эксперимент №3. «Игра — угадай: красный или зелёный?»..................27
Эксперимент №4. «Игровой кубик на шесть граней»..............................30
Эксперимент №5. «Песочные часы»........................................................... 36
Глава 2. «Ардуино — н ач ал о » ....................................................................... 40
Эксперимент №6. «Вновь мигающий светодиод»....................................45
Эксперимент №7. «Осмысленно мигающий светодиод или спасите
наши души».....................................................................................................48
Эксперимент №8. «Песочные часы с секундным отсчётом»..................51
Эксперимент №9. «7 сегментный светодиодный индикатор»................57
Эксперимент №10. «Секундомер на предел измерения — 10 секунд» . .61
Эксперимент №11. «Секундомер на предел измерения — 99 секунд» . .65
Эксперимент №12. «Светодиодный куб 3*3*3»....................................... 70
Эксперимент №13. «Звуковой сигнал sos»................................................. 85
Эксперимент №14. «Моя мелодия»........................................................... 89
Эксперимент №15. «Одноголосый эми или arduino-дудка»....................93
Глава 3. «ардуино-пробы».............................................................................98
Эксперимент №16. «Опять светодиод»..................................................... 99
Эксперимент №17. «Ночник — три цвета»............................................. 102
Эксперимент №18. «Цветовые часы с секундным отсчётом»................107
Эксперимент №19. «Длинномер»............................................................. 110
Эксперимент №20. «Кодовый замок»....................................................... 113
Эксперимент №21. «Проба вход-выход?»............................................... 116
Эксперимент №22. «Эми — вариант второй»......................................... 118
Эксперимент №23. «Проба — мотор»....................................................... 130
Эксперимент №24. «Проба — ноты без tone»......................................... 135
Эксперимент №25. «Проба — goto»......................................................... 139
3
Оглавление
Глава4. «Ардуинобим»................................................................................141
4
Ты датчик, отличающий ускорение
от силы притяжения нашел, физег?
Дмитрий Лилик,
программист из Питера
ПРЕДИСЛОВИЕ
6
ГЛАВА 1
«АРДУИНО-ОЖИДАНИЕ»
/•.SiExpress' =*
0,4/ ‘VW4*? чт*.
jS
it
a
Г,t.% pyf>
Рис. 0
7
Глава 1.«Ардуино-ожидание»
8
Эксперимент № 1
Эксперимент №1
«МИГАЮЩИЙ СВЕТОДИОД»
Рис. 1а
9
Глава 1.«Ардуино-ожидание»
void setup()
{
pinMode(ledPin, OUTPUT); / / определение вывода как ВЫХОД
}
void 1оор()
{
digitalWrite(ledPin, HIGH); //зажечь светодиод
delay(lOOO);// задержка 1000 мсек (1 сек)
digitalWrite(IedPin, LOW); //выключить светодиод
delay(lOOO); //ждать 1 сек
}
////////////////////////////////////////////////////////////////////////
10
Эксперимент № 1
11
Глава 1.«Ардуино-ожидание»
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
/ / Программа мигания светодиода /
//
unsigned int n = 0;
void setup()
{
pinMode(l, OUTPUT);
digitalWrite(l, LOW);
}
12
Эксперимент № 1
void loopO
{
for (n = 0; n <= 50000; n++)
{
digitalWrite(l, HIGH);
}
for (n = 0; n <—50000; n++)
{
digital\Vrite(l, LOW);
}
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
/ / Программа мигания светодиода /
//
void setupO
{
pinMode(l, OUTPUT);
digitalWrite(l, LOW);
}
void loopO
{
digitalWrite(l,! digitalRead (1)); //инвертируем состояние вывода
13
Глава 1.«Ардуино-ожидание»
delay (1000);
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
14
Эксперимент № 1
////////////////////////////////////////////////////////////////////
//
/ / Arduino UNO
//
////////////////////////
//
/ / Программа мигания светодиода /
//
void setupO
{
pinMode(l, OUTPUT);
digitaIWrite(l, LOW);
}
void loopO
{
digitalWrite(l,! digitalRead (1)); //инвертируем состояние вывода
15
Глава 1.«Ардуино-ожидание»
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
16
Глава 1.«Ардуино-ожидание»
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
/ / Программа бегущий огонь на 4 светодиода /
/ / с переменной частотой переключения /
unsigned int n;
unsigned int k;
void setup()
{
void loop()
{
for ( k = 200; k <= 2000; k=k+200)
{
for (n = 1; n <= 4; n++)
{
digitalWrite(n, HIGH);
delay(k);
digitalWrite(n, LOW);
}
}
}
//
18
Эксперимент №2
/ /К о н е ц /
//
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
/ / Arduino UNO
19
Глава 1.«Ардуино-ожидание»
//
////////////////////////
//
/ / Программа плавное зажигание на 4 светодиода /
/ / с переменной частотой нарастания /
unsigned int к;
unsigned int n;
unsigned int i;
void setupO
{
void loop()
{
for ( к - 100; к <= 1000; k=k+100)
{
for (n = 1; n <= 4; n++)
{
for (i = 1; i <= k; i=i+l)
{
digitalWrite(l, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
delay(n);
digitalWrite(l, LOW);
digitaIWrite(2, LOW);
20
Эксперимент №2
digitalWrite(3, LOW);
digitalWrite(4, LOW);
delay(S-n);
}
}
}
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
//
/ / Arduino UNO
//
////////////////////////
//
/ / Программа попарного перемигивания на 4 светодиода /
/ / с переменной частотой /
unsigned int k;
unsigned int n;
unsigned int i;
21
Глава 1.«Ардуино-ожидание»
void setup()
{
void ioop()
{
for ( к = 200; к <= 2000; k=k+200)
{
for (n = 0; n <= 1; n=n+l)
{
for (i = 0; i <= 1; i=i+l)
{
if (i= = l)
{
digitalWrite(l, HIGH);
digita!Write(3, LOW);
}
else
{
digitalWrite(I, LOW);
digitalWrite(3, HIGH);
}
if (n==l)
{
digitalWrite(2, HIGH);
digitalWrite(4, LOW);
}
22
Эксперимент №2
else
{
digitalWrite(2, LOW);
digitalWrite(4, HIGH);
}
delay(k);
}
}
}
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
23
Глава 1.«Ардуино-ожидание»
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
/ / Программа Зх режимного переключателя на 4 светодиода /
/ / с переменной частотой переключения (задействованы выводы 1-4)/
unsigned int n;
unsigned int k;
unsigned int i;
void setup()
{
void loop()
{
for ( k = 200; k <= 2000; k=k+200)
{
for (n = 1; n <= 4; n++)
{
digitalWrite(n, HIGH);
delay(k);
24
Эксперимент №2
digitaIWrite(n, LOW);
}
}
for ( к = 100; к <= 1000; k=k+100)
{
for (n —1; n <= 4; n++)
{
for (i = 1; 1<= k; i=i+l)
{
digitalWrite(l, HIGH);
digitaIWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
delay(n);
digitalWrite(l, LOW);
digitalWrite(2, LOW);
digitaIWrite(3, LOW);
digitaIWrite(4, LOW);
delay(S-n);
}
}
}
for ( к = 200; к <= 2000; k=k+200)
{
for (n = 0; n <= 1; n=n+l)
{
for (i = 0; i <= 1; i=i+l)
{
if(i— i)
{
digitalWrite(l, HIGH);
digitaIWrite(3, LOW);
}
else
25
Глава 1.«Ардуино-ожидание»
{
digitalWrite (1, LOW);
digitaIWrite(3, HIGH);
}
if (n==l)
{
digitalWrite(2, HIGH);
digitalWrite(4, LOW);
}
else
{
digitalWrite(2, LOW);
digitalWrite(4, HIGH);
}
delay(k);
}
}
}
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
26
Эксперимент №3
Эксперимент №3
«ИГРА - УГАДАЙ: КРАСНЫЙ ИЛИ
ЗЕЛЁНЫЙ?»
Рис. 3
Рис. За
27
Глава 1.«Ардуино-ожидание»
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
//Игра угадай красный или зелёный?//
void setup()
{
pinMode(ll, OUTPUT); //красный светодиод вых. 11 /
pinMode(13, OUTPUT); //зелёный светодиод вых.13 /
pinMode( 12,INPUT); //кнопка выв. 12 вход/
digitalWrite(13,LOW);
digitaIWrite(ll,HIGH);
}
void loopO
{
if (digitalRead (12)==HIGH) //если кнопка нажата...
{
digitaIWrite(13,! digitalRead(13)); //инвертируем состояние
вывода 13
digitaIWrite(ll,! digitalRead(13)); //инвертируем состояние
вывода 11 по отн. 13
28
Эксперимент №3
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
29
Глава 1.«Ардуино-ожидание»
Эксперимент №4
«ИГРОВОЙ КУБИК НА ШЕСТЬ ГРАНЕЙ»
Рис. 41
Рис. 4а
30
Эксперимент №4
////////////////////////////////////////////////////////////////////
//
/ / Arduino UNO
//
////////////////////////
//
//Кубик игровой на шесть граней//
void setup()
{
pinMode(2, OUTPUT); //центральный светодиод вых. 2 /
pinMode(3, OUTPUT); //диагональ светодиодов вых. 3 /
pinMode(4, OUTPUT); //диагональ светодиодов вых. 4 /
pinMode(5, OUTPUT); //горизонталь светодиодов вых.5 /
pinMode(6,INPUT); //кнопка выв.б стоп игра/
digitalWrite(2,LOW); //Зажигаем грань 6/
digitalWrite(3,HIGH);
digitaIWrite(4,HIGH);
digitalWrite(5,HIGH);
}
void loop()
{
for ( int k = 2; k <= 5; k=k+l) / / Зажигаем грань 1
{
digitaIWrite(k,! digitalRead(k));
}
delay(10); / /небольшая защита от «дребезга» контактов кнопки
31
Глава 1.«Ардуино-ожидание»
delay(10);
if (digitalRead (6)==HIGH) //если кнопка нажата, останавлива
ем грань
{
delay(5000); //Фиксация выпавшей грани 2 на 5 сек.
}
digitalWrite(2,! digitalRead(2)); / / Зажигаем грань 3
delay(10);
if (digitalRead (6)==HIGH) //если кнопка нажата, останавли
ваем грань
{
delay(5000); //Фиксация выпавшей грани 3 на 5 сек.
}
digitalWrite(2,! digitalRead(2)); / / Зажигаем грань 4
digitalWrite(4,! digitalRead(4));
delay(10);
if (digitalRead (6)==HIGH) //если кнопка нажата, останавлива
ем грань
{
delay(5000); //Фиксация выпавшей грани 4 на 5 сек.
}
digitalWrite(2,! digitalRead(2)); / / Зажигаем грань 5
delay(lO);
if (digitalRead (6)==HIGH) //если кнопка нажата, останавли
ваем грань
{
delay(5000); //Фиксация выпавшей грани 5 на 5 сек.
}
digitalWrite(2,! digitalRead(2)); / / Зажигаем грань 6
digitalWrite(5,! digitaIRead(5));
delay(10);
if (digitalRead (6)==HIGH) //если кнопка нажата, останавлива
ем грань
{
delay(5000); //Фиксация выпавшей грани 6 на 5 сек.
}
32
Эксперимент №4
>
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
//Кубик игровой на шесть граней с зеро//
void setupO
{
pinMode(2, OUTPUT); //центральный светодиод вых. 2 /
pinMode(3, OUTPUT); //диагональ светодиодов вых. 3 /
pinMode(4, OUTPUT); //диагональ светодиодов вых. 4 /
pinMode(5, OUTPUT); //горизонталь светодиодов вых.5 /
pinMode(6,INPUT); //кнопка выв.б стоп игра/
33
Глава 1.«Ардуино-ожидание»
void loopO
{
for ( int к = 2; к <= 4; k=k+l) / / Зажигаем грань О
{
digitalWrite(к,! digitalRead(k));
}
delay(10); //небольшая защита от «дребезга» контактов кнопки
delay(10);
if (digitalRead (6)==HIGH) //если кнопка нажата, останавлива
ем грань
{
delay(5000); //Фиксация выпавшей грани 1 на 5 сек.
}
digitalWrite(2,! digitalRead(2)); / / Зажигаем грань 2
digitalWrite(3,! digitalRead(3));
delay(10);
if (digitalRead (6)==HIGH) //если кнопка нажата, останавли
ваем грань
{
delay(5000); //Фиксация выпавшей грани 2 на 5 сек.
}
34
Эксперимент №4
35
Гпава 1.«Ардуино-ожидание»
Эксперимент №5
«ПЕСОЧНЫЕ ЧАСЫ»
Рис. 1
Рис. la
36
Эксперимент №5
////////////////////////////////////////////////////////////////////
//
/ / Arduino UNO
//
////////////////////////
//
//Песочные часы на 1 минуту//
unsigned int n=0;
unsigned int i=0;
void setupO
{
pinMode(5, OUTPUT); //нижняя группа светодиодов /
pinMode(6, OUTPUT); /верхняя группа светодиодов /
pinMode( 12,INPUT); //кнопка запуска часов/
analog\Vrite(5,n);
analogWrite(6,238- n);
}
void loopO
{
if (digitalRead (12)==HIGH) //если часы запущены...
{
37
Глава 1.«Ардуино-ожидание»
38
Эксперимент №5
39
ГЛАВА 2
«АРДУИНО - НАЧАЛО»
Рис. 1 Рис. 2
40
«Ардуино — начало»
If I « 11*1 . ' ■ | //
: ■<;. !■ ■ ' >
: ; ,. . . . :
: V . .. '
i- 'В е ш и т . У г. : ^
j
; 8м о р « * шт ^ :
* { • (
: Алтафорштритлшй
Рис. 3 Рис. 4
6. Выбираем иной путь, как кажется автору более удобный...
7. Выделяем текст заготовки и удаляем его (работаем левой и пра
вой кнопкой мыши) — рисунок 2.
8. Далее параллельно открыва
ем документ, в котором хра
ним текст скетча, выделяем
его, копируем.
9. Вставляем текст программы в
Arduino IDE — рисунок 3.
10. Через несколько секунд текст
появится в окошке (рис. 4).
11. Убедимся что в скетче мы не
допустили никаких оши
бок — нажмём кнопку «Про
верить» — рисунок 5. аншн^ И И
41
Гпава 2. «Ардуино — начало»
Рис. 6
ки со скетчем на нашем компьютере. Выберем это место и
сохранимся — рисунок 6.
13. После этого окошко исчезнет, а процесс проверки-компиляции
продолжится (в нижней части окна появится таймер реализации).
Рис. 7 Рис. 8
42
«Ардуино — начало»
n 5$s э s ааа
'■■■■..... Э Э З Э Э З З « ) © Э Э
Ц} ^
Рис. 9
43
Гпава 2. «Ардуино — начало»
44
Эксперимент №6
Эксперимент №6
«ВНОВЬ МИГАЮЩИЙ СВЕТОДИОД»
////////////////////////////////////////////////////////////////////
//
/ / Arduino UNO
//
////////////////////////
//
/ / Программа мигания светодиода без остановки программы/
Рис. 11
45
Гпава 2. «Ардуино — начало»
//
long i = 0; / / вводим переменную, для хранения считываемого времени
long п = 0; / / вводим переменную для хранения предыдущего значения
времени
void setup()
{
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
}
void loop()
{
i= millisO; //присваиваем переменной текущее время
if (i — n > 500) / / если разница предыдущего значения и теку
щего...
{
digitalWrite(13,! digitalRead (13)); //инвертируем состояние вывода
n=i; / / заменяем предыдущее значение текущим
}
}
//
/ / Конец /
46
Эксперимент №6
47
Гпава 2. «Ардуино — начало»
Эксперимент №7
«ОСМЫСЛЕННО МИГАЮЩИЙ
СВЕТОДИОД или СПАСИТЕ НАШИ
ДУШИ»
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
/ / Программа передачи светодиодом сигнала SOS /
//
unsigned int n = 0;
48
Эксперимент №7
void setupO
{
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
}
void loopO
{
for (n = 0; n < 18; n++)
{
digitalWrite(13,! digitalRead (13)); //инвертируем состояние
вывода
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
49
Гпава 2. «Ардуино — начало»
Эксперимент №8
«ПЕСОЧНЫЕ ЧАСЫ С СЕКУНДНЫМ
ОТСЧЁТОМ»
void setupO
{
pinMode(5, OUTPUT); / /
нижняя группа светодиодов / Рис. 13
51
Гпава 2. «Ардуино — начало»
Рис. 14
pinMode(6, OUTPUT); //верхняя группа светодиодов /
pinMode(12,INPUT); //кнопка запуска часов/
analogWrite(5,n);
analogWrite(6,238- n);
}
А должно:
void setupO
{
pinMode(5, OUTPUT); //нижняя группа светодиодов /
pinMode(6, OUTPUT); //верхняя группа светодиодов /
pinMode(12,INPUT); //кнопка запуска часов/
analogWrite(6,n);
analogWrite(5,238- n);
}
52
Эксперимент №8
////////////////////////////////////////////////////////////////////
//
/ / Arduino UNO
//
////////////////////////
//
//Песочные часы на 1 минуту с отсчётом секунд//
unsigned int n=0;
unsigned int i=0;
unsigned int k;
void setupO
{
pinMode(5, OUTPUT); //нижняя группа светодиодов /
pinMode(6, OUTPUT); //верхняя группа светодиодов /
pinMode( 12,INPUT); //кнопка запуска часов/
analogWrite(6,n);
analogWrite(5,238- n);
}
void loop()
{
if (digitalRead (12)==HIGH) //если часы запущены...
{
for (n = 0; n <= 14; n=n+l)
{
i=17*n;
for (k = 1; k <= 4; k=k+l)
53
Гпава 2. «Ардуино — начало»
{
digitalWrite(5, LOW);
digitalWrite(6, LOW);
delay(250);
analogWrite(5,i);
analogWrite(6,238- i);
delay(750); //задержка свечения данной яркости на 4
сек. за цикл
}
}
}
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
//Песочные часы на 1 минуту с отсчётом секунд — улучшенные//
unsigned int n=0;
54
Эксперимент №8
i=5*n;
j=17*n;
for (k = 1; k <= 4; k=k+l)
{
digitalWrite(5, LOW);
digitalWrite(6, LOW);
delay(250);
analogWrite(5,i);
analogWrite(6,238- j);
delay(750); //задержка свечения данной яркости на 4
сек. за цикл
}
}
}
}
//
/ / Конец /
55
Гпава 2. «Ардуино — начало»
и
////////////////////////////////////////////////////////////////////
56
Эксперимент №9
Эксперимент №9
«7 СЕГМЕНТНЫЙ СВЕТОДИОДНЫЙ
ИНДИКАТОР»
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
/ / Программа перебора цифр 7 сегментного ивдикатора /
//
unsigned int k = 0;
57
Гпава 2. «Ардуино — начало»
Рис. 16
unsigned int i ;
void setup()
{
for (i = 1; i <=7; i++)
{
pinMode(i, OUTPUT);
digitalWrite(i,! LOW);
}
}
void loop()
{
58
Эксперимент №9
Рис. 17
for (i = 1; i < = 7 ; i+ + )
{
digitalWrite(i,! tabl [к]); //включаем каждый сегмент по коду
k=k+l; / / производим последовательный перебор в массиве
if (k==70)
{
k=0;
}
}
delay(lOOO);
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
59
Гпава 2. «Ардуино — начало»
—
ш ^н
— IШ
кя Ш
.........
■ С Я Я ^В В Д ^№ 1 Э Д И Н Ж |1
1^ ^ Н | Н
ш я вШ шШ Ш Я Ш Ш Ш
■ ИИИИЯИИИИИИИИ
н_
я ■
шШ Ш Ж _
■
Рис. 18
60
Эксперимент №10
Эксперимент №10
«СЕКУНДОМЕР НА ПРЕДЕЛ
ИЗМЕРЕНИЯ - 10 СЕКУНД»
61
Гпава 2. «Ардуино — начало»
11И
Рис. 20
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
/ / Секундомер на 10 секуцц /
//
unsigned int к = 0;
unsigned int i ;
void setup()
{
pinMode(8,INPUT); //кнопка запуска, остановки секундомера
for (i = 1; i <=7; i++)
62
Эксперимент №10
{
pinMode(i, OUTPUT);
digitalWrite(i,! LOW);
}
void loopO
{
if (digitalRead (8)==LOW) / / если кнопка отпущена...
{
k=0;
}
if (digitalRead (8)==HIGH) //если кнопка нажата...
{
//
/ / Конец /
//
Трактовать её содержание можно так:
1. Введём две переменные и массив, указав все его 70 элементов.
2. Обозначим вывод 8 как вход, в цикле обозначим выводы с 1 по 7
как выходы, присвоим им через отрицание высокий уровень
(сегменты гореть не будут).
63
Гпава 2. «Ардуино — начало»
64
Эксперимент №11
Эксперимент №11
«СЕКУНДОМЕР НА ПРЕДЕЛ
ИЗМЕРЕНИЯ - 99 СЕКУНД»
Рис. 21
65
Гпава 2. «Ардуино — начало»
Рис. 22
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
66
Эксперимент №11
/ / Секундомер 99 секуцд /
//
unsigned int k=7;
unsigned int i= 0 ;
unsigned int r= 0;
unsigned int n = 0 ;
unsigned int f= 0 ;
void setup()
{
pinMode( 10,INPUT); //кнопка сброса показаний секундомера
pinMode(8,INPUT); //кнопка запуска секуццомера
pinMode(9, OUTPUT);
digitalWrite(9,! LOW);
void loopO
{
if (digitalRead (10)==HIGH) //если кнопка сброса нажата
{
k=0;
n=0;
67
Гпава 2. «Ардуино — начало»
delay(250);
}
if (digitalRead (8)==HIGH) //если кнопка запуска нажата...
{
n=n+l;
if (n==10)
{
n=0;
}
}
}
delay (1000);
}
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
69
Гпава 2. «Ардуино — начало»
Эксперимент №12
«СВЕТОДИОДНЫЙ КУБ 3*3*3»
Рис. 23
70
Эксперимент №12
Рис. 24
71
Гпава 2. «Ардуино — начало»
Рис. 25
на вывод 2 включится дополнительно светодиод HL4 и т.д. «Играя»
на выводах логическими уровнями можно управлять свечением све
тодиодов куба. Вариант макетного исполнения (без изготовления ку
ба) дан на рисунке 27. Взаиморасположение светодиодов в кубе от
носительно подключения номеров выводов платы дано на рисун
ке 28. Рассмотрим работу нескольких программ управления «лед
кубом».
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
/ / LED КУБ змейка столбцов /
//
unsigned int i ;
72
Эксперимент №12
HL1
Рис. 26
73
Гпава 2. «Ардуино — начало»
|Щ £ ф в
unsigned int к ;
void setup()
{
for (к = 10; к <=12; к++)
{
pinMode (к, OUTPUT);
digitalWrite (к, HIGH );
}
for (i = 1; i <=9; i++)
{
pinMode (i, OUTPUT);
Эксперимент № 12
void loopO
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
75
Гпава 2. «Ардуино — начало»
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
/ / LED КУБ нарастание — убывание слоёв /
//
unsigned int i ;
unsigned int к ;
void setup()
{
for (k = 10; к <=12; k++)
void loop()
76
Эксперимент №12
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
Скетч можно-«расшифровать»:
1. Введём две переменные — счётчики выходов платы.
2. В цикле присвоим сначала выводам 10-12 статус выход и состоя
ние — низкий уровень сигнала; затем выводам 1-9 статус выход и
состояние — высокий уровень.
3. В бесконечном цикле введём два последовательных цикла пере
счёта выводов с 1 0 п о 1 2 и в обратном порядке с 12 по 10.
4. Будем там последовательно присваивать соответствующему вы
воду высокий уровень, задерживать свечение слоя на полсекун
ды и переходить в цикле к следующему выводу — слою (преды
дущий слой при этом остаётся включённым).
5. В следующем цикле наоборот будем отключать слои, задержи
вая каждый режим на полсекунды.
Ещё один режим свечения поясняет рисунок 31. «Бегущие слои с
реверсом» так можно назвать этот режим. Программа имеет вид:
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
/ / LED КУБ бе1ущие слои с реверсом /
//
unsigned int i ;
77
Гпава 2. «Ардуино — начало»
unsigned int к ;
void setup()
{
for (к = 10; к <=12; к++)
{
pinMode (к, OUTPUT);
digitalWrite (к, LOW);
}
for (i = 1; i <=9; i++)
{
pinMode (i, OUTPUT);
digitalWrite (i, HIGH);
}
void loop()
{
for (k = 10; к <=12; k++)
{
digitalWrite (k, HIGH);
delay (500);
digitalWrite (k, LOW);
}
for (k = 12; к >=10; k=k-l)
{
digitalWrite (k, HIGH);
delay (500);
digitalWrite (k, LOW);
}
}
/ / Конец /
Эксперимент № 12
и
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
//
/ / Arduino UNO
//
////////////////////////
//
//L E D КУБ общая программа /
//
unsigned int i ;
unsigned int k ;
unsigned int j—100; / / регулировщик частоты переключений
void setup()
{
for (k = 10; k <=12; k++)
{
pinMode (k, OUTPUT);
digitalWrite (k, LOW);
}
for (i = 1; i <=9; i++)
{
pinMode (i, OUTPUT);
digitalWrite (i, HIGH);
}
79
Гпава 2. «Ардуино — начало»
void 1оор()
{
for (к = 10; к <=12; к++) / / начало фрагмента №3
{
digitalWrite (к, HIGH);
delay (j);
digitalWrite (к, LOW);
}
for (к = 12; к >=10; k=k-l)
{
digitalWrite (к, HIGH);
delay 0);
digitalWrite (k, LOW);
}
for (i = 1; i <=9; i++) / / подготовка к фрагменту №1
{
digitalWrite (i, LOW);
}
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
81
Гпава 2. «Ардуино — начало»
////////////////////////////////////////////////////////////////////
//
/ / Arduino UNO
//
////////////////////////
//
/ / LED КУБ универсальная программа — пример вспышка /
//
unsigned int i ;
intk;
unsigned int j ;
unsigned int n ; / / в таблицу-массив ниже вносим данные для этого
примера
int tabl [216]= {1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,
1,1,0,0,0,1,0,0,0, 1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,
1.1.1.0.1.1.1.0.0, 1,1,0,0,0,1,0,0,0, 1,0,о,о,о,о,о,о,о,
1.1.1.1.1.1.1.1.0, 1,1,1,0,1,1,1,0,0, 1,1,О,О,О,1,0,о,о,
1.1.1.1.1.1.1.1.1, 1,1,1,1,1,1,1,1,0, 1,1,1,0,1,1,1,0,о,
1.1.1.1.1.1.1.1.1, 1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,о,
1.1.1.1.1.1.1.1.1, 1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,
82
Эксперимент №12
void setup()
{
for (к = 10; к<=12; к++) / / объявляем все выходы и задаём начальное
состояние
{
pinMode (к, OUTPUT);
digitalWrite (к, LOW );
}
for (i = 1; i <=9; i++)
{
pinMode (i, OUTPUT);
digitalWrite (i, LOW);
}
void loop()
{
k= -l;
for (n = 1; n <=8; n++) / / определяет перебор картинок — пример 8
картинок
{
for (j = 1; j <=25; j+ + ) / / определяет длительность свечения 1
картинки
{
digitalWrite (10, HIGH);
for (i = 1; i <=9; i++)
{
k=k+l;
digitalWrite (i, tabl [k]);
}
delay(5);
digitalWrite (10, LOW);
83
Гпава 2. «Ардуино — начало»
}
delay(5);
digitalWrite (12, LOW);
k=k-27;
}
k=k+27;
}
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
84
Эксперимент № 13
Эксперимент №13
«ЗВУКОВОЙ СИГНАЛ SOS»
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
Puc. 33
85
Гпава 2. «Ардуино — начало»
— ... ...........
Рис. 34
Рис. 35
86
Эксперимент №13
//
////////////////////////
//
/ / Программа передачи звукового сигнала SOS /
//
unsigned int n = 0;
unsigned int k = 0;
unsigned int j = 0;
unsigned int r = 0;
void setup()
{
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
}
void loopO
{
for (n = 0; n <18; n=n+2)
{
k=tabl[n];
j=tabl[n+l];
tone (13, 700,100*k);
r=100*(k+j);
delay(r);
}
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
87
Гпава 2. «Ардуино — начало»
88
Эксперимент № 14
Эксперимент №14
«МОЯ МЕЛОДИЯ»
Рис. 36
89
Гпава 2. «Ардуино — начало»
////////////////////////////////////////////////////////////////////
//
/ / Arduino UNO
//
////////////////////////
//
11 Универсальная программа проигрывания мелодий — пример моя
мелодия/
//
unsigned int n = 0;
unsigned int к = 0;
unsigned int j = 0;
unsigned int г = 0;
unsigned int s = 0;
unsigned int h = 0;
90
Эксперимент №14
void setup()
{
pinMode(13, OUTPUT);
digitaIWrite(13, LOW);
}
void loop()
{
for (h = 20; h <=40; h=h+10)// смена темпа звучания
{
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
В массиве каждые три подряд элемента «отвечают» за звучание но
ты. Первый задаёт частоту звука, второй условную длительность зву
чания ноты, третий — условную длительность паузы. Реальную дли
91
Гпава 2. «Ардуино — начало»
92
Эксперимент № 15
Эксперимент №15
«ОДНОГОЛОСЫЙ ЭМИ или
ARDUINO-ДУДКД»
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
/ / Программа для одноголосого ЭМ И /
//
unsigned int n = 0;
unsigned int i = 0;
unsigned int j = 500;
93
Глава 2. «Ардуино — начало»
Рис. 37
unsigned int к = 0;
94
Эксперимент №15
void setupO
{
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
for (i =6 ; i <=10; i=i+l)
{
pinMode(i, OUTPUT);
digitalWrite(i, LOW);
}
for (i = 1 ; i <=5; i=i+l)
{
pinMode(i, INPUT);
}
Puc. 38
95
Гпава 2. «Ардуино — начало»
void 1оор()
{
for (i =6 ; i <=10; i=i+l) //последовательно-попеременная подача
на выходы логической единицы
{
digitalWrite(i, HIGH);
for (n = 1 ; n <=5; n=n+l) / / перебор входов
{
if (digitalRead (i)==HIGH & digitalRead (n)==H IG H )//
проверка замкнута ли кнопка ?
{
k=5*(i-6) + (n-1);
tone (13, tabl[k] j); / / исполнение вызванной ноты
delay (j);
Puc. 39
96
Эксперимент №15
}
}
digitalWrite(i, LOW);
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
97
ГЛАВА 3.
«АРДУИНО-ПРОБЫ»
98
Эксперимент №16
Эксперимент №16
«ОПЯТЬ СВЕТОДИОД»
////////////////////////////////////////////////////////////////////
//
/ / Arduino UNO
//
////////////////////////
//
//Плавное переключение яркости свечения светодиода с регулятором
частоты//
unsigned int n=0;
int k = l;
unsigned int x=0;
unsigned int j=0;
Puc. 2
99
Гпава 3. «Ардуино-пробы»
void setup()
{
pinMode(6, OUTPUT); //канал сигнала для светодиода /
analogWrite(6,0);
pinMode(A0, INPUT); / / регулятор частоты/
}
void 1оор()
{
analogWrite(6,n);
delay(j);
x=analogRead(AO);
j=map(x, 0,1023,20,2);
n=n+k;
if ( n>=255)
{
k—-1 ;
}
if ( n<=0)
{
k= 1;
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
100
Эксперимент №16
101
Гпава 3. «Ардуино-пробы»
Эксперимент №17
«НОЧНИК - ТРИ ЦВЕТА»
Рис. 3
102
Эксперимент №17
Puc. 4
вкладыши, также уменьшающие засветку. Программа для конструк
ции обеспечивает четыре смены динамики свечения, переменный
резистор регулирует амплитуду перелива света и его скорость (часто
ту смены). Реализовано два основных режима — синхронное нарас
тание цвета в трубочке (выдавливание белого цвета красным, зелё
ным, синим с реверсом) и поочерёдное выдавливание в каждой труб
ке (перелив цветов). Между этими режимами — статичное,
пятисекундное, синхронное свечение каждого (основного) цвета в
трубочке. Программа представлена ниже.
/ /////////////////////////////////////////////////////////////////
//
/ / Arduino UNO
//
////////////////////////
//
103
Гпава 3. «Ардуино-пробы»
Рис. 5
//Свечение трёх трубочек с регулятором амплитуды перелива света и
частоты//
unsigned int nl=0;
unsigned int n2=0;
unsigned int n3=0;
int k l= l;
int k2=l;
int k3=l;
int i=0;
long y l= 0 ;
104
Эксперимент №17
long у2=0;
unsigned int x=0;
unsigned int j=0;
unsigned int z=0;
unsigned int r=0;
void setup()
{
pinMode(6, OUTPUT); / / канал сигнала для 1 трубки /
analogWrite(6,0);
pinMode(5, OUTPUT); / / канал сигнала для 2 трубки /
analogWrite(5,0);
pinMode(9, OUTPUT); / / канал сигнала для 3 трубки /
analogWrite(9,0);
pinMode(A0, INPUT); / / регулятор амплитуды и частоты/
}
void 1оор()
{
x=analogRead(AO); y2=millis();
z=map(x, 0, 1023, 0,127); / / переменная, ограничивающая min
яркости
j=map(x, 0,1023,20,2); / / переменная, определяющая длитель
ность задержки
г=шар(х, 0,1023,255,128); / / переменная, ограничивающая
шах яркости
n l= n l+ k l; n2=n2+k2; пЗ=пЗ+кЗ; //счётчики ступеней измене
ния яркости
105
Гпава 3. «Ардуино-пробы»
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
106
Эксперимент №18
Эксперимент №18
«ЦВЕТОВЫЕ ЧАСЫ С СЕКУНДНЫМ
ОТСЧЁТОМ»
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
Puc. 6
107
Гпава 3. «Ардуино-пробы»
//
//Цветовые часы на 1 минуту с отсчётом секунд//
unsigned int n=0;
unsigned int i=0;
unsigned int k;
void setupO
{
pinMode(5, OUTPUT); //трубка красного свечения /
pinMode(6, OUTPUT); / / трубка синего свечения /
pinMode(9, OUTPUT); / / трубка зелёного свечения /
pinMode(12,INPUT); / / кнопка запуска часов/
anaIogWrite(6,n);
analogWrite(5,n);
anaIogWrite(9,n);
}
void loopO
{
if (digitalRead (12)==HIGH) / /
если часы запущены...
ill
i j
Puc. 7
108
Эксперимент № 18
109
Гпава 3. «Ардуино-пробы»
Эксперимент №19
«ДЛИННОМЕР»
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
//Длинномер: программа работы / /
unsigned int n=0;
unsigned int x=0;
void setupO
{
pinMode(6, OUTPUT); //канал сигнала для микроамперметра /
pinMode(A0, INPUT); //датчик перемещения/
}
void 1оор()
{
x=ana!ogRead(AO);
n=map(x, 0,1023, 0,170);
analogWrite(6,n);
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
111
Гпава 3. «Ардуино-пробы»
112
Эксперимент №20
Эксперимент №20
«КОДОВЫЙ ЗАМОК»
Рис. 10
Рис. 11
113
Гпава 3. «Ардуино-пробы»
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
//Кодовый замок — игрушка / /
unsigned int n = 0;
int tabl [3] ={0,0,5};// комбинация цифр ключа
void setup()
{
pinMode(6, OUTPUT); //канал сигнала для лампы /
digitalWrite(6, LOW);
if (n==3){digitalWrite(6, HIGH);}
114
Эксперимент №20
115
Гпава 3. «Ардуино-пробы»
Эксперимент №21
«ПРОБА ВХОД-ВЫХОД?»
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
116
Эксперимент №21
// ш ш ш ш т ш гт ш ш ш ш т
////////////////////////
н
//программа ПРОБА 1 / /
unsigned int n=0;
unsigned int x=0;
void setup()
void loop()
{ a
pinMode(A0,
INPUT);x=analogRead(AO); , I
n=map(x, 0,700,100,2000); I .......... . ,
pinMode(14, OUTPUT);digital
Write( 14,HIGH);delay(n);
digitalWrite( 14, LOW);delay(n);
1
// Puc. 14
/ / Конец /
//
////////////////////////////////////////////////////////////////////
117
Гпава 3. «Ардуино-пробы»
Эксперимент №22
«ЭМИ - ВАРИАНТ ВТОРОЙ»
Рис. 15
118
Эксперимент №22
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
Puc. 16
119
Гпава 3. «Ардуино-пробы»
////////////////////////
//
//программа ЭМИ вариант 2 / /
unsigned int n=0;
unsigned int x=0;
int tabl [8] ={0,261,293,329,349,392,
440,494 }; / / зашифрованные данные нот — их частоты
void setup()
{
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
pinMode(A0, INPUT);
}
void Ioop()
{
x=analogRead(A0); n=map(x, 0,1025,0,8);
if ( n>0) {tone (13, tabl[n]);} / / исполнение вызванной ноты
else {noTone(13);}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
120
Эксперимент №22
Рис. 17
121
Гпава 3. «Ардуино-пробы»
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
//программа ЭМИ вариант со светодиодами / /
unsigned int n=0;
unsigned int x=0;
unsigned int nl=0;
unsigned int xl=0;
long yl=0;
long y2=0;
int i=0;
int tabl [8] ={0,261,293,329,349,392,
440,494 }; / / зашифрованные данные нот — их частоты
void setup()
{
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
pinMode(A0, INPUT);
}
void loop()
{
x=analogRead(A0); n=map(x, 0,1025,0,8);
if ( n>0) {tone (13, tabl[n]);} / / исполнение вызванной ноты
else { noTone(13);}
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / мигающие светодио
ды / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / y2=millis();
pinMode(Al, INPUT);xl=analogRead(Al); nl=map(xl, 0, 700,100,
2000);
122
Эксперимент №22
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
123
Гпава 3. «Ардуино-пробы»
Рис. 18
124
Эксперимент №22
//
//программа ЭМИ вариант 3 с запретом нажатия более 1 кнопки / /
unsigned int n=0;
unsigned int x=0;
unsigned int xl=0;
int tabl [11] ={0,261,293,329,349,392,
440,494,523,587,659}; / / зашифрованные данные нот —
их частоты
void setup()
{
pinMode(13, OUTPUT);
digitalWrite( 13, LOW);
pinMode(A0, INPUT); //вход, следящий какая кнопка нажата
pinMode(Al, INPUT); //вход, следящий сколько кнопок нажато
}
void 1оор()
{
metka:
х 1=analogRead(Al);
if ( xl>=106) {goto metka;}// блокировка при нажатии более 1
кнопки
x=analogRead(A0); n=map(x, 0,1025,0, 11);
if ( n>0) {tone (13, tabl[n],10);} / / исполнение вызванной ноты
else { noTone(13);}
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
125
Гпава 3. «Ардуино-пробы»
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
//программа ЭМИ вариант 3 с запретом нажатия более 1 кнопки и
выводом данных на монитор порта / /
unsigned int n=0;
unsigned int x=0;
unsigned int xl=0;
long yl = 0;
long y2 = 0;
126
Эксперимент №22
void setupO
{
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
pinMode(A0, INPUT);
pinMode(Al, INPUT);
Serial.begin(9600);
}
void loop()
{
metka:
y2=millis();
if (y2-yl>=2000)
{yl=y2; Serial.println(“x,xl,n”);Serial.println(x);Serial.
println(xl);Serial.printIn(n);}
xl=analogRead(Al);
if ( xl>=106) {goto metka;}// блокировка при нажатии более 1
кнопки
x=analogRead(AO); n=map(x, 0,1025,0, 11);
if ( n>0) {tone (13, tabl[n],10);} / / исполнение вызванной ноты
else { noTone(13);}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
Фрагмент программы:
y2=millis();
if (y2-yl>=2000)
127
Гпава 3. «Ардуино-пробы»
{yl=y2; Serial.
println(“x,xl,n”);SeriaI.
println(x);Serial.printIn(x 1); Serial.
println(n);}
можно «перевести» — каждый
раз, через две секунды печатай в
мониторе порта надпись «х,х1,п»
и числовые значения переменных
х, xl, п.
Эксперимент №22
Эксперимент №23
«ПРОБА-МОТОР»
Рис. 22
130
Эксперимент №23
Puc. 23
привода. Потребляемый им ток под нагрузкой, обычно не превышает
100-120 мА. Это обстоятельство позволяет нам использовать для его
питания соответствующие выводы платы. Транзисторный ключ по
зволит нам регулировать «усреднённое значение напряжения» на мо
торе методом ШИМ. Диод защищает схему от нежелательных им
пульсов напряжения обратной полярности, возникающих при ком
мутации двигателя. К аналоговому входу АОподключим потенциометр
для регулировки скорости вращения вала или круговой частоты.
В процессе проб будем менять номера выводов платы на мотор. Итак
первый скетч:
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
131
Гпава 3. «Ардуино-пробы»
void loop()
{
x=analogRead(A0);x=x/4;
analogWrite(6,x);
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
132
Эксперимент №23
////////////////////////
//
/ / Программа регулировки частоты вращения вала мотора /
//
long у 1 = 0; / / вводим переменную, для хранения считываемого времени
long у2 = 0; / / вводим переменную для хранения предыдущего значения
времени
long х = 0;
void setup()
{
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
pinMode(A0, INPUT);
}
void loopO
{
x=analogRead(A0);
y2= microsO; //присваиваем переменной текущее время
if (y2-yl >=х) { digitalWrite(13,HIGH); }//определяет длитель
ность низкого уровня сигнала
if (у2-у1 >=1023) { digitalWrite( 13,LOW);y 1=у2;} / / запускает
новый период отсчёта
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
133
Гпава 3. «Ардуино-пробы»
134
Эксперимент №24
Эксперимент №24
«ПРОБА - НОТЫ БЕЗ TONE»
Рис. 25
void setupO
{
135
Гпава 3. «Ардуино-пробы»
void 1оор()
{
digitalWrite(ledPin, HIGH); //подать высокий уровень сигнала на
динамик
delayMicroseconds (760);// задержка 760 мксек
digitalWrite(ledPin, LOW); //выключить динамик
delayMicroseconds (760);//ждать 760 микросек
}
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
/ / Программа звукового сигнала ноты «ми» 2 октавы /
//
long 1= 0; / / вводим переменную, для хранения считываемого времени
long п = 0; / / вводим переменную для хранения предыдущего значения
времени
void setup()
{
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
}
void loop()
{
i= micros(); //присваиваем переменной текущее время
if (i — n >=760) / / если разница предыдущего значения и теку
щего...
136
Эксперимент №24
{
digitalWrite(13,! digitalRead (13)); //инвертируем состояние
вывода
n=i; / / заменяем предыдущее значение текущим
}
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
//
/ / Arduino UNO
//
////////////////////////
//
/ / Программа звуковой сирены (ноты «ми» и «до» разных октав)/
//
long il = 0; / / вводим переменную, для хранения считываемого времени
void setup()
{
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
}
void loopO
{
137
Гпава 3. «Ардуино-пробы»
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
138
Эксперимент №25
Эксперимент №25
«ПРОБА-GOTO»
////////////////////////////////////////////////////////////////////
//
/ / Arduino UNO
//
////////////////////////
//
/ / Программа проба команды goto /
//
long yl = 0;
long у2 = 0;
void setup()
{
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
void loop()
{
Puc. 26
139
Гпава 3. «Ардуино-пробы»
140
ГЛАВА 4
«АРДУИНОБИМ»
Рис. 1
141
Ардуинобим
Рис. 4
143
Гпава 4. «Ардуинобим»
Рис. 5
«Vin». Вообще-то он предназначен для снятия напряжения питания
на внешние исполняющие устройства с платы Ардуино при её пита
нии от внешнего источника (рис. 6 —верхняя схема). При этом мини
мально допустимое напряжение может быть 6,5 Вольт. При «нашем»
подключении минимальное напряжение может составлять 6 Вольт.
Полная схема платы приведена на рисунке 7.
Рассмотрим несколько скетчей, управляющих различными сюжета
ми поведения робота. После включения питания его запуск произво
дит кнопка SB1. ВНИМАНИЕ! Не следует одновременно подавать на
пряжение на плату через USB разъём и от батареек, дабы исключить её
поломку (при подключении платы к компьютеру SA1 — выключен).
144
Ардуинобим
U1
NCP1117ST50T3G
• 4
РС2С2
GND GND
6ND
Рис. 6
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
/ / Программа №1 для управления роботом /
145
Гпава 4. «Ардуинобим»
Рис. 7
146
Ардуинобим
и
longyl = 0;
long y2 = 0;
long уЗ = 0;
int x;
int xl;
long y4 = 0;
void setup()
{
pinMode(2, ОиТР11Т);//канал передачи звуковых и световых
эффектов
digitalWrite(2, LOW);
pinMode(3, ОиТРЦТ);//канал управления левым мотором
digitalWrite(3, LOW);
pinMode(4, OUTPUT);// канал управления правым мотором
digitalWrite(4, LOW);
pinMode(5, INPUT);// кнопка управления пуском
}
void 1оор()
{
metka:
if (digitalRead (5)=s=LOW){y2=millis();yl=y2;goto metka;} / /
условие блокировки запуска работы скетча
147
Гпава 4. «Ардуинобим>
{
digitalWrite(3, HIGH);delay(800);digitalWrite(3, L0\v);delay(1500);
goto metkal;}
else {yl=y2;goto metka2;}
148
Ардуинобим
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
/ / Программа №2 для управления роботом /
//
long yl = 0;
long у2 = 0;
void setup()
{
pinMode(2, О иТРШ );//канал передачи звуковых и световых
эффектов
digitalWrite (2, LOW);
pinMode(3, ОиТРЦТ);//канал управления левым мотором
digitalWrite(3, LOW);
pinMode(4, OUTPUT);// канал управления правым мотором
digitalWrite(4, LOW);
pinMode(5, INPUT);// кнопка управления пуском
}
149
Гпава 4. «
Ардуинобим»
void 1оор()
{
metka:
if (digitalRead (5)==LOW){y2=millis();yl=y2;goto metka;} / /
условие блокировки запуска работы скетча
goto metkal;}
else {digitalWrite(3, LOW);yl=y2;goto metka2;}
y2=millis();
if (y2-yl<=3000)
{tone(2,900,200);delay(250); tone(2,1300,200);delay(250);goto
metka2;}
else {yl=y2; goto metka3;}
150
Ардуинобим
goto metka3;}
else {digitalWrite(4, LOW);yl=y2;goto metka4;}
y2=millis0;
if (у2-у1<=3000)
{tone(2,500,200);delay(250); tone(2,700,200);delay(250);goto
metka4;}
else {yl=y2; goto metkat)-------------------------------
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
/ / Программа №3 для управления роботом /
//
long yl = 0;
long у2 = 0;
151
Гпава 4. «Ардуинобим»
long уЗ = 0;
int х;
in tx l;
long у4 = 0;
unsigned int n = 0;
unsigned int к = 0;
unsigned int j = 0;
unsigned int r = 0;
unsigned int n l = 0;
void setup()
{
pinMode(2, ОЦТРиТ);//канал передачи звуковых и световых
эффектов
digitalWrite(2, LOW);
pinMode(3, О иТРШ );//канал управления левым мотором
digitaIWrite(3, LOW);
pinMode(4, OUTPUT);// канал управления правым мотором
digitalWrite(4, LOW);
pinMode(5, INPUT);// кнопка управления пуском
}
void 1оор()
{
metka:
if (digitalRead (5)==LOW){y2=millisO;yl=y2;goto metka;nl=0;} / /
условие блокировки запуска работы скетча
152
Ардуинобим
{
k=tabl[n];
j=tabl[n+l];
tone (2 ,7 0 0 ,100*k);
r=100*(k+j);
delay(r);
}
goto metkaO;}
else {yl=y2;goto metkal;}
goto metkal;}
else {yl=y2;goto metka2;}
153
Гпава 4. «Ардуинобим»
Время
Реализация действия
Действия робота реализации
(возможная)
(примерное), сек.
Движение-рывок Включены одновременно оба
0,5-2
вперёд мотора
Попеременно включаются и
Шагание вперёд выключаются оба мотора
0,3-07
(шажок) приблизительно на одинаковое
время
Разворот на месте
Включён один мотор 0,3-3
(вращение)
154
Ардуинобим
Время
Реализация действия
Действия робота реализации
(возможная)
(примерное), сек.
Плавное движение по
Включены оба мотора, но с
дуге (требуется
разным «усреднённым» 1-6
использование ШИМ
значением напряжения питания
управления выходом)
Команда tone(), генератор
«Несвязная речь» 3-8
случайных чисел
Разговор на языке Массивы, циклы, команда
4-12
азбуки Морзе tone()
Звуки сирены Циклы, команда tone() 3-10
Исполнение
Массивы, циклы, команда
музыкальных 5-20
tone()
фрагментов
155
Гпава 4. «Ардуинобим»
Рис. 8
Рис. 9
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
156
Ардуинобим
и
////////////////////////
//
//программа микрофон как акустический датчик — реакция 1 хлопок//
unsigned int х=0;
void setupO
{
pinMode(6, OUTPUT); //канал сигнала для светодиода /
digitalWrite(6,LOW);
pinMode(A0, INPUT); / / подключение датчика/
}
void 1оор()
{
x=analogRead(AO);
if (x<=350){ digitalWrite(6,! digitalRead (6)); delay (500);} //инвертируем
состояние вывода
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
Программа постоянно «сканирует» напряжение на входе АО и если
оно вдруг в какой то момент становится меньше 1,7 Вольт меняет
уровень сигнала на выводе 6 на противоположное значение. Далее
делает паузу в полсекунды. То есть, щёлкая пальцами каждую секун
ду можно управлять светодиодом как «послушной мигалкой». Можно
отдавать и голосовые команды, например, короткое «а». Если дать
очень протяжное «аааааа» светодиод начнёт постоянно мигать с ча
стотой переключения в 1 Гц. Датчик реагирует на любые громкие зву
ки. Ещё один вариант скетча, управляет светодиодом при двух после
довательных быстрых хлопках:
157
Гпава 4. «Ардуинобим»
////////////////////////////////////////////////////////////////////
//
/ / Arduino UNO
//
////////////////////////
//
//программа микрофон как акустический датчик — реакция 2 хлопка
подряд//
unsigned int х=0;
unsigned int i= l;
void setup()
{
pinMode(6, OUTPUT); //канал сигнала для светодиода /
digitalWrite(6,LOW);
pinMode(A0, INPUT); / / подключение датчика/
}
void loopO
{
x=analogRead(AO);
if (х<=650)//если произошёл первый хлопок
{
delay (250);//ждём окончания первого хлопка
for (i=l;i<=500;i++)//B цикле ожидаем и проверяем наличие
второго хлопка
{
x=analogRead(AO);//cmiMaeM данные с датчика
delay (1); //короткая временная пауза
if (х<=650)//если произошёл второй хлопок
{
digitalWrite(6,! digitalRead (б));//меняем состояние выхода на
противоположное
return;
}
}
>
158
Ардуинобим
и
/ / Конец /
//
////////////////////////////////////////////////////////////////////
Этот скетч позволяет второму светодиоду не реагировать на оди
ночные хлопки — своего рода простейший «фильтр звука». Однако
протяжное «аааааа» вновь портит всю картину. Если всё-таки хочется
отделять короткие звуковые сигналы от длинных сигналов (хотя бы
частично) можно поэкспериментировать с таким вариантом про
граммы:
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
//программа акустического переключения RGB светодиода//
unsigned int х=0;
unsigned int n=0;
unsigned int k=0;
long yl=0;
long y2=0;
void setupO
{
pinMode(6, OUTPUT); //канал сигнала для красного светодиода /
digitalWrite(6,LOW);
pinMode(7, OUTPUT); //канал сигнала для зелёного светодиода
/
digitaIWrite(7,LOW);
pinMode(8, OUTPUT); //канал сигнала для синего светодиода /
digitalWrite(8,LOW);
pinMode(A0, INPUT); / / подключение датчика/
159
Гпава 4. «Ардуинобим»
>
void loopO
{
x=analogRead(AO);
if (x<=350){yl=millis();}
if(x>=750){y2=milUs();}
if (yl-y2>=200){
digitalWrite(6,! digitalRead (6));n=n+l;k=k+l;
if (n==2)
{
digitalWrite(7,! digitalRead (7));n=0;
}
if (k==4)
{
digitalWrite(8,! digitalRead (8));k=0;
}
yl=y2;delay (300);
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
160
Ардуинобим
Puc. 10
161
Гпава 4. «Ардуинобим»
Рис. 12
162
Ардуинобим
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
Puc. 14
163
Гпава 4. «Ардуинобим»
//
//////////////////////// ,-S -« ■ 4 -,
// / \ / \ / \ / \
//Программа акустического пере iJL l _•_! I* . j»,
ключения танцующего человечка//
unsigned int х=0; /> >> /V > v
void setup()
{ <4 <4 <4 <4
pinMode(6, OUTPUT); / / I• I I•
канал сигнала для левой руки /
digitaIWrite(6,LOW);
pinMode(7, OUTPUI); / / Puc. 15
канал сигнала для правой руки /
digitalWrite(7,LOW);
pinMode(8, OUTPUT); //канал сигнала для левой ноги /
digitalWrite(8,LOW);
pinMode(9, OUTPUT); //канал сигнала для правой ноги /
digitalWrite(9,LOW);
x=analogRead(AO);
if (х<=650)//если звуковой сигнал получен...
{
digitalWrite (б, random (0,2));//псевдослучайно меняем логическое
состояние выходов...
digitaiWrite(7,random (0,2));
digitalWrite(8,random (0,2));
digitaIWrite(9, random (0,2));
delay(300);
}
164
Ардуинобим
>
и
/ / Конец /
//
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
//программа акустического переключения танцующего человечка/ /
unsigned int х=0;
unsigned int yl=0;
unsigned int y2=0;
unsigned int zl=0;
unsigned int z2=0;
unsigned int il=0;
unsigned int 12=0;
165
Гпава 4. «Ардуинобим»
x=analogRead(AO);
if (х<=650)//если звуковой сигнал получен...
{
yl=y2;zl=z2;il=i2yl=j2;
y2=random (0,2); z2=random (0,2);i2=random (0,2)y2=random (0,2);
166
Ардуинобим
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
/ / Программа №4 для управления роботом /
Рис. 16
167
Гпава 4. «Ардуинобим»
Рис. 17
II
long yl = 0;
long у2 = 0;
long уЗ = 0;
int х;
intxl;
int х2;
long у4 = 0;
void setup()
{
pinMode(2, 01ЛГРиТ);//канал передачи звуковых и световых
эффектов
digitalWrite(2, LOW);
pinMode(3, ОЦТРЦТ);//канал управления левым мотором
digitalWrite(3, LOW);
pinMode(4, OUTPUT);// канал управления правым мотором
168
Ардуинобим
digitalWrite(4, LOW);
pinMode(A0, INPUT);// звуковой датчик управления пуском
}
void 1оор()
{
metka:
x2=analogRead(A0);
if (x2>=650){y2=millis();yl=y2;goto metka;} //условие блокировки
запуска работы скетча
goto metkal;}
else {yl=y2;goto metka2;}
и
/ / Конец /
//
////////////////////////////////////////////////////////////////////
170
ГЛАВА 5
АРДУИНО И ВРЕМЯ
171
Гпава 5. Ардуино и время
Эксперимент №26
«ТРЁХЦВЕТНЫЙ RGB СВЕТОДИОД»
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
//программа проверки аппаратного прерывания на RGB светодиоде//
const volatile int х=0;
int k = ll;
void setup()
{
pinMode(2, Ш РШ );//кнопка прерываний
pinMode(13, ОЦТРиТ);//канал красного кристалла
digitalWrite(13,LOW);
pinMode(12, ОЦТРЦТ);//канал синего кристалла
digitalWrite(12,LOW);
pinMode(ll, ОиТРЦТ);//канал зелёного кристалла
digitalWrite (11, LOW);
attachlnterrupt (x,fun,RISING);
}
void йш()//переключение светодиода на прерывании
{
k=k+l;if(k==14){k=ll;}//nepeiciii04eHHe цвета свечения по кругу
>
void 1оор()//переключение светодиода каждые 0,05 секунды
172
Эксперимент №26
{
digitalWrite(l l,LOW);
digitalWrite(12,LOW);
digitalWrite(I3,LOW);
delay (50);
digitalWrite(k, НГСН);//включенне кристалла данного цвета
delay (50);
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
Рис. 1
173
Гпава 5. Ардуино и время
Рис. 2
ней по каждому нажатию кнопки производится перебор возможных
значений — 11,12,13. Вызывая каждый раз прерывания, мы меняем
цвет мигания светодиода, перебирая зелёный, синий, красный. Часть
кода, относящаяся к реализации прерывания, выделена цветом.
Вариант макета дан на рисунке 2. Практически схему и скетч мож
но применить при проектировании светодиодного ночника-светиль
ника. Правда рациональней будет «добавить в скетч возможность»
перебора комбинаций цветов. Например, красный — синий, крас
ный — зелёный, зелёный — синий.
174
Эксперимент №27
Эксперимент №27
«СНОВА ЭЛЕКТРОННЫЙ КУБИК»
Рис. 3
175
Гпава 5. Ардуино и время
////////////////////////////////////////////////////////////////////
//
/ / Arduino UNO
//
////////////////////////
//
//программа для игрового кубика на 6 граней с использованием опроса
кнопки в цикле//
int i=0;
int k=0;
int z=0;
int tabl [24] ={1,0,0,0,0,1,0,0,1,1,0,0, 0,1,1,0,1,1,1,0, 0,1,1,1}; / /
значения логических уровней каналов на каждую грань
176
Эксперимент №27
void setup()
{
pinMode(2, INPUT);//кнопка выпадения грани
pinMode(6, OUTPUT);//l канал
digitalWrite(6,LOW);
pinMode(7, OUTPUT);//2 канал
digitaIWrite(7,LOW);
pinMode(8, OUTPUT);//3 канал
digitalWrite(8,LOW);
pinMode(9, OUTPUT);//4 канал
digitalWrite(9,LOW);
void loop()
{
1=га1н1о т (0,6);//псевдослучайный перебор граней
if (digitalRead (2)==HIGH) //если кнопка нажата...
{
delay (200);//пауза временнАя
if (digitalRead (2)==LOW) //и отпущена...
{
г=4*1;//выпавшая грань (номер в массиве 1канала грани)
for(k=6;k<=9;k++)
{
digitalWrite(k,tabl[z]); //включение канала
г++;//перебор каналов грани кубика
}
}
}
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
177
Гпава 5. Ардуино и время
178
Эксперимент №27
179
Гпава 5. Ардуино и время
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
//программа для игрового кубика на 6 граней с использованием преры
ваний//
const int х=0;
volatile int n= l;
int i=0;
int k=0;
volatile int z=0;
int tabl [24] ={1,0,0,0,0,1,0,0,1,1,0,0, 0,1,1,0,1,1,1,0,0,1,1,1};
void setup()
{
pinMode(2, INPUT);
pinMode(6, OUTPUT);
digitalWrite(6,LOW);
pinMode(7, OUTPUT);
digitalWrite(7,LOW);
pinMode(8, OUTPUT);
digitalWrite(8,LOW);
pinMode(9, OUTPUT);
digitalWrite(9,LOW);
attachlnterrupt (x, fun, RISING);
}
void Л|п()//функция выбора выпадающей грани на прерывании
180
Эксперимент №27
{
if(n==l)//yaiOBHe, устраняющее дребезг контакта
{
п=0;
/=4*ц//фиксация вьтавшей грани
}
}
void loopO
{
i=random(0,6);
if (n==0)
{
for(k=6;k<=9;k++)
{
digitalWrite(k,tabl [z]);
z + + ;// перебор каналов грани кубика
}
delay (300);
n=l;
}
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
181
Гпава 5. Ардуино и время
Эксперимент №28
«СНОВА ЭЛЕКТРОННЫЙ
СЕКУНДОМЕР»
182
Гпава 5. Ардуино и время
long у2=0;
void setup()
{
pinMode(2, ШРЦТ);//кнопка прерываний
pinMode(6, ОиТРШ);//канал для микроамперметра
digitalWrite(6,LOW);
attachlnterrupt (х,fun,RISING);
}
void Аш()//управление секундомером на прерывании
{
п=п+1;|Г(п>=3){п=0;}//переключение режимов секундомера по кругу
}
void 1оор()
{
y2=millis();
if(y2-yl>=1000&n==l){k=k+l;xl=map(k,0,100,0,255);analogWrite(6,x
l);yl=y2;}
if(k>=100){k=0;}
if(n==0){k=0;analogWrite(6,0);}
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
184
Эксперимент №28
185
Гпава 5. Ардуино и время
Эксперимент №29
«АНАЛОГОВЫЕ ЧАСЫ»
Рис. 7 Рис. 8
186
Эксперимент №29
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
//программа №1 для часов на микроамперметре//
int п=0;
int к=50;//изначально выставленные минуты
int kl=0;
int ]=12;//изначально выставленные часы
int jl= 0;
long yl=0;
long у2=0;
long у3=0;
void setup()
{
pinMode(6, ОиТРиТ);//канал для отсчёта часов и минут
digitalWrite(6,LOW);
pinMode(4, ОиТР1Л);//канал — указатель индикации
digitalWrite(4,LOW);
}
void loopO
{
y2=millis();
if(y2-y3>=10000&n==l){n=0;y3=y2;kl=map(k,0,60,0,255);analogWrite
(6,kl);}
//условие индикации числа минут
if(y2-y3>=10000&n==0){n=l;y3=y2yl=map(j,0,24,0,255);analogWrite(
187
Гпава 5. Ардуино и время
Рис. 9
188
Эксперимент №29
////////////////////////////////////////////////////////////////////
//
/ / Arduino UNO
//
////////////////////////
//
//программа №2 для часов на микроамперметре//
int п=0;
int k=0;
int kl=0;
int j=0;
int jl= 0;
longyl=0;
Puc. 10
189
Гпава 5. Ардуино и время
long у2=0;
long у3=0;
void setup()
{
pinMode(6, ОЦТРЦТ);//канал для отсчёта часов и минут
digitalWrite(6,LOW);
pinMode(4, ОиТРЦТ);//канал- указатель иццикации
digitalWrite(4,LOW);
pinMode(5, ШР11Т);//канал начальных установок времени
>
void 1оор()
{
y2=millis();
if(y2-y3>=10000&n==l){n=0;y3=y2;kl=map(k,0,60,0,255);analogWrite
(6,kl>;>
//условие индикации числа минут
if(digitalRead(5)==HIGH&n==l)(j++;if(j==24){j=0;}
jl=map(j,0,24,0,255);analogWrite(6Jl);delay(200);}
//процедура настройки начального времени — число часов
if(digitalRead(5)==HIGH&n==0){k++;if(k==60){k=0;}
kl=map(k,0,60,0,255);analogWrite(6,kl);delay(200);}
//процедура настройки начального времени — число минут
190
Эксперимент №29
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
Рис. 11
191
Гпава 5. Ардуино и время
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
//программа №3 для часов на микроамперметре//
int п=0;
int n l= l;
unsigned int k—0;
int kl=0;
unsigned int k2=0;
unsigned int j=0;
int jl=0;
unsigned int j2=0;
long у 1=0;
long y2=0;
longy3=0;
void setup()
{
pinMode(6, ОиТРЦТ);//канал для отсчёта часов и минут
digitalWrite(6,LOW);
pinMode(4, ОиТРШ);//канал- указатель индикации
digitaIWrite(4,LOW);
pinMode(5, ШРШГ);//канал начальных установок времени
pinMode(3, ОЦТРЦТ);//канал для зуммера будильника
digitalWrite(3,LOW);
pinMode(7, ПЧР1ЛГ);//канал управления будильником
}
void 1оор()
{
192
Эксперимент №29
y2=millisO;
193
Гпава 5. Ардуино и время
194
Эксперимент №30
Эксперимент №30
«ПЕСОЧНЫЕ ЧАСЫ НА
СВЕТОДИОДНЫХ МАТРИЦАХ»
Рис. 12
195
Гпава 5. Ардуино и время
Рис. 13
196
Эксперимент №30
Puc. 14
Puc. 15
////////////////////////////////////////////////////////////////////
//
/ / Arduino UNO
//
////////////////////////
//
//программа для светодиодной матрицы 8*8 и max7219 / /
197
Гпава 5. Ардуино и время
void setup()
void loopO
{
for 0=0у<=7у++)//цикл в цикле для перебора элементов массива
{
for (i=0;i<=7;i++)
{
LC.setLed(0, i, j, №1е);//последовательное включение каждого свето
диода матрицы
delay(150);
LC.setLed(0, i, j, tabl[i] Ц]);//включение, оставление включёнными
только светодиодов контура картинки
}
}
delay(1000);
198
Эксперимент №30
199
Гпава 5. Ардуино и время
Рис. 16
200
Эксперимент №30
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
//программа для светодиодной матрицы 8*8 и шах7219 песочные часы
//
void setup()
{
LC.shutdown(0, Гаке);//выключаем энергосберегающий режим
LC.setIntensity(0,8);// устанавливаем интенсивность в 8 единиц
между 0 и 15
201
Гпава 5. Ардуино и время
LC.clearDisplay(0);//очищаем матрицу 1
LC.shutdown(l, Га1$е);//выключаем энергосберегающий режим
LC.setIntensity(l, 8);// устанавливаем интенсивность в 8 единиц
между 0 и 15
LC.clearDisplay( 1);//очищаем матрицу 2
}
void 1оор()
{
/ / / / / / / / / / зажигаем верхнюю чашу / / / / / / / / / / / / / / / / / / / / /
for (i=7;i>=0;i--) //цикл в цикле для перебора элементов массива
{
for а=7у>=0у--)
{
LC.setLed(l,j, i, tabl[j][i]);
}
}
delay(5000);
/ / / / / / / / / / / / / / / «пересыпаем песок» в нижнюю чашу
//////////////////
for <i=7;i>=0;i—) //цикл в цикле для перебора элементов массива
{
for 0=7у>=0у--)
{
LC.setLed(0, j, i, tabl[j][i]);
if (tabl|j][i]==l){LC.setLed(l, j, i, !tabl[j][i]); z=k;k=kl;kl=z;LC.
setlntensity(0,8*k);LC.setIntensity(l, 8*k);delay(500);LC.setIntensity(0,
8*kl);LC.setIntensity(l, 8*kl);delay(500);
LC.setIntensity(0, 8*k);LC.setIntensity( 1, 8*k);delay(500);}//включение
и соответственно выключение каждого светодиода контура картинки с
задержкой в 1,5 сек.
}
}
202
Эксперимент №30
LC.clearDisplay(0);//o4HiuaeM матрицу 1
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
Рис. 17
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
//программа для светодиодной матрицы 8*8 и шах7219 песочные часы
//
203
Гпава 5. Ардуино и время
1,1,1,1,1,1,1,0,
1.1.1.1.1.1.0.0,
1.1.1.1.1.0.0.0,
1.1.1.1.0.0.0.0,
1.1.1.0.0.0.0.0,
1.1.0.0.0.0.0.0,;// храним картинку в массиве
void setup()
{
pinM0de(9,INPUT);//n0fliuii04eHHe управляющей кнопки
LC.shutdown(0, false);//выключаем энергосберегающий режим
LC.setIntensity(0,8);// устанавливаем интенсивность в 8 единиц
между 0 и 15
LC.clearDisplay(0);//очищаем матрицу 1
LC.shutdown(l, Еаке);//выключаем энергосберегающий режим
LC.setIntensity(l, 8);// устанавливаем интенсивность в 8 единиц
между 0 и 15
LC.clearDisplay(1);//очищаем матрицу 2
}
void 1оор()
{
/ / / / / / / / / / зажигаем верхнюю чашу / / / / / / / / / / / / / / / / / / / / /
for (i=7;i>=0;i—) //цикл в цикле для перебора элементов массива
{
for (j=7a>=0y~)
{
LC.setLed(l, j, i, tabl[j] [i]>;
}
}
metka:
if (digitalRead (9)==LOW){goto metka;} //пока кнопка не нажата
204
Эксперимент №30
LC.setLed(0, j, i, tabl[j][i]>;
if (tablO][i]==l){LC.setLed(l, j, i, !tabl[j][i]); z=k;k=kl;kl=z;LC.
setlntensity(0,8*k);LC.setIntensity( 1, 8*k);delay(500);LC.setIntensity(0,
8*kl);LC.setIntensity(l, 8*kl);delay(500);// посекундная смена яркости
свечения индикаторов
LC.setIntensity(0,8*k);LC.setIntensity( 1, 8*к)^е1ау(500);}//включение
и соответственно выключение каждого светодиода контура картинки с
задержкой в 1,5 сек.
}
}
LC.clearDisplay(0);//o4HiuaeM матрицу 1
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
205
ГЛАВА 6
АРДУИНО-ПРАКТИЧЕСКОЕ
ПРИЛОЖЕНИЕ
206
Светодиодный куб 4x4x4
Рис. 1 Рис. 2
207
Гпава 6. Ардуино-практическое приложение
Рис. 3
208
Светодиодный куб 4x4x4
Рис. 4 Рис. 5
209
Гпава 6. Ардуино-практическое приложение
линии
КАТОДОВ
ЛИНИИ АНОДОВ
Рис. 6
АЗ___
^ Первый
о слой
4 HL1-HL16
« --- » -
5V Vcc A1lA2|A3|A4]
■«---
12 DIN R3
7 12В
« ---
10 CS 12 А4_____
« --- » - 1 Второй
^ .G N D 11 CLK R5 ^ слой
« --- » - 4 HL17-HL32
GND
- « --- »
А1 Arduino Uno _AJA2IA3|A4|
« --- »
« --- »
« --- » А5_____
С2 4 Третий
« --- » - ^ слой
DIN DOUT
« --- » - 4 HL33-HL48
CS CS
« --- » _АИА2|АЗ|А4|
CLK CLK
GND GND С6
« --- » - А6___
1 Четвертый
А7 Модуль на МАХ7219 « --- » 5 слой
« --- » - К 4 HL49-HL64
А2 Модуль на МАХ7219 А ‘ДА2|АЗ|А4
Куб 4x4x4
Рис. 7
210
Светодиодный куб 4x4x4
С *р<шф*1ь/Кишшм1р<л*ть СМ * К
CW*U
j n- щямршшлтр CW*$Wt*U
3*1 m >pt См м арм о * о ф л й А » f t it » АЛ ♦S
♦ * r .f iu o t м t a l. k ’ / j i d i t h ) * , € и Ъ .Ш ' AtJ4>r<ofcitfcr.HCW
Bitdge
It PROM
IjC 1»>а‘ он» го I {12, n , 10, 2 ) ; bhptot*
// 'it-jm m h u m П 1*1 If 7 (thems
ticnuiU
void setup 0
t®
tayfowd
K 'w n ia , f a ’. s * * | ; / ’ ш м ь ч в л л « f f . r n c W f j - r a t e i M M o use
.U'-lumvIS, 12};//
1
■I)', j f . . a * f t l j ; / ' счлц,м и ш c j M u y ; '
R tib o l С « *t< s4
i s :i v n { l, ;/ , 'W i * K J a i 4 ,i * * 4 лм **р!-> i V j * » : ыхчМ Шоbat Ш K m n o t e
• • • u i . i j ilj 4);// ycijddiieiw-.'M ^aTtKMK'jc? HiЫЛ M e t at
0'»jp ;d V11) ; ' ' '4ЛИЯ Miiip.i Ji t ’
Puc. 8
211
Гпава 6. Ардуино-практическое приложение
212
Светодиодный куб 4x4x4
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
//программа для LED КУБА вместо светодиодной матрицы 8*8, и
тах7219 / /
void setupO
213
Гпава 6. Ардуино-практическое приложение
void loopO
{
/ / / / / / / / / / / / / / / ПОСТРОЧНОЕ ВКЛЮЧЕНИЕ ВСЕХ СВЕТОДИО
ДОВ IIIIIIIIН И Н Ш II
for (i=0;i<=7;i++) //цикл в цикле для перебора элементов матрицы
{
for (j=0y<=7;j++)
{
LC.setLed(l, i, j,l); LC.setLed(0, i, j, 1); delay(lOO);
}
}
/ / / / / / / / / / / / / / / МИГАНИЕ СВЕТОДИОДАМИ ВСЕГО КУБА
////////////////////////
for о=оа<=4а++)
{
LC.shutdown(0, true);LC.shutdown(l, true); delay(300); LC.shutdown(0,
false);LC.shutdown(l, false); delay(300);
}
/ / / / / / / / / / / / / / / ПОСТРОЧНОЕ РЕВЕРС-ВЫКЛЮЧЕНИЕ ВСЕХ
СВЕТОДИОДОВ / / / / / / / / / /
for (i=7;i>=0;i—) //цикл в цикле для перебора элементов матрицы
{
for (j=7y>=0g-)
{
214
Светодиодный куб 4x4x4
}
>
for (i=0;i<=7;i++) //цикл в цикле для перебора элементов матрицы
{
for (j=0y<=7y++)
{
LC.setLed(l, i, j,0); LC.setLed(0, i, j, 0);
if (i==l&j==7){delay(500);}
if (i==3&j==7){delay(500);}
if (i==5&j==7){delay(500);}
if (i==7&j==7){delay(500);}
}
}
/ / / / / / / / / / / / / / / ПОСЛОЙНОЕ ВКЛЮЧЕНИЕ И ВЫКЛЮЧЕНИЕ
С ПАУЗОЙ СВЕТОДИОДОВ СЛОЁВ / / / / / / / / / / / / / / / / / / /
for (k= 1;k<=2;k++)//2 кратное повторение перебора
{
for (i=0;i<=7;i++) //цикл в цикле для перебора элементов матрицы
{
for(j=0y<=7y++)
215
Гпава 6. Ардуино-практическое приложение
{
LC.setLed(l, i, j,l); LC.setLed(0, i, j, 1);
if (i==l&j==7){delay( 100);LC.clearDisplay(0); LC.clearDisplay( 1);}
if (i==3&j==7){delay(200);LC.clearDisplay(0); LC.clearDisplay(l);}
if (i==5&j==7){delay(300);LC.clearDisplay(0); LC.clearDisplay(l);}
if (i==7&j==7){delay(400);LC.clearDisplay(0); LC.clearDisplay(l);}
}
}
}
/ / / / / / / / / / / / / / / ПОРЯДНОЕ ВКЛЮЧЕНИЕ И ВЫКЛЮЧЕНИЕ С
ПАУЗОЙ СВЕТОДИОДОВ СЛОЯ / / / / / / / / / / / / / / / / / / /
for (к=1;к<=2;к++)//2 кратное повторение перебора
{
for (i=0;i<=7;i++) //цикл в цикле для перебора элементов матрицы
{
for 0=Oy<=7y=j+2)
{
LC.setLed(l, i, j,l); LC.setLed(0, i, j, 1);
if (i==0&j==6){delay(300);LC.clearDisplay(0); LC.clearDisplay(l);}
if (i==l&j==6){delay(300);LC.clearDispiay(0); LC.clearDisplay( 1);}
if (i==2&j==6){delay(300);LC.clearDisplay(0); LC.clearDisplay(1);}
if (i==3&j==6){delay(300);LC.clearDisplay(0); LC.clearDisplay(l);}
if (i==4&j==6){delay(300);LC.clearDisplay(0); LC.clearDisplay( 1);}
if (i==5&j==6){delay(300);LC.clearDispIay(0); LC.clearDisplay(l);}
if (i==6&j==6){delay(300);LC.clearDisplay(0); LC.clearDisplay(l);}
if (i==7&j==6){delay(300);LC.clearDisplay(0); LC.clearDisplay(l);}
}
for(j=ly<=7y=j+2)
{
LC.setLed(l, i, j,l); LC.setLed(0, i, j, 1);
if (i==0&j==7){delay(300);LC.clearDisplay(0); LC.clearDisplay(l);}
if (i== l&j==7){delay(300);LC.clearDisplay(0); LC.clearDisplay( 1);}
if (i==2&j==7){delay(300);LC.clearDisplay(0); LC.clearDisplay(l);}
if (i==3&j==7){delay(300);LC.clearDisplay(0); LC.clearDispiay( 1);}
216
Светодиодный куб 4x4x4
}
}
}
l l l l l l l l l I I I III ПОСТОЛБЦОВОЕ И ПОРЯДНОЕ ВКЛЮЧЕ
НИЕ И ВЫКЛЮЧЕНИЕ С ПАУЗОЙ СВЕТОДИОДОВ СЛОЁВ
///////////////////
for (к=1;к<=2;к++)//2 кратное повторение перебора
{
for (i=0;i<=7;i++) //цикл в цикле для перебора элементов матрицы
{
for (j=0y<=7y=j+2)
{
LC.setLed(l, j, i,l); LC.setLed(0, j, i, l);LC.setLed(l, i, j,l); LC.
setLed(0, i, j, 1);
if (i==0&j==6){delay(100);LC.clearDisplay(0); LC.clearDisplay(l);}
if (i==l&j==6){delay( 100);LC.clearDisplay(0); LC.clearDisplay( 1);}
if (i==2&j==6){delay(100);LC.clearDisplay(0); LC. clearDisplay(1);}
if (i==3&j“ 6){delay(100);LC.clearDisplay(0); LC.clearDisplay(l);}
if (i==4&j==6){delay(100);LC.clearDisplay(0); LC.clearDisplay(l);}
if (i==5&j==6){delay(100);LC.clearDisplay(0); LC.clearDisplay(l);}
if (i==6&j==6){delay( 100);LC.clearDisplay(0); LC.clearDisplay( 1);}
if (i==7&j==6){delay(100);LC.clearDisplay(0); LC.clearDisplay(l);}
}
fora=la<=7y=j+2)
{
LC.setLed(l, j, i,l); LC.setLed(0, j, i, l);LC.setLed(l, i, j,l); LC.
setLed(0, i, j, 1);
if (i==0&j==7){delay(100);LC.clearDisplay(0); LC.clearDispiay( 1);}
if (i==l&j==7){delay(100);LC.clearDisplay(0); LC. clear Display(1);}
if (i==2&j==7){deIay(100);LC.clearDisplay(0); LC.cIearDisplay(l);}
217
Гпава 6. Ардуино-практическое приложение
}
}
>
for (k=l;k<=2;k++)//2 кратное повторение перебора
{
for (i=0;i<=7;i=i+2) //цикл в цикле для перебора элементов матрицы
{
for (j=0a<=7a=j+2)
{
LC.setLed(l, i, j, 1); LC.setLed(0, i, j, 1);
LC.setLed(l, i, j+1,1); LC.setLed(0, i, j+ 1 ,1);
LC.setLed(l, i+1, j,l); LC.setLed(0, i+1, j, 1);
LC.setLed(l, i+1, j+1,1); LC.setLed(0, i+1, j+ 1 ,1);
delay(250);LC.clearDisplay(0); LC.cIearDispiay(l);
}
}
}
/ / / / / / / / / / / / / / / ПСЕВДОСЛУЧАЙНОЕ ВКЛЮЧЕНИЕ/ВЫКЛЮ
ЧЕНИЕ 4 ПАР (КУБИК) СВЕТОДИОДОВ / / / / / / / / / / / / / / / / / / /
for (k=l;k<=20;k++)//20 кратное повторение перебора
{
i=random(0,6)a=random(0,5);
LC.setLed(l, i, j,l); LC.setLed(0, i, j, 1);
LC.setLed(l, i, j+1,1); LC.setLed(0, i, j+ 1 ,1);
LC.setLed(l, i, j+2,1); LC.setLed(0, i, j+ 2 ,1);
LC.setLed(l, i, j+3,1); LC.setLed(0, i, j+ 3 ,1);
LC.setLed(l, i+2, j,l); LC.setLed(0, i+2, j, 1);
LC.setLed(l, i+2, j+1,1); LC.setLed(0, i+2, j+ 1 ,1);
LC.setLed(l, i+2, j+2,1); LC.setLed(0, i+2, j + 2 ,1);
LC.setLed(l, i+2, j+3,1); LC.setLed(0, i+2, j + 3 ,1);
218
Светодиодный куб 4x4x4
delay(random (100,250));
LC .clearDisplay (0);//очищаем матрицу 1
LC.clearDisplay( 1);//очищаем матрицу 2
}
/ / / / / / / / / / / / / / / КОНТУР КУБА - ПОЯВЛЕНИЕ/ИЗЧЕЗНОВЕ-
НИЕ / / / / / / / / / / / / / / / / / / /
intta
Ы1[32]={0,0,0,0,2,4,6,6,6,6,4,2,0,1,1,3,5,7,7,7,7,5,3,1,1,1,6,7,0,1,6,7}
int ta
Ы2[32]={0,2,4,6,6,6,6,4,2,0,0,0,1,0,1,1,1,1,3,5,7,7,7,7,5,3,7,6,7,6,1,0}
for (к=0;к<=31;к++)
{
LC.setLed(l, tabll[k],tabl2[k] ,1); LC.setLed(0, tabl 1[к],tabl2[к]
,l);delay(250);
}
delay(2000);
for (k=31;k>=0;k—)
{
LC.setLed(l, tabll[k],tab!2[k] ,0); LC.setLed(0, tabll[k],tabl2[k]
,0);delay(250);
}
delay(2000);
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / П Е Р Е Х О Д КАПЕЛЬ СВЕТА С ПЛО
СКОСТИ НА П Л О С К О С Т Ь / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
for (к=1;к<=2;к++)//2 кратное повторение перебора
{
for (i=0;i<=l;i++) //цикл в цикле для перебора элементов матрицы
{
fora=oy<=7a++)
{
LC.setLed(l, ij ,1); LC.setLed(0, i j ,1);
}
219
Гпава 6. Ардуино-практическое приложение
}
delay(200);
for (l=0;i<=l;i++) //цикл в цикле для перебора элементов матрицы
{
for0=0a<=7y++)
{
LC.setLed(l, i j ,0); LC.setLed(0, ij ,0);delay(50);
for (n=2;n<=6;n=n+2){LC.setLed(l, i+ n j ,1); LC.setLed(0, i+ n j
,l);delay(50);LC.setLed(l, i+ n j ,0); LC.setLed(0, i+ nj ,0);}
LC.setLed(l, i+6 j ,1); LC.setLed(0, i+ 6 j ,l);delay(50);
}
}
LC.clearDisplay(0);LC.clearDisplay(l);
}
/ / / / / / / / / / / / / / / ПАДАЮЩИЕ КАПЛИ СВЕТА / / / / / / / / / / / / / / / / / / /
for (k=0;k<=15;k++)
{
i=random(0,4)y=randoni(0,4); i=2*ij=2*j;
LC.setLed(l, ij ,1); LC.setLed(0, i j ,l);delay(200); LC.
clearDisplay(0);LC.clearDisplay(l);
LC.setLed(l, ij + 1 ,1); LC.setLed(0, ij+ 1 ,l);delay(100); LC.
clearDispIay(0);LC.clearDisplay(l>;
LC.setLed(l, i+1 j ,1); LC.setLed(0, i+1 j ,l);delay(75); LC.
clearDispIay(0);LC.clearDisplay(l);
LC.setLed(l, i+1 j + 1 ,1); LC.setLed(0, i+1 j+ 1 ,l);delay(50); LC.
clearDisplay<0);LC.clearDisplay(l);
}
for (k=0;k<=20;k++)
{
i=random(0,4)j=random(0,4); i=2*iy=2*j;
LC.setLed(l, i j ,1); LC.setLed(0, ij ,l);delay(200);
LC.setLed(l, ij + 1 ,1); LC.setLed(0, ij+ 1 ,l);delay(100);
LC.setLed(l, i+1 j ,1); LC.setLed(0, i+1 j ,l);delay(75);
LC.setLed(l, i+1 j + 1 ,1); LC.setLed(0, i+1 j+ 1 ,l);delay(50);n++;
if (n>=5){delay(500);LC.clearDisplay(0);LC.clearDisplay( l);n=0;}
}
220
Светодиодный куб 4x4x4
/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / ПОВОРОТ ПЛОСКОСТЕЙ / / / / / /
///////////////////////////
for (к=1;к<=8;к++)//8 кратное повторение перебора
{
for (i=0;i<=l;i++) //цикл в цикле для перебора элементов матрицы
{
for 0=0у<=7 у++)
{
LC.setLed(l, i j ,1); LC.setLed(0, i j ,1);
}
}
delay(150);LC.clearDisplay(0);LC.clearDisplay(l);
for (i=0;i<=6;i=i+2) //цикл для перебора элементов матрицы
{
LC.setLed(l, i,i ,1); LC.setLed(0, i,i ,l);LC.setLed(l, i+ l,i ,1); LC.
setLed(0, i+ l,i ,1);
LC.setLed(l, i,i+ l ,1); LC.setLed(0, i,i+l ,l);LC.setLed(l, i+ 1,i+ 1,1);
LC.setLed(0, i+1,i+1,1);
}
delay(150);LC.clearDisplay(0);LC.clearDisplay(l);
for (i=0;i<=l;i++) //цикл в цикле для перебора элементов матрицы
{
for (j=0 j< = 7y+ + )
{
LC.setLed(l, j,i ,1); LC.setLed(0, j,i ,1);
}
}
delay(150);LC.clearDisplay(0);LC.clearDisplay(l);
for (i=0;i<=6;i=i+2) //цикл для перебора элементов матрицы
{
LC.setLed(l, i,7-i ,1); LC.setLed(0, i,7-i ,l);LC.setLed(l, i+l,7-i ,1);
LC.setLed(0, i+l,7-i ,1);
LC.setLed(l, i+l,6-i ,1); LC.setLed(0, i+l,6-i ,l);LC.setLed(l, i,6-i
,1); LC.setLed(0, i,6-i ,1);
}
delay(150);LC.clearDisplay(0);LC.clearDisplay(l);
221
Гпава 6. Ардуино-практическое приложение
222
Светодиодный куб 4x4x4
LC.clearDisplay(l);//o4HiuaeM матрицу 2
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
223
Гпава 6. Ардуино-практическое приложение
Рис. 9
224
Тренажёр-игрушка алфавит «Павлин»
"Выбор слова"
А1 Arduino Uno
5V
Puc. 10
225
Гпава 6. Ардуино-практическое приложение
226
Тренажёр-игрушка алфавит «Павлин»
Рис. 11
декоративная картинка 4 на картонном основании. Для её фиксации
можно применить термоклей.
Все узлы устройства (рис. 11) размещены внутри пластмассового
корпуса-футляра 1 подходящего размера. Лицевая стенка 3 изготов
лена из отрезка ДВП и утоплена внутрь корпуса на высоту сервопри
вода 6. На ней расположено табло, кнопочный выключатель питания
4 на две группы контактов и кнопка SB2 5. Напротив декоративной
картинки в стенке 3 просверлено отверстие, в которое пропущен
шлейф проводов сервопривода. Информационные надписи напеча
таны на бумаге и зафиксированы на поверхностях с помощью поло
сок прозрачной липкой ленты. Во время хранения футляр закрывают
от пыли прозрачной тонкой пластиковой крышкой 2. Она согнута из
листовых фрагментов от упаковки хозтоваров. Внутри по её краю на
клеен бумажный кант.
Налаживание сводится к регулировке углов поворота качалки-ко
ромысла сервопривода до совпадения расположения конца стрелки и
нужной буквы алфавита. Для этого вместо фраз в массив данных сле
дует записать подряд все буквы алфавита и, варьируя числовые зна
чения длительностей импульсов, подобрать требуемый для каждой
буквы угол поворота стрелки. Это удобнее сделать на макете, до окон
чательной сборки тренажёра.
Ниже дан текст управляющего скетча.
227
Гпава 6. Ардуино-практическое приложение
////////////////////////////////////////////////////////////////////
//
/ / Arduino UNO
//
////////////////////////
//
//программа для управления алфавитом —тренажёром / /
/ / / / / / / / / / / / / / / таблица соответствия букв и длительностей импульса
//////////////////////////////////////////////////////////
///А Б В Г Д Е Ж З И Й
//2235 2180 2130 2070 2015 1960 1905 1850 1795 1740
/ /К Л М Н О П Р С Т У
///1685 1630 1575 1520 1465 1410 1355 1300 1245 1190
//Ф X Ц Ч Ш Щ Ъ Ы Ь Э
///1135 1080 1025 970 915 860 805 750 710675
/ / Ю Я ДРУГОЙ (ПРОБЕЛ)
///620 580 540
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
228
Тренажёр-игрушка алфавит «Павлин»
void 1оор()
{
metka:
if (digitalRead (12)==HIGH) //если кнопка нажата...
{x=random (0,10);y=0;delay(50);} //случайный выбор словосочетания
if(y>=10){goto metka; }//условие завершения чтения словосочетания
до нового нажатия кнопки
for (i=l;i<=75;i=i+l)
{
digitalWrite(7, HIGH);
de!ayMicroseconds(tabl[x] [у]);//длительиость импульса
digitaIWrite(7, LOW);
delayMicroseconds(10000-tabl[x] [у]);//длительность паузы
delayMicroseconds(lOOOO);
}
у++;//переход на следующую букву
}
//
/ / Конец /
//
////////////////////////////////////////////////////////////////////
229
Гпава 6. Ардуино-практическое приложение
Рис. 12
230
Танцующий человечек Next
Puc. 13
Puc. 14
АО платы Arduino UNO. Если напряжение резко уменьшается (при
достаточно громкой музыке), происходит переключение позы чело
вечка.
Кратко рассмотрим работу программы. Она выполняет следующие
задачи: определение уровня напряжения входного сигнала (на выво
231
Гпава 6. Ардуино-практическое приложение
№ светодиода 1 2 3 4 5 6 7 8 9 10 11 13 14 15 16 17 18 19
i 0 0 0 0 0 1 1 1 1 1 2 2 2 2 3 3 3 3
j 0 1 2 3 4 0 1 2 3 4 0 2 3 4 0 1 2 3
№ светодиода 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
i 3 4 4 4 4 4 5 5 5 5 5 6 6 6 6 6
j 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4
232
Танцующий человечек Next
Рис. 15
233
Рис. 17
234
Танцующий человечек Next
235
Гпава 6. Ардуино-практическое приложение
> li 1 /1 1
Рис. 18
Рис. 19
236
Танцующий человечек Next
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
//программа для танцующего человечка вместо светодиодной матрицы
8*8, и шах7219 / /
237
Гпава 6. Ардуино-практическое приложение
5.1.5.2.6.1.5.0.5.3.6.3.4.0.6.2.4.3.5.4,
5.1.5.2.6.1.5.0.5.3.6.3.4.0.6.0.4.4.5.4,
5.1.5.2.6.1.5.0.5.3.6.3.4.2.6.0.4.3.5.4,
5.1.5.2.6.1.5.0.5.3.6.3.4.0.6.2.4.4.5.4,
5.1.5.2.6.1.5.0.5.3.6.3.4.2.6.2.4.4.5.4,
5.1.5.2.6.1.5.0.5.3.6.3.4.2.6.0.4.3.6.4,
5.1.5.2.6.1.5.0.5.3.6.3.4.0.6.0.4.4.5.4,
5.1.5.2.6.1.5.0.5.3.6.3.4.2.6.2.4.3.6.4,
3.1.3.2.4.1.3.0.2.3.3.3, 2,2,4,0,2,4,4,3,
3.1.3.2.4.1.3.0.2.3.3.3, 2,0,4,0,4,4,1,3,
3.1.3.2.4.1.3.0.2.3.3.3.2.2.4.0.2.4.4.3,
3.1.3.2.4.1.3.0.2.3.3.3, 2,0,4,0,5,3,3,4};//массив-таблица для
хранения поз человечка
void setup()
{
pinMode(A0, INPUT); / / подключение датчика/
LC.shutdown(0, false);//выключаем энергосберегающий режим
LC.setIntensity(0,0);// устанавливаем интенсивность в 0 единиц
между 0 и 15
LC.clearDisplay(0);//o4HUiaeM матрицу 1
void loopO
{
x=analogRead(A0);
if (х<=650)//если звуковой сигнал получен...
{
if(x>=150&x<=450){LC.setIntensity(0,10)y=j+4;}//ecflH сигнал
сильный...
238
Танцующий человечек Next
}
delay(30);
}
}
///////////////////////
/ / Конец /
//
////////////////////////////////////////////////////////////////////
239
Гпава 6. Ардуино-практическое приложение
Ночной светильник
Рис. 20
240
Ночной светильник
Рис. 21
частотой 40 кГц. После приёма отраженного сигнала на выходе Echo
формируется импульс, длительность которого пропорциональна рас
стоянию до объекта, от которого отразился сигнал. Следующий за
пускающий импульс рекомендуется подавать не ранее чем через
Vcc
Trig
[to
±] Echo
Gnd
А1
HC-SR04
sbi §Л
'•Вкл."
XS1
12В >1
+ v
EL1-EL3 5039R2G3B2C-ESB
Рис. 22
241
Гпава 6. Ардуино-практическое приложение
242
Ночной светильник
////////////////////////////////////////////////////////////////////
//
//Arduino UNO
//
////////////////////////
//
//программа для ультразвукового датчика — включатель светодиодов
R G B //
const int echoPin=9;
const int trigPin=8;
unsigned int x,xl;
void setupO
{
pinMode(trigPin, OUTPUT);
pinMode(10, OUTPUT);// “красный канал”
pinMode(ll, OUTPUT); //"зелёный канал”
pinMode(12, OUTPUT); //"синий канал”
pinMode(echoPin, INPUT);
digitalWrite(trigPin, LOW);
243