Оглавление:
- Шаг 1. Создайте проект Blynk
- Шаг 2: Загрузите программы на FireBeetle Board-ESP32
- Шаг 3: Подключение оборудования
Видео: Как сделать счетчик шагов ?: 3 шага (с картинками)
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:48
Я хорошо выступал во многих видах спорта: ходьба, бег, езда на велосипеде, игра в бадминтон и т. Д.
Я люблю кататься, чтобы быстро путешествовать. Что ж, посмотри на мой толстый живот …
Ну, в любом случае, решаю перезапустить тренировку. Какое оборудование мне подготовить? Да, помимо спортивного сооружения! Мне нужен инструмент! Я верю, что с его помощью я смогу поддерживать необходимое количество упражнений. Вот и рождается инструмент. Начнем с видео ~
Инструмент может не только записывать шаги (и калории) в реальном времени, но и показывать время. Что особенного, так это то, что формат отображения - указатель ~ так здорово! Мне это очень, очень нравится!
Вы можете загружать свои записи в Интернет
только одним щелчком мыши. Все записи могут отображаться с помощью Blynk (программное обеспечение для смартфонов, представленное ранее). Так же, как и носимые смарт-часы, прибор получает время в сети (поэтому вам не нужно бояться обновления мощности и времени).
Оборудование в мид:
Доска FireBeetle-ESP32
Обложки FireBeetle-Proto Board
Экран дисплея OLED12864
Модуль ускорения
Аккумулятор 3,7 В (покупается в Интернете, объем около 600 мАч)
3 бутылки (покупаются в Интернете)
Строить этот проект Blybk очень удобно.
Шаг 1. Создайте проект Blynk
Добавьте два элемента управления:
Отображение значений * 1
Часы реального времени * 1
Имя параметра «Отображение значений» должно быть указано в виде шагов, но не должно указываться в свойствах часов реального времени. Выберите V1 в качестве входного контакта, чтобы настроить расположение элементов управления, как показано ниже.
Шаг 2: Загрузите программы на FireBeetle Board-ESP32
Щелкните здесь, чтобы загрузить исходный код на esp32. Исходный код состоит из файлов библиотеки и файлов 3D-печати. Вы должны сохранить файл библиотеки в lib arduino. А из 3D-файлов можно напрямую печатать корки.
Ниже основная программа
#include #include // Требуется только для Arduino 1.6.5 и более ранних версий #include "SSD1306.h" // псевдоним для `#include" SSD1306Wire.h "` #include "OLEDDisplayUi.h" #include "images.h" # include #include #include #include #include #define POWER_KEY 1 #define MENU_KEY 2 #define UPLOAD_KEY 3 boolean upload = false; Дисплей SSD1306 (0x3c, 18, 0); OLEDDisplayUi ui (& дисплей); Таймер SimpleTimer; WidgetRTC rtc; int screenW = 128; int screenH = 64; int clockCenterX = screenW / 2; int clockCenterY = ((экранH-16) / 2) +16; // верхняя желтая часть имеет высоту 16 пикселей int clockRadius = 23; #define DEVICE (0x53) // адрес устройства ADXL345 #define TO_READ (6) // количество байтов, которое мы будем читать каждый раз (два байта для каждой оси) byte buff [TO_READ]; // 6-байтовый буфер для сохранения данных, считанных с устройства char str [100]; // строковый буфер для преобразования данных перед их отправкой в последовательный порт int regAddress = 0x32; // первый регистр данных ускорения оси на ADXL345 int xx, yy, zz; // данные трехосного ускорения static int currentValue = 0; статические длинные шаги без знакаSum = 0; char auth = "YourAuthToken"; // Ваши учетные данные WiFi. // Установите пароль на "" для открытых сетей. char ssid = "YourNetworkName"; char pass = "Ваш пароль"; const char running_Logo_bits PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x03, 0x00, 0x 0xF8, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0x00, 0xFC, 0x05, 0x00, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0x00 0xFC, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x60, 0xF1, 0x07, 0x00, 0x 0xF8, 0x17, 0x00, 0x00, 0xC0, 0xF8, 0x0F, 0x00, 0x00, 0xE0, 0xFB, 0x17, 0x00, 0x00, 0xC0, 0xFF, 0x13, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x03 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFA, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x00x07, 0x00x07 0xF4, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x0F, 0x00, 0x00, 0x00, 0xF9, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x80, 0xFE, 0x00, 0x1F, 0xFF, 0x1F, 0x00, 0x00, 0xA0, 0xFF, 0x5F, 0x00, 0x00, 0xC0, 0x3F, 0x3F, 0x00, 0x0 0, 0xE8, 0x1F, 0x3F, 0x00, 0x00, 0xE8, 0xA7, 0x3E, 0x00, 0x00, 0xF0, 0x03, 0x7C, 0x00, 0x00, 0xE0, 0x05, 0x7C, 0x00, 0x00, 0x0x01, 0xE0 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1E3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 0x00, 0x80, 0x03, 0x00, 0xF8, 0x01, 0x00, 0x07, 0x00, 0xF4, 0x00, 0x00, 0x07, 0x00, 0xE8, 0x00, 0x80, 0x0F, 0x00, 0xE8, 0x00, 0x0F, 0x0F, 0x0F 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00,}; // служебная функция для отображения цифровых часов: печатает в начале 0 String twoDigits (int digits) {if (digits <10) {String i = '0' + String (digits); вернуть я; } else {return String (цифры); }} void clockOverlay (OLEDDisplay * display, OLEDDisplayUiState * state) {if ((hour () == 0) && (minute () == 0) && (second () == 0)) stepsSum = 0; } void analogClockFrame (OLEDDisplay * дисплей, OLEDDisplayUiState * состояние, int16_t x, int16_t y) {display-> drawCircle (clockCenterX + x, clockCenterY + y, 2); // часовые тики для (int z = 0; z drawLine (x2 + x, y2 + y, x3 + x, y3 + y);} // отображение секундной стрелки float angle = second () * 6; angle = (angle / 57.29577951); // Преобразование градусов в радианы int x3 = (clockCenterX + (sin (angle) * (clockRadius - (clockRadius / 5)))); int y3 = (clockCenterY - (cos (angle) * (clockRadius - (clockRadius / 5)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // отображение минутной стрелки angle = minute () * 6; angle = (angle / 57.29577951); // Преобразуем градусы в радианы x3 = (clockCenterX + (sin (angle) * (clockRadius - (clockRadius / 4)))); y3 = (clockCenterY - (cos (angle) * (clockRadius - (clockRadius / 4)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // отображение угла часовой стрелки = hour () * 30 + int ((minute () / 12) * 6); angle = (angle / 57.29577951); // Преобразование градусов в радианы x3 = (clockCenterX + (sin (angle) * (clockRadius - (clockRadius / 2)))); y3 = (clockCenterY - (cos (angle) * (clockRadius - (clockRa диус / 2)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); } void digitalClockFrame (OLEDDisplay * display, OLEDDisplayUiState * state, int16_t x, int16_t y) {String date = String (year ()) + "/" + twoDigits (month ()) + "/" + twoDigits (day ()); Строка timenow = Строка (час ()) + ":" + две цифры (минута ()) + ":" + две цифры (секунда ()); дисплей-> setTextAlignment (TEXT_ALIGN_CENTER); display-> setFont (ArialMT_Plain_24); дисплей-> drawString (clockCenterX + x, 20, timenow); дисплей-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, дата); } void writeTo (int устройство, адрес байта, значение байта) {Wire.beginTransmission (устройство); // начать передачу на устройство Wire.write (адрес); // отправляем адрес регистра Wire.write (val); // отправляем значение в запись Wire.endTransmission (); // завершение передачи} // считывает количество байтов, начиная с регистра адреса на устройстве, в массив буферов void readFrom (int device, byte address, int num, byte buff ) {Wire.beginTransmission (device); // начать передачу на устройство Wire.write (адрес); // отправляет адрес для чтения из Wire.endTransmission (); // завершаем передачу Wire.beginTransmission (device); // начать передачу на устройство Wire.requestFrom (device, num); // запрашиваем 6 байт с устройства int i = 0; while (Wire.available ()) // устройство может отправить меньше запрошенного (ненормально) {buff = Wire.read (); // получаем байт i ++; } Wire.endTransmission (); // завершение передачи} void runningFrame (OLEDDisplay * display, OLEDDisplayUiState * state, int16_t x, int16_t y) {float calValue = stepsSum * 0.4487; дисплей-> setTextAlignment (TEXT_ALIGN_CENTER); дисплей-> setFont (ArialMT_Plain_24); display-> drawString (clockCenterX, clockCenterY, str); sprintf (str, "%.2fcal", calValue); дисплей-> setTextAlignment (TEXT_ALIGN_CENTER); дисплей-> setFont (ArialMT_Plain_10); display-> drawString (100, 20, str); display-> drawXbm (10, 14, 34, 50, running_Logo_bits); } void uploadFrame (OLEDDisplay * дисплей, OLEDDisplayUiState * состояние, int16_t x, int16_t y) {display-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, «загрузить данные…»); } // В этом массиве хранятся указатели функций на все кадры // кадры - это отдельные представления, которые скользят в FrameCallback frames = {analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // сколько там кадров? int frameCount = 4; // Наложения статически рисуются поверх кадра, например. оверлеи OverlayCallback с часами = {clockOverlay}; int overlaysCount = 1; void uploadToBlynk (void) {if (upload == true) {Blynk.virtualWrite (V0, stepsSum); Blynk.virtualWrite (V1, stepsSum); }} void uiInit (void) {ui.setTargetFPS (30); //ui.setActiveSymbol(activeSymbol); //ui.setInactiveSymbol(inactiveSymbol); ui.setIndicatorPosition (TOP); ui.setIndicatorDirection (LEFT_RIGHT); ui.setFrameAnimation (SLIDE_LEFT); ui.setFrames (кадры, frameCount); ui.setOverlays (оверлеи, overlaysCount); ui.disableAutoTransition (); ui.switchToFrame (2); ui.init (); display.flipScreenVertical (); } void adxl345Init (void) {writeTo (УСТРОЙСТВО, 0x2D, 0); writeTo (УСТРОЙСТВО, 0x2D, 16); writeTo (УСТРОЙСТВО, 0x2D, 8); } void updateAdxl345 (void) {readFrom (УСТРОЙСТВО, regAddress, TO_READ, бафф); // считываем данные ускорения из ADXL345 xx = (((int) buff [1]) << 8) | бафф [0]; yy = (((int) buff [3]) << 8) | бафф [2]; zz = (((int) buff [5]) << 8) | бафф [4]; если (хх 80) {если (хх <текущее значение) {шагиСумма ++; } currentValue = xx; } sprintf (str, "% d", stepsSum); } int getKeys (void) {если (digitalRead (D2) == LOW) {задержка (5); если (digitalRead (D2) == LOW) {while (digitalRead (D2) == LOW); вернуть POWER_KEY; }} если (digitalRead (D3) == LOW) {задержка (5); если (digitalRead (D3) == LOW) {while (digitalRead (D3) == LOW); вернуть MENU_KEY; }} если (digitalRead (D4) == LOW) {задержка (5); если (digitalRead (D4) == LOW) {while (digitalRead (D4) == LOW); вернуть UPLOAD_KEY; }} return 0; } void doKeysFunction (void) {static int uiFrameIndex = 2; int keys = getKeys (); если (ключи == POWER_KEY) {статический символ я = 0; если (i) {ui.init (); display.flipScreenVertical (); display.displayOn (); } еще {display.displayOff (); } я = ~ я; } if (keys == MENU_KEY) {if (upload == false) {uiFrameIndex ++; если (uiFrameIndex == 3) uiFrameIndex = 0; ui.switchToFrame (uiFrameIndex); } еще {ui.switchToFrame (3); }} if (keys == UPLOAD_KEY) {if (upload == true) {upload = false; ui.switchToFrame (uiFrameIndex); } else {upload = true; ui.switchToFrame (3); }}} void setup () {pinMode (D2, INPUT); pinMode (D3, ВХОД); pinMode (D4, ВХОД); Blynk.begin (auth, ssid, pass); rtc.begin (); uiInit (); adxl345Init (); timer.setInterval (30, updateAdxl345); timer.setInterval (100, uploadToBlynk); } void loop () {int ОстающийсяTimeBudget = ui.update (); статический int testSum = 0; if ((testSum 0) {delay (ОстающийсяБюджет времени);} doKeysFunction (); timer.run ();}
Внимание: вы должны изменить настройки Wi-Fi, паспорт и AUTHTOKENS для себя.
char auth = "YourAuthToken"; // Ваши учетные данные WiFi. // Установите пароль на "" для открытых сетей. char ssid = "YourNetworkName"; char pass = "Ваш пароль";
Шаг 3: Подключение оборудования
Подключите OLED12864 и модуль ускорения к I2C, низы к D2, D3, D4. Кроме того, добавьте подтягивающие резисторы 51 кОм к нижнему краю, чтобы достичь напряжения 3,3 В, как показано ниже.
Внимание: подтягивающие резисторы неправильно подключать к AREF, правильнее - к 3,3 В.
Изображение аппаратной пайки, показанное ниже:
После пайки, сборка аппаратного модуля до корки, как показано ниже:
Комплексное изображение эффекта ~
Рекомендуемые:
Как сделать огромную светодиодную вывеску: 4 шага (с картинками)
Как сделать огромную светодиодную вывеску: в этом проекте я покажу вам, как построить огромную вывеску со специальной надписью, которая может загораться с помощью светодиодов RGB. Но вывеску также можно использовать в качестве основного источника света в вашей комнате за счет использования светодиодных лент теплого белого цвета. Давай
Как сделать счетчик монет: 3 шага
Как сделать счетчик монет: В этом руководстве описывается, как создать счетчик монет в копилке с помощью GreenPAK ™. Этот счетчик-копилка будет использовать три основных компонента: GreenPAK SLG46531V: GreenPAK служит интерпретатором между датчиками и дисплеем
Как сделать дрон с помощью Arduino UNO - Сделать квадрокоптер с помощью микроконтроллера: 8 шагов (с картинками)
Как сделать дрон с помощью Arduino UNO | Сделать квадрокоптер с помощью микроконтроллера: ВведениеПосетите мой канал на Youtube Дрон - очень дорогой гаджет (продукт) для покупки. В этом посте я собираюсь обсудить, как я могу сделать это дешево ?? И как вы можете сделать это своими руками по дешевой цене … Ну, в Индии все материалы (моторы, регуляторы
Счетчик Гейгера счетчик PKE: 7 шагов (с изображениями)
Счетчик Гейгера PKE Meter: Я давно хотел построить счетчик Гейгера, чтобы дополнить мою охлаждаемую камеру Пельтье. Есть (надеюсь) не очень полезная цель владения счетчиком Гейгера, но мне просто нравятся старые русские лампы, и я подумал, что это будет
Как сделать счетчик с помощью Microbit?: 9 шагов
Как сделать счетчик с помощью Microbit ?: Когда мы садимся в самолет, мы часто сталкиваемся с такой ситуацией: красивая стюардесса, несущая небольшую серебряную коробку, нажимает на нее, когда проезжает мимо. Она бормочет: 1,2,3,4,5,6 … Вы, наверное, догадались - она считает общее количество