Агуулгын хүснэгт:

Шатны тоолуурыг хэрхэн яаж хийх вэ?: 3 алхам (зурагтай)
Шатны тоолуурыг хэрхэн яаж хийх вэ?: 3 алхам (зурагтай)

Видео: Шатны тоолуурыг хэрхэн яаж хийх вэ?: 3 алхам (зурагтай)

Видео: Шатны тоолуурыг хэрхэн яаж хийх вэ?: 3 алхам (зурагтай)
Видео: Амжилттай Сурах 13 арга 2024, Оны зургадугаар сарын
Anonim
Image
Image
Blynk төслийг бий болгох
Blynk төслийг бий болгох

Би спортын олон төрөлд сайн тоглодог байсан: алхах, гүйх, дугуй унах, бадминтон тоглох гэх мэт.

Би удалгүй тойрч аялах дуртай. За, миний гэдсийг хар даа ….

За ямар ч байсан дасгалаа дахин эхлүүлэхээр шийдлээ. Би ямар тоног төхөөрөмж бэлтгэх ёстой вэ? Спортын байгууламжаас гадна, тийм ээ! Надад багаж хэрэгтэй байна! Үүнтэй холбоотойгоор би зохих хэмжээний дасгал хийж чадна гэдэгт итгэж байна. Энд энэ хэрэгсэл бий болно. Видео бичлэгээс эхэлье ~

Энэхүү хэрэгсэл нь зөвхөн алхам (ба илчлэг) -ийг бодит цаг хугацаанд бүртгэж чаддаггүй, харин цагийг харуулдаг. Онцлог нь юу вэ гэвэл харуулах хэлбэр нь заагч юм ~ маш дажгүй! Надад үнэхээр, үнэхээр таалагдаж байна!

Та бичлэгээ интернетэд байршуулах боломжтой

зөвхөн нэг товшилтоор. Бүх бүртгэлийг Blynk (өмнө нь танилцуулсан ухаалаг утасны програм хангамж) харуулах боломжтой. Зүүж болох ухаалаг цагны нэгэн адил хэрэгсэл нь цаг тухайд нь авдаг (Тиймээс та хүч чадал, цаг шинэчлэхээс айх хэрэггүй).

Мэдээллийн техник хангамж:

FireBeetle Board-ESP32

FireBeetle хавтас-Прото самбар

OLED12864 дэлгэц

Хурдасгах модуль

3.7V батерей (онлайнаар худалдаж авсан, эзэлхүүн нь ойролцоогоор 600 мАч байна.

3 шил (онлайнаар худалдаж авсан.

Энэ төслийг Blybk -ээр бүтээх нь маш тохиромжтой.

Алхам 1: Blynk төслийг бий болгох

Хоёр хяналт нэмэх:

Утга харуулах * 1

Бодит цагийн цаг * 1

Утга харуулах нэрийг алхам алхамаар тохируулах ёстой боловч бодит цагийн цагийн шинж чанарыг тохируулах шаардлагагүй болно. Доор үзүүлсэн хяналтын байршлыг өөрчлөхийн тулд V1 -ийг оролтын зүү болгон сонгоно уу.

Алхам 2: FireBeetle Board-ESP32 дээр програм татаж авах

Эх кодыг esp32 руу татаж авахын тулд энд дарна уу. Эх код нь номын сангийн файлууд болон 3D хэвлэх файлуудаас бүрдэнэ. Та номын сангийн файлыг lidu arduino дээр хадгалах ёстой. Мөн 3D файлууд нь царцдасыг шууд хэвлэх боломжтой.

Үндсэн програмыг доор харуулав

#include #include // Зөвхөн Arduino 1.6.5 болон түүнээс өмнөх хувилбаруудад хэрэгтэй #include "SSD1306.h" // alias for `#include" SSD1306Wire.h "" #include "OLEDDisplayUi.h" #include "images.h" # оролцуулах SSD1306 дэлгэц (0x3c, 18, 0); OLEDDisplayUi ui (& харуулах); SimpleTimer таймер; WidgetRTC rtc; int дэлгэцW = 128; int дэлгэцH = 64; int clockCenterX = дэлгэцW/2; int clockCenterY = ((дэлгэцH-16)/2) +16; // дээд шар хэсэг нь 16 пиксел өндөр int clockRadius = 23; #DEVIN DEVICE (0x53) // ADXL345 төхөөрөмжийн хаягийг #тодорхойлох TO_READ (6) // бидний унших гэж буй байтын тоо (тэнхлэг тус бүрт хоёр байт) байтын буф [TO_READ]; // Төхөөрөмжөөс уншсан өгөгдлийг хадгалах 6 байтын буфер char str [100]; // өгөгдлийг цуваа порт руу илгээхээс өмнө хувиргах string буфер int regAddress = 0x32; // ADXL345 int xx, yy, zz дээрх анхны тэнхлэг-хурдатгал-өгөгдлийн бүртгэл; // гурван тэнхлэг хурдатгалын өгөгдөл static int currentValue = 0; статик гарын үсэг зураагүй урт алхамSum = 0; char auth = "YourAuthToken"; // Таны WiFi итгэмжлэлүүд. // Нээлттэй сүлжээнд нууц үгээ "" болгож тохируулна уу. char ssid = "Таны сүлжээний нэр"; char pass = "YourPassword"; Const Хорхой running_Logo_bits PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0x00, 0xFC, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 0xFC, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x60, 0xF1, 0x07 0xF8, 0x17, 0x00, 0x00, 0xC0, 0xF8, 0x0F, 0x00, 0x00, 0xE0, 0xFB, 0x17, 0x00, 0x00, 0xC0, 0xFF, 0x13, 0x00, 0x00, 0x00, 0xF, 0x00, 0x00 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFA, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x07 0xF4, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x0F, 0x00, 0x00, 0x00, 0xF9, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x80, 0x00, 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, 0x00, 0x00, 0x00 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1, 0x1, 0x00, 0x1, 0x03 0x00, 0x80, 0x03, 0x00, 0xF8, 0x01, 0x00, 0x07, 0x00, 0xF4, 0x00, 0x00, 0x07, 0x00, 0xE8, 0x00, 0x80, 0x0F, 0x00, 0xE8, 0x00, 0x90 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00,}; // дижитал цаг харуулах хэрэгслийн функц: 0 String twoDigits (int digit) {if (оронтой тоо <10) {String i = '0'+String (цифрүүд); буцах i; } өөр {буцах String (цифрүүд); }} void clockOverlay (OLEDDisplay * дэлгэц, OLEDDisplayUiState * төлөв) {if ((hour () == 0) && (minutes () == 0) && ((секунд () == 0)) stepsSum = 0; } хүчингүй 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);} // хоёр дахь гар хөвөх өнцөг = секунд () * 6; өнцөг = (өнцөг / 57.29577951); // Зэрэглэлийг радиус болгон хувиргах int x3 = (clockCenterX + (sin (өнцөг) * (clockRadius - (clockRadius / 5))))); int y3 = (clockCenterY - (cos (өнцөг) * (clockRadius - (clockRadius / 5)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // дэлгэцийн минутын гар өнцөг = минут () * 6; өнцөг = (өнцөг / 57.29577951); // градусыг радиан болгон хөрвүүлэх x3 = (clockCenterX + (sin (өнцөг) * (clockRadius - (clockRadius / 4))))); y3 = (clockCenterY - (cos (өнцөг) * (clockRadius - (clockRadius / 4)) дэлгэц)> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // дэлгэцийн цагийн зүүний өнцөг = цаг () * 30 + int ((минут () / 12) * 6); өнцөг = (өнцөг / 57.29577951); // градусыг радиан болгон хөрвүүлэх x3 = (clockCenterX + (sin (өнцөг) * (clockRadius - (clockRadius / 2))))); y3 = (clockCenterY - (cos (өнцөг) *) цаг радиус - (цагRa dius / 2)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); } хүчингүй digitalClockFrame (OLEDDisplay * дэлгэц, OLEDDisplayUiState * төлөв, int16_t x, int16_t y) {String date = String (year ())+"/"+twoDigits (month ())+"/"+twoDigits (day ()); String timenow = String (hour ())+":"+twoDigits (minutes ())+":"+twoDigits (second ()); дэлгэц-> setTextAlignment (TEXT_ALIGN_CENTER); дэлгэц-> setFont (ArialMT_Plain_24); display-> drawString (clockCenterX + x, 20, timenow); дэлгэц-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, огноо); } void writeTo (int device, byte address, byte val) {Wire.beginTransmission (төхөөрөмж); // Wire.write төхөөрөмж рүү дамжуулж эхлэх (хаяг); // бүртгэлийн хаягийг илгээх Wire.write (val); // Wire.endTransmission () бичихийн тулд утга илгээх; // дамжуулалтыг дуусгах} // төхөөрөмж дээрх хаягийн бүртгэлээс эхлэн тоо байтыг уншдаг. readFrom (int төхөөрөмж, байт хаяг, int num, байт buff ) {Wire.beginTransmission (төхөөрөмж); // Wire.write төхөөрөмж рүү дамжуулж эхлэх (хаяг); // хаягийг Wire.endTransmission () -аас уншихаар илгээдэг; // төгсгөлийн дамжуулалт Wire.beginTransmission (төхөөрөмж); // Wire.requestFrom төхөөрөмж рүү дамжуулж эхлэх (төхөөрөмж, тоо); // төхөөрөмжөөс 6 байт хүсэх int i = 0; while (Wire.available ()) // төхөөрөмж нь хүссэн хэмжээнээс бага хэмжээгээр илгээж болно (хэвийн бус) {buff = Wire.read (); // i ++ байт хүлээн авах; } Wire.endTransmission (); // дамжуулалтыг дуусгах} void runningFrame (OLEDDisplay*дэлгэц, OLEDDisplayUiState*төлөв, 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); } хүчингүй uploadFrame (OLEDDisplay * дэлгэц, OLEDDisplayUiState * төлөв, int16_t x, int16_t y) {display-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, "өгөгдөл байршуулах …"); } // Энэ массив нь функцийн заагчийг бүх фрэймд хадгалж байдаг // хүрээ нь FrameCallback фрэймд гулсдаг ганц үзэл юм = {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 (frames, frameCount); ui.setOverlays (overlays, overlaysCount); ui.disableAutoTransition (); ui.switchToFrame (2); ui.init (); display.flipScreenVertically (); } void adxl345Init (void) {writeTo (DEVICE, 0x2D, 0); writeTo (DEVICE, 0x2D, 16); writeTo (DEVICE, 0x2D, 8); } void updateAdxl345 (void) {readFrom (DEVICE, regAddress, TO_READ, buff); // ADXL345 xx = (((int) buff [1]) << 8) -аас хурдатгалын өгөгдлийг уншина уу | буф [0]; yy = (((int) buff [3]) << 8) | буф [2]; zz = (((int) buff [5]) << 8) | буф [4]; if (xx 80) {if (xx <currentValue) {stepsSum ++; } currentValue = xx; } sprintf (str, "%d", stepsSum); } int getKeys (void) {if (digitalRead (D2) == LOW) {саатал (5); if (digitalRead (D2) == LOW) {while (digitalRead (D2) == LOW); POWER_KEY буцаах; }} if (digitalRead (D3) == LOW) {саатал (5); if (digitalRead (D3) == LOW) {while (digitalRead (D3) == LOW); буцах MENU_KEY; }} if (digitalRead (D4) == LOW) {саатал (5); if (digitalRead (D4) == LOW) {while (digitalRead (D4) == LOW); UPLOAD_KEY буцаах; }} буцаах 0; } void doKeysFunction (void) {static int uiFrameIndex = 2; int түлхүүрүүд = getKeys (); if (түлхүүрүүд == POWER_KEY) {статик char i = 0; хэрэв (i) {ui.init (); display.flipScreenVertically (); display.displayOn (); } өөр {display.displayOff (); } би = ~ би; } if (key == MENU_KEY) {if (upload == false) {uiFrameIndex ++; хэрэв (uiFrameIndex == 3) uiFrameIndex = 0; ui.switchToFrame (uiFrameIndex); } өөр {ui.switchToFrame (3); }} if (key == UPLOAD_KEY) {if (upload == true) {upload = false; ui.switchToFrame (uiFrameIndex); } өөр {байршуулах = үнэн; ui.switchToFrame (3); }}} void setup () {pinMode (D2, INPUT); pinMode (D3, INPUT); pinMode (D4, INPUT); Blynk.begin (auth, ssid, pass); rtc.begin (); uiInit (); adxl345Init (); timer.setInterval (30, updateAdxl345); timer.setInterval (100, uploadToBlynk); } void loop () {int kalanTimeBudget = ui.update (); static int testSum = 0; if ((testSum 0) {delay (kalanTimeBudget);} doKeysFunction (); timer.run ();}

Анхааруулга: Та Wi-Fi-ийн тохиргоо, паспорт, AUTHTOKENS-ийг өөртөө өөрчлөх хэрэгтэй.

char auth = "YourAuthToken"; // Таны WiFi итгэмжлэлүүд. // Нээлттэй сүлжээнд нууц үгээ "" болгож тохируулна уу. char ssid = "Таны сүлжээний нэр"; char pass = "YourPassword";

Алхам 3: Тоног төхөөрөмжийн холболт

Тоног төхөөрөмжийн холболт
Тоног төхөөрөмжийн холболт
Тоног төхөөрөмжийн холболт
Тоног төхөөрөмжийн холболт
Тоног төхөөрөмжийн холболт
Тоног төхөөрөмжийн холболт

OLED12864 болон хурдатгалын модулийг I2C -т, доод хэсгийг D2, D3, D4 -т холбоно уу. Дээрээс нь доор үзүүлсэн 3.3В хүрэхийн тулд ёроолд нь 51к татах эсэргүүцэл нэмж оруулаарай.

Анхааруулга: Татах эсэргүүцэлийг AREF-тэй холбох нь буруу, зөв нь 3.3V байна

Тоног төхөөрөмжийн гагнуурын зургийг доор харуулав.

Гагнуурын дараа тоног төхөөрөмжийн модулийг царцдас руу угсарч, доор харуулав.

Цогц нөлөө бүхий дүрс ~

Зөвлөмж болгож буй: