Translate

Deteksi Golongan Darah Non Invasive (Masih Tahap Experimental)

Deteksi Golongan Darah Non Invasive (Masih Tahap Experimental)


       Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat mendeteksi golongan darah secara non invasive tapi masih dalam tahap experimental belum fix, alat ini masih butuh banyak uji coba agar didapat banyak data yang bisa diambil kesimpulannya. untuk lebih jelasnya berikut adalah koding dan skemanya.

 

1. Skema


2. Program Arduino IDE

#include <Wire.h>
#include <SoftwareSerial.h>

SoftwareSerial mySerial (2, 3);

int dataadc1;
int zero=0;
int heatTime = 80;
int heatInterval = 255;
char printDensity = 15;
char printBreakTime = 15;
char my_str1[] = "A+";
char my_str2[] = "A-";
char my_str3[] = "B+";
char my_str4[] = "B-";
char my_str5[] = "AB+";
char my_str6[] = "AB-";
char my_str7[] = "O+";
char my_str8[] = "O-";
int datahasil;
int urutan;
int mark;
int tanda = 0;
int button = 12;
int buttonx;

void setup() {
  mySerial.begin(9600);
  Serial.begin(9600); // to write to our new printer
  pinMode(button,INPUT_PULLUP);
  initPrinter();
}

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

void loop() {

  dataadc1 = analogRead(A0);
 
  if((dataadc1 > 50)&&(dataadc1 < 100)){
  lcdCMD("hasil.txt=\"A+\"");  
  mark = 1;
  }

  if((dataadc1 > 100)&&(dataadc1 < 200)){
  lcdCMD("hasil.txt=\"A-\"");  
  mark = 2;
  }

  if((dataadc1 > 200)&&(dataadc1 < 300)){
  lcdCMD("hasil.txt=\"B+\"");  
  mark = 3;
  }

  if((dataadc1 > 300)&&(dataadc1 < 400)){
  lcdCMD("hasil.txt=\"B-\"");  
  mark = 4;
  }

  if((dataadc1 > 400)&&(dataadc1 < 500)){
  lcdCMD("hasil.txt=\"AB+\""); 
  mark = 5;
  }

  if((dataadc1 > 500)&&(dataadc1 < 600)){
  lcdCMD("hasil.txt=\"AB-\"");  
  mark = 6;
  }

  if((dataadc1 > 600)&&(dataadc1 < 700)){
  lcdCMD("hasil.txt=\"O+\"");  
  mark = 7;
  }

  if((dataadc1 > 700)&&(dataadc1 < 800)){
  lcdCMD("hasil.txt=\"O-\"");  
  mark = 8;
  }

  lcdCMD("sensor2.val=" + String(dataadc1));

   buttonx = digitalRead(button);
   if(buttonx == 0){
    printing();
   } 
    
}

void lcdCMD(String cmd) {
  mySerial.print(cmd);
  mySerial.write(0xff);
  mySerial.write(0xff);
  mySerial.write(0xff);
  tanda = 0;
}

void printing(){
   delay(1000);

if(mark == 1){
  Serial.print("GOL= ");
  Serial.println(my_str1);
  mark = 0;
  }

if(mark == 2){
  Serial.print("GOL= ");
  Serial.println(my_str2);
  mark = 0;
  }

if(mark == 3){
  Serial.print("GOL= ");
  Serial.println(my_str3);
  }

if(mark == 4){
  Serial.print("GOL= ");
  Serial.println(my_str4);
  mark = 0;
  }

if(mark == 5){
  Serial.print("GOL= ");
  Serial.println(my_str5);
  mark = 0;
  }  

if(mark == 6){
  Serial.print("GOL= ");
  Serial.println(my_str6);
  mark = 0;
  }      

if(mark == 7){
  Serial.print("GOL= ");
  Serial.println(my_str7);
  mark = 0;
  }      

if(mark == 8){
  Serial.print("GOL= ");
  Serial.println(my_str8);
  mark = 0;
  }                  
  
  Serial.write(10);
  Serial.write(10);  
}

3. VIDEO HASILNYA


Monitor Turbidity Air Output Relay dan Buzzer

Monitor Turbidity Air Output Relay dan Buzzer


        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang bisa memonitor turbidity air dengan interface lcd 16x2 dan menggunakan Arduino Uno sebagai kontrollernya. alat ini juga ada fitur kendali relay dan buzzer ketika turbidity sudah mencapai angka tertentu. 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 turbi;
int ntux;
int relay1 = 6;
int relay2 = 7;
int buzzer = 11;

void setup() {
  lcd.begin();
  lcd.clear();
  lcd.noCursor();
  pinMode(relay1,OUTPUT);
  pinMode(relay2,OUTPUT);
  pinMode(buzzer,OUTPUT);  
}

void loop(){
 
  turbi = analogRead(A0);             
  ntux = map(turbi, 10, 650, 100, 0);

  if(ntux < 0){
   ntux = 0;
  }
  
  lcd.setCursor(0,0);
  lcd.print("NTU= ");
  lcd.print(ntux);
  lcd.print(" %   ");

/*
  lcd.setCursor(0,1);
  lcd.print("adc= ");
  lcd.print(turbi);
  lcd.print("   ");
*/

  if(ntux > 50){
    digitalWrite(relay1,LOW); 
    digitalWrite(buzzer,HIGH); 
    
    lcd.setCursor(0,1);
    lcd.print("AIR KOTOR    ");
  
  }

  if(ntux <= 50){
    digitalWrite(relay1,HIGH); 
    digitalWrite(buzzer,LOW); 

    lcd.setCursor(0,1);
    lcd.print("AIR BERSIH  ");
  }
    
  delay(200);
}


3. VIDEO ALATNYA



Alat Pakan Ikan Otomatis Berbasis IOT Blynk 2.0 ESP8266

Alat Pakan Ikan Otomatis Berbasis IOT Blynk 2.0 ESP8266


        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitoring pakan ikan secara online. jadi alat ini bisa memonitor volume pakan ikan sudah habis atau masih ada. alat ini menggunakan monitor Blynk 2.0 dan sensor jarak HY-SRF05. untuk lebih jelasnya berikut adalah koding dan skemanya.
 

1. Skema



2. Program Arduino IDE

#define BLYNK_TEMPLATE_ID "TMPL6wOC--xxx"
#define BLYNK_TEMPLATE_NAME "monitor pakan ikan"
#define BLYNK_AUTH_TOKEN "VOK0cWiFN5ycHj3SV_snEDXTfTfeixxx"
#define BLYNK_PRINT Serial  

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

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

Servo myservo;
BlynkTimer timer;

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

const int trigPin = D6;
const int echoPin = D7;
long duration, distance;

//define sound velocity in cm/uS
#define SOUND_VELOCITY 0.034
#define CM_TO_INCH 0.393701

int dataadc;
int tanda;
int relay = D3;

#define DS3231_I2C_ADDRESS 0x68

byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;


// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
  return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return( (val/16*10) + (val%16) );
}

void kirimdata()
{
  Blynk.virtualWrite(V0,distance);
  Blynk.virtualWrite(V1,dataadc);
}

void setup() {
  Serial.begin(115200); // Starts the serial communication
  lcd.begin();
  lcd.clear();
  lcd.noCursor();
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(relay, OUTPUT);
  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
  timer.setInterval(1000L, kirimdata);
  
  Wire.begin();
  // set the initial time here:
  // DS3231 seconds, minutes, hours, day, date, month, year
   setDS3231time(0,59,6,6,23,11,18);

  myservo.attach(D0);
}

void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{
  // sets time and date data to DS3231
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set next input to start at the seconds register
  Wire.write(decToBcd(second)); // set seconds
  Wire.write(decToBcd(minute)); // set minutes
  Wire.write(decToBcd(hour)); // set hours
  Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
  Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
  Wire.write(decToBcd(month)); // set month
  Wire.write(decToBcd(year)); // set year (0 to 99)
  Wire.endTransmission();
}
void readDS3231time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  // request seven bytes of data from DS3231 starting from register 00h
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}

void loop() {
  
  dataadc = analogRead(A0);
  
  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;
  
 lcd.setCursor(0,0);
 lcd.print("S/D= ");
 lcd.print(distance);
 lcd.print(" / ");
 lcd.print(dataadc);
 lcd.print("  ");

  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  // send it to the serial monitor
  lcd.setCursor(0,1);
  lcd.print(hour, DEC);
  // convert the byte variable to a decimal number when displayed
  lcd.print(":");
  if (minute<10)
  {
    lcd.print("0");
  }
  lcd.print(minute, DEC);
  lcd.print(":");
  if (second<10)
  {
    lcd.print("0");
  }
  lcd.print(second, DEC);
  lcd.print(" ");

  if(distance < 7){
  digitalWrite(relay,HIGH);
  }

  if(distance >= 7){
  digitalWrite(relay,LOW);
  }

   if((hour == 7)&&(tanda == 0)){
    myservo.write(100);
    delay(1000);
    myservo.write(150);
    delay(1000);
    tanda = 1;
   }

    if((hour == 16)&&(tanda == 1)){
    myservo.write(100);
    delay(1000);
    myservo.write(150);
    delay(1000);
    tanda = 0;
   }
   
 
 Blynk.run(); 
 timer.run(); 
 delay(100);
}


3. VIDEO ALATNYA



Monitor Tekanan Udara sensor HX710 Interface VB 6

Monitor Tekanan Udara sensor HX710 Interface VB 6

         
           Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitor tekanan udara dengan sensor HX710 dengan interface VB 6.0, alat ini dapat mengukur tekanan udara dengan satuan InH20. untuk lebih jelasnya berikut adalah koding dan komponennya.

1. Sensor Hx710


2. Program Arduino IDE

#include <Wire.h>  // i2C Conection Library
#include <LiquidCrystal_I2C.h>  //i2C LCD Library
#include "HX710B.h"

LiquidCrystal_I2C lcd(0x27, 16, 2);

float psi1,psi2,psi3;

const int DOUT1 = 2;   //sensor data pin
const int SCLK1  = 3;   //sensor clock pin

const int DOUT2 = 4;   //sensor data pin
const int SCLK2  = 5;   //sensor clock pin

const int DOUT3 = 6;   //sensor data pin
const int SCLK3  = 7;   //sensor clock pin

int btup = 9;
int btdown = 8;
int btupx;
int btdownx;
float range = 80.0;
float persen;
float cfm;
float inh20sen1, inh20sen2, inh20sen3;

HX710B pressure_sensor1;
HX710B pressure_sensor2;
HX710B pressure_sensor3;

void setup() {
  Serial.begin(9600);
  lcd.begin();
  lcd.clear();
  lcd.noCursor();
  pinMode(btup,INPUT_PULLUP);
  pinMode(btdown,INPUT_PULLUP);  
  pressure_sensor1.begin(DOUT1,SCLK1);
  pressure_sensor2.begin(DOUT2,SCLK2);
  pressure_sensor3.begin(DOUT3,SCLK3);    
}

void loop() {
  
  psi1 = pressure_sensor1.psi();
  psi2 = pressure_sensor2.psi();
  psi3 = pressure_sensor3.psi();

  inh20sen1 = psi1 * 27.679;
  inh20sen2 = psi2 * 27.679;
  inh20sen3 = psi3 * 27.679;
  
  btupx = digitalRead(btup);
  btdownx = digitalRead(btdown);  

  if(btupx == 0){
  delay(200);
  range = range + 0.1;  
  }

  if(btdownx == 0){
  delay(200);
  range = range - 0.1;  
  }

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

  persen = (inh20sen2 - inh20sen3) * 100.0;
  cfm = persen * range;
     
  lcd.setCursor(0, 0);
  lcd.print("I/R: ");
  lcd.print(inh20sen1);
  lcd.print(" / ");
  lcd.print(range);
  lcd.print("   "); 

  lcd.setCursor(0, 1);
  lcd.print("P/C: ");  
  lcd.print(persen);
  lcd.print(" / "); 
  lcd.print(cfm);
  lcd.print("   "); 

Serial.print(inh20sen1);
Serial.print("|");
Serial.print(range);
Serial.print("|");
Serial.print(persen);
Serial.print("|");
Serial.print(cfm);
Serial.println("|");
      
delay(1000);
}


3. Program Interface VB 6


Option Explicit
Dim arrdata()
Dim TotalBaca As Integer
Dim BMI As Single
Dim Keterangan As String
Const MAKSBACA = 15

Private Sub berhenti_Click()
  start.Enabled = True
    berhenti.Enabled = False
    TimerBaca.Enabled = False
End Sub

Private Sub Command2_Click()
Unload Me
End Sub

Private Sub Form_Load()
Dim i As Byte
For i = 1 To 16
    ComboCOM.AddItem (i)
Next i
End Sub

Private Sub MSComm2_OnComm()
Dim buffer As String
Dim temp As String
Dim pisah() As String
Dim i As Integer

If MSComm2.CommEvent = comEvReceive Then
    buffer = MSComm2.Input
    'pisah = Split(buffer, Chr$(13))
    pisah = Split(buffer, "|")

On Error Resume Next
If buffer <> " " Then
With Text1
    .SelStart = Len(.Text)
    .SelText = buffer
End With
For i = 0 To 4
    If 0 < 5 Then
        Text2(i).Text = CStr(pisah(i))
        End If
        Next i
    Else
    buffer = " "
    End If
End If
End Sub

Private Sub start_Click()
Dim u As Integer

    On Error GoTo ada_eror
    
    MSComm2.CommPort = ComboCOM.Text
    MSComm2.Settings = "9600,N,8,1"
    MSComm2.RThreshold = 20
    MSComm2.InputLen = 20
    MSComm2.InputMode = comInputModeText
    MSComm2.PortOpen = True ' buka port
    
    ReDim arrdata(1 To MAKSBACA + 1)
    For u = 1 To MAKSBACA
        arrdata(u) = 0
    Next
    TotalBaca = 0
    start.Enabled = False
    berhenti.Enabled = True
    TimerBaca.Enabled = True
ada_eror:
 If ComboCOM.ListIndex < 1 Then
    MsgBox "COM berada di Nomor : " & Err.Number & vbCrLf & Err.Description, vbCritical + vbOKOnly, "ERROR"
    start.Enabled = True
    berhenti.Enabled = True
    ComboCOM.Text = "Pilih COM"
End If
End Sub

Private Sub Text3_Change()

End Sub

Private Sub TimerBaca_Timer()
Dim strInput As String
Dim strPotong As String
Dim singleInput As Single
Dim u As Integer
    strInput = MSComm2.Input
        strPotong = strInput
        'Text1.Text = Text1.Text + strPotong + vbCrLf
        'singleInput = Val(strPotong)
        'Label1.Caption = singleInput
        If TotalBaca >= MAKSBACA Then
            TimerBaca.Enabled = False
            If MSComm2.PortOpen = True Then MSComm2.PortOpen = False
            Call berhenti_Click
        End If
  
End Sub

4. VIDEO HASILNYA


Monitoring Kecepatan Angin (Anemometer) dan Arah Mata Angin Wireless Hc-12 Penampil DMD P10 + Fitur Pilih Mode Output

Monitoring Kecepatan Angin (Anemometer) dan Arah Mata Angin Wireless Hc-12 Penampil DMD P10 + Fitur Pilih Mode Output


        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitoring keceatan angin dan arah mata angin dengan penampil dmd p10. alat ini memiliki 2 bagian yaitu bagian transmitter dan receiver, untuk transmitter dipasangakan 2 buah sensor, kemudian pada bagian receiver dipasangkan panel dmd p10 dengan komunikasi secara wireless. untuk lebih jelasnya berikut adalah koding dan skemanya.



1. Skema



2. Program Transmitter

#include <Wire.h>  // i2C Conection Library
#include <SoftwareSerial.h>
SoftwareSerial dataserial(7, 6); // D7,D6
String data, arah_angin, s_angin;
int a, b;
int arahnya;
int kecepatanangin;

// anemometer parameters
volatile byte rpmcount; // count signals
volatile unsigned long last_micros;
unsigned long timeold;
unsigned long timemeasure = 2.00; // seconds
int timetoSleep = 1;               // minutes
unsigned long sleepTime = 15;      // minutes
unsigned long timeNow;
int countThing = 0;
int GPIO_pulse = 2; // Arduino = D2
float rpm, rps;     // frequencies
float radius = 0.1; // meters - measure of the lenght of each the anemometer wing
float velocity_kmh; // km/h
float velocity_ms;  //m/s
float omega = 0;    // rad/s
float calibration_value = 2.0;

void setup() {

  Serial.begin(9600);
  dataserial.begin(9600);
   
  pinMode(GPIO_pulse, INPUT_PULLUP);
  digitalWrite(GPIO_pulse, LOW);

  detachInterrupt(digitalPinToInterrupt(GPIO_pulse));                         // force to initiate Interrupt on zero
  attachInterrupt(digitalPinToInterrupt(GPIO_pulse), rpm_anemometer, RISING); //Initialize the intterrupt pin
  rpmcount = 0;
  rpm = 0;
  timeold = 0;
  timeNow = 0;
 
}

void loop()
{
  bacaarahangin();
  
  //Measure RPM
  if ((millis() - timeold) >= timemeasure * 1000)
  {
    //countThing++;
    detachInterrupt(digitalPinToInterrupt(GPIO_pulse)); // Disable interrupt when calculating
    rps = float(rpmcount) / float(timemeasure);         // rotations per second
    rpm = 60 * rps;                                     // rotations per minute
    omega = 2 * PI * rps;                               // rad/s
    velocity_ms = omega * radius * calibration_value;   // m/s
    velocity_kmh = velocity_ms * 3.6;                   // km/h
    kecepatanangin = velocity_ms * 100;    
    timeold = millis();
    rpmcount = 0;
    attachInterrupt(digitalPinToInterrupt(GPIO_pulse), rpm_anemometer, RISING); // enable interrupt
  }

Serial.print("*");
Serial.print(kecepatanangin);
Serial.print(",");
Serial.print(arahnya);
Serial.println("#");

/*
Serial.print(velocity_ms);
Serial.print(",");
Serial.println(arahnya);
*/
 
 delay(100); 
}

void rpm_anemometer()
{
  if (long(micros() - last_micros) >= 5000)
  { // time to debounce measures
    rpmcount++;
    last_micros = micros();
  }
}

void bacaarahangin(){

 if (dataserial.available()) // Jika ada data yang diterima dari sensor
  {
    data = dataserial.readString(); // data yang diterima dari sensor berawalan tanda * dan diakhiri tanda #, contoh *1#
    a = data.indexOf("*"); // a adalah index tanda *
    b = data.indexOf("#"); // b adalah index tanda #
    s_angin = data.substring(a + 1, b); // membuang tanda * dan # sehingga di dapat nilai dari arah angin
    if (s_angin.equals("1")) { // jika nilai dari sensor 1 maka arah angin utara
      arah_angin = "utara     ";
      arahnya = 1;
    }
    if (s_angin.equals("2")) {
      arah_angin = "timur laut";
      arahnya = 2;
    }
    if (s_angin.equals("3")) {
      arah_angin = "timur     ";
      arahnya = 3;
    }
    if (s_angin.equals("4")) {
      arah_angin = "tenggara  ";
      arahnya = 4;
    }
    if (s_angin.equals("5")) {
      arah_angin = "selatan   ";
      arahnya = 5;
    }
    if (s_angin.equals("6")) {
      arah_angin = "barat daya";
      arahnya = 6;
    }
    if (s_angin.equals("7")) {
      arah_angin = "barat     ";
      arahnya = 7;
    }
    if (s_angin.equals("8")) {
      arah_angin = "barat laut";
      arahnya = 8;
    }

  }
}


3. Program Receiver

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

#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];
char strsms[5];

int temp;
int x = 5;
int y;

int value1;
int value2;
int value3;
int tbup = 4;
int tbdown = 5;
int tbset = A0;
int tbok = A1;

int tbupx;
int tbdownx;
int tbsetx;
int tbokx;
int alarm;
unsigned int mode;
int relay = A2;

float speednya;
int arah;

int datain1;
int datain2;
int datain3;

String dataIn;
String dt[10];
int i;
boolean parsing = false;

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

void setup()
{
  Serial.begin(9600);
  lcd.begin();
  lcd.clear();
  lcd.noCursor();
  pinMode(tbup,INPUT_PULLUP);
  pinMode(tbdown,INPUT_PULLUP);
  pinMode(tbok,INPUT_PULLUP);
  pinMode(tbset,INPUT_PULLUP);
  pinMode(relay,OUTPUT);
   
  dataIn="";

  dmd.clearScreen( true );   //true is normal (all pixels off), false is negative (all pixels on)
   //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()
{

  tbupx = digitalRead(tbup);
  tbdownx = digitalRead(tbdown);
  tbsetx = digitalRead(tbset);
  tbokx = digitalRead(tbok);

 sprintf(lineBuff, "%s    ", dtostrf(speednya, 5, 2, strsms));
 dmd.selectFont(Droid_Sans_12);
 dmd.drawString( 33,  3, lineBuff, strlen(lineBuff), GRAPHICS_NORMAL);  

 if(mode == 0){
 if(arah == 1){
 sprintf(lineBuff2, "UTARA      ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 0,  0, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }
 
 if(arah == 2){
 sprintf(lineBuff2, "TMRLT ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 0,  0, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }

 if(arah == 3){
 sprintf(lineBuff2, "TIMUR      ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 0,  0, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }

 if(arah == 4){
 sprintf(lineBuff2, "TNGGR ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 0,  0, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }

  if(arah == 5){
 sprintf(lineBuff2, "SELTN ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 0,  0, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }

 if(arah == 6){
 sprintf(lineBuff2, "BRTDY ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 0,  0, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }

 if(arah == 7){
 sprintf(lineBuff2, "BARAT ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 0,  0, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }

 if(arah == 8){
 sprintf(lineBuff2, "BRTLT ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 0,  0, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }
   
 }

 if(mode == 1){
 if(arah == 1){
 sprintf(lineBuff2, "N 0     ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }
 
 if(arah == 2){
 sprintf(lineBuff2, "NE 45     ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }

 if(arah == 3){
 sprintf(lineBuff2, "E 90      ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }

 if(arah == 4){
 sprintf(lineBuff2, "SE135      ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }

  if(arah == 5){
 sprintf(lineBuff2, "S 180      ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }

 if(arah == 6){
 sprintf(lineBuff2, "W 225      ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }

 if(arah == 7){
 sprintf(lineBuff2, "w 270      ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }

 if(arah == 8){
 sprintf(lineBuff2, "WN 310      ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }
   
 }
 
  if(tbupx == 0){
    delay(200);
    alarm++;
  }

  if(tbdownx == 0){
    delay(200);
    alarm--;
  }

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

  if(tbsetx == 0){
    delay(200);
    dmd.clearScreen( true ); 
    mode++;
  }

  if(tbokx == 0){
    delay(200);
    dmd.clearScreen( true ); 
    mode--;
  }

  if(speednya > alarm){
    digitalWrite(relay,HIGH);
  }

  if(speednya <= alarm){
    digitalWrite(relay,LOW);
  }

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

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

  lcd.setCursor(0, 0);
  lcd.print("AL:");
  lcd.print(alarm);
  lcd.print(" ");

  lcd.setCursor(0, 1);
  lcd.print("MODE:");
  lcd.print(mode);
  lcd.print(" ");
  
while(Serial.available()>0) {
//   dataIn="";
    char inChar = (char)Serial.read();
    dataIn += inChar;
    if (inChar == '\n') {
    parsing = true;
  }
}

if(parsing){
   
 parsingData();

 }
}

void parsingData(){
int j=0;

//kirim data yang telah diterima sebelumnya
//Serial.print("data masuk : ");
//Serial.print(dataIn);
//Serial.print("\n");

//inisialisasi variabel, (reset isi variabel)
dt[j]="";
//proses parsing data
for(i=1;i<dataIn.length();i++){
//pengecekan tiap karakter dengan karakter (#) dan (,)
if ((dataIn[i] == '#') || (dataIn[i] == ','))
{
//increment variabel j, digunakan untuk merubah index array penampung
j++;
dt[j]="";       //inisialisasi variabel array dt[j]
}
else
{
//proses tampung data saat pengecekan karakter selesai.
dt[j] = dt[j] + dataIn[i];
}
}

 datain1 = dt[0].toInt();
 datain2 = dt[1].toInt();

 speednya = datain1 / 100.0;
 arah = datain2 / 1;
 
 Serial.print(speednya);
 Serial.print(":"); 
 Serial.println(arah); 
 
}


4. VIDEO HASILNYA




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