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

Arduino:Примеры/ConsoleShell

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

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

Контакты:

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


Использование CmdMessenger в качестве оболочки[1]

Этот пример показывает, как использовать CmdMessenger в качестве оболочки, а также то, как «общаться» с этой оболочкой через монитор порта в IDE Arduino.

Код

  1. // *** Использование CmdMessenger в качестве оболочки ***
  2.  
  3. // Этот пример показывает, как использовать CmdMessenger в качестве
  4. // оболочки и коммуницировать с нею при помощи консоли в мониторе
  5. // порта.
  6.  
  7. // Этот пример отличается от других:
  8. // - у него нет «программы-напарника» на PC:
  9. // - он только получает команды; вместо отправки команд он использует Serial.print
  10. //
  11. // Ниже демонстрируется, как взаимодействовать с этим скетчем:
  12. //
  13. //   Доступные команды:
  14. //   0;                  - Показать список команд
  15. //   1,<состояние>;      - Задать статус светодиода. 0 = выкл, 1 = вкл
  16. //   2,<яркость>;        - Задать яркость светодиода. 0 - 1000
  17. //   3;                  - Показать состояние светодиода
  18. //  
  19. //  Если ввести команду «3», то результат будет:
  20. //  
  21. //  Led status (т.е. состояние светодиода): on (т.е. «вкл»)
  22. //  Led brightness (т.е. яркость светодиода): 500
  23. //  
  24. //  Если ввести команду «2», а затем «1000», то результат будет:
  25. //  
  26. //  Led status: on
  27. //  Led brightness: 1000
  28. //  
  29. //  Если ввести команду «1», а затем «0», то результат будет:
  30. //  
  31. //  Led status: off (т.е. «выкл»)
  32. //  Led brightness: 1000
  33.  
  34.  
  35. #include <CmdMessenger.h>  // библиотека CmdMessenger
  36.  
  37. // переменные для ШИМ-интервала:
  38. unsigned long intervalOn        = 0;
  39. unsigned long prevBlinkTime     = 0;
  40. const unsigned long PWMinterval = 1000;
  41.  
  42. // переменные для мигающего светодиода:
  43. bool ledState                   = 1;                 // состояние светодиода («вкл» или «выкл»)
  44. int  ledBrightness              = prevBlinkTime /2 ; // 50 % от яркости
  45. const int kBlinkLed             = 13;                // контакт для встроенного светодиода
  46.  
  47. // привязываем экземпляр класса CmdMessenger к последовательному порту:
  48. CmdMessenger cmdMessenger = CmdMessenger(Serial);
  49.  
  50. // Это список распознаваемых команд. Чтобы получить команду, к этому
  51. // событию нужно привязать функцию внешнего вызова.
  52. enum
  53. {
  54.   kCommandList         , // команда, запрашивающая список доступных команд
  55.   kSetLed              , // команда, запрашивающая, чтобы светодиод выставили в определенное состояние  
  56.   kSetLedBrightness    , // команда, запрашивающая, чтобы светодиод горел с определенной яркостью  
  57.   kStatus              , // команда, запрашивающая статус светодиода
  58. };
  59.  
  60. // функции внешнего вызова, определяющие, при получении каких команд нам нужно начинать действовать:
  61. void attachCommandCallbacks()
  62. {
  63.   // подключаем функции внешнего вызова:
  64.   cmdMessenger.attach(OnUnknownCommand);
  65.   cmdMessenger.attach(kCommandList, OnCommandList);
  66.   cmdMessenger.attach(kSetLed, OnSetLed);
  67.   cmdMessenger.attach(kSetLedBrightness, OnSetLedBrightness);
  68.   cmdMessenger.attach(kStatus, OnStatus);
  69. }
  70.  
  71. // эта функция вызывается, когда к присланной команде не привязано никакой функции:
  72. void OnUnknownCommand()
  73. {
  74.   Serial.println("This command is unknown!");  //  "Эта команда неизвестна!"
  75.   ShowCommands();
  76. }
  77.  
  78. // функция внешнего вызова, показывающая список команд:
  79. void OnCommandList()
  80. {
  81.   ShowCommands();
  82. }
  83.  
  84. // функция внешнего вызова, включающая/выключающая светодиод:
  85. void OnSetLed()
  86. {
  87.   // считываем аргумент для состояния светодиода; здесь ожидается
  88.   // либо «0», либо «1», интерпретируем их как «false» или «true»:
  89.   ledState = cmdMessenger.readBoolArg();
  90.   ShowLedState();  
  91. }
  92.  
  93. // функция внешнего вызова, меняющая яркость светодиода:
  94. void OnSetLedBrightness()
  95. {
  96.   // считываем аргумент для яркости светодиода; здесь ожидается
  97.   // значение в диапазоне от «0» до 255»:
  98.   ledBrightness = cmdMessenger.readInt16Arg();  
  99.   // задаем яркость светодиода:
  100.   SetBrightness();  
  101.   // показываем состояние светодиода
  102.   ShowLedState();  
  103. }
  104.  
  105. // функция внешнего вызова, показывающая статус светодиода:
  106. void OnStatus()
  107. {
  108.   // отсылаем обратно статус, описывающий состояние светодиода:
  109.   ShowLedState();
  110. }
  111.  
  112. // показываем доступные команды:
  113. void ShowCommands()
  114. {
  115.   Serial.println("Available commands");  //  "Доступные команды"
  116.   Serial.println(" 0;                  - This command list");  //  "0; - Показать список команд"
  117.   Serial.println(" 1,<led state>;      - Set led. 0 = off, 1 = on");  //  "1,<состояние>; - Задать статус светодиода. 0 = выкл, 1 = вкл"
  118.   Serial.print  (" 2,<led brightness>; - Set led brighness. 0 - ");  //  "2,<яркость>; - Задать яркость светодиода. 0 - 1000"
  119.   Serial.println(PWMinterval);
  120.   Serial.println(" 3;                  - Show led state");  //  "3; - Показать состояние светодиода"
  121. }
  122.  
  123. // показываем состояние и яркость светодиода:
  124. void ShowLedState()
  125. {
  126.   Serial.print("Led status: ");  //  "Статус светодиода: "
  127.   Serial.println(ledState?"on":"off");
  128.   Serial.print("Led brightness: ");  //  "Яркость светодиода: "
  129.   Serial.println(ledBrightness);
  130. }
  131.  
  132. // задаем состояние светодиода:
  133. void SetLedState()
  134. {
  135.   if (ledState)  {
  136.     // если светодиод включен, задаем яркость при помощи аналоговой записи:
  137.     analogWrite(kBlinkLed, ledBrightness);
  138.   } else {
  139.     // если светодиод выключен, выключаем ШИМ при помощи цифровой записи:
  140.     digitalWrite(kBlinkLed, LOW);
  141.   }
  142. }
  143.  
  144. // рассчитываем яркость светодиода:
  145. void SetBrightness()
  146. {
  147.   // делаем так, чтобы значение в intervalOn было либо «0», либо соответствующим PWMinterval:
  148.   intervalOn  =  max(min(ledBrightness,PWMinterval),0);
  149. }
  150.  
  151. // яркость светодиода будет зависеть от широтно-импульсной модуляции;
  152. // до достижения значения intervalOn светодиод будет включен,
  153. // до достижения значения PWMinterval светодиод будет выключен:
  154. bool blinkLed() {
  155.   if (  micros() - prevBlinkTime > PWMinterval ) {
  156.     // включаем светодиод в конце интервала (если состояние светодиода – «вкл»):
  157.     prevBlinkTime = micros();
  158.     digitalWrite(kBlinkLed, ledState?HIGH:LOW);    
  159.   } else if (  micros() - prevBlinkTime > intervalOn ) {
  160.     // выключаем светодиод в середине интервала:
  161.     digitalWrite(kBlinkLed, LOW);
  162.   }
  163. }
  164.  
  165. // блок исходных операций:
  166. void setup()
  167. {
  168.   // прослушиваем последовательное соединение на предмет сообщений
  169.   // от PC:
  170.   Serial.begin(115200);
  171.  
  172.   // добавляем каждой команде символ новой строки:
  173.   cmdMessenger.printLfCr();  
  174.  
  175.   // подключаем функции внешнего вызова, заданные пользователем:
  176.   attachCommandCallbacks();
  177.  
  178.   // задаем контакт для мигающего светодиода:
  179.   pinMode(kBlinkLed, OUTPUT);
  180.  
  181.   // показываем список команд:
  182.   ShowCommands();
  183. }
  184.  
  185. // блок повторяющихся операций:
  186. void loop()
  187. {
  188.   // обрабатываем данные, пришедшие по последовательному соединению,
  189.   // и выполняем функции внешнего вызова:
  190.   cmdMessenger.feedinSerialData();
  191.   blinkLed();
  192. }

См.также

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

  1. github.com - ConsoleShell.ino