Arduino:Примеры/ArduinoController
Перейти к навигации
Перейти к поиску
Поддержать проект | Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.
Содержание
Контроллер Arduino[1]
Этот пример является расширенной версией примера «Получение команд», то есть демонстрирует, как сделать на PC переключатель светодиода, встроенного в Arduino, но вдобавок к этому – то, как задать частоту мигания светодиода.
Код
1 // *** ArduinoController ***
2
3 // Это расширенная версия примера «Получение команд». В него
4 // добавлено то, что пользователь может задать частоту мигания
5 // светодиода.
6 //
7 // Этот скетч демонстрирует, как:
8 // - обрабатывать входящие команды, к которым не привязаны функции
9 // - отправлять на PC команду с аргументом
10 // - инициировать основной поток
11
12 #include <CmdMessenger.h> // CmdMessenger
13
14 // переменные для мигающего светодиода:
15 const int kBlinkLed = 13; // контакт для встроенного светодиода
16 bool ledState = 1; // текущее состояние светодиода
17 float ledFrequency = 1.0; // текущая частота мигания светодиода
18
19 unsigned long intervalOn;
20 unsigned long intervalOff;
21 unsigned long prevBlinkTime = 0;
22
23 // привязываем экземпляр класса CmdMessenger к последовательному порту:
24 CmdMessenger cmdMessenger = CmdMessenger(Serial);
25
26 // Это список распознаваемых команд, и эти команды могут быть
27 // либо получены, либо отправлены. Чтобы получить команду, к этому
28 // событию нужно привязать функцию внешнего вызова.
29 enum
30 {
31 kAcknowledge,
32 kError,
33 kSetLed, // команда, запрашивающая, чтобы светодиод был переключен в определенное состояние
34 kSetLedFrequency,
35 };
36
37 // функции внешнего вызова, определяющие, при получении каких команд нам нужно начинать действовать:
38 void attachCommandCallbacks()
39 {
40 // подключаем функции внешнего вызова:
41 cmdMessenger.attach(OnUnknownCommand);
42 cmdMessenger.attach(kSetLed, OnSetLed);
43 cmdMessenger.attach(kSetLedFrequency, OnSetLedFrequency);
44 }
45
46 // эта функция вызывается, когда к присланной команде не привязано никакой функции:
47 void OnUnknownCommand()
48 {
49 cmdMessenger.sendCmd(kError,"Command without attached callback"); // "Команда без функции внешнего вызова"
50 }
51
52 // функция внешнего вызова, включающая/выключающая светодиод:
53 void OnSetLed()
54 {
55 // считываем присланный аргумент, интерпретируем строку как boolean:
56 ledState = cmdMessenger.readBoolArg();
57 cmdMessenger.sendCmd(kAcknowledge,ledState);
58 }
59
60 // функция внешнего вызова, задающая частоту мигания светодиода:
61 void OnSetLedFrequency()
62 {
63 // считываем присланный аргумент, интерпретируем строку как boolean:
64 ledFrequency = cmdMessenger.readFloatArg();
65 // проверяем, что частота не равна нулю (чтобы предотвратить деление на ноль)
66 if (ledFrequency < 0.001) { ledFrequency = 0.001; }
67 // конвертируем частоту в интервалы включения/выключения (в миллисекундах):
68 intervalOn = (500.0/ledFrequency);
69 intervalOff = (1000.0/ledFrequency);
70 cmdMessenger.sendCmd(kAcknowledge,ledFrequency);
71 }
72
73 // блок исходных операций:
74 void setup()
75 {
76 // прослушиваем последовательное соединение на предмет сообщений от PC:
77 Serial.begin(115200);
78
79 // добавляем к каждой команде символ новой строки:
80 //cmdMessenger.printLfCr();
81
82 // подключаем функции внешнего вызова, заданные пользователем:
83 attachCommandCallbacks();
84
85 // отсылаем на PC сообщение о загрузке Arduino; также обратите
86 // внимание, что это хороший способ отладки – эта функция даст
87 // знать, если в скетче есть баг и Arduino была перезапущена:
88 cmdMessenger.sendCmd(kAcknowledge,"Arduino has started!"); // "Arduino запущена!"
89
90 // режим работы светодиода выставляем на OUTPUT:
91 pinMode(kBlinkLed, OUTPUT);
92 }
93
94 // блок повторяющихся операций:
95 void loop()
96 {
97 // обрабатываем данные, пришедшие по последовательному соединению,
98 // и выполняем функции внешнего вызова:
99 cmdMessenger.feedinSerialData();
100 delay(10);
101 blinkLed();
102 }
103
104 // возвращаем «true», если время превысило заданный интервал
105 // (в миллисекундах); используется для периодических действий:
106 void blinkLed() {
107 if ( millis() - prevBlinkTime > intervalOff ) {
108 // выключаем светодиод в середине заданного интервала:
109 prevBlinkTime = millis();
110 digitalWrite(kBlinkLed, LOW);
111 } else if ( millis() - prevBlinkTime > intervalOn ) {
112 // включаем светодиод в конце заданного интервала (если состояние светодиода – это «вкл»):
113 digitalWrite(kBlinkLed, ledState?HIGH:LOW);
114 }
115 }
См.также
Внешние ссылки