Цифровая электроника для начинающих - страница 17
Переменная index используется для вывода результатов с увеличением счетчика. Она создана в виде глобальной переменной, т.к. функция loop каждый раз вызывается заново. Стоит заметить, что при работе программы в течении долгого времени, переменная index может переполниться, для избежания таких случаев стоит использовать тип данных с большей разрядностью.
Запустив программу, мы получим в Serial Monitor данные типа таких:
0, 225,153,15401, 22,44,15, 540,302,192
1, 223,175,15434, 7,41,15, 540,302,192
2, 226,161,15417, 3,46,16, 540,302,192
3, 233,166,15411, 7,51,3, 540,302,192
4, 233,166,15411, 13,44,2, 540,302,192
5, 223,161,15435, 13,44,2, 540,302,192
Каждый датчик - 3х-осевой, соответственно мы имеем 3 колонки цифр с каждого из сенсоров (акселерометр, гироскоп и компас). Примерно такие же датчики стоят и в смартфонах, что используется например в играх, для управления наклонами устройства.
Данные также можно открыть в любой программе построения графиков, например онлайн на https://plot.ly/create/, и наглядно посмотреть как изменяются значения при вращении или повороте датчика. К примеру, на картинке показан график с магнитометра при поднесении к датчику металлического предмета.
Сам график построен с помощью бесплатного сервиса https://plot.ly/create/.
Чтение данных с барометра BMP280 аналогично. Нужно скачать библиотеки с сайта https://github.com/adafruit/Adafruit_BMP280_Library и поместить их в папку Документы\Arduino\libraries.
Код аналогичен приведенному выше.
#include
#include
#include
#include
Adafruit_BMP280 bmp;
void setup() {
Serial.begin(115200);
Serial.println(F("BMP280 test"));
if (!bmp.begin()) {
Serial.println(F("Could not find a valid BMP280 sensor"));
while (1);
}
}
void loop() {
// Чтение температуры
Serial.print(F("T = "));
Serial.print(bmp.readTemperature());
Serial.println(" *C");
// Атмосферное давление
Serial.print(F("Pressure = "));
Serial.print(bmp.readPressure());
Serial.println(" Pa");
// Барометрическая высота относительно “нулевой” отметки
Serial.print(F("Approx altitude = "));
Serial.print(bmp.readAltitude(1013.25)); // Давление на “нулевой” отметке
Serial.println(" m");
Serial.println();
delay(2000);
}
Разумеется, атмосферное давление не меняется столь же быстро, как показания акселерометра. Оставив программу работать некоторое время, можно получить график изменения атмосферного давления. Барометрическая высота кстати, активно используется в авиации, т.к. позволяет получать довольно-таки точную высоту над уровнем моря относительно нулевой отметки. Точность цифровых датчиков весьма высока, и позволяет улавливать даже разницу в высоте менее 1м. Это используется например, в квадрокоптерах для удержания заданной высоты полета.
Самостоятельная работа #1: Вывести на графике изменение атмосферного давления за ночь. Т.к. давление изменяется медленно, паузу в коде можно увеличить, это уменьшит требуемое количество сохраняемых данных.
Самостоятельная работа #2: Создать устройство “тревожной сигнализации”, которое будет мигать светодиодом и включать звук, если кто-то сдвинул прибор с места. Для этого при включении устройства стоит запоминать текущее значение акселерометра или компаса, и если значения вышли за заданные пределы, значит устройство было сдвинуто. Также можно предусмотреть отдельную кнопку “сброс” для запоминания новых значений. Разместив такой прибор в компактном корпусе, его можно использовать например, для охраны чемодана.
2.10 Подключаем часы реального времени (RTC)
Мы уже знаем, как подключить к Arduino внешнюю нагрузку через полевой транзистор или реле, как запрограммировать паузы и считывать температуру с внешнего сенсора. Допустим, мы решили сделать полив цветов по расписанию - утром и вечером. Но как Arduino узнает, какое сейчас время суток? Для этого может использоваться специальная микросхема - модуль часов реального времени (Real Time Clock). Данный модуль передает данные по I2C, время хранится в специальной микросхеме DS1307, на плате также есть батарейка, обеспечивающая работу модуля когда питание отключено.