Translate

Membuat Anemometer dengan Arduino

Membuat Anemometer dengan Arduino
 

        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat mengukur kecepatan angin atau anemometer, alat ini menggunakan arduino dan interface yang dipakai adalah lcd 16x2. di alat ini juga dilengkapi dengan sebuah buzzer agar saat kecepatan angin melebihi batas maka akan membunyikan buzzer tersebut untuk lebih jelasnya berikut adalah komponen dan programnya.
 
 
a. Komponen Penyusun
 



b. Program Arduino IDE

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

// 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;
int buzm = 11; //pin buzzer

void setup() {

  Serial.begin(9600);
  lcd.begin();
  lcd.clear();
  lcd.noCursor();
 
  pinMode(buzm,OUTPUT);
  digitalWrite(buzm,LOW);
 
  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()
{
  //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
        
    timeold = millis();
    rpmcount = 0;
    attachInterrupt(digitalPinToInterrupt(GPIO_pulse), rpm_anemometer, RISING); // enable interrupt
  }

  lcd.setCursor(0, 0);
  lcd.print("Kec=");
  lcd.print(velocity_ms);
  lcd.print(" m/s ");

if(velocity_ms > 5){
  lcd.setCursor(0, 1);
  lcd.print("Tinggi  ");
  digitalWrite(buzm,HIGH);
}
if((velocity_ms >= 3)&&(velocity_ms <= 5)){
  lcd.setCursor(0, 1);
  lcd.print("Sedang  ");
  digitalWrite(buzm,LOW);
}
if(velocity_ms < 3){
  lcd.setCursor(0, 1);
  lcd.print("Rendah  ");
  digitalWrite(buzm,LOW);
}  

}

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

 


c. VIDEO HASILNYA


 

Tutorial Modbus RS485 Arduino : Nurse Call

Tutorial Modbus RS485 Arduino : Nurse Call


       Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat dengan menggunakan modbus RS485 untuk alat Nurse Call, jadi alat ini berfungsi untuk memanggil perawat agar datang keruangan yang dibutuhkan misalnya ruangan pasien yang membutuhkan bantuan maka alat ini dapat digunakan. untuk lebih jelasnya berikut adalah koding dan komponennya.



a. Skema Alat




b. Master Nurse Call




c. Nurse Call Slave






d. Program Arduino IDE Master Nurse Call

#include <ModbusRtu.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);

#define slaveID 11

int tombol1 = 10;
int tombol2 = 11;
int tombol3 = 12;
int tombol1x;
int tombol2x;
int tombol3x;


uint16_t nilainya = 0;
unsigned long lastPrint = 0;

// data array for modbus network sharing
uint16_t au16data[4] = {
  slaveID, 225, 8888, 9999
};

Modbus slave(slaveID, mySerial, 4); // this is slave @1 and RS-232 or USB-FTDI

void setup() {
  Serial.begin(9600);
  mySerial.begin( 19200 ); // baud-rate at 19200
  slave.start();
  delay(10);
  pinMode(tombol1,INPUT_PULLUP);
  pinMode(tombol2,INPUT_PULLUP);
  pinMode(tombol3,INPUT_PULLUP);
}

void loop() {
  slave.poll( au16data, 4 );
  if (millis() - lastPrint > 200) {
    Serial.print(au16data[0]); Serial.print(":");
    Serial.print(au16data[1]); Serial.print(":");
    Serial.print(au16data[2]); Serial.println();
    lastPrint = millis();
  }
  readSensor(); //for ultrasonic sensor
}

void readSensor() {
  tombol1x = digitalRead(tombol1);
  tombol2x = digitalRead(tombol2);
  tombol3x = digitalRead(tombol3);

  if(tombol1x == 0){
    nilainya = 1;
   }

  if(tombol2x == 0){
    nilainya = 2;
   }

  if(tombol3x == 0){
    nilainya = 3;
   }
   
  au16data[1] = nilainya; //data to be sent to slave device
}




e. Program Arduino IDE Slave Nurse Call

// modbus RS485 read and write register
// V1.1 
// 1 master 2 slave, 
// 1 slave : 1 input 1 output

#include <Wire.h>
#include <ModbusRtu.h>
#define slaveNumber 5
#define delayCom 15
#define maxQuery 2*2//slaveNumer*2
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
SoftwareSerial mySerial(2, 3);
LiquidCrystal_I2C lcd(0x27,16,2);

uint8_t u8state; //!< machine state
uint8_t u8query; //!< pointer to message query

uint16_t dataBus[slaveNumber*3];
uint16_t lastPrint=100;
int slaveID[slaveNumber] = {11,12,13,14,15}; //id = 0,1,2,3,4
/**
 *  Modbus object declaration
 *  u8id : node id = 0 for master, = 1..247 for slave
 *  port : Serial1 port
 *  u8txenpin : 0 for RS-232 and USB-FTDI 
 *               or any pin number > 1 for RS-485
 */
Modbus master(0,mySerial,4); // ID, seriapNumber, enablePin

/**
 * This is an structe which contains a query to an slave device
 */
modbus_t telegram[slaveNumber*2];

unsigned long u32wait;

void init_modBus(){
  int num=0;
  int addr=0;
////SLAVE 1
  // Read 1 data from Slave 11
  telegram[num].u8id = slaveID[0]; // slave address
  telegram[num].u8fct = 3; // function code (this one is registers read)
  telegram[num].u16RegAdd = 0; // start address in slave
  telegram[num].u16CoilsNo = 2; // number of elements (coils or registers) to read
  telegram[num].au16reg = dataBus; // pointer to a memory array in the Arduino
  num+=1;
  addr+=2;
  
  // Write 1 data to Slave 11
  telegram[num].u8id = slaveID[0]; // slave address
  telegram[num].u8fct = 6; // function code (this one is write a multiple register)
  telegram[num].u16RegAdd = 2; // start address in slave
  telegram[num].u16CoilsNo = 1; // number of elements (coils or registers) to write
  telegram[num].au16reg = dataBus+2; // pointer to a memory array in the Arduino
  num+=1;
  addr+=1;

  master.start();
  master.setTimeOut( 100 ); // if there is no answer in 100 ms, roll over
  u32wait = millis() + 40;
  u8state = u8query = 0; 
  
}

void rtuState(){
  switch( u8state ) {
  case 0: 
    if (millis() >= u32wait) u8state++; // wait state
    break;
  case 1: 
    master.query( telegram[u8query] ); // send query (only once)
    u8state++;
    u8query++;
    if (u8query >= maxQuery) 
      u8query = 0;
    break;
  case 2:
    master.poll(); // check incoming messages if communication in idle state
    if (master.getState() == COM_IDLE) {
      u8state = 0;
      u32wait = millis() + delayCom;  //delay for next state
    }
    break;
  }
}

void printData(){
  if (millis() - lastPrint>200){
    //print data to validate
    Serial.print(dataBus[0]); Serial.print(":");
    Serial.print(dataBus[1]); Serial.print(":");
    Serial.print(dataBus[2]); Serial.print("\t:\t");
    //Serial.print(dataBus[3]); Serial.print(":");
    //Serial.print(dataBus[4]); Serial.print(":");
    //Serial.print(dataBus[5]); 
    Serial.println();
  }
}

void processData(){
  //data to be sent so slave 1 based on slave 2 data
  dataBus[2] = dataBus[4]*0.25; //convert 1023 to 255
  //data to be sent so slave 2 based on slave 1 data
  //dataBus[5] = dataBus[1]*0.25;

   if(dataBus[1] == 0){
     lcd.setCursor(0, 0);
     lcd.print("               ");
    }
    
   if(dataBus[1] == 1){
     Serial.println("RUANG DOKTER");
     lcd.setCursor(0, 0);
     lcd.print("RUANG DOKTER  ");
    }

  if(dataBus[1] == 2){
    Serial.println("RUANG PASIEN");
    lcd.setCursor(0, 0);
    lcd.print("RUANG PASIEN   ");
   }

  if(dataBus[1] == 3){
    Serial.println("RUANG RAWAT");
    lcd.setCursor(0, 0);
    lcd.print("RUANG RAWAT   ");
   }
    
}

void setup() {
  lcd.begin();
  lcd.noCursor();
  lcd.clear();
  Serial.begin (9600); //baud rate of Serial PC
  mySerial.begin( 19200 ); // baud-rate of RS485
  init_modBus();
}

void loop() {
  rtuState();
  printData();
  processData();
}




f. VIDEO HASILNYA





Alat Deteksi Listrik Padam Kirim Notifikasi SMS SIM900A / SIM800L

Alat Deteksi Listrik Padam Kirim Notifikasi SMS SIM900A / SIM800L
 
 
          Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang menggunakan sensor tegangan AC 220 yaitu ZMPT, alat ini berfungsi ketika listrik dirumah padam maka akan mengirimkan notifikasi berupa sms ke nomor HP tujuan. sehingga jika pemilik rumah memiliki hewan peliharaan atau sesuatu yang tidak boleh gelap dirumah maka si pemilik rumah bisa menyuruh orang untuk menghidupkan genset dirumah. untuk lebih jelasnya berikut komponen dan kodingnya.


a. Komponen yang dipakai

 
1. Arduino Uno
2. sensor ZMPT
3. Sim900A / Sim800L
4. Powerbank


b. Program Arduino IDE

#include "Wire.h"
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
SMSGSM sms;

int vin = 0;
int iin = 0;
int vout;
float kal;

int a = 0;
int zero = 1;
int kondisi = 0;
int dataadc;

char string[160];
int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];
unsigned long values[100];
int vin1;
int vin2;
int vin3;
int vin4;
unsigned int i1;
unsigned int z1;
unsigned int i2;
unsigned int z2;
unsigned int i3;
unsigned int z3;
unsigned int i4;
unsigned int z4;


void setup() {
  Serial.begin(9600);
 
  Serial.println("GSM Shield testing.");
     if (gsm.begin(2400)) {
          Serial.println("\nstatus=READY");
          started=true;
     } else Serial.println("\nstatus=IDLE");

     if(started) {
          if (sms.SendSMS("08123456789", "Alat Ready"))
          Serial.println("\nSMS sent OK");
     }
     
}


void loop() {
 
z1 = 0;
z2 = 0;
z3 = 0;
z4 = 0;

for(i1=0;i1<100;i1++) {
  values[i1] = analogRead(A0);            
  if (values[i1] >= z1) {
  z1 = values[i1];
  }
}

for(i2=0;i2<100;i2++) {
  values[i2] = analogRead(A0);            
  if (values[i2] >= z2) {
  z2 = values[i2];
  }
}
 
for(i3=0;i3<100;i3++) {
  values[i3] = analogRead(A0);            
  if (values[i3] >= z3) {
  z3 = values[i3];
  }
}
 
 for(i4=0;i4<100;i4++) {
  values[i4] = analogRead(A0);            
  if (values[i4] >= z4) {
  z4 = values[i4];
  }
}
 
vin1 = z1 ;
vin2 = z2 ;
vin3 = z3 ;
vin4 = z4 ;

z1 = 0;
z2 = 0;
z3 = 0;
z4 = 0;

if((vin1 > vin2)&&(vin1 > vin3)&&(vin1 > vin4)){
  vout = vin1;
  kal = (vout - 515.9) / 0.413 ;
}
else if((vin2 > vin1)&&(vin2 > vin3)&&(vin2 > vin4)){
  vout = vin2;
  kal = (vout - 515.9) / 0.413 ;
}
else if((vin3 > vin1)&&(vin3 > vin2)&&(vin3 > vin4)){
  vout = vin3;
  kal = (vout - 515.9) / 0.413 ;
}
else if((vin4 > vin1)&&(vin4 > vin2)&&(vin4 > vin3)){
  vout = vin4;
  kal = (vout - 515.9) / 0.413 ;
}

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

Serial.println(kal);

 if((kal > 200)&&(kondisi == 1)){
  if (sms.SendSMS("08123456789", "Listrik Nyala"))
      Serial.println("\nSMS sent OK");
      kondisi = 0;
      delay(3000);
   }
 
 if((kal < 200)&&(kondisi == 0)){
   if (sms.SendSMS("08123456789", "Listrik Padam"))
      Serial.println("\nSMS sent OK");
      kondisi = 1;
      delay(3000);
   }
      
delay(200);
}




c. VIDEO HASILNYA






ECG AD8232 ARDUINO

ECG AD8232 ARDUINO
 

      Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara mengakses modul sensor ECG AD8232 dengan menggunakan Arduino Uno. jadi alat ini akan menampilkan sinyal PQRS di serial monitor atau serial plotter Arduino. alat ini bisa dikembangkan lagi untuk keperluan yang lebih canggih misal sinyal ECG ditampilkan ke Android atau ke internet. untuk lebih jelasnya berikut adalah skema dan kodingnya. 
 
Link Sumber : https://how2electronics.com/ecg-monitoring-with-ad8232-ecg-sensor-arduino/
 
 
a. Skema 
 

 
 
b. Cara Pemasangan ke Tubuh
 

 
 
c. Program Arduino Uno
 
void setup() {
// initialize the serial communication:
Serial.begin(9600);
pinMode(10, INPUT); // Setup for leads off detection LO +
pinMode(11, INPUT); // Setup for leads off detection LO -
 
}
 
void loop() {
 
if((digitalRead(10) == 1)||(digitalRead(11) == 1)){
Serial.println('!');
}
else{
// send the value of analog input 0:
Serial.println(analogRead(A0));
}
//Wait for a bit to keep serial data from saturating
delay(1);
}
 
 
 
d. VIDEO HASILNYA
 

 

Timer Countdown, Jam Digital, Stopwatch, Lap Counter Panel P10 RGB HUB75 ARUINO

Timer Countdown, Jam Digital, Stopwatch, Lap Counter Panel P10 RGB HUB75 ARDUINO


         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang memiliki 4 fitur berbeda yaitu Timer Countdown, Stopwatch, Jam Digital, Lap Counter dengan penampilnya menggunakan panel P10 RGB HUB75. untuk lebih jelasnya berikut adalah koding dan komponennya. 



a. Arduino Uno




b. Panel P10 RGB





c. Modul RTC DS3231






d. Program Arduino IDE

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

DS3231  rtc(SDA, SCL);
Time  t;

#define F2(progmem_ptr) (const __FlashStringHelper *)progmem_ptr

#define CLK 8  // MUST be on PORTB! (Use pin 11 on Mega)
#define LAT A3
#define OE  9
#define A   A0
#define B   A1
#define C   A2

RGBmatrixPanel matrix(A, B, C, CLK, LAT, OE, false);

String sjam,smenit,sdetik;
int jam,menit,detik;
int pilih;
float xjam, xmenit, xdetik, xmiliDetik;
int xjamx, xmenitx, xdetikx, xmiliDetikx;
unsigned long over;

int lap;
int btset = 10;
int btup = 11;
int btdown = 12;
int btok = 13;
int btsetx;
int btupx;
int btdownx;
int btokx;
int countdown;
int detikku;
int mulai;
int seconds;
int cs;
long start_time = 0;
int jams,menits;
unsigned long mulaix, selesai, dataStopWatch;
int i=0;
int fPaus = 0;
long lastButton = 0; 
long delayAntiBouncing = 50; 
long dataPaus = 0;


void setup()
{
  lcd.begin();
  lcd.clear();
  lcd.noCursor();
  pinMode(btset,INPUT_PULLUP);
  pinMode(btup,INPUT_PULLUP);
  pinMode(btdown,INPUT_PULLUP);
  pinMode(btok,INPUT_PULLUP);
  matrix.begin();
  matrix.setTextWrap(false); // Allow text to run off right edge
  matrix.fillScreen(0);
  rtc.begin();
  //rtc.setDOW(THURSDAY);     // Set Day-of-Week to SUNDAY
  //rtc.setTime(15, 53, 0);     // Set the time to 12:00:00 (24hr format)
  //rtc.setDate(13, 5, 2022);   // Set the date to January 1st, 2014
}

void loop()
{
    
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);

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

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

if(pilih > 3){
pilih = 0;  
}

if(pilih < 0){
pilih = 3;  
}

if(pilih == 0){
  lcd.setCursor(0,0);
  lcd.print("1.Countdown    ");
}

if(pilih == 1){
  lcd.setCursor(0,0);
  lcd.print("2.Stopwatch    ");
}

if(pilih == 2){
  lcd.setCursor(0,0);
  lcd.print("3.Jam          ");
}

if(pilih == 3){
  lcd.setCursor(0,0);
  lcd.print("4.Lap Counter  ");
}

if((btokx == 0)&&(pilih == 0)){
lcd.clear();
delay(2000);
countdownku();  
}

if((btokx == 0)&&(pilih == 1)){
lcd.clear();
delay(2000);
lcd.print("  Tekan Tombol");
lcd.setCursor(0, 1); 
lcd.print("  Start / Stop");
stopwatch();  
}

if((btokx == 0)&&(pilih == 2)){
lcd.clear();
delay(2000);
jamku();  
}

if((btokx == 0)&&(pilih == 3)){
lcd.clear();
delay(2000);
lapcounter();  
}

}


void lapcounter(){

lcd.setCursor(0,0);
lcd.print("Lap: ");
lcd.print(lap);
lcd.print("   ");

btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);

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

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

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

if(lap <= 9){
matrix.setTextSize(2);
matrix.setTextColor(matrix.Color444(1, 0, 0));
matrix.setCursor(10, 1); //x,y
matrix.print(lap);   
}

if(lap > 9){
matrix.setTextSize(2);
matrix.setTextColor(matrix.Color444(1, 0, 0));
matrix.setCursor(4, 1); //x,y
matrix.print(lap);   
}

delay(100);
matrix.fillScreen(0);
 

lapcounter();  
}


void setjam(){

lcd.setCursor(0,0);
lcd.print("Jam: ");
lcd.print(jam);
lcd.print("   ");

btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);

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

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

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

if(jam > 23){
jam = 0;
}

if(jam < 0){
jam = 23;
}  

setjam();
}


void setmenit(){

  lcd.setCursor(0,0);
  lcd.print("Min: ");
  lcd.print(menit);
  lcd.print("   ");

btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);

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

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

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

if(menit > 59){
menit = 0;
}

if(menit < 0){
menit = 59;
}  

setmenit();
}


void setdetik(){

  lcd.setCursor(0,0);
  lcd.print("Detik: ");
  lcd.print(detik);
  lcd.print("   ");

btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);

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

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

if(btokx == 0){
lcd.clear();
delay(2000);
t.hour = jam;
t.min = menit;
t.sec = detik;
rtc.setTime(jam,menit,detik);     // Set the time to 12:00:00 (24hr format)
return; 
}

if(detik > 59){
detik = 0;
}

if(detik < 0){
detik = 59;
}  

setdetik();
}


void jamku(){
  
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);

if((btupx == 0)&&(btdownx == 0)){
lcd.clear();
delay(2000);
return;
}

if(btsetx == 0){
delay(200);
lcd.clear();  
setjam();
setmenit();
setdetik();  
}

 t = rtc.getTime();
 
  lcd.setCursor(0,0);
  lcd.print(t.hour);
  lcd.print(":");
  lcd.print(t.min);
  lcd.print(":");
  lcd.print(t.sec);
  lcd.print("   ");

  matrix.setTextSize(1);
  matrix.setTextColor(matrix.Color444(1, 0, 0));
  matrix.setCursor(1, 8); //x,y
  matrix.print(t.hour);
  matrix.setTextColor(matrix.Color444(3, 1, 0));
  matrix.print(":");
  matrix.setTextColor(matrix.Color444(0, 1, 0));
  matrix.print(t.min);
 
  matrix.setCursor(10, 1); //x,y
  matrix.setTextColor(matrix.Color444(0, 0, 1));
  matrix.print(t.sec);
 
  delay(1000);
  matrix.fillScreen(0);
  
jamku();  
}



void countdownku(){
matrix.setTextSize(2);
    
t = rtc.getTime();

btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);

if((btupx == 0)&&(btdownx == 0)){
lcd.clear();
delay(2000);
return;
}

if(btsetx == 0){
delay(200);
lcd.clear();  
setjam();
setmenit();
setdetik();  
}

  lcd.setCursor(0,0);
  lcd.print(t.hour);
  lcd.print(":");
  lcd.print(t.min);
  lcd.print(":");
  lcd.print(t.sec);
  lcd.print("   ");

detikku = 59 - t.sec;

if(t.sec == 30){

  matrix.drawLine(4, 3, 5, 3 , matrix.Color333(1, 0, 0));
  matrix.drawLine(3, 4, 6, 4 , matrix.Color333(1, 0, 0));
  matrix.drawLine(2, 5, 7, 5 , matrix.Color333(1, 0, 0));
  matrix.drawLine(1, 6, 8, 6 , matrix.Color333(1, 0, 0));
  matrix.drawLine(0, 7, 9, 7 , matrix.Color333(1, 0, 0));
  matrix.drawLine(0, 8, 9, 8 , matrix.Color333(1, 0, 0));
  matrix.drawLine(1, 9, 8, 9 , matrix.Color333(1, 0, 0));
  matrix.drawLine(2, 10, 7, 10 , matrix.Color333(1, 0, 0));
  matrix.drawLine(3, 11, 6, 11 , matrix.Color333(1, 0, 0));
  matrix.drawLine(4, 12, 5, 12 , matrix.Color333(1, 0, 0));

countdown = 30;
matrix.setTextColor(matrix.Color444(1, 1, 1));
matrix.setCursor(10, 1); //x,y
matrix.print(countdown); 
delay(2000);
matrix.fillScreen(0);
}

if(detikku == 10){
  
  matrix.drawLine(4, 3, 5, 3 , matrix.Color333(1, 0, 0));
  matrix.drawLine(3, 4, 6, 4 , matrix.Color333(1, 0, 0));
  matrix.drawLine(2, 5, 7, 5 , matrix.Color333(1, 0, 0));
  matrix.drawLine(1, 6, 8, 6 , matrix.Color333(1, 0, 0));
  matrix.drawLine(0, 7, 9, 7 , matrix.Color333(1, 0, 0));
  matrix.drawLine(0, 8, 9, 8 , matrix.Color333(1, 0, 0));
  matrix.drawLine(1, 9, 8, 9 , matrix.Color333(1, 0, 0));
  matrix.drawLine(2, 10, 7, 10 , matrix.Color333(1, 0, 0));
  matrix.drawLine(3, 11, 6, 11 , matrix.Color333(1, 0, 0));
  matrix.drawLine(4, 12, 5, 12 , matrix.Color333(1, 0, 0));

countdown = 10;
  
matrix.setTextColor(matrix.Color444(1, 1, 1));
matrix.setCursor(10, 1); //x,y
matrix.print(countdown);   
delay(1000);
matrix.fillScreen(0);
}

if((detikku > 0 )&&(detikku <= 5)){
matrix.setTextColor(matrix.Color444(1, 1, 1));
matrix.setCursor(15, 1); //x,y
matrix.print(detikku);   
}

if(detikku > 0){
  matrix.drawLine(4, 3, 5, 3 , matrix.Color333(1, 0, 0));
  matrix.drawLine(3, 4, 6, 4 , matrix.Color333(1, 0, 0));
  matrix.drawLine(2, 5, 7, 5 , matrix.Color333(1, 0, 0));
  matrix.drawLine(1, 6, 8, 6 , matrix.Color333(1, 0, 0));
  matrix.drawLine(0, 7, 9, 7 , matrix.Color333(1, 0, 0));
  matrix.drawLine(0, 8, 9, 8 , matrix.Color333(1, 0, 0));
  matrix.drawLine(1, 9, 8, 9 , matrix.Color333(1, 0, 0));
  matrix.drawLine(2, 10, 7, 10 , matrix.Color333(1, 0, 0));
  matrix.drawLine(3, 11, 6, 11 , matrix.Color333(1, 0, 0));
  matrix.drawLine(4, 12, 5, 12 , matrix.Color333(1, 0, 0));
}

if(detikku == 0){
  matrix.drawLine(4, 3, 5, 3 , matrix.Color333(0, 1, 0));
  matrix.drawLine(3, 4, 6, 4 , matrix.Color333(0, 1, 0));
  matrix.drawLine(2, 5, 7, 5 , matrix.Color333(0, 1, 0));
  matrix.drawLine(1, 6, 8, 6 , matrix.Color333(0, 1, 0));
  matrix.drawLine(0, 7, 9, 7 , matrix.Color333(0, 1, 0));
  matrix.drawLine(0, 8, 9, 8 , matrix.Color333(0, 1, 0));
  matrix.drawLine(1, 9, 8, 9 , matrix.Color333(0, 1, 0));
  matrix.drawLine(2, 10, 7, 10 , matrix.Color333(0, 1, 0));
  matrix.drawLine(3, 11, 6, 11 , matrix.Color333(0, 1, 0));
  matrix.drawLine(4, 12, 5, 12 , matrix.Color333(0, 1, 0));
  matrix.setTextColor(matrix.Color444(0, 1, 0));
  matrix.setCursor(10, 1); //x,y
  matrix.print("GO");   
  delay(3000);
  matrix.fillScreen(0);
}
  delay(1000);
  matrix.fillScreen(0);
    
countdownku();  
}



void stopwatch(){
  
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);

if((btupx == 0)&&(btdownx == 0)){
lcd.clear();
delay(2000);
return;
}

if (btsetx == 0){
  if ((millis() - lastButton) > delayAntiBouncing){
      if (i==0){
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Start Timer");
          mulaix = millis();
          fPaus = 0;
        }
       else if (i==1){
        lcd.setCursor(0, 0);
        lcd.print("Stop Timer  ");
        dataPaus = dataStopWatch;
        fPaus = 1;
        }
       i =!i;
      }
      lastButton = millis();
  }
  
if ((btupx == 0) && (fPaus == 1)){
  dataStopWatch = 0;
  dataPaus = 0; 
  lcd.clear();
  lcd.print("Reset Stopwatch");
  lcd.setCursor(0, 1); 
  lcd.print("0:0:0.0");  
  xjamx = 0;
  xmenitx = 0;
  xdetikx = 0;
  xmiliDetikx = 0;
 }
  
  if (i==1){
      selesai = millis(); 

      // MATH time!!!
      dataStopWatch = selesai - mulaix;
      dataStopWatch = dataPaus + dataStopWatch;

      xjam = int(dataStopWatch / 3600000);
      over = dataStopWatch % 3600000;
      xmenit = int(over / 60000);
      over = over % 60000;
      xdetik = int(over / 1000);
      xmiliDetik = over % 100;

      lcd.setCursor(0, 1);
      lcd.print(xjam, 0); 
      lcd.print(":"); 
      lcd.print(xmenit, 0);
      lcd.print(":");
      lcd.print(xdetik, 0);
      lcd.print(".");
      if (xjam < 10){
          lcd.print(xmiliDetik, 0);
          lcd.print("   ");
       }
   }

xjamx = xjam;
xmenitx = xmenit;
xdetikx = xdetik;
xmiliDetikx = xmiliDetik;
   
matrix.setTextSize(1);
matrix.setTextColor(matrix.Color444(1, 0, 0));
matrix.setCursor(1, 1); //x,y
matrix.print(xjamx);   
matrix.print(":");   
matrix.print(xmenitx);  
matrix.setCursor(1, 8); //x,y
matrix.print(xdetikx);  
matrix.print(":");   
matrix.print(xmiliDetikx);   

delay(1);
matrix.fillScreen(0);
  
stopwatch();  
}




e. VIDEO HASILNYA



Timer Counter Down Panel P10 RGB HUB75

Timer Counter Down Panel P10 RGB HUB75



        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat menampilkan nilai countdown untuk tujuan tertentu. alat ini menggunakan panel P10 RGB dengan HUB75. pada tampilan di panel P10 terdapat simbol merah dan hijau serta terdapat pula nilai yang countdown. untuk lebih jelasnya berikut adalah program dan komponennya.  


a. Arduino Uno




b. Panel P10 RGB





c. Modul RTC DS3231





d. Program Arduino IDE

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

DS3231  rtc(SDA, SCL);
Time  t;

#define F2(progmem_ptr) (const __FlashStringHelper *)progmem_ptr

#define CLK 8  // MUST be on PORTB! (Use pin 11 on Mega)
#define LAT A3
#define OE  9
#define A   A0
#define B   A1
#define C   A2

RGBmatrixPanel matrix(A, B, C, CLK, LAT, OE, false);

String sjam,smenit,sdetik;
int jam,menit,detik;

int btset = 10;
int btup = 11;
int btdown = 12;
int btok = 13;
int btsetx;
int btupx;
int btdownx;
int btokx;
int countdown;
int detikku;


void setup()
{
  lcd.begin();
  lcd.clear();
  lcd.noCursor();
  pinMode(btset,INPUT_PULLUP);
  pinMode(btup,INPUT_PULLUP);
  pinMode(btdown,INPUT_PULLUP);
  pinMode(btok,INPUT_PULLUP);
  matrix.begin();
  matrix.setTextWrap(false); // Allow text to run off right edge
  matrix.setTextSize(2);
  matrix.fillScreen(0);
  rtc.begin();
  //rtc.setDOW(THURSDAY);     // Set Day-of-Week to SUNDAY
  //rtc.setTime(15, 53, 0);     // Set the time to 12:00:00 (24hr format)
  //rtc.setDate(13, 5, 2022);   // Set the date to January 1st, 2014
}

void loop()
{
  
t = rtc.getTime();

btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);

if(btsetx == 0){
delay(200);
lcd.clear();  
setjam();
setmenit();
setdetik();  
}

  lcd.setCursor(0,0);
  lcd.print(t.hour);
  lcd.print(":");
  lcd.print(t.min);
  lcd.print(":");
  lcd.print(t.sec);
  lcd.print("   ");

detikku = 59 - t.sec;

if(t.sec == 30){

  matrix.drawLine(4, 3, 5, 3 , matrix.Color333(1, 0, 0));
  matrix.drawLine(3, 4, 6, 4 , matrix.Color333(1, 0, 0));
  matrix.drawLine(2, 5, 7, 5 , matrix.Color333(1, 0, 0));
  matrix.drawLine(1, 6, 8, 6 , matrix.Color333(1, 0, 0));
  matrix.drawLine(0, 7, 9, 7 , matrix.Color333(1, 0, 0));
  matrix.drawLine(0, 8, 9, 8 , matrix.Color333(1, 0, 0));
  matrix.drawLine(1, 9, 8, 9 , matrix.Color333(1, 0, 0));
  matrix.drawLine(2, 10, 7, 10 , matrix.Color333(1, 0, 0));
  matrix.drawLine(3, 11, 6, 11 , matrix.Color333(1, 0, 0));
  matrix.drawLine(4, 12, 5, 12 , matrix.Color333(1, 0, 0));

countdown = 30;
matrix.setTextColor(matrix.Color444(1, 1, 1));
matrix.setCursor(10, 1); //x,y
matrix.print(countdown); 
delay(2000);
matrix.fillScreen(0);
}

if(detikku == 10){
  
  matrix.drawLine(4, 3, 5, 3 , matrix.Color333(1, 0, 0));
  matrix.drawLine(3, 4, 6, 4 , matrix.Color333(1, 0, 0));
  matrix.drawLine(2, 5, 7, 5 , matrix.Color333(1, 0, 0));
  matrix.drawLine(1, 6, 8, 6 , matrix.Color333(1, 0, 0));
  matrix.drawLine(0, 7, 9, 7 , matrix.Color333(1, 0, 0));
  matrix.drawLine(0, 8, 9, 8 , matrix.Color333(1, 0, 0));
  matrix.drawLine(1, 9, 8, 9 , matrix.Color333(1, 0, 0));
  matrix.drawLine(2, 10, 7, 10 , matrix.Color333(1, 0, 0));
  matrix.drawLine(3, 11, 6, 11 , matrix.Color333(1, 0, 0));
  matrix.drawLine(4, 12, 5, 12 , matrix.Color333(1, 0, 0));

countdown = 10;
  
matrix.setTextColor(matrix.Color444(1, 1, 1));
matrix.setCursor(10, 1); //x,y
matrix.print(countdown);   
delay(1000);
matrix.fillScreen(0);
}

if((detikku > 0 )&&(detikku <= 5)){
matrix.setTextColor(matrix.Color444(1, 1, 1));
matrix.setCursor(15, 1); //x,y
matrix.print(detikku);   
}

if(detikku > 0){
  matrix.drawLine(4, 3, 5, 3 , matrix.Color333(1, 0, 0));
  matrix.drawLine(3, 4, 6, 4 , matrix.Color333(1, 0, 0));
  matrix.drawLine(2, 5, 7, 5 , matrix.Color333(1, 0, 0));
  matrix.drawLine(1, 6, 8, 6 , matrix.Color333(1, 0, 0));
  matrix.drawLine(0, 7, 9, 7 , matrix.Color333(1, 0, 0));
  matrix.drawLine(0, 8, 9, 8 , matrix.Color333(1, 0, 0));
  matrix.drawLine(1, 9, 8, 9 , matrix.Color333(1, 0, 0));
  matrix.drawLine(2, 10, 7, 10 , matrix.Color333(1, 0, 0));
  matrix.drawLine(3, 11, 6, 11 , matrix.Color333(1, 0, 0));
  matrix.drawLine(4, 12, 5, 12 , matrix.Color333(1, 0, 0));
}

if(detikku == 0){
  matrix.drawLine(4, 3, 5, 3 , matrix.Color333(0, 1, 0));
  matrix.drawLine(3, 4, 6, 4 , matrix.Color333(0, 1, 0));
  matrix.drawLine(2, 5, 7, 5 , matrix.Color333(0, 1, 0));
  matrix.drawLine(1, 6, 8, 6 , matrix.Color333(0, 1, 0));
  matrix.drawLine(0, 7, 9, 7 , matrix.Color333(0, 1, 0));
  matrix.drawLine(0, 8, 9, 8 , matrix.Color333(0, 1, 0));
  matrix.drawLine(1, 9, 8, 9 , matrix.Color333(0, 1, 0));
  matrix.drawLine(2, 10, 7, 10 , matrix.Color333(0, 1, 0));
  matrix.drawLine(3, 11, 6, 11 , matrix.Color333(0, 1, 0));
  matrix.drawLine(4, 12, 5, 12 , matrix.Color333(0, 1, 0));
  matrix.setTextColor(matrix.Color444(0, 1, 0));
  matrix.setCursor(10, 1); //x,y
  matrix.print("GO");   
  delay(3000);
  matrix.fillScreen(0);
}
  delay(1000);
  matrix.fillScreen(0);
}

void setjam(){

  lcd.setCursor(0,0);
  lcd.print("Jam: ");
  lcd.print(jam);
  lcd.print("   ");

btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);

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

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

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

if(jam > 23){
jam = 0;
}

if(jam < 0){
jam = 23;
}  

setjam();
}


void setmenit(){

  lcd.setCursor(0,0);
  lcd.print("Min: ");
  lcd.print(menit);
  lcd.print("   ");

btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);

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

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

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

if(menit > 59){
menit = 0;
}

if(menit < 0){
menit = 59;
}  

setmenit();
}


void setdetik(){

  lcd.setCursor(0,0);
  lcd.print("Detik: ");
  lcd.print(detik);
  lcd.print("   ");

btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);

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

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

if(btokx == 0){
lcd.clear();
delay(2000);
t.hour = jam;
t.min = menit;
t.sec = detik;
rtc.setTime(jam,menit,detik);     // Set the time to 12:00:00 (24hr format)
return; 
}

if(detik > 59){
detik = 0;
}

if(detik < 0){
detik = 59;
}  

setdetik();




e. VIDEO HASILNYA




Timer Counter Board Mini 4WD 3 Jalur Line / Track

 Timer Counter Board Mini 4WD 3 Jalur Line / Track 

        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang bisa digunakan untuk counter timer untuk balapan mobil mini 4WD, jadi alat ini menggunakan 3 buah sensor sesuai dengan jumlah track yang dipakai kemudian terdapat 3 lap sehingga jika ada yang telah mencapai 3 lap terlebih dahulu dialah yang menang. untuk lebih jelasnya berikut adalah koding dan komponennya.

 

a. Arduino Uno


b. Sensor Proximity


c. Koneksi Arduino ke P10 HUB12



d. Program Arduino IDE

#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;
 
void ScanDMD()
{
  dmd.scanDisplayBySPI();
}


void setup(void)
{
 
  pinMode(2,INPUT);
  pinMode(3,INPUT);
  pinMode(4,INPUT);
 
  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(4);

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

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

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

if((lineA == 0)&&(lineB == 0)&&(lineC == 1)&&(mulai == 1)){
lapa++;
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++;
lapc++;
delay(100);
}

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

//=============================================
if(lapa > 2){
dmd.clearScreen( true );  
hasila();  
}

if(lapb > 2){
dmd.clearScreen( true );  
hasilb();  
}

if(lapc > 2){
dmd.clearScreen( true );  
hasilc();  
}

//=============================================
lineA = digitalRead(2);

if((lineA == 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, " A", 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, " C", lapa, lapb, lapc);
dmd.selectFont(Droid_Sans_12);
dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL);  

hasilc();  
}

 

e. VIDEO HASILNYA