Table des matières:

Comment faire un compteur de pas ? : 3 étapes (avec photos)
Comment faire un compteur de pas ? : 3 étapes (avec photos)

Vidéo: Comment faire un compteur de pas ? : 3 étapes (avec photos)

Vidéo: Comment faire un compteur de pas ? : 3 étapes (avec photos)
Vidéo: Compteur : afficheur 7 segment avec le microcontrôleur PIC 2024, Juin
Anonim
Image
Image
Créer un projet Blynk
Créer un projet Blynk

J'avais l'habitude de bien performer dans de nombreux sports: marcher, courir, faire du vélo, jouer au badminton, etc.

J'adore rouler pour voyager avant longtemps. Eh bien, regardez mon ventre corpulent……

Bon, de toute façon, je décide de recommencer à faire de l'exercice. Quel équipement dois-je préparer ? Outre les installations sportives, oui! J'ai besoin d'un instrument ! Je crois qu'avec cela, je peux garder une quantité appropriée d'exercice. Ici, l'instrument prend forme. Commençons par une vidéo ~

L'instrument peut non seulement enregistrer les pas (et les calories) en temps réel, mais aussi afficher l'heure. Ce qui est spécial, c'est que le format d'affichage est le pointeur ~ tellement cool ! J'aime vraiment, vraiment !

Vous pouvez télécharger vos dossiers sur Internet

en un seul clic. Tous les enregistrements peuvent être affichés par Blynk (un logiciel pour smartphone introduit auparavant). Identique à la montre intelligente portable, l'instrument obtient l'heure en ligne (vous n'avez donc pas besoin d'avoir peur de la mise à jour de l'alimentation et de l'heure).

Matériel en mesure:

Carte FireBeetle-ESP32

FireBeetle Covers-Proto Board

écran d'affichage OLED12864

Module d'accélération

Batterie 3.7V (achetée en ligne, le volume est d'environ 600mAH)

3 boutons (acheté en ligne)

Il est très pratique de construire ce projet par Blybk.

Étape 1: Créer un projet Blynk

Ajoutez deux contrôles:

Affichage de la valeur * 1

Horloge en temps réel * 1

Le nom de l'affichage de la valeur doit être défini sur des étapes, mais aucun paramètre pour les propriétés de l'horloge en temps réel. Choisissez V1 comme broche d'entrée pour ajuster la disposition des commandes, comme indiqué ci-dessous.

Étape 2: Télécharger des programmes sur FireBeetle Board-ESP32

Cliquez ici pour télécharger le code source d'esp32. Le code source se compose de fichiers de bibliothèque et de fichiers d'impression 3D. Vous devez enregistrer le fichier de bibliothèque dans la lib d'arduino. Et les fichiers 3D peuvent imprimer des croûtes directement.

Ci-dessous le programme principal

#include #include // Uniquement nécessaire pour Arduino 1.6.5 et versions antérieures #include "SSD1306.h" // alias pour `#include "SSD1306Wire.h"` #include "OLEDDisplayUi.h" #include "images.h" # inclure #include #include #include #include #define POWER_KEY 1 #define MENU_KEY 2 #define UPLOAD_KEY 3 boolean upload = false; Affichage SSD1306 (0x3c, 18, 0); OLEDDisplayUi ui (&display); minuteur SimpleTimer; WidgetRTC rtc; int écranW = 128; écran intH = 64; int clockCenterX = screenW/2; int clockCenterY = ((screenH-16)/2)+16; // la partie supérieure jaune a une hauteur de 16 px int clockRadius = 23; #define DEVICE (0x53) //Adresse du périphérique ADXL345 #define TO_READ (6) //nombre d'octets que nous allons lire à chaque fois (deux octets pour chaque axe) byte buff[TO_READ]; // tampon de 6 octets pour sauvegarder les données lues à partir du périphérique char str[100]; //string buffer pour transformer les données avant de les envoyer au port série int regAddress = 0x32; //premier registre de données d'accélération d'axe sur l'ADXL345 int xx, yy, zz; //données d'accélération sur trois axes statiques int currentValue = 0; longs pas statiques non signésSum=0; char auth = "YourAuthToken"; // Vos identifiants WiFi. // Définissez le mot de passe sur "" pour les réseaux ouverts. char ssid = "VotreNomRéseau"; char pass = "Votre mot de passe"; 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, 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, 0 0xF8, 0x17, 0x00, 0x00, 0xC0, 0xF8, 0x0F, 0x00, 0x00, 0xE0, 0xFB, 0x17, 0x00, 0x00, 0xC0, 0xFF, 0x13, 0x00, 0x00, 0x00, 0xFF, 0,x03, 0x00, 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFA, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0 0xF4, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x0F, 0x00, 0x00, 0x00, 0xF9, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x80, 0xFE, 0,00, 0x, 00 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, 0x, 0,05,E0 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1E, 0x00, 003xA0, 40, 0x00, 0x80, 0x03, 0x00, 0xF8, 0x01, 0x00, 0x07, 0x00, 0xF4, 0x00, 0x00, 0x07, 0x00, 0xE8, 0x00, 0x80, 0x0F, 0x00, 0xE8, 0x00, 0x 90, 0x0,0F 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00, }; // fonction utilitaire pour l'affichage de l'horloge numérique: imprime le premier 0 String twoDigits(int digits){ if(digits <10) { String i = '0'+String(digits); retourner je; } else { return String(chiffres); } } void clockOverlay(OLEDDisplay *display, OLEDDisplayUiState* state) { if((hour()==0) && (minute()==0) && (second()==0)) stepsSum = 0; } void analogClockFrame(OLEDDisplay *display, état OLEDDisplayUiState*, int16_t x, int16_t y) { display->drawCircle(clockCenterX + x, clockCenterY + y, 2); //heure ticks for(int z=0; z drawLine(x2 + x, y2 + y, x3 + x, y3 + y); } // afficher la seconde main float angle = second() * 6; angle = (angle / 57.29577951); //Convertir les degrés en radians 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); // afficher l'angle de l'aiguille des minutes = minute() * 6; angle = (angle / 57.29577951); //Convertir les degrés en radians x3 = (clockCenterX + (sin(angle) * (clockRadius - (clockRadius / 4)))); y3 = (clockCenterY - (cos(angle) * (clockRadius - (clockRadius / 4)))); display->drawLine(clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // afficher l'angle de l'aiguille des heures = hour() * 30 + int((minute() / 12) * 6); angle = (angle / 57.29577951); //Convertir les degrés en radians x3 = (clockCenterX + (sin(angle) * (clockRadius - (clockRadius / 2)))); y3 = (clockCenterY - (cos(angle) * (clockRadius - (clockRa dius / 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()); String timenow = String(hour())+":"+twoDigits(minute())+":"+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, date); } void writeTo(int device, byte address, byte val) { Wire.beginTransmission(device); //commencer la transmission vers le périphérique Wire.write(address); // envoie l'adresse du registre Wire.write(val); // envoie la valeur pour écrire Wire.endTransmission(); //fin de la transmission } //lit num octets à partir du registre d'adresse sur le périphérique dans le tableau buff void readFrom(int device, byte address, int num, byte buff) { Wire.beginTransmission(device); //commencer la transmission vers le périphérique Wire.write(address); //envoie l'adresse à lire depuis Wire.endTransmission(); //fin de la transmission Wire.beginTransmission(device); //démarrer la transmission vers le périphérique Wire.requestFrom(device, num); // demande 6 octets du périphérique int i = 0; while(Wire.available()) //le périphérique peut envoyer moins que demandé (anormal) { buff= Wire.read(); // reçoit un octet i++; } Wire.endTransmission(); //fin de la transmission } void runningFrame(OLEDDisplay *display, état OLEDDisplayUiState*, int16_t x, int16_t y) { float calValue = stepsSum*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, état OLEDDisplayUiState*, int16_t x, int16_t y) { display->setFont(ArialMT_Plain_16); display->drawString(60, 45, "upload data …"); } // Ce tableau conserve les pointeurs de fonction vers tous les cadres // les cadres sont les vues uniques qui glissent dans FrameCallback frames = { analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // combien y a-t-il de cadres ? int frameCount = 4; // Les superpositions sont dessinées statiquement au-dessus d'un cadre, par exemple. une horloge OverlayCallback overlays = { 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(superpositions, 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); //lire les données d'accélération de l'ADXL345 xx = (((int)buff[1]) << 8) | buff[0]; yy = (((int)buff[3])<< 8) | chamois[2]; zz = (((int)buff[5]) << 8) | chamois[4]; if(xx 80){ if(xx < currentValue){ stepsSum++; } valeurcourante = xx; } sprintf(str, "%d", stepsSum); } int getKeys(void){ if(digitalRead(D2) == LOW){ delay(5); if(digitalRead(D2) == LOW){ while(digitalRead(D2) == LOW); renvoie POWER_KEY; } } if(digitalRead(D3) == LOW){ delay(5); if(digitalRead(D3) == LOW){ while(digitalRead(D3) == LOW); renvoie MENU_KEY; } } if(digitalRead(D4) == LOW){ delay(5); if(digitalRead(D4) == LOW){ while(digitalRead(D4) == LOW); renvoie UPLOAD_KEY; } } renvoie 0; } void doKeysFunction(void){ static int uiFrameIndex = 2; clés int = getKeys(); if(keys == POWER_KEY){ static char i = 0; if(i){ui.init(); display.flipScreenVertically(); display.displayOn(); }autre{ display.displayOff(); } je = ~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); }autre{ upload = true; ui.switchToFrame(3); } } } void setup() { pinMode(D2, INPUT); pinMode(D3, ENTREE); pinMode(D4, ENTREE); Blynk.begin(auth, ssid, pass); rtc.begin(); uiInit(); adxl345Init(); timer.setInterval(30, updateAdxl345); timer.setInterval(100, uploadToBlynk); } void loop() { int restantTimeBudget = ui.update(); static int testSum = 0; if((testSum 0) { delay(remainingTimeBudget); } doKeysFunction(); timer.run(); }

Attention: vous devez modifier les paramètres Wi-Fi, le passeport et les AUTHTOKENS pour vous-même.

char auth = "YourAuthToken"; // Vos identifiants WiFi. // Définissez le mot de passe sur "" pour les réseaux ouverts. char ssid = "VotreNomRéseau"; char pass = "Votre mot de passe";

Étape 3: connexion matérielle

Connexion matérielle
Connexion matérielle
Connexion matérielle
Connexion matérielle
Connexion matérielle
Connexion matérielle

Connectez OLED12864 et le module d'accélération à I2C, les bas à D2, D3, D4. De plus, ajoutez des résistances pull-up de 51k aux bas pour atteindre 3,3 V, comme indiqué ci-dessous.

Attention: il est faux de connecter des résistances pull-up à AREF, la bonne est à 3,3V

L'image de soudure de matériel, montrée comme ci-dessous:

Après la soudure, assemblage du module matériel à la croûte, illustré ci-dessous:

Image d'effet complète ~

Conseillé: