Vill du bli nästa Usain Bolt? Ta en titt! Detta projekt mäter hur snabbt du kan springa 50, 100, 150 ... eller 500 meter. Allt du behöver är en ESP TTGO, ultraljudssensor och ett par knappar från komponentmegakitet — aktuellt utbud; kontrollera kompatibilitet. Tabellen nedan ger också ett inköpsförslag som täcker behoven för detta projekt och många framtida projekt!
Specifikationer
För att bygga projektet behöver du komponenterna nedan. Alla finns här på eBits.dk.
Du behöver följande delar från komponentmegakitet — aktuellt utbud; kontrollera kompatibilitet-kitet:
| Antal | Komponent |
| 1 | Aktiv summer med fast frekvens |
| 3 | Knappar |
| 3 | 10 kΩ motstånd |
| 12 | Dupont-kablar |
Bygg kretsen på ett kopplingsdäck
Bygg kretsen på kopplingsdäcket med följande anslutningar till TTGO. Om du följer tabellen nedan behöver du inte ändra koden längre ned på sidan eller via följande länk:
|
HC-SR04 VCC |
TTGO 5V |
|
HC-SR04 GND |
TTGO GND |
|
HC-SR04 TRIG |
TTGO 32 |
|
HC-SR04 ECHO |
TTGO 33 via lämplig 5V→3.3V nivåomvandlare eller spänningsdelare (aldrig direkt 5V) |
|
Summer + |
TTGO 17 |
|
Summer - |
TTGO GND |
|
Startknapp |
TTGO 25 |
|
Uppknapp |
TTGO 26 |
|
Nedknapp |
TTGO 27 |

Bilden nedan visar uppkopplingen på kopplingsdäcket. Originaldiagrammet visar inte nödvändigtvis nivåanpassning: HC-SR04 ECHO kan vara 5V och måste sänkas till en säker 3.3V-nivå före ESP32 GPIO33.

Bilden nedan visar samma uppkoppling, men med ett batteri — aktuellt utbud; kontrollera kompatibilitet och en laddningskrets tillagda så att enheten kan bli bärbar. Denna koppling ansluts direkt till baksidan av TTGO som stöder direkt anslutning av ett batteri — aktuellt utbud; kontrollera kompatibilitet. Själva laddningskretsen tar emot USB-C med 5V 2A. Batteriet på bilderna är ett 1800 mAh-batteri — aktuellt utbud; kontrollera kompatibilitet som bör ge en rimlig drifttid. Kontrollera batteriets polaritet, skydd och laddningsspecifikationer. Anslut inte två laddningsutgångar till samma cell utan en godkänd laddningstopologi; kontrollera TTGO-kortets inbyggda laddare innan du använder en extra laddningsmodul.
![]()
Bilden nedan visar uppkopplingen på kopplingsdäcket. Originaldiagrammet visar inte nödvändigtvis nivåanpassning: HC-SR04 ECHO kan vara 5V och måste sänkas till en säker 3.3V-nivå före ESP32 GPIO33.

Programmera TTGO T-Display
Kodavsnittet nedan visar biblioteken som används i projektet, främst för att komma åt skärmen på TTGO. Mapparna kan laddas ned via denna länk: TFT_eSPI.h & Free_Fonts.h.
Lägg dem i libraries-mappen under Dokument -> 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
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);
}
}
}
För att uppdatera skärmen när avståndsknapparna trycks in anropas följande funktion, som uppdaterar skärmen.
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 trycks in anropas följande funktion, som visar en nedräkning på skärmen och spelar upp en hörbar nedräkning med pip. När nedräkningen är klar ger summern en längre ton som signalerar att tidtagningen har startat.
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 du springer förbi ultraljudssensorn avslutas MeasureRunTime(), och tiden skickas till 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);
}
Här är funktionen som anropas i while-loopen tills den avbryts.
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;
}
Kodavsnittet nedan är ännu en funktion för att uppdatera skärmen, nu med den senaste löptiden.
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);
}
Hela projektet finns på eBits GitHub
3D-utskrivet hölje
Bilderna nedan visar höljets design och den tänkta placeringen av modulerna inuti. Om du inte har en 3D-skrivare hemma finns många utskriftstjänster på nätet som erbjuder detta till ett förmånligt pris.
Designen nedan finns här
![]() |
![]() |
![]() |
Genomförande
Här visas anslutningarna och inkopplingen av laddningskretsen, knappar, TTGO och HC-SR04 på det 3D-utskrivna höljets lock. En liten klick snabblim längs kanterna kan fästa knapparna. Resten kan monteras med skruvar.
Här visas den färdiga, fullt fungerande sprinttrackern. USB-C-laddningsporten sitter längst ned och en strömbrytare är monterad överst. Höljet är ganska litet och lätt att ta med sig.








