İçindekiler:

Adım Sayacı Nasıl Yapılır?: 3 Adım (Resimlerle)
Adım Sayacı Nasıl Yapılır?: 3 Adım (Resimlerle)

Video: Adım Sayacı Nasıl Yapılır?: 3 Adım (Resimlerle)

Video: Adım Sayacı Nasıl Yapılır?: 3 Adım (Resimlerle)
Video: Adım at para kazan hîlesi ( Arapların taktiği 😅 ) 2024, Eylül
Anonim
Image
Image
Bir Blynk Projesi Oluşturun
Bir Blynk Projesi Oluşturun

Birçok sporda iyi performans gösterirdim: yürümek, koşmak, bisiklete binmek, badminton oynamak vb.

Çok geçmeden gezmek için ata binmeyi seviyorum. Peki, benim iri göbeğime bak……

Neyse, egzersize yeniden başlamaya karar verdim. Hangi ekipmanları hazırlamalıyım? Spor tesislerinin yanı sıra, evet! Bir enstrümana ihtiyacım var! Bununla inanıyorum, uygun miktarda egzersiz yapabilirim. Enstrüman burada ortaya çıkıyor. Bir video ile başlayalım~

Cihaz sadece adımları (ve kalorileri) gerçek zamanlı olarak kaydetmekle kalmaz, aynı zamanda zamanı da gösterir. Özel olan, gösterim biçiminin işaretçi olması~ çok havalı! Gerçekten, gerçekten çok hoşuma gitti!

Kayıtlarınızı internete yükleyebilirsiniz.

sadece tek bir tıklama ile. Tüm kayıtlar Blynk (daha önce tanıtılan bir akıllı telefon yazılımı) tarafından görüntülenebilir. Giyilebilir akıllı saat ile aynı, cihaz çevrimiçi zaman alır (Yani güç ve zaman güncellemesinden korkmanıza gerek yoktur).

Ortamda donanım:

FireBeetle Kurulu-ESP32

FireBeetle Kapakları-Proto Kartı

OLED12864 görüntüleme ekranı

Hızlanma modülü

3.7V pil (çevrimiçi satın alındı, hacim yaklaşık 600mAH))

3 botton (çevrimiçi satın alındı)

Bu projeyi Blybk tarafından inşa etmek çok uygundur.

1. Adım: Bir Blynk Projesi Oluşturun

İki kontrol ekleyin:

Değer Göstergesi * 1

Gerçek zamanlı saat * 1

Değer Görüntüleme adı adımlara ayarlanmalıdır, ancak Gerçek zamanlı saatin özellikleri için ayar yapılmamalıdır. Aşağıda gösterildiği gibi kontrollerin düzenini ayarlamak için giriş pini olarak V1'i seçin.

Adım 2: Programları FireBeetle Board-ESP32'ye İndirin

Kaynak kodunu esp32'ye indirmek için buraya tıklayın. Kaynak kodu, kütüphane dosyaları ve 3D baskı dosyalarından oluşur. Kütüphane dosyasını arduino lib'e kaydetmelisiniz. Ve 3D dosyalar kabukları doğrudan yazdırabilir.

Aşağıda ana program

#include #include // Yalnızca Arduino 1.6.5 ve önceki sürümler için gereklidir #include "SSD1306.h" // `#include "SSD1306Wire.h"` için diğer ad #include "OLEDDisplayUi.h" #include "images.h" # include #include #include #include #include #define POWER_KEY 1 #define MENU_KEY 2 #define UPLOAD_KEY 3 boole yüklemesi = false; SSD1306 ekranı (0x3c, 18, 0); OLEDDisplayUi kullanıcı arabirimi (&ekran); SimpleTimer zamanlayıcı; WidgetRTC rtc; int ekranW = 128; int ekranH = 64; int clockCenterX = ekranW/2; int clockCenterY = ((ekranH-16)/2)+16; // üstteki sarı kısım 16 piksel yükseklik int clockRadius = 23; #define DEVICE (0x53) //ADXL345 cihaz adresi #define TO_READ (6) //her seferinde okuyacağımız bayt sayısı (her eksen için iki bayt) bayt buff[TO_READ]; // cihazdan okunan verileri kaydetmek için arabellek char str[100]; // verileri seri bağlantı noktasına göndermeden önce dönüştürmek için dizge tamponu int regAddress = 0x32; //ADXL345 üzerindeki ilk eksen-hızlanma-veri kaydı int xx, yy, zz; //üç eksen ivme verisi statik int currentValue = 0; statik işaretsiz uzun adımlarSum=0; char auth = "YourAuthToken"; // WiFi kimlik bilgileriniz. // Açık ağlar için şifreyi "" olarak ayarlayın. char ssid = "AğAdınız"; char pass = "Parolanız"; const char koşu_Logo_bits PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x03, 0x000, 0x00 0xF8, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0x00, 0xFC, 0x05, 0x00, 0x00, 0x00, 0xFC, 0x01, 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, 0x00 0xF8, 0x17, 0x00, 0x00, 0xC0, 0xF8, 0x0F, 0x00, 0x00, 0xE0, 0xFB, 0x17, 0x00, 0x00, 0xC0, 0xFF, 0x13, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x03, 0x00, 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFA, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x000, 0x00 0xF4, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x0F, 0x00, 0x00, 0x00, 0xF9, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x80, 0xFE, 0x1F, 0x00, 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, 0xE0, 0x05, 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1E, 0x00, 0xA40, 0x03, 0xA40, 0x03, 0x 0x00, 0x80, 0x03, 0x00, 0xF8, 0x01, 0x00, 0x07, 0x00, 0xF4, 0x00, 0x00, 0x07, 0x00, 0xE8, 0x00, 0x80, 0x0F, 0x00, 0xE8, 0x00, 0x90, 0x00, 0x0F, 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00, }; // dijital saat gösterimi için yardımcı fonksiyon: baştaki yazdırır 0 String ikiDigits(int digits){ if(digits <10) { String i = '0'+String(digits); dönüş i; } else { return String(rakamlar); } } void clockOverlay(OLEDDisplay *display, OLEDDisplayUiState* state) { if((hour()==0) && (dakika()==0) && (second()==0))stepSum = 0; } void analogClockFrame(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { display->drawCircle(clockCenterX + x, clockCenterY + y, 2); //saat işaretleri for(int z=0; z drawLine(x2 + x, y2 + y, x3 + x, y3 + y); } // ikinci el float açısını göster = saniye() * 6; açı = (açı / 57.29577951); //Dereceyi radyana çevir int x3 = (clockCenterX + (sin(açı) * (clockRadius - (clockRadius / 5)))); int y3 = (clockCenterY - (cos(açı) * (clockRadius - () clockRadius / 5)))); display->drawLine(clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // yelkovan açısını göster = dakika() * 6; açı = (açı / 57.29577951); //Dereceyi radyana dönüştür x3 = (clockCenterX + (sin(açı) * (clockRadius - (clockRadius / 4)))); y3 = (clockCenterY - (cos(açı) * (clockRadius - (clockRadius / 4)))); display->drawLine(clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // akrep açısını göster = saat() * 30 + int((dakika() / 12) * 6); açı = (açı / 57.29577951); //Dereceleri radyana dönüştür x3 = (clockCenterX + (sin(angle) * (clockRadius - (clockRadius / 2)))); y3 = (clockCenterY - (cos(açı)) * (clockRadius - (clockRa dius / 2)))); display->drawLine(clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); } void digitalClockFrame(OLEDDisplay *display, OLEDDisplayUiState* durumu, int16_t x, int16_t y) { Dize tarih = Dize(yıl())+"/"+twoDigits(ay())+"/"+twoDigits(gün()); String timenow = String(hour())+":"+twoDigits(dakika())+":"+twoDigits(second()); display->setTextAlignment(TEXT_ALIGN_CENTER); display->setFont(ArialMT_Plain_24); display->drawString(clockCenterX + x, 20, timenow); display->setFont(ArialMT_Plain_16); display->drawString(60, 45, tarih); } void writeTo(int aygıt, bayt adresi, bayt değeri) { Wire.beginTransmission(device); //cihaza iletimi başlat Wire.write(adres); // register adresini gönder Wire.write(val); // Wire.endTransmission() yazmak için değer gönder; //iletimi sonlandır } //cihazdaki adres kaydından başlayarak buff dizisine kadar baytları okur void readFrom(int aygıt, bayt adresi, int sayı, bayt buff) { Wire.beginTransmission(device); //cihaza iletimi başlat Wire.write(adres); // Wire.endTransmission()'dan okunacak adresi gönderir; // iletimi sonlandır Wire.beginTransmission(cihaz); //cihaza iletimi başlat Wire.requestFrom(device, num); // cihazdan 6 bayt iste int i = 0; while(Wire.available()) //cihaz istenenden daha azını gönderebilir (anormal) { buff= Wire.read(); // bir bayt al i++; } Wire.endTransmission(); // iletimi sonlandır } void RunningFrame(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { float calValue = stepSum*0.4487; display->setTextAlignment(TEXT_ALIGN_CENTER); display->setFont(ArialMT_Plain_24); display->drawString(clockCenterX, clockCenterY, str); sprintf(str, "%.2fcal", calValue); display->setTextAlignment(TEXT_ALIGN_CENTER); display->setFont(ArialMT_Plain_10); display->drawString(100, 20, str); display->drawXbm(10, 14, 34, 50, Running_Logo_bits); } void uploadFrame(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { display->setFont(ArialMT_Plain_16); display->drawString(60, 45, "veri yükle…"); } // Bu dizi, tüm çerçevelerin işlev işaretçilerini tutar // çerçeveler, FrameCallback çerçevelerinde kayan tek görünümlerdir = { analogClockFrame, digitalClockFrame, RunningFrame, uploadFrame}; // kaç kare var? int frameCount = 4; // Bindirmeler statik olarak bir çerçevenin üzerine çizilir, örn. bir saat OverlayCallback overlays = { clockOverlay }; int overlaysCount = 1; void uploadToBlynk(void){ if(upload == true){ Blynk.virtualWrite(V0, stepSum); Blynk.virtualWrite(V1, adımlarSum); } } 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(çerçeveler, frameCount); ui.setOverlays(overlays, overlaysCount); ui.disableAutoTransition(); ui.switchToFrame(2); ui.init(); display.flipScreenVertical(); } void adxl345Init(void){ writeTo(DEVICE, 0x2D, 0); writeTo(CİHAZ, 0x2D, 16); writeTo(CİHAZ, 0x2D, 8); } void updateAdxl345(void){ readFrom(DEVICE, regAddress, TO_READ, buff); //ADXL345'ten hızlanma verilerini oku xx = (((int)buff[1]) << 8) | güçlendirme[0]; yy = (((int)buff[3])<< 8) | buff[2]; zz = (((int)buff[5]) << 8) | tutku[4]; if(xx 80){ if(xx < currentValue){ stepSum++; } akımDeğeri = xx; } sprintf(str, "%d", adımlarSum); } int getKeys(void){ if(digitalRead(D2) == DÜŞÜK){ gecikme(5); if(dijitalOkuma(D2) == DÜŞÜK){ while(dijitalOkuma(D2) == DÜŞÜK); POWER_KEY döndür; } } if(dijitalOkuma(D3) == DÜŞÜK){ gecikme(5); if(dijitalOkuma(D3) == DÜŞÜK){ while(dijitalOkuma(D3) == DÜŞÜK); MENU_KEY döndür; } } if(dijitalOkuma(D4) == DÜŞÜK){ gecikme(5); if(dijitalOkuma(D4) == DÜŞÜK){ while(dijitalOkuma(D4) == DÜŞÜK); UPLOAD_KEY döndür; } } 0 döndür; } void doKeysFunction(void){ static int uiFrameIndex = 2; int anahtarlar = getKeys(); if(keys == POWER_KEY){ statik karakter i = 0; if(i){ ui.init(); display.flipScreenVertically(); display.displayOn(); }else{ display.displayOff(); } ben = ~i; } if(keys == MENU_KEY){ if(upload == false){ uiFrameIndex++; if(uiFrameIndex == 3) uiFrameIndex = 0; ui.switchToFrame(uiFrameIndex); }else{ ui.switchToFrame(3); } } if(keys == UPLOAD_KEY){ if(upload == true){ upload = false; ui.switchToFrame(uiFrameIndex); }else{ upload = true; ui.switchToFrame(3); } } } geçersiz kurulum() { pinMode(D2, INPUT); pinMode(D3, GİRİŞ); pinMode(D4, GİRİŞ); Blynk.begin(auth, ssid, pass); rtc.begin(); uiInit(); adxl345Init(); timer.setInterval(30, updateAdxl345); timer.setInterval(100, uploadToBlynk); } void loop() { int kalanTimeBudget = ui.update(); statik int testSum = 0; if((testSum 0) { delay(remainingTimeBudget); } doKeysFunction(); timer.run(); }

Dikkat: Wi-Fi ayarını, pasaportu ve AUTHTOKENS'i kendinize göre değiştirmelisiniz.

char auth = "YourAuthToken"; // WiFi kimlik bilgileriniz. // Açık ağlar için şifreyi "" olarak ayarlayın. char ssid = "AğAdınız"; char pass = "Parolanız";

3. Adım: Donanım Bağlantısı

Donanım Bağlantısı
Donanım Bağlantısı
Donanım Bağlantısı
Donanım Bağlantısı
Donanım Bağlantısı
Donanım Bağlantısı

OLED12864 ve hızlandırma modülünü I2C'ye, altları D2, D3, D4'e bağlayın. Ayrıca, aşağıda gösterildiği gibi 3.3V'a ulaşmak için tabanlara 51k pull-up dirençleri ekleyin.

Dikkat: Pull-up dirençlerini AREF'e bağlamak yanlış, doğru olanı 3.3V'a

Aşağıdaki gibi gösterilen donanım lehimleme görüntüsü:

Lehimden sonra, donanım modülünün kabuğa montajı, aşağıda gösterildiği gibi:

Kapsamlı efekt resmi~

Önerilen: