IC timer 555 adalah sirkuit terpadu (chip) yang digunakan dalam berbagai pembangkit timer, pulsa dan aplikasi osilator. Komponen ini digunakan secara luas, berkat kemudahan dalam penggunaan, harga rendah dan stabilitas yang baik
Kami bantu anda untuk memahami lebih jelas mengenai migrasi tv digital, apa sebabnya dan bagaimana efek terhadap kehidupan. Jasa teknisi juga tersedia dan siap membantu instalasi - setting perangkat - pengaturan antena dan distribusi televisi digital ke kamar kos / hotel
Project Sederhana dengan Dot Matrix dan Attiny2313. Bisa menjadi hadiah buat teman atau pacarmu yang ulang tahun dengan tulisan dan animasi yang dapat dibuat sendiri.
Jika anda pencinta IC TTL datau CMOS maka project jam digital ini akan menunjukkan bahwa tidak ada salahnya balik kembali ke dasar elektronika digital , sebab semuanya BISA dibuat dengan teknologi jadul
Kegemaran saya mengoprek jam kalender dan TV dimulai sejak membaca tulisan mengenai steve wozniak dan steve jobs tentang bagaimana mereka bekerjasama membuat hardware video game "breakout" di Atari, hingga akhirnya menciptakan komputer apple yang legendaris itu. Dulu saat penulis kuliah sempat mendapat praktikum interfacing monitor VGA tapi hanya selintas aja dan menyesal juga kenapa gak sedari dulu bisa mengerti walau nilai praktikum dapat A (nyontek teman yg pinter sihhh). Dari dua latar belakang tersebut dan ketika microcontroller semakin murah dan mudah didapatkan menjadi tantangan tersendiri bermain micro di TV dan terlihat seperti main-main dan menghabiskan waktu, memang itu benar tapi asyik lhoo! Tapi jangan berkecil hati karena penulis juga dapat banyak ilmu terutama mengenai pemrograman script yang lebih efisien. Salah satunya adalah ketika tantangan komunikasi arduino ke ESP agar tidak mengganggu timer Atmega328 untuk scanning TV. Jika menggunakan Serial baik Hardware atau emulasi software tetap aja akan menimbulkan interfrensi timer. Untuk itu digunakan komunikasi dengan timer yg independen yaitu I2C. Dari hasil googling didapat bahwa ESP8266 bisa juga dimanfaatkan sebagai I2C master dan Arduino sebagai Slave nya.
Komunikasi I2C sudah tersedia librarinya dalam instalasi default sketch, yaitu dengan library " wire.h ". Untuk arduino uno / mini / micro yg berbasis ATmega328 pin SDA = A4 pin SCL =A5 . Dengan menggunakan I2C maka master dapat mengirim data atau meminta data ke slave. Tiap komponen yg diakses memiliki address masing-masing. Untuk ESP8266-01 memiliki 2 output GPIO yang bukan berfungsi sebagai I2C secara spesifik, sehingga perlu dilakukan inisialisasi port sendiri mana yg berfungsi sebagai SDA atau SCL.
Menyambung tulisan mengenai jam di TV dan esp8266 , maka sebelum melanjutkan ke bahasan dibawah ada baiknya paca dulu PART1 dan PART2.
- Praktek Testing I2C
Kita akan mencoba menghubungkan ESP sebagai master, terhubung secara I2C ke Arduino sebagai Slave dan tujuannya adalah mengirimkan data kalender secara periodik. Slave kemudian akan menuliskan hasil data yg diperoleh ke Serial port.
Script Master ( ESP8266-01)
#include <ESP8266WiFi.h> #include <WiFiUdp.h> #include "TimeLib.h" //library I2c #include <Wire.h> //library NTP , unduh jika blom ada #include <NTPClient.h> const char *ssid = "Nama Wifi"; const char *password = "Password"; //Offset WIB +7 , sesuaikan const long utcOffsetInSeconds = 25200; long previousMillis = 0; long interval = 10000; //tiap 10 detik //Array kalender char tanggalan[] ="20,1,1,23,59,0" ; // NTP lokal, ubah jika perlu WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "ntp.bmkg.go.id", utcOffsetInSeconds); void setup(){ Serial.begin(9600); //monitor Wire.begin(0, 2); /* Koneksi i2c SDA=0 and SCL=2 pada ESP-01 */
#include <Wire.h> void setup() { Serial.begin(9600); Wire.begin(8); //rutin event receive i2c Wire.onReceive(espWifiReceiveEvent); } void loop() { delay(1); } //Kirim ke serial saat ada data i2c masuk void espWifiReceiveEvent(int count) { Serial.print("Received["); while (Wire.available()) { char c = Wire.read(); Serial.print(c); } Serial.println("]");
}
Nah jika dilihat output pada serial monitor / putty disisi arduino/slave seperti berikut:
- SCRIPT JAM LENGKAP
Terdapat beberapa hal yg menjadi perhatian saat data diterima arduino pada port I2C, dimana timer tetap akan kacau kalau data i2c nya panjang. I2C akan hang itulah yg terjadi saat 17 byte char diterima , jadi diakali dengan melakukan penonaktifan I2C setelah data kalender lengkap. Peng-update-an tanggalan dilakukan setiap jam atau sesuai keinginan misalnya tiap jam 3 pagi jika TV mau nyala terus dan gak dipake emak nonton sinetron..hehehehe...ayuk kita kupas satu persatu.
angle=(angle/57.29577951) ; //Convert degrees to radians
x3=(tvx+(sin(angle)*(tvradius-6)));
y3=(tvy-(cos(angle)*(tvradius-6)));
TV.draw_line(tvx,tvy,x3,y3,WHITE);
angle = minute * 6 ;
angle=(angle/57.29577951) ; //Convert degrees to radians
x3=(tvx+(sin(angle)*(tvradius-11)));
y3=(tvy-(cos(angle)*(tvradius-11)));
TV.draw_line(tvx,tvy,x3,y3,WHITE);
angle = hour * 30 + int((minute / 12) * 6 ) ;
angle=(angle/57.29577951) ; //Convert degrees to radians
x3=(tvx+(sin(angle)*(tvradius-15)));
y3=(tvy-(cos(angle)*(tvradius-15)));
TV.draw_line(tvx,tvy,x3,y3,WHITE);
}
void setup() {
//TV di mode NTSC
TV.begin(_NTSC,150,71);
TV.select_font(font6x8);
TV.clear_screen();
tvx= TV.hres()/2;
tvy=TV.vres()/2;
tvradius=TV.vres()/2 ;
//clock face lingkaran
TV.draw_circle(tvx,tvy,tvradius,WHITE);
//hour ticks
for( int z=0; z < 360;z= z + 30 ){
//Begin at 0° and stop at 360°
float angle = z ;
angle=(angle/57.29577951) ; //Convert degrees to radians
x2=(tvx+(sin(angle)*tvradius));
y2=(tvy-(cos(angle)*tvradius));
x3=(tvx+(sin(angle)*(tvradius-5)));
y3=(tvy-(cos(angle)*(tvradius-5)));
TV.draw_line(x2,y2,x3,y3,WHITE);
}
TV.set_cursor(10,30);
TV.print("NTP");
TV.set_cursor(0,55);
TV.print("aisi555");
TV.set_cursor(3,63);
TV.print(".com");
//buka serial kalau mau debug
//Serial.begin(9600);
Wire.begin(8); // I2C
Wire.onReceive(espWifiReceiveEvent);
}
void loop() {
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
TV.delay(980); // Sesuaikan antara 950-1000
printTime();
}
}
void espWifiReceiveEvent(int count)
{
//buka blok serial kalau mau debug
//Serial.print("Received[");
//jika i2c terima data dan blum komplit kalendernya
while (Wire.available() && ntpkomplit == false)
{
char c = Wire.read();
//Serial.print(c);
buff[buffindex]=c;
buffindex++;
}
//Serial.println("]");
//Ntpkomplit = true Jika buffer kalender sampe menit terpenuhi
if(buffindex >=14) {
ntpkomplit = true;
TWCR = 0; //bunuh i2c
}
buffindex = 0;
}
HASIL :
Proses update yg saya gunakan adalah tiap JAM atau menit ke 0, jadi memang tidak akan langsung terupdate akibat proses BITBANG tabrak menabrak antar timer vs i2c. Jadi seperti video berikut ini dapat dilihat UPDATE ke waktu NTP terjadi hampir 2 menit kemudian.
Bagaimana ? Sudah Mumet ? Sebaiknya baca dari awal ya PART1 dan PART2 dan juga bagian sebelumnya mengenai TV menggunakan microcontroller yang sudah saya tulis sejak 2012.
Ini merupakan kelanjutan dari pembahasan Jam TV part1 dan merupakan bagian yang paling penting untuk mendapatkan waktu yg akurat. Umumnya para desainer elektronika yg membutuhkan pewaktu akan menggunakan RTC baik yg jadul paralel DS12887 atau yg sangat murah RTC serial/i2c DS1807. Penulis sangat benci menggunakan RTC karena ketidak akuratannya yg akan melenceng seiring waktu. Bahkan tidak pernah menggunakan RTC dalam proyek apapun karena selalu menggunakan timer internal dari AVR seperti yg pernah saya bahas secara gamblang disini. Karena sekarang saya menggunakan timer secara khusus untuk timing raster tv maka akan mengganggu library tvout nya. Untuk itu saya menggunakan NTP atau network time protocol yang kekauratatnnya teruji untuk penggunaan komputer. Menurut wikipedia....
Network Time Protocol (NTP) adalah sebuah protokol yang digunakan untuk pengsinkronan waktu di dalam sebuah jaringan bisa pada jaringan LAN (Local Area Network) maupun pada jaringan internet dan untuk sinkronisasi jam-jam sistem komputer di atas paket-switching, variabel-latency jaringan data. Proses sinkronisasi ini dilakukan didalam jalur komunikasi data yang biasanya menggunakan protokol komunikasi TCP/IP. Sehingga proses ini sendiri dapat dilihat sebagai proses komunikasi data yang hanya melakukan pertukaran paket-paket data saja.
NTP menggunakan port komunikasi UDP nomor 123. Salah satu contoh NTP server yg bisa dicoba adalah ntp.bmkg.go.id dan banyak lagi NTP server lainnya. Data yg diberikan oleh server NTP berupa elapsed second sejak tahun 1900. Komputer pada umumnya menggunakan unix / epoch time yg dihitung mulai 1 januari 1970, jadi butuh perhitungan mengurangi data yg diterima sebanyak 2208988800 . Wow lumayan besar angkanya jadi kita akan terbiasa dengan format angka Unsigned Long. Untuk mempelajari prinsip epoch, unix time, dan NTP bisa baca di epochconverter.com .
- ESP8266 / ESP-01
Modul murah meriah ESP8266 merupakan penggerak utama dari perkembangan IOT di dunia sejak 10 tahun lalu. Bagaimana tidak hampir semua alat ber-wifi menggunakan platform yg sama dan membuat saya heran karena harganya super murah. Gak habis pikir deh berapa nilai keuntungan yg diambil oleh espressif ? Sebagai jebolan pabik komponen jadi ingat kalau pabrik di china bisa sampai menekan harga dan mengambil untung hanya 1 sen untuk tiap produknya, dengan catatan order ke mereka main kuantitas besar. Ahh jangan dibahas lah kalau lawan industri china, kita di Indonesia hanya bisa lihat dan impor saja, bermimpi kembali ke jaman 80-90an dimana ada pabrik komponen yg pabriknya lokal jawa timuran.
Gambar Yang saya tampilkan diatas merupakan interfacing / hubungan antara ESP yg berlevel tegangan 3.3 volt dengan Arduino dengan level 5 volt. Pembagi tegangan menggunakan resistor bisa ditambahkan untuk keamanan, tapi menurut saya sudah bertahun-tahun level uart TTL bisa langsung dipake ke uart 3.3 volt asal jangan sampai tegangan supplynya / vcc aja sampe salah.
Baudrate UART dari ESP pada umumnya di set 115200 dan menggunakan perintah AT command seperti halnya pada modul GSM SIM800. Anda bisa mencobanya dengan USB UART dan terminal yang memiliki fasiitas penambahan "CR" pada akhir command. Jadi jangan gunakan putty secara polos ya, gunakan monitor uart pada arduino atau Real Term daripada bingung karena Putty tanpa respond hanya keluar tulisan " Ready".
-Library ESPWiFi mode AT COMMAND
Kita lanjut pembahasan bagaimana interfacingnya modul ESP01 ini ke arduino dan penulis sangat terkejut bahwa library dari ESP yg dengan firmware AT "WiFiEsp" sudah memiliki fasilitas NTP-UDP siap pakai. Wahh tinggal copy paste ini sepertinya dan benar saja dari kumpulan script example bisa kita langsung dapatkan hasil yang memuaskan.
Untuk mengubah data waktu EPOCH dengan hasil yg lebih spesifik (hari tanggal bulan tahun) maka kita perlu menambahkan libary pengolah kalender "TimeLib.h". Ini karena pada library WiFiEsp tidak ada fasilitas pengolahan data EPOCH nya. Modifikasi saja pada script sesuai contoh berikut:
if (Udp.parsePacket()) {
Serial.println("packet received");
// We've received a packet, read the data from it into the buffer
Udp.read(packetBuffer, NTP_PACKET_SIZE);
// the timestamp starts at byte 40 of the received packet and is four bytes,
// or two words, long. First, esxtract the two words:
unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
// combine the four bytes (two words) into a long integer
// this is NTP time (seconds since Jan 1 1900):
unsigned long secsSince1900 = highWord << 16 | lowWord;
Serial.print("Seconds since Jan 1 1900 = ");
Serial.println(secsSince1900);
// now convert NTP time into everyday time:
Serial.print("Unix time = ");
// Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
// print the hour, minute and second , ini mode libraru standar
Serial.print("Waktu WIB (+7) = "); // WIB +7
Serial.print(( epoch % 86400L) / 3600); // print the hour
Serial.print(':');
if (((epoch % 3600) / 60) < 10) {
// In the first 10 minutes of each hour, we'll want a leading '0'
Serial.print('0');
}
Serial.print((epoch % 3600) / 60); // print the minute
Serial.print(':');
if ((epoch % 60) < 10) {
// In the first 10 seconds of each minute, we'll want a leading '0'
Serial.print('0');
}
Serial.println(epoch % 60); // print the second
// dibawah ini penggunaan TimeLib.h yang lebih singkat
char buffer[100] ;
sprintf(buffer, " Tanggal : %4d-%02d-%02d", year(epoch), month(epoch),day(epoch));
Serial.println(buffer);
}
- Mengubah ESP01 menjadi Berbasis Arduino
Kelanjutan pembahasan saya kali ini alur ceritanya maju kedepan saat kegagalan mencoba Wifi + NTP + TVOUT gara-gara critical timingnya. Jadi saya perlu mendapatkan parameter waktu tanpa mengganggu timer 16 bit nya atmega328 dan ini sangat mustahil. Awalnya saya berpikir menggunakan Software Serial untuk mengambil data vi AT command, akan tetapi layar TV langsung blank. Jadi Mau tidak mau harus menggunakan jalur komunikasi lainnya yg memungkinkan, dan benar saja GPIO dari ESP8266/01 ini ada 2 buah yg GPIO 0 dan 2, jadi cukup lah untuk menjadikannya port I2C ( SDA dan SCL). Namun saya perlu merangkai flashernya agar bisa diprogram melalui sketch arduino.
Cara flashingnya dengan urutan : Menekan 2 Tombol Flash + Reset , kemudian lepas tombol Reset dan tombol Flash tetap ditekan , ditandai dengan led esp warna biru kedip sekali. Nah selanjutnya anda bisa menekan Upload pada sketch seperti biasanya. Pembahasan I2C untuk mengirim data kalender akan dibahas pada tulisan berikutnya. Anda bisa mencoba menggunakan ESP01 untuk menerima data NTP dan menampilkan pada serial port / debug port seperti script dibawah.
#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
const char *ssid = "Nama Wifi";
const char *password = "Passwordnya";
const long utcOffsetInSeconds = 25200; //offset +7 WIB
Kekuatan dari arduino adalah kegilaan para "opreker" dalam membuat script library yang sangat rapih dan membuat anda yang kurang kekuatan berimajinasinya menjadi sangat terbantu. 10 tahun yg lalu mungkin ini menjadi kekecewaan saya , kenapa gak dari jaman saya awal belajar microcontroller dulu muncul library yg gampang ini? Akan tetapi ada bergunanya juga saya belajar microcontroller mulai dari bahasa assembly dimana saya dengan mudah melakukan modifikasi dari suatu library , hasil pemahaman "jeroan" dari register microcontroller sekelas AVR. Contoh nyata adalah yang pernah saya tulis di Praktek Jam TV Dengan Attiny2313 dimana saya berhasil mengoprek library arduino agar muat ke ROM attiny yg super kecil.
Penjelasan teori dari bagaimana menampilkan gambar pada TV composite analog dapat dibaca pada beberapa seri tulisan Micro vs TV yg menggunakan hardware yg sama seperti gambar diatas. Bermodal 2 resistor 1K dan 470 Ohm maka sinyal sync dan blanking dapat diatur sedemikian rupa menggunakan fungsi timer pada microcontroller. Cukup dengan script delay saja bisa membuat karakter sederhana seperti video yutub dibawah ini. Dan akhir dari seri praktek TV 7 taun yg lalu itu adalah membuat overlay/osd pada gambar live TV.
Ketika saya memutuskan membahas arduino pada blog, maka saya jadi berpikiran pasti ada library yang membahas TV dan ternyata ada library TVOUT yang memang sudah ada sejak lama. Namun kalau tampilannya itu itu aja maka akan sedikit kurang tantangannya. Hasil googling saya menunjukkan hasil karya TVOUT jam digital dengan gabungan tulisan dan animasi jam dinding. Bisa anda baca di http://giantmetalrobot.blogspot.com/2011/05/arduino-analog-clock.html. Dan sebagai tantangannya saya akan merubah penggunaan RTC menjadi NTP yaitu mengambil data jam dari server internet semacam http://ntp.bmkg.go.id. Saya akan membuat seri tulisan yg akan membahas satu persatu agar pembaca semakin paham, mulai dari menulis di tv, mengambil data NTP melalui ESP8266 dan terakhir penggabungannya.
Jika menggunakan pemrograman avr non arduino, maka register timer 16 bit diatas harus dipahami sampai diluar kepala. Ya mau tidak mau harus! Karena menulis pada TV memerlukan timing yang pas pada jangka waktu per raster yg hanya 64us. Pada Library TVout nya arduino anda tidak perlu pusing-pusing lagi karena cukup menggunakan fasilitas langsung jadi. Hardware pun masih sama 2 resistor saja dengan menggunakan port seperti pada gambar.
Baiklah setelah terangkai dengan benar, maka kita bisa membuat tulisan sederhana seperti pada contoh script singkat berikut.
#include <TVout.h> #include <fontALL.h> TVout TV; void setup() { //Setup display. TV.begin(PAL,120,96); //Select font. TV.select_font(font6x8); } void loop() { //Clear screen at the beginning of the loop. TV.clear_screen(); //Set curosr position. (x,y) TV.set_cursor(0, 10); //Print text. TV.println("www.aisi555.com"); TV.delay(60); }
Thats it....hanya sebaris itu..Bagaimana dengan membuat jam seperti pada gambar paling atas? Tinggal langsung copy paste aja kok dari blog aslinya dan merubah bagian pembacaan RTC dan membuat delay 1 detik sehingga mensimulasi pergantian detik ke menit jam tanggal dan seterusnya.
Lama banget gak utak-atik LED MATRIX padahal barang satu ini favorit saya sejak kuliah 20 tahun yang lalu. Kekaguman saya pada benda ini berawal saat tahun 90an saya sering diminta teman membuat LED susun menjadi tulisan tertentu dan kemudian digabung dengan IC 4017 agar menjadi efek gerak kedip kanan kiri, sayangnya karakter yg dibentuk gak bisa diubah. Dan saat saya kuliah ketemu dot matrix yang gak lain led disusun yang bisa diubah ubah tampilannya sesuai keinginan. Bahkan ingatan saya masih clink pada tahun 1998 di atas atap kampus Elektro ITS terpampang text berjalan dari Bohlam yg disusun menjadi seperti LED matrix berukuran super besar.
Tuh saya masih inget bikin generator susunan led ke bit / hex yang nantinya dimasukkan ke script atmel studio. Dulu saya pake IC legendaris ATTINY 2313 dan banyak yang belajar dari modul pembelajaran (yang saya jual paketan) dimana praktek terakhirnya bikin teks berjalan pada satu marix yang bisa dibaca disini atau versi excel disini . Kini sudah tahun 2020 saya ingin membagi ilmu nya kembali dengan format lebih jaman now menggunakan Arduino. Lanjut kumpulin bahan-bahannya yuk...
Bahan-bahan dapat disesuaikan dengan yang ada dirumah aja jangan kaku sampe harus beli (walau murah tinggal klik olshop). Rangkaian nya sangat simple karena akan menggunakan pin I/O nomer 2-8 sebagai BARIS dan pin 9-13 sebagai KOLOM dari led matrix. Sebaiknya jika bingung prinsip penyalaan LED MATRIX bisa dibaca dulu dasarnya disini.
Karena Arduino Pro Mini yg saya gunakan memakai header cowok maka sangat simple menyambungkannya ke Led Matrix dengan menggunakan kabel jumper cewek ke cewek. Tinggal colok seperti gambar dibawah. Kalau pake arduino jenis lain tinggal sesuaikan saja.
Mari kita bahas scriptnya secara mendalam..jangan sampe pusing ya ! Pegangan kalau kepala sudah muncul bintang nya..hehehe
Untuk menyusun karakter diatas anda butuh mengunduh software TextToBit yang saya kerasikan disini. Jadi saya ingin membuat animasi jantung berdenyut dengan 2 frame karakter yang dinyalakan bergantian (kalau mau banyak ya lebih keren juga). Jadi prinsipnya menyusun BIT sedemikian rupa agar karakter terwakili pada led dengan kombinasi 7 output BARIS (HIGH) vs 5 output KOLOM (LOW). Perhatikan gambar berikut ya ...
Dari gambar dapat dibayangkan bahwa BIT biner pada array (BARIS) diatas menunjukkan nilai 1 berarti LED NYALA dan sebaliknya. Selanjutnya akan di scanning KOLOM nya satu persatu secara cepat dan mata melihat sebagai satu gambar utuh. Karena Matrix yg kita gunakan 7x5 maka cukup menggunakan 7 bit saja per baris.
Tujuan membuat array yang isinya PIN I/O untuk kolom dan baris adalah memudahkan proses geser BIT saat scanning dan penyalaan LED. Ini karena arduino menggunakan penamaan PIN sebagai Port I/O tersendiri bukan seperti Attiny dan microcontroler AVR lainnya yg PORT disesuaikan dengan register portnya masing-masing selebar 8 bit sehingga mudah melakukan operasi geser bit. Ini bedanya tukang solder yg pernah belajar microcontroller menggunakan bahasa assembly dengan yang langsung lompat menggunakan arduino. Kalau anda langsung menggunakan Arduino mungkin akan kebingungan memahaminya.
Kita akan bahas baris per baris fungsi diatas agar gampang memahaminya.
void tulis(int lama, byte *dot)
Lama = waktu lama for loop dijalankan agar menunjukan lama tampilnya sebuah karakter.
*dot = Pointer ke array yang akan melewatkan 7 bit baris karakter
Terdapat 4 buah FOR LOOP yaitu :
a = Loop lama tampil sebuah karakter
b = Scanning KOLOM
c = Geser kolom (LOW)
d = Geser baris (HIGH)
Kita akan breakdown for loop C dan D :
for( int c=0;c<5 ; c++){
if( c == b) digitalWrite(kolomnya[c],LOW );
else digitalWrite(kolomnya[c],HIGH );
}
Ketika scanning kolom satu persatu maka yg bergerak adalah memberikan pin i/o sebagai LOW / 0, jadi kalau diberikan perintah secara manual akan menjadi :
if ( b == 0 ) {
digitalWrite(KOLOM1, LOW);
digitalWrite(KOLOM1, HIGH);
digitalWrite(KOLOM1, HIGH);
digitalWrite(KOLOM1, HIGH);
digitalWrite(KOLOM1, HIGH);
}
else if ( b == 1 ) {
digitalWrite(KOLOM1, HIGH);
digitalWrite(KOLOM1, LOW);
digitalWrite(KOLOM1, HIGH);
digitalWrite(KOLOM1, HIGH);
digitalWrite(KOLOM1, HIGH);
}
else if ( b == 2 ) {
digitalWrite(KOLOM1, HIGH);
digitalWrite(KOLOM1, HIGH);
digitalWrite(KOLOM1, LOW);
digitalWrite(KOLOM1, HIGH);
digitalWrite(KOLOM1, HIGH);
}
else if ( b == 3 ) {
digitalWrite(KOLOM1, HIGH);
digitalWrite(KOLOM1, HIGH);
digitalWrite(KOLOM1, HIGH);
digitalWrite(KOLOM1, LOW);
digitalWrite(KOLOM1, HIGH);
}
else if ( b == 4 ) {
digitalWrite(KOLOM1, HIGH);
digitalWrite(KOLOM1, HIGH);
digitalWrite(KOLOM1, HIGH);
digitalWrite(KOLOM1, HIGH);
digitalWrite(KOLOM1, LOW);
}
Terlalu panjang, namun mudah dimengerti dan merupakan terjemahan isi dari FOR LOOP C yang hanya 4 baris saja.
for(int d=0;d<7;d++) {
digitalWrite(barisnya[d], ((1<<d) & dot[b]) >> d );
}
For Loop D memiliki keunggulan geser bit dengan hanya sebaris script, tapi untuk memahaminya butuh penjabaran yaitu :
GESER BIT 1 : (1<<d) & dot[b]
GESER BIT 2 : >> d
Semisal nih..7 BIT baris yg akan dinyalakan adalah 0b0001100 , dimana 0 = mati , 1 = nyala. Sehingga kita perlu mengetahui bit yg sesuai dengan PIN i/o yg bersesuaian juga. Inilah hubungan kita membuat ARRAY yg berisikan nomer PIN.
Jadi dengan 7 kali loop maka kita akan tau PIN BARIS ke X itu mati atau nyala. Penejelasannya seperti berikut :
saat d=0 , maka angka 1 geser kiri sebanyak 0 kali = 0000001 , lanjut di AND dengan isi semuanya 0001100 hasilnya = 00000000, kemudian geser kanan semuanya sebanyak 0 kali hasilnya PIN BARIS1 = 0 /MATI
saat d=1 , maka angka 1 geser kiri sebanyak 1 kali = 0000010 , lanjut di AND dengan isi semuanya 0001100 hasilnya = 00000000, kemudian geser kanan semuanya sebanyak 1 kali hasilnya PIN BARIS2 = 0 /MATI
saat d=2 , maka angka 1 geser kiri sebanyak 2 kali = 0000100 , lanjut di AND dengan isi semuanya 0001100 hasilnya = 00000100, kemudian geser kanan semuanya sebanyak 2 kali hasilnya PIN BARIS3 = 1 /NYALA
saat d=3 , maka angka 1 geser kiri sebanyak 3 kali = 0001000 , lanjut di AND dengan isi semuanya 0001100 hasilnya = 00001000, kemudian geser kanan semuanya sebanyak 3 kali hasilnya PIN BARIS4 = 1 /NYALA
saat d=4 , maka angka 1 geser kiri sebanyak 4 kali = 0010000 , lanjut di AND dengan isi semuanya 0001100 hasilnya = 00000000, kemudian geser kanan semuanya sebanyak 4 kali hasilnya PIN BARIS5 = 0 /MATI
saat d=5 , maka angka 1 geser kiri sebanyak 5 kali = 0100000 , lanjut di AND dengan isi semuanya 0001100 hasilnya = 00000000, kemudian geser kanan semuanya sebanyak 5 kali hasilnya PIN BARIS6 = 0 /MATI
saat d=6 , maka angka 1 geser kiri sebanyak 6 kali = 1000000 , lanjut di AND dengan isi semuanya 0001100 hasilnya = 00000000, kemudian geser kanan semuanya sebanyak 6 kali hasilnya PIN BARIS7 = 0 /MATI
Seperti itulah proses geser BIT sehingga tiap LED dapat ditentukan mati dan nyalanya .
delay(2);
blank();
delay(1);
Fungsi blank mengatasi kelembaman mata yg menyebabkan efek LED berbayang (saking cepetnya ) dengan cara mematikan semua LED saat akan pindah 7 bit Baris selanjutnya
void blank ()
{
digitalWrite(BARIS1,LOW);
digitalWrite(BARIS2,LOW);
digitalWrite(BARIS3,LOW);
digitalWrite(BARIS4,LOW);
digitalWrite(BARIS5,LOW);
digitalWrite(BARIS6,LOW);
digitalWrite(BARIS7,LOW);
}
- Sedangkan untuk LOOP utama cukup singkat aja
void loop() {
tulis(10,love1);
tulis(10,love2);
}
- Hasilnya :
Selanjutnya ada fasilitas text geser kanan dan naik
Tinggal mengolah sedikit script pada tulisan sebelumnya di 2011 di link disini.