Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

  • IC Timer 555 yang Multifungsi

    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

  • Data Science

    Mengulik Digitalisasi data statistik dengan bantuan python untuk pemanfaatan di bidang transportasi, kesehatan, keuangan dan masih banyak lagi

  • Artificial Intelligence - Pengenalan Object

    Menghadirkan pemanfaatan AI dengan praktek-praktek yang mudah diikuti - cocok untuk mahasiswa yang mencari ide tugas akhir

  • JAM DIGITAL 6 DIGIT TANPA MICRO FULL CMOS

    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

  • Node Red - Kontrol Industri 4.0

    Teknologi kontrol sudah melampaui ekspektasi semua orang dan dengan kemajuan dunia elektronika, kini semakin leluasa berkreasi melalui Node Red

Sabtu, 22 Januari 2022

Memperbaiki Aki Kering Dengan Alat Sederhana - Part 1 - Cek Elektrolit

 



Tidak dipungkiri lagi baterai - accu alias aki merupakan barang yang kita anggap sebagai sesuatu yg "remeh" dan harganya tidak terlalu mengkhawatirkan kantong - soak ya buang aja ke tempat sampah. Padahal bisnis daur ulang aki semakin lama semakin menggiurkan terutama mereka kaum "35" yang sangat berani atau bisa dibilang nekat bermain dengan benda elektro-kimia yang dalam dunia limbah merupakan kategori B3. Namun karena prinsip mereka sampah bisa jadi uang ya mau tidak mau harus diakui, banyak dari mereka - suku yg berasal dari timur kota Surabaya itu terkenal jago mendaur ulang aki bekas. Dengan modal keliling kampung mencari aki bekas yg dibuang atau diloak dengan cuman 5000 perak saja, dapat menjadi penghasilan yg menggiurkan, baik dengan cara memperbaiki akinya maupun mendaur ulang timbal untuk dijual kembali ke industri yg memerlukan.


- Aki kering itu tidak "kering" 

 


Aki atau baterai sel basah dalam istilah inggrisnya dinamakan sebagai Lead-Acid Battery dimana terdapat pelat timbal dengan larutan elektrolit berupa Asam Sulfat ( H2SO). Kesalah pahaman yg umum di Indonesia adalah ketika motor jaman now kebanyakan menggunakan aki kering dan kebanyakan orang mengira kalau baterai kering itu seperti baterai sel kering yg biasa dipakai pada lampu senter. 

Sebenarnya aki kering ini nama yang betul adalah aki MF - Maintenance Free dimana produsen sudah memperkirakan aki akan aman cairan elektrolitnya selama masa pakai 2 - 3 tahun jadi tidak perlu menambahkan air aki (demin water) untuk menjaga level elektrolit seperti halnya aki basah. Selebihnya prinsip Lead-Acid baterai tetap sama dengan tambahan katup pengaman agar cairan elektrolit tidak tumpah.


- Proses Kimia 




Wah kembali ke pelajaran menakutkan masa SMA nih, namun saya persingkat saja dengan menggambarkan aki saat bekerja menghidupkan lampu maka reaksi kimia memecah elektrolit menjadi aliran elektron pada rangkaian listrik. Akibatnya lama kelamaan elektrolit melepaskan H2O alias air dan menguap akibat panas reaksi. Juga plat Timbal (Lead) akan tertempel Sulfat dari cairan asam sulfat. Ini menyebabkan air aki pada aki basah akan cenderung habis seiring waktu. Atau pada aki MF yg lebih tertutup, elektrolit akan menjadi H2O alias air. Sehingga diperlukan penggantian elektrolitnya asalkan timbal nya tidak terlalu tertutup penuh dengan sulfat.


- Penambahan elektrolit




Untuk aki kering yg sekiranya tegangan belum turun dari 12.5 volt atau berusia kira-kira 2 tahun namun masih bisa buat dobel starter motor, sebaiknya dicek elektrolitnya agar kemudian kita bisa menambah usianya. Cara menambah elektrolit banyak dijadikan konten youtube dan bisa dilihat cara membuka segel aki MF. Pengalaman penulis, elektrolit yg ditambahkan berupa air aki merah (zuur / h2so4) + air aki biru (demin water) dengan perbandingan zuur:aqua = 1:1 . Terdapat 6 lubang aki yang menandakan tiap sel mengasilkan tegangan sekitar 2 volt.




Buang dulu elektrolit yg lama menggunakan suntikan 12 mili dan tambahkan elektrolit sampai lumayan terlihat dari atas (jangan penuh). Jika memiliki multitester atau voltmeter maka bisa diukur antar lubang memiliki tegangan diatas 2 volt. Jangan lupa mengembalikan tutup lobang sel aki dan mengelem segel aki menggunakan lem alteco, lem korea atau lem besi.




Bagaimana jika tegangan dibawah 12 volt ? Ahh saya sudah coba tambah air aki dan tetap aja aki ngedrop ! Tenang...tenang...pake cara kaum 35 saja, mereka pede kok menjual aki bekas / rekondisi yg 1 hari dipakai langsung ngedrop!..heheheh. Jadi ilmu per-aki-an masih panjang ceritanya dan kuncinya adalah sabar mengikuti langkah-langkah pada bagian selanjutnya. Selamat mencoba !  


selanjutnya : Teori pengisian baterai 


Share:

Selasa, 16 November 2021

MQTT Data Simulator Menggunakan Python - PahoMqtt

 



Kadang kalanya para penggiat IOT adalah mereka yang tidak berhubungan langsung dengan benda yg bernama mikrokontroler maupun sensor. Ya benar saja kenyataan ini terjadi akibat semakin melebarnya topik sensor 8 bit ke dunia koding yg semakin menjangkau mereka yg biasanya hanya terkoneksi dengan komputer PC saja. Akibatnya para "koder" yg jago ini menjadi kewalahan dalam memperoleh data pembacaan sensor kecuali bekerjasama dengan mereka yg sering bekerja dengan sensor dan mikrokontroler. Padahal kalau dilihat kemampuan orang yg mempunyai latar belakang koding informatika akan menghasilkan program yg lebih rapi pada umumnya. 


Lalu bagaimana menghasilkan data pembacaan sensor tanpa menggunakan mikrokontroller? Mudah saja sebenarnya karena kita dapat memanfaatkan bahasa pemrograman apapun untuk menciptakan data numerik random yang menyerupai data pembacaan sensor. Namun kendalanya adalah bahasa pemrograman paling mudah dan ready untuk komunikasi sensor secara IOT apa ya ? Jawabannya adalah python yg sering saya gunakan untuk mengolah data IOT menggunakan protokol MQTT, seperti pada pembahasan sebelumnya disini : https://www.aisi555.com/2020/07/tutorial-menggambar-grafik-data-arduino.html


Jadi untuk komunikasi berbasis MQTT sudah tersedia library /package siap pakai bernama paho MQTT.


pip install paho-mqtt


Diatas merupakan cara untuk menginstall packagenya pada console python anda. Sedangkan untuk membuat angka pembacaan sensor secara random bisa menggunakan script berikut:



from random import randrange

suhu = float( randrange(250,350,2) / 10)
humi = randrange(50,95,2)

Jadi dengan menggabungkan pahomqtt dan  randrange kita bisa memperoleh simulasi pembacaan sensor yg datanya dapat dicoba pada MQTT explorer atau IOT MQTT PANEL pada smartphone anda.



import paho.mqtt.client as mqtt
from time import sleep
from random import randrange

# Inisialisasi broker 
broker_address="broker.hivemq.com" 
broker_port=1883

def on_publish(client,userdata,result):                   #create function for callback
    print("data terkirim ke broker")
    pass

client1= mqtt.Client(f'unesa-client-{randrange(0,100)}')  #clientnya harus random
client1.on_publish = on_publish                           #assign function to callback
client1.connect(broker_address,broker_port)               #establish connection
while 1:                                                  #loop terus sambil kirim data
    suhu = float( randrange(250,350,2) / 10)              #random suhu dan kelembaban
    humi = randrange(50,95,2)
    ret= client1.publish("/testyuk/suhu",suhu)            #PUB suhu ke topik /testyuk/suhu
    sleep(3)
    ret= client1.publish("/testyuk/humi",humi)            #PUB Kelembaban ke topik /testyuk/humi
    sleep(3)         


Jangan lupa untuk membuat nama client     client1= mqtt.Client("unesa123")  yg unik agar tidak sama dengan nama client orang lain.  Hasilnya seperti berikut ini :








Share:

Senin, 20 September 2021

Praktek Input/Output Led Matrix - Nostalgia Berbagi Ilmu 10 Tahun Yang Lalu

 


Sebelum negara api menyerang dan menjadi pusat produksi segala macam benda elektronika, Led Matrix seperti gambar diatas sangat umum ditemukan,  disusun berderet dengan microcontroller sebagai otaknya. Ini menjadi handalan banyak penggiat bisnis elektronika - display digital atau signage dan baliho marketing yg dipasang di jalan - jalan. Keleluasaan untuk mengkreasikan banyak karakter dan animasi menarik diatasnya membuat menjadi sasaran akhir mereka yang belajar microcontroler di era sebelum 2010. Namun ketika modul display led matrix siap pakai seperti : P10, P8 dan sebagainya, didukung dengan harga yang dibilang tak masuk akal murahnya, membuat para seniman teks digital menjadi dimanjakan. Cukup gunakan jari untuk mengimpor via smartphone, lalu plug and play saja.

Namun blog ini tetap bertujuan utama berbagi ilmu bagaimana cara kerja Led Matrix dan bagaimana menyusunnya menjadi display yang menarik. beberapa tulisan mengenai Led Matrix ada pada link berikut : 





Mengingat itu semua terutama video yg saya buat pada 2009 diatas membuat sedikit sentimentil dan emosional, karena banyaknya rekan mahasiswa bertanya ilmu Led Matrix yg saya bagi di forum kaskus (sebelum saya pindah ke blog ini). Ada yang dari jogja, semarang, bali, sampai aceh hingga gorontalo memesan komponennya ke saya dan berdiskusi mengenai cara membuat teks berjalan pada Led Matrix. Ini menjadi kebanggaan sendiri karena beberapa yg sukses belajar led matrix menjadikan tolak ukur keberhasilan telah dipahaminya  konsep dasar mikrokontroller dan siap untuk mendesain apapun setelahnya.

Kali ini saya akan menjelaskan kembali praktek lovehurt 2011 dengan sedikit penjelasan agar lebih mudah dimengerti, diawali dengan melihat bagaimana flowchart untuk menuliskan karakter pada sebuah Led Matrix.



Penjelasan :

Pada dasarnya Led Matrix adalah Led yang disusun berdasarkan konsep Row dan Column, dimana untuk menyalakan satu buah led diberikan tegangan 2.4 Volt pada R dan 0 Volt pada C. Jadi untuk menyalakan R5C3 harus terjadi forward voltage dari R5 ke C3 sehingga Led menyala.

Untuk membuat sebuah karakter misal huruf A, dapat menggunakan tools bantuan excel seperti dibawah ini :



File excel dapat diunduh disini.

Selanjutnya akan dilakukan proses scanning dari kolom C1 menuju C5 secara cepat, bergantian memberikan logic LOW pada 1 kolom dan Logic HIGH untuk kolom lainya, bersamaan juga merubah nilai PORT yang mewakilinya, seperti pada skematik praktek kita kali ini menggunakan PORT D sebagai Row dan PORT B sebagai Column nya.




Rangkaian diatas sudah disesuaikan dengan penomeran kaki Led Matrix  7x5 (warna merah)  ukuran 2 inch yang umum dipasaran. Bagaimana script untuk menampilkan huruf A seperti contoh excel diatas ?


#define F_CPU 1000000UL      // frekuensi clock internal 1Mhz
#include <avr/io.h> // definisi library standar IO port
#include <util/delay.h> // definisi include untuk delay

char huruf[]=
{ 0b1111110,
0b0001001,
0b0001001,
0b0001001,
0b1111110 };


int main(void)
{
 DDRD = 0b1111111; // untuk baris
 DDRB = 0b11111;  // untuk kolom

 PORTD =0; // Set all pins low
 PORTB =0b11111; //matikan semua led
    
    
 uint8_t a;
 
 while(1)
 { 


  //proses Scan dan tampilkan huruf
   for(a=0 ; a<5 ; a++)    
     
  {

   PORTB = ~(1<<a) ; //scan kolom active LOW
   PORTD = huruf[a]; //Tampilkan baris sesuai nilai array[kolom]
   _delay_ms(2);
   
  }     
 }	
}		

Permaianan kombinasi loop FOR akan sangat berguna dalam membuat animasi geser kanan atau kiri, seperti yang sudah saya jelaskan pada tulisan sebelumnya disini : https://www.aisi555.com/2012/12/script-break-down-episode-love-hurt.html. Atau jika kamu menggunakan arduino uno atau micro, dapat mempelajari pembahasan saya menyeluruh di tulisan saya disini : https://www.aisi555.com/2020/05/praktek-love-hurt-2020-remake-pake.html.


Yah jadi nostalgia deh sedikit mengenang masa lalu...yang penting saya bangga dapat berbagi ilmu bersama kalian pembaca setia blog ini.
Share:

Minggu, 19 September 2021

Lanjutan Praktek Input Output - Jam 4 Digit Dengan Tombol Non Blocking

 



Apa gak bosen kali ya saya menulis tentang jam digital  ?  Kalu dipikir memang saya maniak per-jam-an digital, dari yg paling sederhana pake delay sampai yg murni tanpa microcontroller, FULL CMOS. Saya rangkum dulu deh isi blog ini yg membahas jam mana saja...



Wah masih banyak lagi yang tidak saya sebutkan karena panjang, cek aja sendiri pasti banyak ketemu pembahasan tentang jam yang keseluruhannya memanfaatkan register timer pada microcontroller sekelas AVR.  Kali ini saya akan melanjutkan praktek I/O pada microcontroller Attiny2313 dengan melengkapi 7 segmen agar lebih bermanfaat yaitu ketika digabung beberapa buah menjadi jam yg dapat digunakan. Rangkaiannya seperti berikut ini.




Metode yang sangat terkenal saat pin I/O terbatas adalah metode scanning cepat, dimana tiap display 7 segmen ditampilkan secara bergantian. Jadi ke 7 kaki segmen dari masing-masing display 7 segmen terhubung semuanya. Sedangkan untuk melakukan penyalaannya diberikan tegangan pada common anoda secara satu-persatu dengan kecepatan tinggi sehingga menipu mata kalau nyalanya bareng. Jadi logikanya sesuai flowchart berikut :



Proses scanning penjelasannya seperti berikut :


  • Bagi nilai jam dengan 10 untuk mendapatkan puluhan jam, kemudian aktifkan PB#0, sedangkan PB#1,2,3 OFF. Nilai 7 segmen adalah segmen[puluhan_jam]
  • Ambil sisa pembagian jam dengan 10, kemudian aktifkan PB#1, sedangkan PB#0,2,3 OFF. Nilai 7 segmen adalah segmen[satuan_jam]
  • Bagi nilai menit dengan 10 untuk mendapatkan puluhan menit, kemudian aktifkan PB#2, sedangkan PB#0,1,3 OFF. Nilai 7 segmen adalah segmen[puluhan_menit]
  • Ambil sisa pembagian menit dengan 10, kemudian aktifkan PB#3, sedangkan PB#0,1,2 OFF. Nilai 7 segmen adalah segmen[satuan_menit]

Scriptnya seperti berikut ini :


#define F_CPU 1000000UL      // frekuensi clock internal 1Mhz
#include <avr/io.h> // definisi library standar IO port
#include <util/delay.h> // definisi include untuk delay
#include <avr/interrupt.h>
#include <stdlib.h>

int jam=23, menit=59, detik=50; //variable global untuk menyimpan data2 waktu


//susunan segmen dari portD = GFEDCBA
//7 segmen common ANODA


uint8_t segmen[11]= 
	{0b1000000, // 0
	0b1111001, // 1
	0b0100100, // 2
	0b0110000, // 3
	0b0011001, // 4
	0b0010010, // 5
	0b0000010, // 6
	0b1111000, // 7
	0b0000000, // 8
	0b0010000, //9
	0b1111111}; // 10 / blank



ISR(TIMER1_COMPA_vect)  // 1 detik
{

	detik ++;

	if ( detik == 60)
	{       detik=0;
		menit++;
	}

	if ( menit == 60)
	{       menit = 0;
		jam++ ;
	}
	
	if (jam >23) jam=0;
}

int main(void)
{
    DDRD |= (1<<PD6) |(1<<PD5) |(1<<PD4) |(1<<PD3) |(1<<PD2) |(1<<PD1) | (1<<PD0) ; //segmen
    DDRB |= (1<<PB0) | (1<<PB1) |(1<<PB2) |(1<<PB3) | (1<<PB6) ; //Scan 7 segmen
    DDRB &= ~(1<<PB4) & ~(1<<PB5); // tombol tambah menit dan jam
    
    TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode
    TIMSK |= (1 << OCIE1A); // Enable CTC interrupt
    OCR1A  = 15625; //compare the CTC A for 1 second 
    TCCR1B |= (1 << CS11)|(1 << CS10); // Start timer at Fcpu/64

	//untuk tombol anti blocking
	uint16_t waktu =0;  
	bool pencet = false;

	sei(); //start interrupt
   
		
   while (1) 
{ PORTD = segmen[10]; //blanking biar tidak membayang PORTB |=(1<<PB0); //nyalakan 7 segmen no 1 (puluhan jam) PORTB &= ~(1<<PB1) & ~(1<<PB2) & ~(1<<PB3) ; PORTD = segmen[jam / 10]; //ambil nilai puluhan jam _delay_ms(1); //delay disesuaikan terang tampilan 7 seg PORTD = segmen[10]; PORTB |=(1<<PB1); //nyalakan 7 segmen no 2 (satuan jam) PORTB &= ~(1<<PB0) & ~(1<<PB2) & ~(1<<PB3) ; PORTD = segmen[jam % 10]; //modulus atau sisa untuk satuan jam _delay_ms(1); PORTD = segmen[10]; PORTB |=(1<<PB2); //nyalakan 7 segmen no 3 (puluhan menit) PORTB &= ~(1<<PB0) & ~(1<<PB1) & ~(1<<PB3) ; PORTD = segmen[menit / 10]; //ambil nilai puluham menit _delay_ms(1); PORTD = segmen[10]; PORTB |=(1<<PB3); //nyalakan 7 segmen no 4 (satuan menit) PORTB &= ~(1<<PB0) & ~(1<<PB1) & ~(1<<PB2) ; PORTD = segmen[menit% 10]; //modulus atau sisa untuk satuan jam _delay_ms(1); //Tombol if (bit_is_set(PINB, PINB5)) { if(pencet == false) { jam++; if(jam==24) jam =0; } pencet=true; waktu=TCNT1; } if (bit_is_set(PINB, PINB4)) { if(pencet == false) { menit++; if(menit==60) menit=0; } pencet=true; waktu=TCNT1; } if(abs(waktu - TCNT1) > 4000) { //non blocking delay tombol waktu=0; pencet = false; } //blink Led Pemisah Jam : menit if(TCNT1 <7500) PORTB |=(1<<PB6); else PORTB &= ~(1<<PB6); } }

*) catatan :

  • clock yg digunakan adalah RC oscillator  internal pada attiny2313 yg sangat tidak akurat, untuk itu jika menggunakan nilai yg akurat bisa menggunakan xtal oscillator seperti praktek jam lainnya dan jangan lupa merubah fusebit seperti penjelsan disini  dan jika menggunakan USBASP maka butuh batuan fusebit calculator disini .
  • Jika menggunakan clock 4 MHZ maka nilai fusebitnya :


  • Sedangkan perubahan untuk menyesuaikan clock dilakukan pada script dibagian ini :

#define F_CPU 4000000UL
==========================================
			
	TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode
	TIMSK |= (1 << OCIE1A); // Enable CTC interrupt
	OCR1A  = 62499; //compare the CTC A (clock 4 Mhz)
	TCCR1B |= (1 << CS11)|(1 << CS10); // Start timer at Fcpu/64

	
  • Non blocking delay pada tombol akan berpengaruh pada tampilan yang tidak terlihat kedip saat tombol dipencet, seperti animasi paling atas dimana saya menggunakan  _delay_ms(300); setelah penekanan tombol.

Share:

Jumat, 17 September 2021

Lanjutan Praktek Dasar Input / Output - 7 Segmen Serta Penjelasan Blocking Delay

 



7-segmen Display , atau indikator tujuh-segmen, adalah suatu bentuk perangkat tampilan elektronik untuk menampilkan angka desimal. 7-segmen display yang banyak digunakan dalam jam digital, meter elektronik, dan perangkat elektronik lainnya untuk menampilkan informasi numerik. Pada umumnya 7 segmen merupakan kumpulan Led yang disusun sehingga terbentuk rangkaian yg dapat dipilih secara elektronik untuk menampilkan suatu digit desimal.



Dalam penjelasan praktek kali ini kita akan menggunakan 7 segmen komon anoda / positif dengan susunan rangkaian yang saya pakai masih menyambung dari praktek sebelumnya.




Untuk menampilkan angka digit 0 - 9 saat terjadi penekanan tombol, pola pikir yang digunakan sesuai dengan flowchart berikut ini :





Penjelasan:

  • Input tetap berupa tombol, posisi di PIN B#1.
  • 7 segmen dihubungkan pada output PORT D#0 sampai D#6.
  • Tiap segmen dihubungkan dengan kondisi nyala mati sedemikian rupa sehingga menampilkan digit angka 0,1,2,3,4,5,6,7,8,9 .
  • Tiap digit desimal segmen di masukkan kedalam Array Segmen[10] yang isinya susunan segmen penyusun digit dan kemudian ditampilkan sesuai variabel angka.
  • Ketika ada penekanan tombol maka variabel angka akan increment / nambah sampai kondisi angka >9 di reset kembali menjadi 0.


Scriptnya seperti berikut ini :

#define F_CPU 1000000UL      // frekuensi clock internal 1Mhz
#include <avr/io.h> // definisi library standar IO port
#include <util/delay.h> // definisi include untuk delay



//susunan segmen dari portD = GFEDCBA
//7 segmen common ANODA


uint8_t segmen[10]= {0b1000000, // 0
		     0b1111001, // 1
		     0b0100100, // 2
		     0b0110000, // 3
		     0b0011001, // 4
		     0b0010010, // 5
		     0b0000010, // 6
		     0b1111000, // 7
		     0b0000000, // 8
		     0b0010000}; // 9
int main(void)
{
   
   DDRD |= (1<<PD6) |(1<<PD5) |(1<<PD4) |(1<<PD3) |(1<<PD2) |(1<<PD1) | (1<<PD0) ; // 7 seg
   DDRB &= ~(1<<PB1);  //tombol
   
   uint8_t a =0;
   
    while (1) 
    {
		
		
		if(bit_is_set(PINB,PINB1)) { 
		      a++;	
		      if(a==10) a=0;
		      _delay_ms(300);
		    }
		
       PORTD = segmen[a]; //Tampilkan segmen
    }      }

Penjelasan :

  • Hal yang mungkin cukup spesial adalah array segmen[10] dengan 10 buah anggota, yang merupakan susunan segmen yang jumlahnya 7, sehingga sedemikian rupa untuk menampilkan digit 6, maka PORT D#0, D#2, D#3, D#4, D#5, D#6 diberikan logika 0 (ingat komonnya anoda /positif) sehingga segmen ini menyala. Sedangkan PORT D#1 diberikan logika HIGH (5 volt ) alias sama dengan commonnya dan menyebabkan LED segmennya mati.




  • Saat ada penekanan tombol pada PIN B#1 maka variabel angka akan berubah dan PORTD nilainya diubah sesuai angka binary yang diwakilkan oleh array segmen[angka], yang artinya jika angka bernilai 6, maka PORTD bernilai 0b0000010.  


Bagaimana jika saya ingin membuat perubahan digit berjarak 1 detik ? Kita akan bandingkan 2 tipe, yaitu dengan Blocking Delay serta dengan Timer Register.


BLOCKING DELAY

#define F_CPU 1000000UL      // frekuensi clock internal 1Mhz
#include <avr/io.h> // definisi library standar IO port
#include <util/delay.h> // definisi include untuk delay



//susunan segmen dari portD = GFEDCBA
//7 segmen common ANODA


uint8_t segmen[10]= {0b1000000, // 0
		     0b1111001, // 1
		     0b0100100, // 2
		     0b0110000, // 3
		     0b0011001, // 4
		     0b0010010, // 5
		     0b0000010, // 6
		     0b1111000, // 7
		     0b0000000, // 8
		     0b0010000}; // 9

int main(void)
{
   
   DDRD |= (1<<PD6) |(1<<PD5) |(1<<PD4) |(1<<PD3) |(1<<PD2) |(1<<PD1) | (1<<PD0) ;
   DDRB |= (1<<PB0); //led
   DDRB &= ~(1<<PB1);  //tombol
   
   uint8_t angka;
   
    while (1) 
    {
		
		
		for(angka=0 ; angka<10 ; angka++){
			
	                 PORTD=segmen[angka];
			_delay_ms(1000);
		}
		
		if(bit_is_set(PINB,PINB1)) PORTB |=(1<<PB0);
		else PORTB &= ~(1<<PB0);
		
		
    }
}

Penjelasan :

  • Loop for(angka=0 ; angka<10 ; angka++)  merupakan cara untuk melakukan pengulangan dan penambahan variabel angka secara satu persatu dari 0 sampai nilai maksimum 9. 
  • Delay 1000 mili second diberikan setiap loop for dan ini merupakan blocking delay atau menghentikan semua jalannya program mikrokontroller selama 1 detik.
  • Perintah dibawah loop For merupakan proses menunggu penekanan tombol dan perubahan LED pada Port B#0, dan karena terjadi blocking delay, maka penekanan tombol kadang tidak terbaca seperti animasi berikut.


 

  • Untuk mengatasi blocking delay maka dapat memanfaatkan fasilitas timer pada microcontroller.


Non Blocking Delay Menggunakan Timer



#define F_CPU 1000000UL      // frekuensi clock internal 1Mhz
#include <avr/io.h> // definisi library standar IO port
#include <util/delay.h> // definisi include untuk delay
#include <avr/interrupt.h> // library interupt timer



//susunan segmen dari portD = GFEDCBA
//7 segmen common ANODA


uint8_t segmen[10]= {0b1000000, // 0
		     0b1111001, // 1
		     0b0100100, // 2
		     0b0110000, // 3
		     0b0011001, // 4
		     0b0010010, // 5
		     0b0000010, // 6
		     0b1111000, // 7
		     0b0000000, // 8
		     0b0010000}; // 9

uint8_t angka=0;


ISR(TIMER1_COMPA_vect) // interupt jalan independen tiap selang 1 detik

{
 PORTD = segmen[angka];
 angka++;
 if(angka==10) angka=0;

}


int main(void)
{
   
   DDRD |= (1<<PD6) |(1<<PD5) |(1<<PD4) |(1<<PD3) |(1<<PD2) |(1<<PD1) | (1<<PD0) ;
   DDRB |= (1<<PB0);
   DDRB &= ~(1<<PB1);  
   
      TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode
      TIMSK |= (1 << OCIE1A); // Enable CTC interrupt
      OCR1A  = 15625; //compare the CTC A for 1 second
      TCCR1B |= (1 << CS11)|(1 << CS10); // Start timer at Fcpu/64
   
    sei();  //mulai membaca interupt
    while (1) 
    {
		//penekanan tombol
		
		if(bit_is_set(PINB,PINB1)) PORTB |=(1<<PB0);
		else PORTB &= ~(1<<PB0);
	
		
    }
}


   

Penjelasan :

  • Mikrokontroler memiliki fasilitas counter & timer internal, dan akan berjalan secara independen.
  • Tiap tick/clock akan diatur sedemikian rupa sehingga counter didalamnya dapat melakukan delay sesuai nilai yang ditentukan, semisal contoh diatas tiap 1 detik atau clock counter 15625 maka akan men-trigger fungsi interupt  ISR(TIMER1_COMPA_vect).
  • Hasilnya pada loop utama saat penekanan tombol tidak akan terpengaruh seperti pada animasi berikut ini.




Selamat Mencoba ...
Share:

Penjelasan Proses Input Output Dan Register I/O Pada Microcontroller AVR

 



Proses Input dan Output pada sebuah microcontroller dapat dipastikan melibatkan perubahan dan akses pembacaan dari REGISTER I/O . Ini tentu saja bertujuan untuk memudahkan pengaksesan dari semua Port atau Pin I/O pada microcontroller,  dengan cara menautkannya secara hardware pada sebuah alamat memory tertentu. Inilah memory khusus yang dinamakan Register I/O. Perhatikan datasheet dari IC kesayangan saya dibawah ini ATTiny 2313 dimana saya mencuplik Register I/O untuk Port B.




  • PORTB (0x18) : Merupakan Register untuk merubah nilai dari port B ketika berfungsi sebagai output
  • DDRB (0x17) : Merupakan Register untuk merubah arah data tiap Pin pada Port B apakah akan menjadi input atau output
  • PINB (0x19) : Merupakan Register untuk membaca (walau menulis bisa namun jarang) data yg didapatkan pada tiap tiap Pin B apakah bernilai 1 (5Volt) atau 0


Jadi ke 8 buah kaki yang diberi nama PORTB pada microcontroller ATTiny 2313 secara hardware terkoneksi pada 3 buah Register input output seperti gambar diatas. Perhatikan gambar rangkaian berikut ini dimana saya akan menempatkan sebuah LED pada Port B#0 dan sebuah Switch / Tombol (kalau beli di online namanya Tactile Switch)  pada  Port B#1







Penjelasan Rangkaian : 

  1. Vcc terhubung ke tegangan catuan 5 Volt, untuk ATTiny 2313 bisa menggunakan catuan baterai 3 volt atau menggunakan tegangan 5volt yg didapatkan dari downloader USB ASP.
  2. R1 mutlak diperlukan sebagai pengaman LED, nilai berkisar 100 s/d 470 ohm.
  3. Switch diberikan Resistor Pull Down 10Kohm agar mendapatkan default tegangan 0 volt atau Logic LOW saat tidak ada penekanan tombol, dan ketika terjadi penekanan tombol maka PIN microcontroller yg terhubung akan tersambung dengan VCC (5 volt) dan berarti mendapatkan logic HIGH.
  4. AVRISP merupakan header standar menuju programmer ISP seperti yg saya jelaskan sebelumnya disini : https://www.aisi555.com/2021/08/usb-asp-isp-programmer-untuk-avr.html


Bagaimana Flow Chart untuk menghidupkan dan mematikan ( Led Kedip)  LED di PortB#0 ?


Catatan :

Delay merupakan fungsi / routine khusus yg pada compiler atau IDE programming microcontroller yg sudah tersedia dan siap pakai. Pada intinya delay merupakan timer yg BLOCKING yang artinya menghentikan semua proses dan menunggu sampai counternya selesai sesuai nilai waktu yg diberikan. Jadi ingat delay ini sangat tidak disarankan untuk proses yang kompleks karena akan mengehentikan semua proses pada microcontroller.


Scriptnya seperti ini : 


#define F_CPU 1000000UL // frekuensi clock internal 1Mhz
#include <avr/io.h> // definisi library standar IO port
#include <util/delay.h> // definisi include untuk delay


int main(void)

{



	DDRB=0b00000001 ; // Inisialisasi bahwa port B#0 Output
    


	while(1)

	{

		PORTB=0b1; //port B#0 = 1 atau nyala

		_delay_ms(1000); //delay 1 detik
			

		PORTB=0b0; //port B#0 = 0 atau mati

		_delay_ms(1000); //delay 1 detik


	}
	
}

Penjelasan :

  • Langkah pertama adalah menentukan arah data dari PORT B#0 menjadi output dengan perintah DDRB=0b00000001. Ini oleh compiler GCC akan diterjemahkan menjadi menuliskan ke alamat memory Register 0x17 dengan nilai berupa 0b00000001
  • Untuk menyalakan LED di PORT B#0 maka dilakukan penulisan di alamat register PORTB (0x16)  dengan nilai 0b00000001. Agar lebih menyingkat dan lebih bergaya bahasa C yg benar dapat ditulis sebagai :  PORTB = 0x1.
  • Untuk mematikan LED cukup memberikan nilai 0 pada PORTB .


Lalu bagaimana jika Output LED saya tempatkan pada port 5 dan 6 ? Sebaiknya harus membaca penjelasan operasi geser byte disini : https://www.aisi555.com/2012/06/operasi-geser-byte-pada-win-avr-gcc.html. Jadi untuk melakukan blink atau kedip bergantian pada 2 buah LED secara simplenya scriptnya seperti berikut:



#define F_CPU 1000000UL // frekuensi clock internal 1Mhz
#include <avr/io.h> // definisi library standar IO port
#include <util/delay.h> // definisi include untuk delay


int main(void)

{

        // Inisialisasi bahwa port B#5, B#6 Output
DDRB |= (1<<PB5) | (1<<PB6) ; while(1) { PORTB |=(1 << PB5) ; //port B#5 nyala                 PORTB &=~(1 << PB6); //Port B#6 Mati         _delay_ms(1000); //delay 1 detik
		PORTB |=(1 << PB6) ; //port B#6 nyala
                PORTB &=~(1 << PB5); //Port B#5 Mati
        	_delay_ms(1000); //delay 1 detik
} }


Penjelasan :

  • Untuk melakukan SET BIT pada bit tertentu pada sebuat BYTE, maka bisa melakukan operasi geser Byte seperti contoh diatas   DDRB |= (1<<PB5) | (1<<PB6) dimana nilai yg dirubah pada bit ke 5 dan ke 6 saja dengan nilai bit = 1.
  • Jika susah untuk memahami, cukup dengan mengikuti polanya saja, dimana ketika ingin meng "CLEAR" ataui memberikan nilai 0 pada bit tertentu bisa menggunakan pola penulisan        PORTB &= ~(1<<PB5) & ~(1<<PB6) , dimana artinya Port B#5 dan Port B#6 diberikan nilai 0 pada masing-masing bit, tanpa merubah nilai bit disebelahnya yang tidak ikut dalam proses.


 
Bagaimana Flow Chart untuk menerima input pada PIN B#1 dan berinteraksi dengan LED di PORT B#0 ?




Scriptnya sederhana saja seperti berikut :


#define F_CPU 1000000UL // frekuensi clock internal 1Mhz
#include <avr/io.h> // definisi library standar IO port
#include <util/delay.h> // definisi include untuk delay


int main(void)

{
        DDRB |= (1<<PB0) ;   //Port B#0 Output
        DDRB &= ~(1<<PB1) ;  //Pin B#1 Input
while(1)      { if (PINB & (1 << PINB1)) PORTB |=(1 << PB0); // PB#0 Nyala else PORTB &= ~(1 << PB0); //Port B#0 Mati     }  
             }


Penjelasan :

  • if (PINB & (1 << PINB1))  , script ini berarti melihat apakah PIN pada microcontroller diberikan nilai 1 atau SETBIT. Ini merupakan macro standar pada basa GCC - Winavr, yang kemudian disempurnakan lagi menjadi  :  bit_is_set(PINB, PINB1) untuk nilai logic 1 dan bit_is_clear(PINB, PINB1) untuk nilai logic 0. 
  • Kita tidak perlu dipusingkan dengan proses pembacaan pada Register dengan alamat 0x16, ini sudah dipermudah dengan bahasa GCC-Winavr yg sudah menterjemahkan semua nama Mnemonic menjadi alamat registernya.
  • Ingat pada bahasa GCC WINAVR , istilah PORT untuk output, sedangkan PIN untuk input 


Untuk berikutnya silahkan dicoba menjalankan script berikut dan perhatikan apa yg terjadi :



#define F_CPU 1000000UL // frekuensi clock internal
#include <avr/io.h> // definisi standar io port
#include <util/delay.h> // definisi include untuk delay


int main(void)

{


	DDRB |= (1<<PB0) ;   //Port B#0 Output
	DDRB &= ~(1<<PB1) ;  //Pin B#1 Input
	
 bool pencet =false;

	while(1)

	{


		if (bit_is_set(PINB,PINB1) ) {
			
			 if(pencet == false) pencet = true;
			 else pencet = false;
	   		 
			_delay_ms(200);
		}

       if(pencet == true) PORTB |= (1<<PB0);
	   else  PORTB &= ~(1<<PB0);
	


	}
	
}


Script diatas menggunakan variabel boolean   bool pencet =false;  merupakan jenis variabel yg bernilai 1 atau TRUE dan 0 atau FALSE.  Silahkan cari di google atau di blog ini pun sudah dibahas bagaimana cara men - "toogle" atau merubah kondisi dari state BIT sebelumnya dengan teknik yg lebih cepat.  


Selamat Mencoba !
Share:

Kontak Penulis



12179018.png (60×60)
+628155737755

Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (14) antares (11) arduino (28) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) dimmer (5) display (3) esp8266 (26) euro2020 (13) gcc (1) gis (3) gsm (1) iklan (1) infrared (2) Input Output (3) iot (78) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (11) lorawan (2) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (2) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (3) ninmedia (5) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (33) proyek (1) python (9) radio (28) raspberry pi (9) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (2) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) statistik (5) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) telkomiot (5) transistor (2) troubleshoot (3) tulisan (94) tutorial (108) tv digital (6) tvri (2) unesa (8) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3) yolo (9)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika