Arduino:Примеры/SendandReceiveArguments
Перейти к навигации
Перейти к поиску
Поддержать проект | Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.
Получение и отправка команд с аргументами[1]
Этот пример является расширенной версией примера «Получение и отправка команд», то есть демонстрирует, как сделать на PC переключатель светодиода, встроенного в Arduino, а также как отправлять обратно на PC статус, в котором в данный момент находится светодиод, но вдобавок к этому – как отправлять и принимать несколько аргументов в виде значений типа float.
Код
1 // *** Получение и отправка команд с аргументами ***
2
3 // Это расширенная версия примера «Получение и отправка команд».
4 // В него добавлено то, что Arduino теперь отправляет и принимает
5 // несколько float-значений.
6 //
7 // Этот скетч демонстрирует, как:
8 // - возвращать разные статусы (команды подтверждения и ошибки)
9 // - получать несколько аргументов
10 // - отправлять несколько аргументов
11 // - вызывать функцию периодически
12
13 #include <CmdMessenger.h> // подключаем библиотеку CmdMessenger
14
15 // переменные для мигающего светодиода:
16 unsigned long previousToggleLed = 0; // то, когда светодиод был переключен в последний раз
17 bool ledState = 0; // текущее состояние светодиода
18 const int kBlinkLed = 13; // контакт для встроенного светодиода
19
20 // привязываем экземпляр класса CmdMessenger к последовательному порту:
21 CmdMessenger cmdMessenger = CmdMessenger(Serial);
22
23 // Это список распознаваемых команд, и эти команды могут быть
24 // либо получены, либо отправлены. Чтобы получить команду, к этому
25 // событию нужно привязать функцию внешнего вызова.
26 enum
27 {
28 // Команды:
29 kAcknowledge , // команда, подтверждающая получение команды
30 kError , // команда, сообщающая об ошибках
31 kFloatAddition , // команда, запрашивающая суммировать два float-значения
32 kFloatAdditionResult , // команда, сообщающая о результате суммирования
33 };
34
35 // команды, отсылаемые от PC и получаемые на Arduino; в скетче Arduino
36 // нужно задать функцию внешнего вызова для каждой записи из списка ниже:
37 void attachCommandCallbacks()
38 {
39 // подключаем функции внешнего вызова:
40 cmdMessenger.attach(OnUnknownCommand);
41 cmdMessenger.attach(kFloatAddition, OnFloatAddition);
42 }
43
44 // ------------------ ФУНКЦИИ ВНЕШНЕГО ВЫЗОВА -----------------------
45
46 // эта функция вызывается, когда к присланной команде не привязано никакой функции:
47 void OnUnknownCommand()
48 {
49 cmdMessenger.sendCmd(kError,"Command without attached callback"); // "Команда без функции внешнего вызова"
50 }
51
52 // функция внешнего вызова, сообщающая о готовности Arduino (т.е. о ее загрузке):
53 void OnArduinoReady()
54 {
55 cmdMessenger.sendCmd(kAcknowledge,"Arduino ready"); // "Arduino готова"
56 }
57
58 // функция внешнего вызова, рассчитывающая сумму двух присланных float-значений:
59 void OnFloatAddition()
60 {
61 // извлекаем первый аргумент как float:
62 float a = cmdMessenger.readFloatArg();
63
64 // извлекаем второй аргумент как float:
65 float b = cmdMessenger.readFloatArg();
66
67 // отсылаем обратно результат суммирования:
68 //cmdMessenger.sendCmd(kFloatAdditionResult,a + b);
69 cmdMessenger.sendCmdStart(kFloatAdditionResult);
70 cmdMessenger.sendCmdArg(a+b);
71 cmdMessenger.sendCmdArg(a-b);
72 cmdMessenger.sendCmdEnd();
73 }
74
75 // ------------------ ГЛАВНАЯ ЧАСТЬ СКЕТЧА ----------------------
76
77 // блок исходных операций:
78 void setup()
79 {
80 // прослушиваем последовательное соединение на предмет сообщений от PC:
81 Serial.begin(115200);
82
83 // добавляем каждой команде символ новой строки:
84 cmdMessenger.printLfCr();
85
86 // подключаем функции внешнего вызова, заданные пользователем:
87 attachCommandCallbacks();
88
89 // отсылаем на PC сообщение, что Arduino загрузилась:
90 cmdMessenger.sendCmd(kAcknowledge,"Arduino has started!"); // "Arduino запущена!"
91
92 // режим работы светодиода выставляем на OUTPUT:
93 pinMode(kBlinkLed, OUTPUT);
94 }
95
96 // возвращаем «true», если время превысило заданный интервал
97 // (в миллисекундах); используется для периодических действий:
98 bool hasExpired(unsigned long &prevTime, unsigned long interval) {
99 if ( millis() - prevTime > interval ) {
100 prevTime = millis();
101 return true;
102 } else
103 return false;
104 }
105
106 // блок повторяющихся операций:
107 void loop()
108 {
109 // обрабатываем данные, пришедшие по последовательному соединению,
110 // и выполняем функции внешнего вызова:
111 cmdMessenger.feedinSerialData();
112
113 // периодически переключаем светодиод; если светодиод
114 // не переключается каждые 2000 миллисекунд, это значит, что работа
115 // cmdMessenger требует больше времени:
116 if (hasExpired(previousToggleLed,2000)) // переключаем каждые 2 секунды:
117 {
118 toggleLed();
119 }
120 }
121
122 // состояние переключаемого светодиода:
123 void toggleLed()
124 {
125 ledState = !ledState;
126 digitalWrite(kBlinkLed, ledState?HIGH:LOW);
127 }
См.также
Внешние ссылки