Bliv den nye Usain Bolt |Sprint tracker|

Skal du være den næste Usain Bolt ? - så se med her! Dette projekt omhandler et fedt projekt der kan måle hvor hurtigt du kan løbe 50, 100, 150 .... eller 500 meter. Det eneste du skal bruge er en ESP TTGO, Ultrasonisk sensor og et par knapper fra komponent mega kit. Nedenstående tabel kan du også se et forslag til indkøb, som vil dække dine behov til dette projekt men også mange i fremtiden!

  • Specifikationer
  • Opbygning af kredsløb på fumlebræt
  • Programmering af ESP32 TTGO
  • 3D-printet kasse
  • Implementering
  • Specifikationer

    For at kunne lave dette projekt skal du bruge nedenstående komponenter. De er alle at finde her hos eBits.dk.

    Antal

    Komponent billede

    Komponent

    1

    TTGO T-Display ESP32 med WiFi, Bluetooth og 1.1" farve LCD skærm

    1

    300mAh LiPo batteri med beskyttelseskredsløb
    1 Komponent mega kit
    1
    LiPo batteri lader med beskyttelseskredsløb
    1
    HC-SR04

     

    Ting du skal bruge fra komponent mega kit kittet er følgende:

    Antal Komponent
    1 Aktiv Fast frekvens buzzer
    3 Knapper
    3 10 kΩ modstande
    12 Dupontkabler

      

    Opbygning af kredsløb på fumlebræt

    Opbygningen på fumlebrættet udføres med følgende tilslutning af modulerne til TTGO`en. Hvis nedenstående tabel følges behøves der ikke og ændres i koden som er at finde længere nede på siden eller på følgende link: 

    HC-SR04 VCC

    TTGO 5V

    HC-SR04 GND

    TTGO GND

    HC-SR04 TRIG

    TTGO 32

    HC-SR04 ECHO

    TTGO 33

    Buzzer +

    TTGO 17

    Buzzer -

    TTGO GND

    Button Start

    TTGO 25

    Button Up

    TTGO 26

    Button Down

    TTGO 27

    Nedenstående billede illustrerer den faktiske opstilling på fumlebræt. 

    Nedenstående billede er samme opstilling som ovenstående billede, men her er der blot tilsluttet et batteri og en ladekreds, så enheden på sigt kan blive portabel. Denne konstellation er tilsluttet direkte på TTGO`ens bagside som tillader direkte opkobling af batteri. Selve ladekredsen tillader at der tilsluttes USB-C med 5V 2A. Batteriet som ses på billeder er et 1800 mAh batteri som vil tilbyde en rimelig operations tid på systemet.

    Nedenstående billede illustrerer den faktiske opstilling på fumlebræt. 

    Programmering på TTGO t-display

    Nedenstående kodeudsnit viser de biblioteker som projektet anvender. Det er hovedsageligt for at tilgå displayet på TTGO'en. Selve mapperne kan downloades via følgende link: TFT_eSPI.h & Free_Fonts.h. 
    De skal ligges ind under Libraries, som du finder under Dokumenter -> Arduino -> libraries.

    #include "Free_Fonts.h" // Include the header file attached to this sketch
    #include "SPI.h"
    #include "TFT_eSPI.h"
    
    //Based on TTGO
    #define button1 26 
    #define button2 27 
    #define start_run 25
    #define TRIG 32
    #define ECHO 33
    #define A0 17   
    Nedenstående kodeudsnit er selve loop-sløjfen som sørger for at der kan vælges hvilken afstand der ønskes at blive målt og ligeledes tjekker den for om start_run er blevet trykket.

    void loop() {
      tft.setTextDatum(MC_DATUM);
      tft.setTextColor(TFT_WHITE, TFT_BLACK);
    
      if(digitalRead(start_run) == HIGH){
      if(timesDisplayed == false){
      PrepareForRun();
      }else{
        timesDisplayed = false;
        DisplayStartMenu(distance);
        delay(1000);
      }
    }
      if(digitalRead(button2) == HIGH){
      if(distance > 50){
      distance-=50;
      UpdateDistance(distance);
      delay(200);
      }
    }
    if(digitalRead(button1) == HIGH){
      if(distance < 500){
      distance+=50;
      UpdateDistance(distance);
      delay(200);
      }
    }   
    }

    For at opdatere skærmen når distance-knapperne trykkes kaldes nedenstående funktion, som har til opgave at opdatere displayet.

    void UpdateDistance(int _distance){
      tft.fillScreen(TFT_BLACK);
      String text = itoa(_distance, buf, 10);
      text += "m";
      tft.setFreeFont(FF2);
      tft.drawString("Distance: "+ text, 120, 40, GFXFF);  
    }

    Når start_run knappen trykkes kaldes nedenstående funktion som laver en nedtælling på skærmen og ligeledes en audio-nedtælling i form af bip. Når så tiden er gået vil buzzeren give en længere hyle-tone som er indikator for at tiden starter.

    void PrepareForRun(){
      int countdown = distance/5;
      digitalWrite(A0, HIGH);
        delay(200);
        digitalWrite(A0, LOW);
        delay(200);
        digitalWrite(A0, HIGH);
        delay(200);
        digitalWrite(A0, LOW);
        delay(200);
      for(int a = 0; a < distance/5; a++){
        --countdown; 
        String text = itoa(countdown, buf, 10);
        tft.fillScreen(TFT_BLACK);
        tft.setFreeFont(FF2);
        tft.drawString("Go to start: "+ text, 120, 40, GFXFF);
       delay(1000);
      }
      for(int b = 3; b > 0; b--){
        String text = itoa(b, buf, 10);
        tft.fillScreen(TFT_BLACK);
        tft.setFreeFont(FF2);
        tft.drawString("Time: "+ text, 120, 40, GFXFF);
        digitalWrite(A0, HIGH);
        delay(500);
        digitalWrite(A0, LOW);
        delay(500);
      }
      digitalWrite(A0, HIGH);
      delay(2000);
      tft.fillScreen(TFT_BLACK);
        tft.setFreeFont(FF2);
        tft.drawString("RUN!", 120, 40, GFXFF);
      digitalWrite(A0, LOW);
      MeasureRunTime();
      }

    Når man løber forbi den ultrasoniske sensor vil MeasureRunTime() blive færdiggjort og en tid vil blive sendt med funktionen DisplayTimes(double timer).

    void MeasureRunTime(){
      timeMeasuring = true;
      runTimeStart = millis();
      while(MeasureDistance() > 100){
        delay(10);
      }
      runTimeMs = millis() - runTimeStart;
      double timer = (double)runTimeMs/1000;
      Serial.print("Time: ");
      Serial.println((double)runTimeMs/1000);
      timeMeasuring = false;
      DisplayTimes(timer);
    }

    Her ses den funktion som kaldes i while-løkken, til den brydes.

    float MeasureDistance(){
      digitalWrite(TRIG, LOW);
      delayMicroseconds(2);
      digitalWrite(TRIG, HIGH);
      delayMicroseconds(5);
      digitalWrite(TRIG, LOW);
    
      float t = pulseIn(ECHO, HIGH);
      float distance = t*0.017015;
      Serial.print("Distance: ");
      Serial.println(distance);
      return distance;
    }

    Nedenstående kodeudsnit er igen en funktion til at opdatere skærmen, nu med den seneste løbetid.

    void DisplayTimes(int time_number){
      String text = itoa(time_number, buf, 10);
      tft.fillScreen(TFT_BLACK);
        tft.setFreeFont(FF2);
        tft.drawString("Time: "+ text +" s", 120, 40, GFXFF);
      }

    Hele projektet vil kunne findes på eBits Github

    3D-printet kasse

    Nedenstående billeder viser designet af kassen og den tiltænkte opkobling af modulerne i kassen. Hvis du ikke har en 3D-printer derhjemme findes der mange print-service virksomheder på internettet som alle tilbyder denne service til en fordelagtig pris. 
    Nedenstående design kan findes her

     

     

    Implementering

    Her ses et billede af tilslutningen og opkobling at ladekredsen, knapper, TTGO og HC-SR04 på den 3D-printede kasses låg. Knapperne kan med fordel få en lille klat sekund-lim på kanterne. Resten kan monteres med skruer.

     

    Her ses et billede af den færdige og fuldt funktionelle sprint tracker, i bunden vil opladningsmuligheden være i form af USB-C og øverst er en tænd/sluk switch monteret. Kassen er ganske lille og nem at tage med sig.

    Skriv kommentar!

    Relevante produkter

    TS100 digital loddekolbeTS100 digital loddekolbe
    TS100 digital loddekolbe
    Tilbudspris Fra 599,00 kr
    8 på lager
    TS80P USB-C Loddekolbe kitTS80P USB-C Loddekolbe kit
    TS80P USB-C Loddekolbe kit
    Tilbudspris 899,00 kr
    Udsolgt :(
    Luksus kolberenserLuksus kolberenser
    Luksus kolberenser
    Tilbudspris 89,00 kr
    12 på lager