Походный трекер
Компоненты и расходные материалы
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 2 | ||||
![]() |
| × | 1 | |||
| × | 1 |
Необходимые инструменты и машины
![]() |
| |||
![]() |
|
Приложения и онлайн-сервисы
![]() |
|
Об этом проекте
Что такое трекер для пеших прогулок?
Походный трекер - это устройство, позволяющее определять изменения в окружающей среде путешественника во время похода.
Идея состоит в том, чтобы наблюдать за изменением температуры, давления, влажности, высоты, местоположения, направления и т. Д. Это дает некоторое интересное представление о походах.
В горах, где холодный, сухой воздух с низкой плотностью по сравнению с низменностями, многим людям трудно дышать. У некоторых наблюдается раздражение сухой кожи. Это устройство позволяет людям, интересующимся пешим туризмом, узнать свои пределы. Также есть удовольствие отправиться в высокогорные места. Возможность узнать высоту - это весело!
Не только горы, но и исследования болот, пустынь, лесов - каждый из них имеет свой уникальный экологический профиль, и возможность наблюдать за окружающей средой на ходу - лучший способ понять природу.

Видео демонстрация
Шаг 1. Оборудование, какое для чего?
Этот проект вызывает много интересного
Дополнительный щиток поставляется с некоторыми устройствами I2C на борту:
- Датчик температуры LM 75B для измерения температуры окружающей среды
- Трехосевой акселерометр ADXL345 для определения угла наклона и силы тяжести
- DS3231 высокоточный RTC для измерения времени
- 3-осевой магнитный датчик HMC5883 для определения направления по компасу
- Датчик влажности AM2320 для определения% относительной влажности
- Датчик давления BMP180 для измерения атмосферного давления и высоты
- Датчик GPS MTK3339 для определения местоположения и пройденного расстояния
На Arduino Uno:
- Делитель напряжения 3,9k + 22k для определения 4 AA напряжение батареи
- 1306 OLED для просмотра данных
- Зуммер для сигнала тревоги
- Светодиод RGB для этого проекта не нужен
- Интерфейс XBee не используется, но Arduino D2, D3, D9, D10 можно вывести из этого интерфейса для других проектов, D2 подключен к сбросу, что позволяет сбросить Arduino из кода!
- 5-позиционный джойстик не используется.
- 101 горшок не используется.
Шаг 2:модификация и подключение оборудования
В Arduino Uno внесено несколько модификаций. Он установлен на держателе батареек 4 AA с винтовыми стойками и горячим клеем.


4 AA и CR1220 (для RTC) устанавливаются на держатели для батареек.


Между держателем батареи и платой Arduino Uno есть пространство, где можно разместить датчик давления, влажности, магнитный и GPS-датчик.


Датчики I2C припаяны на куске сборной платы и помещены в это пространство


Эти датчики подключаются к Arduino Uno снизу:

Добавлен делитель напряжения для измерения напряжения батареи 4 батареек АА.

Линия измерения напряжения батарейного блока AA подключается к АЦП A1:

Джойстик экрана подключен к контакту A1 ACD через контакт A5. Вот почему джойстик распаян и удален.

При подключении какой-либо площадки на Accessory Shield (схему см. Ссылку) с паяным мостом D2 (для мягкого сброса), контакты D3, D9, D10 Arduino становятся доступными на интерфейсе Xbee.


Компоненты складываются следующим образом:

- Верхний слой:Accessory Shield на Arduino
- Средний уровень:другие датчики и GPS будут находиться между Uno и батарейным отсеком.
- Нижний слой:4 батарейных отсека AA с батарейками.
А соединения выглядят так:

Шаг 3. Программирование устройства
Arduino IDEBuild 1.8.5
используется для программирования устройства. Сначала все следующие библиотеки включаются или загружаются с помощью диспетчера библиотек.

При вводе имени датчика в поле поиска диспетчера библиотек появятся соответствующие библиотеки.

Некоторые библиотеки Accessory Shield (см. Справку) добавляются с помощью параметра zip.file

После добавления необходимых библиотек проверяются примеры кодов для каждого датчика, чтобы найти API для связанных датчиков.
Затем все заголовки библиотеки включаются в один пустой скетч Arduino.
Список файлов заголовков
math.h, inttypes.h, Wire.h, lm75.h, ADXL345.h, ChainableLED.h, U8glib.h, ds3231.h, Adafruit_Sensor.h, Adafruit_AM2320.h, Adafruit_BMP085_U.h, Adafruit_HMC5883_U.h, Adafruit_GPS.h
После многократного редактирования, компиляции и отладки (включая неплотное соединение, когда я обнаружил, что BMP180 работает без Vcc из-за утечки мощности для контактов I2C, возможно) и загрузки - наконец, код был готов.
Предостережения
- Расчет высоты основан на падении давления воздуха, применимом только в нормальных погодных условиях.

- Код компаса не поддерживает программную компенсацию наклона, устройство должно находиться на горизонтальной плоскости. Есть фиксированный круг компаса, в котором есть еще один круг переменного радиуса. Когда устройство наклонено, внутренний круг увеличится. Когда он находится в выровненном положении (т.е. оба компонента акселеромера x и y равны почти 0), внутренний круг уменьшится до точки. Это когда направление по компасу более точное.
- Угол склонения стрелки компаса зависит от местоположения и изменения магнитного поля Земли. Который может пострадать от солнечной бури. Если угол склонения не указан, направление по компасу будет отклонено на несколько градусов.
Найдите склонение для своего региона:http://www.m Magnetic-declination.com
- Направление по компасу подвержено влиянию близлежащих магнитных объектов, например сильных магнитных минералов в горах.
- Минимальное рабочее напряжение устройства составляет около 4,5 В. В этом случае следует заменить батарейки типа АА.
- Время и дата программируются с помощью кода. Если время необходимо для замены, батарейку типа «таблетка» необходимо отключить и вставить в розетку. При загрузке новой программы с новым временем в коде время изменится.
- Во время разработки модуль GPS был недоступен. Следовательно, демонстрационные координаты помещаются в Lat-Long. Если кто-то желает воспроизвести этот проект, необходимо включить библиотеку GPS и связанные коды.
- Плоскость XY акселерометра и магнитометра подлежит размещению на печатной плате. Требуется соответствующая корректировка кода.
- Точность показаний акселерометра подвержена вибрации. Рекомендуется использовать устройство в неподвижном состоянии.
Объем улучшений
Со стороны прошивки можно сделать улучшения для еще нескольких функций:
- Периодическая запись параметров в EEPROM
- Звуковой сигнал при достижении контрольной точки высоты / местоположения.
- Напоминание о питьевой воде.
- Напоминание о перерыве
- Предупреждение о низком заряде батареи
- Предупреждение о низкой температуре и влажности.
- Калибровка программного обеспечения компаса для компенсации наклона (много всего тригонометрического)
- Автоматическое определение склонения с использованием подключения к Интернету вещей и GPS через приложение Gateway.
Что касается аппаратной части доработки:
- Переключатели пользовательского ввода для установки времени, склонения и т. д.
- Индивидуальный 3D-футляр для устройства
- Использование перезаряжаемой LiPo батареи
- Одноплатная компактная конструкция печатной платы для большей портативности.
Заключение
Путешествия и туризм - это круто, когда вы можете следить за изменениями в окружающей среде, это делает вещи более интересными. В частности, проверка изменения высоты, влажности, давления и температуры в течение нескольких часов во время пеших прогулок. Это устройство позволяет узнать, на какой высоте вы чувствуете горную тошноту, при каком уровне влажности кожа становится сухой и тому подобное. Несмотря на то, что есть возможности для улучшения как макета схемы, так и кода, чтобы справиться с предостережениями, все же круто иметь такой гаджет, когда вы отправляетесь в дикую местность!
Внешние ресурсы
https://www.waveshare.com/wiki/Accessory_Shield
Рекомендуемое оборудование для лучшей версии этого проекта
Набор для быстрого прототипирования
Код
- Hiking_Tracker.ino
- Библиотеки
Hiking_Tracker.ino C / C ++
main.c/ * /////////// ПРИМЕЧАНИЕ ////////// D2 позволяет мягкий сброс, утверждаемый из кода D3, D9, D10 доступны через 12,13,16 из xbee interface include#include #include #include #include #include #include "U8glib.h" #include "ds3231.h" #include "Adafruit_Sensor.h" #include "Adafruit_AM2320.h" #include #include #include ////////// ///////////// Переменные RTC /////////////////// uint8_t time [8]; struct ts t; int s; int m; int h; int dy; int mo; int yr; ///////////////// Переменные акселерометра ///////////// float X =0.0; float Y =0.0; float Z =0.0; float Gravity =0.0; /////////////////// Переменные акселерометра ///////////// float Xm =0.0; поплавок Ym =0,0; поплавок Zm =0,0; /////////////////////// Переменные светодиода RGB /////////////// const int rgb_pwr =12; const int clk_pin =6; const int data_pin =5; float hue =0.0; логическое up =true; //////////////////////// потенциометр ///////////////// // int pot =0; //////////////////// Batt / Supply Vin ///////////////// float Vbatt =0.0; //// ////////////////// Термометр //////////////////// float temp =0.0; ////// /////////////// Влажность ///////////////////// float humid =0,0; ////// ////////////// Давление воздуха //////////////////// double prsr =0.0; ///////// /////////// Высота //////////////////// float alt =0.0; ///////////// ////// Lat, Long //////////////////// float lat =0.0; float lon =0.0; //////////////////// Заголовок компаса ///////////////// float heading =0,0; /// ////////////////// Переменные другого типа /////////////// int mstime =0; int sensor_selector =1; ///// /////// ENUM // Тип устройства I2C Объект ///////////////// U8GLIB_SSD1306_128X64 u8g (U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0); // I2C OLED DisplayTempI2C_LM75 termo =TempI2C_LM75 (0x48, TempI2C_LM75 ::nine_bits); // I2C Temp SensorADXL345 акселерометр; // Светодиоды I2C Acce SensorChainableLED (clk_pin, data_pin, rgb_pwr, 1); // I2C RGB LEDAdafruit_AM2320 am2320 =Adafruit_AM2320 (); // Датчик влажности I2CAdafruit_BMP085_Unified bmp180 =Adafruit_BMP085_Unified (10085); // Датчик давления I2CAdafruit_HMC5883_Unified mag =Adafruit_HMC5883_Unified (12345); // Датчик I2C Compa // раскомментируйте следующие 2 строки, чтобы включить GPS // Последовательная отладка не будет доступна // HardwareSerial mySerial =Serial; // Adafruit_GPS GPS (&mySerial); void setup (void) {// 1.1V Internal Analog Ref // analogReference (INTERNAL); ///////////// Сигналы для OLED на дополнительном щите /////////// //// припаивать перемычку к экрану, необходимому для D2, D3, D9, D10 // pinMode (2,1); // Самостоятельный сброс D2 в RST pinMode (3,1); // выход на xbee int 12, pinMode (9,1); // выход на xbee int 13 pinMode (10,1); // выход на xbee int 16 // digitalWrite (2, HIGH); digitalWrite (3, ВЫСОКИЙ); digitalWrite (9, LOW); digitalWrite (10, ВЫСОКИЙ); pinMode (7,1); pinMode (8,1); digitalWrite (7, ВЫСОКИЙ); digitalWrite (8, LOW); // 10k POT на A0 // Vin Batt / Supply на A1 (3,91k / 21,76k) /////////////////////////////// //////////////////////// Последовательная связь для отладки (необязательно) ////////// Serial.begin (9600); // //////////// Ожидание инициализации ускорения ///////// if (! Accelerometer.begin ()) {delay (50); } /////////////// Разрешение прерывания RTC ///////// DS3231_init (DS3231_INTCN); //////////////// Запуск зуммера //////////////// pinMode (11,1); digitalWrite (11, LOW); } void loop (void) {// цикл изображений u8g.firstPage (); делать {рисовать (); } while (u8g.nextPage ()); // переключение между датчиками I2C sensor_selector ++; if (sensor_selector> =3) {sensor_selector =0;} ////// API выборки температуры ////// temp =termo.getTemp (); delay (5); // "C /////// API извлечения давления //////// if (sensor_selector ==0) {///////////// Датчик давления Init ///////// if (! Bmp180.begin ()) delay (11); sensor_event_t event; bmp180.getEvent (&event); if (event.pressure) {prsr =event.pressure / 10; / / Задержка в КП до КП (50);}} ////////////// Инициализация GPS ////////////GPS.begin(9600);//// /// Altitude Fetch API //////// if (sensor_selector ==0) {sensor_event_t event; bmp180.getEvent (&event); alt =bmp180.pressureToAltitude (1013.25, event.pressure); delay (50); // bmp180.end ();} // в метрах ////////////// Инициализация датчика влажности /////// if (sensor_selector ==1) {am2320.begin (); delay (50); ////// Humidity Fetch API ///////// humid =am2320.readHumidity (); delay (50); // am2320.end (); // в% от RH} // в кПа ////// Acceleration Fetch API ////// Vector norm =accelerometer.readNormalize (); X =norm.XAxis; Y =norm.YAxis; Z =norm.ZAxis; Gravity =sqrt (X * X + Y * Y + Z * Z) - (0.3); // смещение // в м / с ^ 2 ///// Time Fetch API //////// DS3231_get (&t); s =t.sec; m =t.min; h =t. час; dy =t.mday; mo =t.mon; yr =t. год; ///// Выбор позиции банка /////// pot =analogRead (A0) * 5 / (10 * 3); delay (2); ///// VBatt / Supply Fetch /////// // 1.1 равно 1.08 для этого чипа Vbatt =(1.08 * analogRead (A1) / 1023) /3.91 * ((3.91 + 21.76) ); delay (2); ///////// Направление по компасу //////// if (sensor_selector ==2) {if (! mag.begin ()) {while (1); } // задержка (70); sensor_t sensor2; mag.getSensor (&sensor2); задержка (70); // угол склонения зависит от геолокации // использовать широту и долготу от GPS для вычисления датчиков_event_t event2; mag.getEvent (&event2); // Xm =event2.m Magnetic.x; // Ym =event2.m Magnetic.y; задержка (70); склонение поплавка =0,0; заголовок =atan2 (event2.mintage.y, event2.m Magnetic.x); курс + =склонение; // исправление знака if (заголовок <0) заголовок + =2 * PI; if (заголовок> 2 * PI) заголовок - =2 * PI; // Преобразуем радианы в градусы для удобства чтения. заголовок =заголовок * 180 / M_PI; // mag.end ();} ///// Управление зуммером ////////// if (pot> 80) {digitalWrite (11,1);} else {digitalWrite (11,0); } ///// Управление адресными светодиодами RGB ///////////// if (pot> 40) {leds.pwr_set (PWR_ENABLE); for (байт i =0; i <1; i ++) leds.setColorHSB (i, hue, 1.0, 0.5); если (вверх) оттенок + =0,025; иначе оттенок- =0,025; если (оттенок> =1.0 &&вверх) up =false; иначе, если (оттенок <=0,0 &&! вверх) up =true; } /////////////////////////////////////////// Самостоятельный сброс //// /////// // digitalWrite (2, LOW); /////////////////////////////////} ///////// Здесь заканчивается Void Loop /////////////////////// Oled Picture Loop Draw Fn ///////// ////////// void draw (void) {u8g.setFont (u8g_font_7x13); u8g.drawHLine (37, 0, 62); u8g.setPrintPos (41, 12); если (h <10) u8g.print (0); u8g.print (h); u8g.drawStr (54,12, ":"); u8g.setPrintPos (62, 12); если (m <10) u8g.print (0); u8g.print (m); u8g.drawStr (75,12, ":"); u8g.setPrintPos (83, 12); если (s <10) u8g.print (0); u8g.print (s); u8g.drawHLine (37, 14, 62); u8g.setFont (u8g_font_5x8); u8g.drawVLine (37, 0, 14); u8g.setPrintPos (0, 7); если (dy <10) u8g.print (0); u8g.print (dy); u8g.drawStr (11,7, "/"); u8g.setPrintPos (17, 7); если (mo <10) u8g.print (0); u8g.print (mo); u8g.drawStr (0,16, "/"); u8g.setPrintPos (6, 16); u8g.print (год); u8g.drawVLine (99, 0, 14); u8g.drawStr (104,7, "BATT"); u8g.setPrintPos (102, 15); u8g.print (Vbatt); u8g.drawStr (123,15, "V"); // u8g.setFont (u8g_font_7x13); // u8g.setPrintPos (40, 25); u8g.print (round (temp)); u8g.drawStr (55,25, "'C"); // u8g.print (round (temp)); u8g.setFont (u8g_font_5x8); // u8g.drawStr (5,40, "x"); u8g.setPrintPos (15, 40); u8g.print (round (X)); // u8g.drawStr (50,40, "y"); u8g.setPrintPos (60, 40); u8g.print (round (Y)); // u8g.drawStr (90,40, "z"); u8g.setPrintPos (100, 40); u8g.print (round (Z)); // u8g.drawStr (68,22, "BATT:"); u8g.setPrintPos (95, 22); u8g.print (Vbatt); u8g.drawStr (123,22, "V"); u8g.drawVLine (37, 18, 36); u8g.drawStr (39,24, «ТЕМП. ВОЗДУХА:»); u8g.setPrintPos (85, 24); u8g.print (темп); u8g.drawStr (118,24, "C"); u8g.drawStr (39,34, «ВЛАЖНОСТЬ:»); u8g.setPrintPos (85, 34); u8g.print (влажный); u8g.drawStr (118,34, "%"); u8g.drawStr (39,44, «ДАВЛЕНИЕ:»); u8g.setPrintPos (85, 44); u8g.print (prsr); u8g.drawStr (118,44, "hP"); u8g.drawStr (39,54, «ВЫСОТА:»); u8g.setPrintPos (85, 54); u8g.print (round (alt)); u8g.drawStr (118,54, "м"); u8g.drawHLine (0, 56, 128); u8g.drawStr (19,64, «LAT:»); u8g.setPrintPos (39, 64); u8g.print (23,57); // Демо, заменить на LAT при добавлении GPS u8g.drawStr (69,64, "LONG:"); u8g.setPrintPos (94, 64); u8g.print (90.36); // демонстрация, заменяем на LON при добавлении GPS // u8g.setPrintPos (40, 25); u8g.print (круглый (темп)); u8g.drawStr (55,25, "'C"); int r =круглый (sqrt (X * X + Y * Y)); // float tid =atan (Y / X) * 180 / 3.1415; // математические проблемы здесь // int radius =round (tid); u8g.drawStr (0,22, «заголовок»); u8g.drawCircle (18, 34, r, U8G_DRAW_ALL); // внутренний выравнивающий круг u8g.drawCircle (18, 34,10, U8G_DRAW_ALL); // внешний фиксированный круг // внутренний круг станет точкой без наклона по x и ось y // это когда направление компаса более точное //u8g.drawLine(18, 34, (18 + round (Y * 2)), (34 + round (X * 2))); // увеличен в 2 раза u8g.setPrintPos (0, 53); u8g.print (заголовок); // 0 или 360 - N // 90 - E // 180 - S // 270 - W // u8g.setFont (u8g_font_5x8); если ((заголовок> 315) | (заголовок <=45)) {u8g.drawLine (18,34,8,34); } if ((заголовок> 45) &(заголовок <=135)) {u8g.drawLine (18,34,18,24);} if ((заголовок> 135) &(заголовок <=225)) {u8g.drawLine (18,34,28,34);} if ((заголовок> 225) &(заголовок <315)) {u8g.drawLine (18,34,18,44);} // u8g.drawLine (18, 34, (18 + круг (Y * 2)), (34 + круг (X * 2))); // увеличен в 2 раза НА ОСНОВЕ АКСЕЛАРОМЕТРА // цикл здесь заканчивается}
Библиотеки C / C ++
Разархивируйте его и добавьте отдельные архивы библиотеки в диспетчер библиотек ArduinoБез предварительного просмотра (только загрузка).
Схема

Производственный процесс
- Что такое датчик O2?
- Датчик движения с использованием Raspberry Pi
- Датчик влажности почвы Raspberry Pi
- Превратите Raspberry Pi в фитнес-трекер для хомяков
- Тест датчика DS18B20
- Датчик температуры Raspberry Pi
- Счетчик туалета (на платформе Walabot)
- Датчик эмоций / ЭЭГ
- Windows 10 IoT Core на Raspberry Pi 2 - данные датчика Adafruit
- Трекер датчика WiFi RSSI для МКС