Arduino:Примеры/ArduinoController

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

Перевод: Максим Кузьмин (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 }

См.также

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