Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/ArduinoController

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


Контроллер 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. }

См.также

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

  1. github.com - ArduinoController.ino