Monday, December 14, 2015

Skema dan listing program Jamino - jam arduino

Lama ternyata sudah tidak oprek Jamino alias jam arduino yang beberapa bulan yang lalu sempet ngebut proses peng-oprek-an nya, alasannya pengen punya jam digital bikinan sendiri buat di kamar :D. Sekarang sudah punya 2, satu saya pasang di kamar, satunya lagi nganggur di kotak perkakas saya, hehe.  Pada posting kali ini akan saya bagikan skema dan listing program (coding) dari Jamino hasil dari belajar dari blognya Om Dewo beberapa bulan yang lalu serta dari blog-blog berbahasa Inggris yang keren-keren, yang sedikit memaksa saya selain belajar ngoding juga belajar bahasa Inggris juga, hehehe

langsung saja berikut skematik dari jam arduino saya
Skema Jamino - Jam Arduino dengan seven segment

pin common1, 2, 3, 4 dan pin A, B, C, D, E, F, G(mohon maaf di gambar belum saya ganti dari J7 ke G) dan  Dot dihubungkan ke seven segmen common anoda dan disarankan memakai yang 4 digit saja biar lebih simple pengkabelannya (seperti yang saya gunakan). Sedangkan S1, S2 merupakan switch untuk mencocokkan menit dan jam, dan pada skema diatas tombol reset untuk ATmega8 nya tidak saya gambar, sikahkan ditambahkan sendiri apabila diperlukan. Dan berikut ini listing programnya. Silahkan di eksperimen :D
Semoga bermanfaat

//Jamino7-Hendi 17 desember 2014 11:15wib
//hendysp.blogspot.com
#include "Wire.h"
#include "RTClib.h"
RTC_DS1307 RTC;


byte pin_digit[] = {
13, 6, 12, 0 };


byte pin_segmen[] = {
8, 9, 2, 4, 5, 7, 1, 3 };


byte angka[] = {
1, 1, 1, 1, 1, 1, 0, 0, // 0 ABCDEF
0, 1, 1, 0, 0, 0, 0, 0, // 1
1, 1, 0, 1, 1, 0, 1, 0, // 2
1, 1, 1, 1, 0, 0, 1, 0, // 3
0, 1, 1, 0, 0, 1, 1, 0, // 4
1, 0, 1, 1, 0, 1, 1, 0, // 5
1, 0, 1, 1, 1, 1, 1, 0, // 6
1, 1, 1, 0, 0, 0, 0, 0, // 7
1, 1, 1, 1, 1, 1, 1, 0, // 8
1, 1, 1, 1, 0, 1, 1, 0 // 9
};


int jeda = 1000;
long sblm = 0;
boolean dot = LOW;
byte pin_dot = 3;
byte jam = 0;
byte menit = 0;
byte detik = 0;
byte detik0 = 0;
//hendysp.blogspot.com
//byte pin_tombol = A0;
const int hourButtonPin = A1;//--------------------------hendi
const int minButtonPin = A2;
int hourButtonState;
int minButtonState;


void setup() {
// init
init_segments();
hapus();

pinMode(hourButtonPin,INPUT);
digitalWrite(hourButtonPin, HIGH);
pinMode(minButtonPin,INPUT);
digitalWrite(minButtonPin, HIGH);


Wire.begin();
RTC.begin();
if (!RTC.isrunning()) {
RTC.adjust(DateTime(__DATE__, __TIME__));
}
delay(500);
}


void init_segments() {
for (int i=0; i<4; i++) {
pinMode(pin_digit[i], OUTPUT);
digitalWrite(pin_digit[i], LOW);
}
for (int i=0; i<8; i++) {
pinMode(pin_segmen[i], OUTPUT);
digitalWrite(pin_segmen[i], HIGH);
}
}


void loop() {
check_buttons();
baca_waktu();
tulis_waktu();

}


void baca_waktu() {
if (millis() - sblm > jeda) {
DateTime now = RTC.now();


jam = now.hour();
menit = now.minute();
detik = now.second();
//Serial.print(jam);
//Serial.print(":");
//Serial.println(menit);


/*
if (dot == HIGH) dot = LOW;
else dot = HIGH;
digitalWrite(pin_dot, dot);
*/
sblm = millis();
}
}
void tulis_waktu() {
// tuliskan jam
if (jam < 10) {
tulis(0, 0);
}
else {
int _jam = jam / 10;
tulis(0, _jam);
}
byte __jam = jam %10;
tulis(1, __jam);


// tuliskan menit
if (menit < 10) {
tulis(2, 0);
}
else {
int _menit = menit / 10;
tulis(2, _menit);
}
tulis(3, menit %10);
}


void tulis(int d, int a) {
hapus();
digitalWrite(pin_digit[d], HIGH);
int idx = a * 8;
for (int i=0; i<8; i++) {
if (angka[idx+i] == 1) digitalWrite(pin_segmen[i], LOW);
else digitalWrite(pin_segmen[i], HIGH);
}


if (detik0 != detik) {
detik0 = detik;
if (dot == true) dot = false;
else dot = true;
}


if (d == 1) {
if (dot) {
//digitalWrite(pin_segmen[8], HIGH);
digitalWrite(pin_dot, HIGH);
}
else {
//digitalWrite(pin_segmen[8], LOW);
//hendysp.blogspot.com
digitalWrite(pin_dot, LOW);
}
}


delayMicroseconds(100);
}


void hapus() {
for (int i=0; i<4; i++) digitalWrite(pin_digit[i], LOW);
for (int i=0; i<8; i++) digitalWrite(pin_segmen[i], HIGH);
}


void check_buttons()
{
hourButtonState = digitalRead(hourButtonPin);
minButtonState = digitalRead(minButtonPin);


if(hourButtonState == LOW){
setHour();
}


if(minButtonState == LOW){
setMinutes();
}
}


void setHour()
{
jam++;
if(jam > 23)
{
jam = 0;
detik = 0;
menit = 0;
}
set_time();


}
void setMinutes()
{
menit++;
if(menit > 59)
{
menit = 0;


}
detik=0;


set_time();


}


byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}


byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}


void set_time()
{
Wire.beginTransmission(104);
Wire.write(0);
Wire.write(decToBcd(detik));
Wire.write(decToBcd(menit));
Wire.write(decToBcd(jam));
Wire.endTransmission();
delay(200);
}


No comments:

Post a Comment