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
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 |
1800mAh 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
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.