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.
#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
VIDEO
5. VIDEO HASILNYA versi 2