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