Translate

Monitoring Berat dan Tinggi Badan Hasilnya bisa diprint

Monitoring Berat dan Tinggi Badan Hasilnya bisa diprint


         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat mengukur berat dan tinggi badan secara langsung dengan Arduino dan sensor jarak HC-SRF04 dengan sensor berat menggunakan loadcell. untuk lebih jelasnya berikut adalah koding dan skemanya.

 
1. Skema


2. Program Arduino IDE

 #include <Wire.h>
#include "HX711.h"
#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK);
#include <SoftwareSerial.h>
SoftwareSerial Thermal(2, 3);

// HX711.DOUT    - pin #6
// HX711.PD_SCK    - pin #7

#define trigPin 4
#define echoPin 5

HX711 scale(6, 7);       

int btprint = 12;
int btprintx;

long duration, distance;
float tera = 0;
int berat;
float fix;
int x;
char tmp_string1[8];
char tmp_string2[8];

int zero=0;
int heatTime = 80;
int heatInterval = 255;
char printDensity = 15;
char printBreakTime = 15;

void draw(void) {

  itoa(distance, tmp_string1, 8);
  itoa(berat, tmp_string2, 8);
  
  u8g.setFont(u8g_font_unifont);
  u8g.drawStr(5, 25, "S= ");
  u8g.drawStr(30, 25, tmp_string1);
  u8g.drawStr(5, 40, "W= ");
  u8g.drawStr(30, 40, tmp_string2);
 
}

void initPrinter()
{
 //Modify the print speed and heat
 Thermal.write(27);
 Thermal.write(55);
 Thermal.write(7); //Default 64 dots = 8*('7'+1)
 Thermal.write(heatTime); //Default 80 or 800us
 Thermal.write(heatInterval); //Default 2 or 20us
 //Modify the print density and timeout
 Thermal.write(18);
 Thermal.write(35);
 int printSetting = (printDensity<<4) | printBreakTime;
 Thermal.write(printSetting); //Combination of printDensity and printBreakTime

}

void setup() {

  Wire.begin();
  Serial.begin(9600);
  Thermal.begin(9600); // to write to our new printer
  initPrinter();
 
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(btprint, INPUT_PULLUP);
 
  scale.set_scale(2280.f);       // this value is obtained by calibrating the scale with known weights; see the README for details
  scale.tare();                  // reset the scale to 0


  if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
    u8g.setColorIndex(255);     // white
  }
  else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
    u8g.setColorIndex(3);         // max intensity
  }
  else if ( u8g.getMode() == U8G_MODE_BW ) {
    u8g.setColorIndex(1);         // pixel on
  }
  else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
    u8g.setHiColorByRGB(255,255,255);
  }
 
}

void loop() {
 
  digitalWrite(trigPin, LOW);  // Added this line
  delayMicroseconds(2); // Added this line
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10); // Added this line
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;

  Serial.print("S: ");
  Serial.print(distance);
  Serial.print(" w: ");
  Serial.println(berat); 
  
  berat = scale.get_units(10) * -1;
  fix = ((berat + 1.523) / 0.223) - tera ;

 if (fix < 0 ) {
  fix = 0;
  }

    u8g.firstPage();
  do {
    draw();

  } while( u8g.nextPage() );

 
  scale.power_down();                  
  delay(1000);
  scale.power_up();

btprintx = digitalRead(btprint);
if (btprintx == 0) {    

   Serial.println("print ready");
   Serial.println("printing....");
   delay(1000);

  //print
  Thermal.write(27);
  Thermal.write(45);
  Thermal.write(1);
  Thermal.print("Tinggi= ");
  Thermal.print(distance);
  Thermal.println(" cm");
  Thermal.print("Berat= ");
  Thermal.print(berat);
  Thermal.println(" kg");
  Thermal.write(10);
  Thermal.write(10);

  }

}


3. VIDEO HASILNYA



Kendali 8 Lampu via Blynk 2.0 Wemos D1 Mini ESP8266

Kendali 8 Lampu via Blynk 2.0 Wemos D1 Mini ESP8266


        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat mengendalikan 8 buah lampu secara online dengan menggunakan software Blynk 2.0, alat ini juga bisa dikendalikan menggunakan handphone secara jarak jauh. untuk lebih jelasnya berikut adalah komponen dan kodingnya.


1. Komponen



2. Program Arduino IDE

#define BLYNK_TEMPLATE_ID "TMPL6J5FqGxxx"
#define BLYNK_TEMPLATE_NAME "Kendali Lampu"
#define BLYNK_AUTH_TOKEN "zhIIY4DeLCpTPuRE63CqJtytUKeexxxx"

#define BLYNK_PRINT Serial
#include <Wire.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

char ssid[] = "hotspothpku";       
char pass[] = "123456789";

int lampu1 = D1;
int lampu2 = D2;
int lampu3 = D3;
int lampu4 = D4;
int lampu5 = D5;
int lampu6 = D6;
int lampu7 = D7;
int lampu8 = D8;
int pinValue1,pinValue2,pinValue3,pinValue4,pinValue5,pinValue6,pinValue7,pinValue8;

void setup()
{
  pinMode(lampu1, OUTPUT); 
  pinMode(lampu2, OUTPUT); 
  pinMode(lampu3, OUTPUT); 
  pinMode(lampu4, OUTPUT); 
  pinMode(lampu5, OUTPUT); 
  pinMode(lampu6, OUTPUT); 
  pinMode(lampu7, OUTPUT); 
  pinMode(lampu8, OUTPUT); 
  
  Serial.begin(9600);
  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
}

void loop()
{     
    Blynk.run();
}

BLYNK_WRITE(V0)   
{
  pinMode(lampu1, OUTPUT); 
  pinValue1 = param.asInt();   
  if(pinValue1 == 1){
    digitalWrite(lampu1,LOW);
    digitalWrite(lampu2,HIGH);
    digitalWrite(lampu3,HIGH);
    digitalWrite(lampu4,HIGH);
    digitalWrite(lampu5,HIGH);
    digitalWrite(lampu6,HIGH);
    digitalWrite(lampu7,HIGH);
    digitalWrite(lampu8,HIGH);
  }
  
  if(pinValue1 == 0) {
    digitalWrite(lampu1,HIGH);
  }
}

BLYNK_WRITE(V1)
{
  pinMode(lampu2, OUTPUT); 
  pinValue2 = param.asInt();   
  if(pinValue2 == 1){
    digitalWrite(lampu1,HIGH);
    digitalWrite(lampu2,LOW);
    digitalWrite(lampu3,HIGH);
    digitalWrite(lampu4,HIGH);
    digitalWrite(lampu5,HIGH);
    digitalWrite(lampu6,HIGH);
    digitalWrite(lampu7,HIGH);
    digitalWrite(lampu8,HIGH);
  }
  
  if(pinValue2 == 0) {
    digitalWrite(lampu2,HIGH);
  }
}

BLYNK_WRITE(V2)
{
  pinMode(lampu3, OUTPUT); 
  pinValue3 = param.asInt();   
  if(pinValue3 == 1){
    digitalWrite(lampu1,HIGH);
    digitalWrite(lampu2,HIGH);
    digitalWrite(lampu3,LOW);
    digitalWrite(lampu4,HIGH);
    digitalWrite(lampu5,HIGH);
    digitalWrite(lampu6,HIGH);
    digitalWrite(lampu7,HIGH);
    digitalWrite(lampu8,HIGH);
  }
  
  if(pinValue3 == 0) {
    digitalWrite(lampu3,HIGH);
  }
}

BLYNK_WRITE(V3)
{
  pinMode(lampu4, OUTPUT); 
  pinValue4 = param.asInt();   
  if(pinValue4 == 1){
    digitalWrite(lampu1,HIGH);
    digitalWrite(lampu2,HIGH);
    digitalWrite(lampu3,HIGH);
    digitalWrite(lampu4,LOW);
    digitalWrite(lampu5,HIGH);
    digitalWrite(lampu6,HIGH);
    digitalWrite(lampu7,HIGH);
    digitalWrite(lampu8,HIGH);
  }
  
  if(pinValue4 == 0) {
    digitalWrite(lampu4,HIGH);
  }
}

BLYNK_WRITE(V4)
{
  pinValue5 = param.asInt();   
  if(pinValue5 == 1){
    digitalWrite(lampu1,HIGH);
    digitalWrite(lampu2,HIGH);
    digitalWrite(lampu3,HIGH);
    digitalWrite(lampu4,HIGH);
    digitalWrite(lampu5,LOW);
    digitalWrite(lampu6,HIGH);
    digitalWrite(lampu7,HIGH);
    digitalWrite(lampu8,HIGH);
  }
  
  if(pinValue5 == 0) {
    digitalWrite(lampu5,HIGH);
  }
}

BLYNK_WRITE(V5)
{
  pinValue6 = param.asInt();   
  if(pinValue6 == 1){
    digitalWrite(lampu1,HIGH);
    digitalWrite(lampu2,HIGH);
    digitalWrite(lampu3,HIGH);
    digitalWrite(lampu4,HIGH);
    digitalWrite(lampu5,HIGH);
    digitalWrite(lampu6,LOW);
    digitalWrite(lampu7,HIGH);
    digitalWrite(lampu8,HIGH);
  }
  
  if(pinValue6 == 0) {
    digitalWrite(lampu6,HIGH);
  }
}

BLYNK_WRITE(V6)
{
  pinValue7 = param.asInt();
   if(pinValue7 == 1){   
    digitalWrite(lampu1,HIGH);
    digitalWrite(lampu2,HIGH);
    digitalWrite(lampu3,HIGH);
    digitalWrite(lampu4,HIGH);
    digitalWrite(lampu5,HIGH);
    digitalWrite(lampu6,HIGH);
    digitalWrite(lampu7,LOW);
    digitalWrite(lampu8,HIGH);
  }
  
  if(pinValue7 == 0) {
    digitalWrite(lampu7,HIGH);
  }
}

BLYNK_WRITE(V7)
{
  pinValue8 = param.asInt();   
  if(pinValue8 == 1){
    digitalWrite(lampu1,HIGH);
    digitalWrite(lampu2,HIGH);
    digitalWrite(lampu3,HIGH);
    digitalWrite(lampu4,HIGH);
    digitalWrite(lampu5,HIGH);
    digitalWrite(lampu6,HIGH);
    digitalWrite(lampu7,HIGH);
    digitalWrite(lampu8,LOW);
  }
  
  if(pinValue8 == 0) {
    digitalWrite(lampu8,HIGH);
  }
}


3. VIDEO HASILNYA



Modul Kontroller Pompa Air Mancur 8 Channel

Modul Kontroller Pompa Air Mancur 8 Channel

       
     Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat mengendalikan 8 buah pompa untuk air mancur, selain itu alat ini juga terdapat 3 buah variasi yang bisa disetting sesuai keinginan. untuk lebih jelasnya berikut adalah koding dan skemanya.


1. Skema



2. Program Arduino IDE

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

int tb1 = A0;
int tb2 = A1;
int tb3 = A2;
int tb4 = A3;

int ssr1 = 2;
int ssr2 = 3;
int ssr3 = 4;
int ssr4 = 5;
int ssr5 = 6;
int ssr6 = 7;
int ssr7 = 8;
int ssr8 = 9;
int waktu,mode;
int tb1x,tb2x,tb3x,tb4x;

void setup() {
  
lcd.begin();
lcd.clear();
lcd.noCursor();
  
pinMode(tb1,INPUT_PULLUP);
pinMode(tb2,INPUT_PULLUP);
pinMode(tb3,INPUT_PULLUP);
pinMode(tb4,INPUT_PULLUP);
  
pinMode(ssr1,OUTPUT);
pinMode(ssr2,OUTPUT);
pinMode(ssr3,OUTPUT);
pinMode(ssr4,OUTPUT);
pinMode(ssr5,OUTPUT);
pinMode(ssr6,OUTPUT);
pinMode(ssr7,OUTPUT);
pinMode(ssr8,OUTPUT);

  settingmode();
  settingdelay();
}

void loop() {

tb1x = digitalRead(tb1);
tb2x = digitalRead(tb2);
tb3x = digitalRead(tb3);
tb4x = digitalRead(tb4);

if(tb4x == 0){
  lcd.clear();
  delay(2000);
  settingmode();
  settingdelay();
}

if(mode == 1){
  variasi1();
}

if(mode == 2){
  variasi2();
}

if(mode == 3){
  variasi3();
}
}

void settingmode(){

tb1x = digitalRead(tb1);
tb2x = digitalRead(tb2);
tb3x = digitalRead(tb3);
tb4x = digitalRead(tb4);

if(tb3x == 0){
  lcd.clear();
  delay(2000);
  return;;
}

if(tb1x == 0){
  delay(200);
  mode++;
}

if(tb2x == 0){
  delay(200);
  mode--;
}

if(mode < 1){
  mode = 1;
}

if(mode > 3){
  mode = 3;
}

 lcd.setCursor(0,0);
 lcd.print("MODE= ");
 lcd.print(mode);
 lcd.print("   ");

settingmode();  
}

void settingdelay(){

tb1x = digitalRead(tb1);
tb2x = digitalRead(tb2);
tb3x = digitalRead(tb3);
tb4x = digitalRead(tb4);

if(tb3x == 0){
  lcd.clear();
  delay(2000);
  return;
}

if(tb1x == 0){
  delay(200);
  waktu = waktu + 100;
}

if(tb2x == 0){
  delay(200);
  waktu = waktu - 100;
}

if(waktu < 1){
  waktu = 100;
}

 lcd.setCursor(0,0);
 lcd.print("DLY= ");
 lcd.print(waktu);
 lcd.print(" ms  ");

settingdelay();  
}

void variasi1(){
  
 lcd.setCursor(0,0);
 lcd.print("MODE= ");
 lcd.print(mode);
 lcd.print("   ");
 lcd.setCursor(0,1);
 lcd.print("DLY= ");
 lcd.print(waktu);
 lcd.print(" ms  ");
 
digitalWrite(ssr1,HIGH);
digitalWrite(ssr2,LOW);
digitalWrite(ssr3,LOW);
digitalWrite(ssr4,LOW);
digitalWrite(ssr5,LOW);
digitalWrite(ssr6,LOW);
digitalWrite(ssr7,LOW);
digitalWrite(ssr8,LOW);
delay(waktu);

digitalWrite(ssr1,LOW);
digitalWrite(ssr2,HIGH);
digitalWrite(ssr3,LOW);
digitalWrite(ssr4,LOW);
digitalWrite(ssr5,LOW);
digitalWrite(ssr6,LOW);
digitalWrite(ssr7,LOW);
digitalWrite(ssr8,LOW);
delay(waktu);

digitalWrite(ssr1,LOW);
digitalWrite(ssr2,LOW);
digitalWrite(ssr3,HIGH);
digitalWrite(ssr4,LOW);
digitalWrite(ssr5,LOW);
digitalWrite(ssr6,LOW);
digitalWrite(ssr7,LOW);
digitalWrite(ssr8,LOW);
delay(waktu);

digitalWrite(ssr1,LOW);
digitalWrite(ssr2,LOW);
digitalWrite(ssr3,LOW);
digitalWrite(ssr4,HIGH);
digitalWrite(ssr5,LOW);
digitalWrite(ssr6,LOW);
digitalWrite(ssr7,LOW);
digitalWrite(ssr8,LOW);
delay(waktu);

digitalWrite(ssr1,LOW);
digitalWrite(ssr2,LOW);
digitalWrite(ssr3,LOW);
digitalWrite(ssr4,LOW);
digitalWrite(ssr5,HIGH);
digitalWrite(ssr6,LOW);
digitalWrite(ssr7,LOW);
digitalWrite(ssr8,LOW);
delay(waktu);

digitalWrite(ssr1,LOW);
digitalWrite(ssr2,LOW);
digitalWrite(ssr3,LOW);
digitalWrite(ssr4,LOW);
digitalWrite(ssr5,LOW);
digitalWrite(ssr6,HIGH);
digitalWrite(ssr7,LOW);
digitalWrite(ssr8,LOW);
delay(waktu);

digitalWrite(ssr1,LOW);
digitalWrite(ssr2,LOW);
digitalWrite(ssr3,LOW);
digitalWrite(ssr4,LOW);
digitalWrite(ssr5,LOW);
digitalWrite(ssr6,HIGH);
digitalWrite(ssr7,LOW);
digitalWrite(ssr8,LOW);
delay(waktu);

digitalWrite(ssr1,LOW);
digitalWrite(ssr2,LOW);
digitalWrite(ssr3,LOW);
digitalWrite(ssr4,LOW);
digitalWrite(ssr5,LOW);
digitalWrite(ssr6,LOW);
digitalWrite(ssr7,HIGH);
digitalWrite(ssr8,LOW);
delay(waktu);

digitalWrite(ssr1,LOW);
digitalWrite(ssr2,LOW);
digitalWrite(ssr3,LOW);
digitalWrite(ssr4,LOW);
digitalWrite(ssr5,LOW);
digitalWrite(ssr6,LOW);
digitalWrite(ssr7,LOW);
digitalWrite(ssr8,HIGH);
delay(waktu);
}

//======================================================================
void variasi2(){

 lcd.setCursor(0,0);
 lcd.print("MODE= ");
 lcd.print(mode);
 lcd.print("   ");
 lcd.setCursor(0,1);
 lcd.print("DLY= ");
 lcd.print(waktu);
 lcd.print(" ms  ");
   
digitalWrite(ssr1,HIGH);
digitalWrite(ssr2,LOW);
digitalWrite(ssr3,LOW);
digitalWrite(ssr4,LOW);
digitalWrite(ssr5,LOW);
digitalWrite(ssr6,LOW);
digitalWrite(ssr7,LOW);
digitalWrite(ssr8,HIGH);
delay(waktu);

digitalWrite(ssr1,LOW);
digitalWrite(ssr2,HIGH);
digitalWrite(ssr3,LOW);
digitalWrite(ssr4,LOW);
digitalWrite(ssr5,LOW);
digitalWrite(ssr6,LOW);
digitalWrite(ssr7,HIGH);
digitalWrite(ssr8,LOW);
delay(waktu);

digitalWrite(ssr1,LOW);
digitalWrite(ssr2,LOW);
digitalWrite(ssr3,HIGH);
digitalWrite(ssr4,LOW);
digitalWrite(ssr5,LOW);
digitalWrite(ssr6,HIGH);
digitalWrite(ssr7,LOW);
digitalWrite(ssr8,LOW);
delay(waktu);

digitalWrite(ssr1,LOW);
digitalWrite(ssr2,LOW);
digitalWrite(ssr3,LOW);
digitalWrite(ssr4,HIGH);
digitalWrite(ssr5,HIGH);
digitalWrite(ssr6,LOW);
digitalWrite(ssr7,LOW);
digitalWrite(ssr8,LOW);
delay(waktu);

digitalWrite(ssr1,LOW);
digitalWrite(ssr2,LOW);
digitalWrite(ssr3,LOW);
digitalWrite(ssr4,HIGH);
digitalWrite(ssr5,HIGH);
digitalWrite(ssr6,LOW);
digitalWrite(ssr7,LOW);
digitalWrite(ssr8,LOW);
delay(waktu);

digitalWrite(ssr1,LOW);
digitalWrite(ssr2,LOW);
digitalWrite(ssr3,LOW);
digitalWrite(ssr4,HIGH);
digitalWrite(ssr5,LOW);
digitalWrite(ssr6,HIGH);
digitalWrite(ssr7,LOW);
digitalWrite(ssr8,LOW);
delay(waktu);

digitalWrite(ssr1,LOW);
digitalWrite(ssr2,LOW);
digitalWrite(ssr3,HIGH);
digitalWrite(ssr4,LOW);
digitalWrite(ssr5,LOW);
digitalWrite(ssr6,HIGH);
digitalWrite(ssr7,LOW);
digitalWrite(ssr8,LOW);
delay(waktu);

digitalWrite(ssr1,LOW);
digitalWrite(ssr2,HIGH);
digitalWrite(ssr3,LOW);
digitalWrite(ssr4,LOW);
digitalWrite(ssr5,LOW);
digitalWrite(ssr6,LOW);
digitalWrite(ssr7,HIGH);
digitalWrite(ssr8,LOW);
delay(waktu);

digitalWrite(ssr1,HIGH);
digitalWrite(ssr2,LOW);
digitalWrite(ssr3,LOW);
digitalWrite(ssr4,LOW);
digitalWrite(ssr5,LOW);
digitalWrite(ssr6,LOW);
digitalWrite(ssr7,LOW);
digitalWrite(ssr8,HIGH);
delay(waktu);
}

//======================================================================
void variasi3(){

 lcd.setCursor(0,0);
 lcd.print("MODE= ");
 lcd.print(mode);
 lcd.print("   ");
 lcd.setCursor(0,1);
 lcd.print("DLY= ");
 lcd.print(waktu);
 lcd.print(" ms  ");
   
digitalWrite(ssr1,LOW);
digitalWrite(ssr2,LOW);
digitalWrite(ssr3,LOW);
digitalWrite(ssr4,LOW);
digitalWrite(ssr5,LOW);
digitalWrite(ssr6,LOW);
digitalWrite(ssr7,LOW);
digitalWrite(ssr8,LOW);
delay(waktu);

digitalWrite(ssr1,HIGH);
digitalWrite(ssr2,HIGH);
digitalWrite(ssr3,HIGH);
digitalWrite(ssr4,HIGH);
digitalWrite(ssr5,HIGH);
digitalWrite(ssr6,HIGH);
digitalWrite(ssr7,HIGH);
digitalWrite(ssr8,HIGH);
delay(waktu);
}


3. VIDEO HASILNYA



 

TIMER BALAPAN TAMIYA 3 JALUR LINE PENAMPIL P10 DAN FITUR LASTLAP

TIMER BALAPAN TAMIYA 3 JALUR LINE PENAMPIL P10 DAN FITUR LASTLAP


      Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang menggunakan sensor switch untuk mendeteksi mobil tamiya yang lewat, alat ini juga terdapat fitur lastlap jadi ketika ada tamiya keluar jalur maka tombol lastlap bisa ditekan. untuk lebih jelasnya berikut adalah koding dan skemanya.


1. skema



2. Program Arduino IDE Versi 1

#include <Wire.h>
#include <SPI.h>        //SPI.h must be included as DMD is written by SPI (the IDE complains otherwise)
#include <DMD.h>        //Library DMD yang menyediakan fungsi penampilan teks, gambar dsb
#include <TimerOne.h>   //Library peripheral Timer1 untuk menjalankan prosedur pindai panel DMD
#include <Time.h>     //Library waktu yang menyediakan tipe data, struktur, dan obyek waktu
#include "Arial_black_16.h"
#include "Arial_Black_16_ISO_8859_1.h"
#include "Arial14.h"
#include "DejaVuSans9.h"
#include "Droid_Sans_12.h"
#include "Droid_Sans_16.h"
#include "DejaVuSansItalic9.h"
#include "Mono5x7.h"
#include "SystemFont5x7.h"

#define WAKTU_TAMPIL_JAM      10    //detik
#define WAKTU_TAMPIL_KALENDAR 5     //detik

#define DISPLAY_COLUMN_COUNT  2
#define DISPLAY_ROW_COUNT     1

#define PIXELS_PER_COLUMN  32
#define PIXELS_PER_ROW    16

DMD dmd(DISPLAY_COLUMN_COUNT, DISPLAY_ROW_COUNT);
unsigned char show = 0;

char lineBuff[20];
char lineBuff2[20];

int lineA;
int lineB;
int lineC;
int mulai;
int seconds;
int cs;
long start_time = 0;
int lapa,lapb,lapc;
int btlastlap = 4;
int btlastlapx;
int led1 = A0;
int led2 = A1;
int led3 = A2;

void ScanDMD()
{
  dmd.scanDisplayBySPI();
}

void setup(void)
{
pinMode(2,INPUT_PULLUP);
pinMode(3,INPUT_PULLUP);
pinMode(12,INPUT_PULLUP);
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(led3,OUTPUT);
pinMode(btlastlap,INPUT_PULLUP);

  dmd.clearScreen( true );   //true is normal (all pixels off), false is negative (all pixels on)
  Serial.begin(9600);
   //initialize TimerOne's interrupt/CPU usage used to scan and refresh the display
  Timer1.initialize( 1000 );           //period in microseconds to call ScanDMD. Anything longer than 5000 (5ms) and you can see flicker.
  Timer1.attachInterrupt( ScanDMD );   //attach the Timer1 interrupt to ScanDMD which goes to dmd.scanDisplayBySPI() 
  //clear/init the DMD pixels held in RAM
  dmd.clearScreen( true );
}

void loop(void)
{

//============================================
lineA = digitalRead(2);
lineB = digitalRead(3);
lineC = digitalRead(12);
btlastlapx = digitalRead(btlastlap);


if(btlastlapx == 1){
if((lineA == 0)&&(lineB == 1)&&(lineC == 1)&&(mulai == 1)){
lapc++;
delay(100);
}

if((lineA == 1)&&(lineB == 0)&&(lineC == 1)&&(mulai == 1)){
lapb++;
delay(100);
}

if((lineA == 1)&&(lineB == 1)&&(lineC == 0)&&(mulai == 1)){
lapa++;
delay(100);
}

if((lineA == 0)&&(lineB == 0)&&(lineC == 1)&&(mulai == 1)){
lapc++;
lapb++;
delay(100);
}

if((lineA == 0)&&(lineB == 1)&&(lineC == 0)&&(mulai == 1)){
lapa++;
lapc++;
delay(100);
}

if((lineA == 1)&&(lineB == 0)&&(lineC == 0)&&(mulai == 1)){
lapb++;
lapa++;
delay(100);
}

if((lineA == 0)&&(lineB == 0)&&(lineC == 0)&&(mulai == 1)){
lapa++;
lapb++;
lapc++;
delay(100);
}

//=============================================
if(lapa > 2){
dmd.clearScreen( true );   
sprintf(lineBuff2, "WIN", lapa, lapb, lapc);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL);  
delay(2000);
dmd.clearScreen( true );  
hasila();  
}

if(lapb > 2){
dmd.clearScreen( true );   
sprintf(lineBuff2, "WIN", lapa, lapb, lapc);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL);  
delay(2000);
dmd.clearScreen( true );  
hasilb();  
}

if(lapc > 2){
dmd.clearScreen( true );   
sprintf(lineBuff2, "WIN", lapa, lapb, lapc);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL);  
delay(2000);
dmd.clearScreen( true );  
hasilc();  
}
}

//===========================================================
if(btlastlapx == 0){
if((lineA == 0)&&(lineB == 1)&&(lineC == 1)&&(mulai == 1)){
dmd.clearScreen( true );   
sprintf(lineBuff2, "WIN", lapa, lapb, lapc);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL);  
delay(2000);
dmd.clearScreen( true );  
digitalWrite(led1,HIGH);
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
hasila();  
delay(100);
}

if((lineA == 1)&&(lineB == 0)&&(lineC == 1)&&(mulai == 1)){
dmd.clearScreen( true );   
sprintf(lineBuff2, "WIN", lapa, lapb, lapc);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL);  
delay(2000);
dmd.clearScreen( true );  
digitalWrite(led1,LOW);
digitalWrite(led2,HIGH);
digitalWrite(led3,LOW);
hasilb();  
delay(100);
}

if((lineA == 1)&&(lineB == 1)&&(lineC == 0)&&(mulai == 1)){
dmd.clearScreen( true );   
sprintf(lineBuff2, "WIN", lapa, lapb, lapc);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL);  
delay(2000);
dmd.clearScreen( true );  
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
digitalWrite(led3,HIGH);
hasilc();  
delay(100);
}
}

//=============================================
lineA = digitalRead(2);
lineB = digitalRead(3);
lineC = digitalRead(4);

if((lineA == 0)&&(mulai == 0)){
  delay(200);
  mulai = 1;
  start_time = millis();  
}  

/*
if((lineB == 0)&&(mulai == 0)){
  delay(200);
  mulai = 1;
  start_time = millis();  

if((lineC == 0)&&(mulai == 0)){
  delay(200);
  mulai = 1;
  start_time = millis();  
} */


if(mulai == 1){
seconds = (millis() - start_time) / 1000;
cs = ((millis() - start_time) / 10) % 100;;
}

//===========================================================================  
sprintf(lineBuff, "%d:%d ", seconds, cs);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 37,  3, lineBuff, strlen(lineBuff), GRAPHICS_NORMAL);  

sprintf(lineBuff2, "%d/%d/%d ", lapa, lapb, lapc);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL);  
//===========================================================================

}

void hasila(){
btlastlapx = digitalRead(btlastlap);

if(btlastlapx == 0){
 dmd.clearScreen( true );  
 lapa = 0;
 lapb = 0;
 lapc = 0;
 mulai = 0;
 start_time = 0;
 seconds = 0;
 cs = 0;
 delay(3000);
 return;   
}

sprintf(lineBuff, "%d:%d ", seconds, cs);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 35,  3, lineBuff, strlen(lineBuff), GRAPHICS_NORMAL);  

sprintf(lineBuff2, " A", lapa, lapb, lapc);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL);  

hasila();  
}

void hasilb(){

btlastlapx = digitalRead(btlastlap);

if(btlastlapx == 0){
 dmd.clearScreen( true );  
 lapa = 0;
 lapb = 0;
 lapc = 0;
 mulai = 0;
 start_time = 0;
 seconds = 0;
 cs = 0;
 delay(3000);
 return;   
}
  
sprintf(lineBuff, "%d:%d ", seconds, cs);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 35,  3, lineBuff, strlen(lineBuff), GRAPHICS_NORMAL);  

sprintf(lineBuff2, " B", lapa, lapb, lapc);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL);  

hasilb();  
}

void hasilc(){

btlastlapx = digitalRead(btlastlap);

if(btlastlapx == 0){
 dmd.clearScreen( true );  
 lapa = 0;
 lapb = 0;
 lapc = 0;
 mulai = 0;
 start_time = 0;
 seconds = 0;
 cs = 0;
 delay(3000);
 return;   
}
  
sprintf(lineBuff, "%d:%d ", seconds, cs);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 35,  3, lineBuff, strlen(lineBuff), GRAPHICS_NORMAL);  

sprintf(lineBuff2, " C", lapa, lapb, lapc);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL);  

hasilc();  
}


3. Program Arduino Versi 2

#include <Wire.h>
#include <SPI.h>        //SPI.h must be included as DMD is written by SPI (the IDE complains otherwise)
#include <DMD.h>        //Library DMD yang menyediakan fungsi penampilan teks, gambar dsb
#include <TimerOne.h>   //Library peripheral Timer1 untuk menjalankan prosedur pindai panel DMD
#include <Time.h>     //Library waktu yang menyediakan tipe data, struktur, dan obyek waktu
#include "Arial_black_16.h"
#include "Arial_Black_16_ISO_8859_1.h"
#include "Arial14.h"
#include "DejaVuSans9.h"
#include "Droid_Sans_12.h"
#include "Droid_Sans_16.h"
#include "DejaVuSansItalic9.h"
#include "Mono5x7.h"
#include "SystemFont5x7.h"

#define WAKTU_TAMPIL_JAM      10    //detik
#define WAKTU_TAMPIL_KALENDAR 5     //detik

#define DISPLAY_COLUMN_COUNT  2
#define DISPLAY_ROW_COUNT     1

#define PIXELS_PER_COLUMN  32
#define PIXELS_PER_ROW    16

DMD dmd(DISPLAY_COLUMN_COUNT, DISPLAY_ROW_COUNT);
unsigned char show = 0;

char lineBuff[20];
char lineBuff2[20];

int lineA;
int lineB;
int lineC;
int mulai;
int seconds;
int cs;
long start_time = 0;
int lapa,lapb,lapc;
int btlastlap = A0;
int btlastlapx;
int led1 = A0;
int led2 = A1;
int led3 = A2;

void ScanDMD()
{
  dmd.scanDisplayBySPI();
}

void setup(void)
{
pinMode(2,INPUT_PULLUP);
pinMode(3,INPUT_PULLUP);
pinMode(12,INPUT_PULLUP);
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(led3,OUTPUT);
pinMode(btlastlap,INPUT_PULLUP);

  dmd.clearScreen( true );   //true is normal (all pixels off), false is negative (all pixels on)
  Serial.begin(9600);
   //initialize TimerOne's interrupt/CPU usage used to scan and refresh the display
  Timer1.initialize( 1000 );           //period in microseconds to call ScanDMD. Anything longer than 5000 (5ms) and you can see flicker.
  Timer1.attachInterrupt( ScanDMD );   //attach the Timer1 interrupt to ScanDMD which goes to dmd.scanDisplayBySPI() 
  //clear/init the DMD pixels held in RAM
  dmd.clearScreen( true );
}

void loop(void)
{

//============================================
lineA = digitalRead(2);
lineB = digitalRead(3);
lineC = digitalRead(12);
btlastlapx = digitalRead(btlastlap);


if(btlastlapx == 1){
if((lineA == 0)&&(lineB == 1)&&(lineC == 1)&&(mulai == 1)){
lapc++;
delay(100);
}

if((lineA == 1)&&(lineB == 0)&&(lineC == 1)&&(mulai == 1)){
lapb++;
delay(100);
}

if((lineA == 1)&&(lineB == 1)&&(lineC == 0)&&(mulai == 1)){
lapa++;
delay(100);
}

if((lineA == 0)&&(lineB == 0)&&(lineC == 1)&&(mulai == 1)){
lapc++;
lapb++;
delay(100);
}

if((lineA == 0)&&(lineB == 1)&&(lineC == 0)&&(mulai == 1)){
lapa++;
lapc++;
delay(100);
}

if((lineA == 1)&&(lineB == 0)&&(lineC == 0)&&(mulai == 1)){
lapb++;
lapa++;
delay(100);
}

if((lineA == 0)&&(lineB == 0)&&(lineC == 0)&&(mulai == 1)){
lapa++;
lapb++;
lapc++;
delay(100);
}

}

//===========================================================
if(btlastlapx == 0){
if((lineA == 0)&&(lineB == 1)&&(lineC == 1)&&(mulai == 1)){
dmd.clearScreen( true );   
sprintf(lineBuff2, "WIN", lapa, lapb, lapc);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL);  
delay(2000);
dmd.clearScreen( true );  
digitalWrite(led1,HIGH);
digitalWrite(led2,LOW);
digitalWrite(led3,LOW);
hasila();  
delay(100);
}

if((lineA == 1)&&(lineB == 0)&&(lineC == 1)&&(mulai == 1)){
dmd.clearScreen( true );   
sprintf(lineBuff2, "WIN", lapa, lapb, lapc);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL);  
delay(2000);
dmd.clearScreen( true );  
digitalWrite(led1,LOW);
digitalWrite(led2,HIGH);
digitalWrite(led3,LOW);
hasilb();  
delay(100);
}

if((lineA == 1)&&(lineB == 1)&&(lineC == 0)&&(mulai == 1)){
dmd.clearScreen( true );   
sprintf(lineBuff2, "WIN", lapa, lapb, lapc);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL);  
delay(2000);
dmd.clearScreen( true );  
digitalWrite(led1,LOW);
digitalWrite(led2,LOW);
digitalWrite(led3,HIGH);
hasilc();  
delay(100);
}
}

//=============================================
lineA = digitalRead(2);
lineB = digitalRead(3);
lineC = digitalRead(12);

if((lineA == 0)&&(mulai == 0)){
  delay(200);
  mulai = 1;
  start_time = millis();  
}  


if((lineB == 0)&&(mulai == 0)){
  delay(200);
  mulai = 1;
  start_time = millis();  

if((lineC == 0)&&(mulai == 0)){
  delay(200);
  mulai = 1;
  start_time = millis();  


if(mulai == 1){
seconds = (millis() - start_time) / 1000;
cs = ((millis() - start_time) / 10) % 100;;
}

//===========================================================================  
sprintf(lineBuff, "%d:%d ", seconds, cs);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 37,  3, lineBuff, strlen(lineBuff), GRAPHICS_NORMAL);  

sprintf(lineBuff2, "%d/%d/%d ", lapa, lapb, lapc);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL);  
//===========================================================================

}

void hasila(){

sprintf(lineBuff, "%d:%d ", seconds, cs);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 35,  3, lineBuff, strlen(lineBuff), GRAPHICS_NORMAL);  

sprintf(lineBuff2, " C", lapa, lapb, lapc);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL);  

hasila();  
}

void hasilb(){

sprintf(lineBuff, "%d:%d ", seconds, cs);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 35,  3, lineBuff, strlen(lineBuff), GRAPHICS_NORMAL);  

sprintf(lineBuff2, " B", lapa, lapb, lapc);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL);  

hasilb();  
}

void hasilc(){

sprintf(lineBuff, "%d:%d ", seconds, cs);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 35,  3, lineBuff, strlen(lineBuff), GRAPHICS_NORMAL);  

sprintf(lineBuff2, " A", lapa, lapb, lapc);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL);  

hasilc();  
}


4. VIDEO HASILNYA versi 1



5. VIDEO HASILNYA versi 2