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

  • Ayo Migrasi TV Digital

    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

  • Bermain DOT Matrix - LOVEHURT

    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.

  • 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, 01 Juni 2013

Tutorial : Komunikasi serial pada microcontroller (praktek via attiny 2313)

Microcontroller memiliki metode untuk berkomunikasi dengan perangkat diluarnya. Salah satu metode komunikasi yang standarnya masih banyak dipakai dan umum digunakan adalah komunikasi asynchronous / UART. 



Terminal Serial Tahun 70-an


Apakah itu UART?


UART adalah mode komunikasi serial secara asynchronous, dimana data (bit) dikirim berurutan secara satu persatu bergantian melalui kabel ganda ( twisted pair Tx & Rx)









UART memiliki kecepatan transfer data yg ditentukan oleh pihak pengirim & penerima yg dinamakan BAUDRATE

Pengirim akan mengirimkan data secara serial, dan penerima akan mengolah data BIT (umumnya 8bit) menjadi data 1byte yg digunakan sesuai keperluan


UART memiliki level TTL 5 volt, dan menggunakan 2 buah I/O port (Tx & Rx)



Sebuah UART biasanya berisi komponen-komponen berikut:

  • Generator clock : biasanya kelipatan dari bit rate untuk memungkinkan pengambilan sampel di tengah periode bit.
  • Register Input Output
  • Kontrol kirim (TX) dan terima (RX)
  • Kontrol logika read write
  • Buffer I/O (opsional)
  • Paralel Bus Buffer (opsional)
  • Buffer First In First Out (FIFO) (opsional)



Apakah itu RS232 ?



RS 232 adalah standar signaling dari sebuah komunikasi serial. Pada umumnya PC keluaran sebelum 2010-an akan memiliki sebuah port serial/RS232. Komunikasi RS232 terbatas hanya untuk beberapa meter saja, dan jika membutuhkan jarak lebih maka membutuhkan protokol lain seperti RS485







Tegangan dari RS232 tidak mengikuti level TTL/5V tetapi seperti gambar



Bagaimana Mengubah level UART ke RS232 ?



Untuk mengubahnya diperlukan level converter sejenis MAX-232. Prinsipnya adalah dengan menggunakan charge pump capasitor.








Alternatifnya adalah menggunakan rangkaian sederhana menggunakan transistor yang pernah dibahas juga di sini



klik untuk memperjelas



Ayo kita berlanjut ke Praktek sebenarnya , karena metode belajar yang paling cepat adalah dengan terjun langsung ke permasalahan dilapangan.




(klik buat memperjelas)


PART LIST :


  1. ATTiny2313
  2. Max232
  3. Xtal7.3278 MHz (xtal lain bisa juga dengan catatan akan timbul error rate beberapa % sesuai datasheet)
  4. Led
  5. Push button
  6. Beberapa buah capasitor 10uF/16 volt  dan resistor 10K
  7. DB-9 Female
  8. Kabel Serial (untuk PC jadul) 
  9. USB to RS232 converter untuk Laptop masa kini




SOURCE CODE akan  kita bahas satu persatu

inisialisasi awal


#define F_CPU 7372800UL //frek xtal yang dipake

#include <avr/io.h>

#include <util/delay.h>

#include <inttypes.h>

#include <avr/interrupt.h>

#include <avr/pgmspace.h> 





//rumus penentuan baudrate



#define USART_BAUDRATE 9600  // baudrate 9600 bps

#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) 









//deklarasi menu & tulisan .

// digunakan memori flash(PROGMEM) karena attiny cukup kecil RAM nya



const char menu[] PROGMEM = " 





\r* AVR ATTiny2312 - Rs232 COM  by: ahocool@gmail.com * 

\r Petunjuk: 

\r ** TRANSMIT: Tekan Tombol Keyboard 1 & 2 untuk On/Off LED 1 & 2 

\r ** RECEIVE: Tekan Tombol Switch untuk Menerima Data dari Micro

\r" ;

const char tombol[] PROGMEM ="

\r Tombol Ditekan 

\r" ; 

const char led1on[] PROGMEM ="

\r LED 1 ON 

\r" ; 

const char led1off[] PROGMEM ="

\r LED 1 OFF 

\r" ; 

const char led2on[] PROGMEM ="

\r LED 2 ON 

\r" ; 

const char led2off[] PROGMEM ="

\r LED 2 OFF 

\r" ; 



int led1, led2 ; //variabel untuk led







Inisialisasi USART dari attiny2313


void init_usart(void)

{



cli();



   UCSRB |= (1 << RXEN) | (1 << TXEN);   // kirim & terima

   UCSRC |= (1 << UCSZ0) | (1 << UCSZ1); 

   UBRRL = BAUD_PRESCALE; 

   UBRRH = (BAUD_PRESCALE >> 8);

   UCSRB |= (1 << RXCIE);  //interupt serial usart

sei();

  }






Routine pengiriman text lewat progmem/flash memory


//function untuk mengirim text single



void USART_Tx(unsigned char data)

{   

    

   while (!(UCSRA & (1<<UDRE)));{} // wait till transmit Data register is empty

    UDR = data; // Send data to the computer



}



//function untuk kirim kalimat



void kirim_text(const char *data)

{

   while (pgm_read_byte(data) != 0x00)

     USART_Tx(pgm_read_byte(data++));

} 








Interupt saat menerima input data serial dari PC


ISR(USART_RX_vect)

{ 

 char databyte;

 

  

 databyte = UDR;  



 

     switch (databyte) // pemilah data yg diterima dari PC       



{



     

    case 0xD : {   // jika yg diterima ENTER (0xD)

             kirim_text(menu) ;

 break; }

    case '1' : {  //jika diterima karakter 1

     

             if(led1 == 0)  // jika kondisi awal 0

             { 

 PORTB ^=(1<<0); //toogle dari kondisi sebelumnya

             kirim_text(led1on) ;//kirim kalimat

 led1=1;

 }

 else

 {

 PORTB ^=(1<<0); //toogle dari kondisi sebelumnya

             kirim_text(led1off) ; //kirim kalimat

 led1=0;

 }

 break; }

    case '2' : {

             if(led2 == 0) // jika kondisi awal 0

             { 

 PORTB ^=(1<<1); //toogle dari kondisi sebelumnya

             kirim_text(led2on) ; //kirim kalimat

 led2=1;

 }

 else

 {

 PORTB ^=(1<<1); //toogle dari kondisi sebelumnya

             kirim_text(led2off) ; //kirim kalimat

 led2=0;

 }

 break; }

      



}  

}  










Interupt saat Tombol ditekan dan mengirim data ke PC


SIGNAL (SIG_INT0) 

{



kirim_text(tombol);  //kirim kalimat bahwa tombol ditekan



}






Program utama / main


int main(void)

{

 



    

 DDRB=0b11;  //B0,B1 = Output ke led



 MCUCR |= (1<<ISC01) | (1<<ISC00) ; //inisialisai interupt 0 rise edge



 GIMSK |= (1<<INT0) ; // tombol ada di INT 0

  



 led1=0;  //kondisi awal led1

 led2=0;  //kondisi awal led2



 init_usart();



 kirim_text(menu) ;



 PORTB=0b00; // matikan LED







while(1) //muter tiada henti

 {

    



 }



return 0;

}











Jika sudah di compile & didownload ke AVR, maka hubungkan output MAX232 ke PORT Serial PC ato port USB-serial Converter. Gunakan Hyperterminal/putty/secureCrt untuk melakukan koneksi ke COM PORT dari serial port/Usb-serial converter dengan setting BAUDRATE 9600bps

Video berikut menampilkan contoh komunikasi serial UART dan RS232 ke PC untuk mengontrol nyala LED dan membaca penekanan tombol.



Share:

Kamis, 30 Mei 2013

SMS Kontrol: Mengirim Perintah ke Micro-AVR Via SMS



Posting ini adalah kelanjutan dari posting terdahulu, kirim SMS via attiny intro disini dan lanjut disini, kali ini kita akan bahas mengenai mode "penerima sms" , dimana micro AVR akan menerima SMS dan melakukan keputusan atau proses berdasarkan parsing teks sms yg dikirim.

Kelemahan mode serial UART yg sebelumnya adalah bisa mengirim(banyak teks) dan menerima hanya 1 teks sebagai triger interupt.

...Bagaimana jika Teks yg ingin diparsing berupa beberapa karakter? semisal "LED1ON" ?..

Ternyata jika kita cek satu persatu per-karakter sms yg diterima maka akan muncul masalah "sms terpotong" atau timing yg kacau....Untuk itu dibutuhkan mode "FIFO" atau "circular buffering" dimana teks yg diterima oleh micro melalui UART/serial akan disimpan dalam buffer memory barulah kemudian akan diolah/parsing untuk keperluan kontrol.

Setelah mencoba beberapa library , yang paling pas adalah pfleury uart library penjelasan disini dan download disini. Silahkan baca terlebih dahulu dan ternyata cukup mudah dan simple.

Selanjutnya kita ingat dulu AT command dari modem yg kita gunakan yaitu Wavecom. Beberapa command yg penting adalah :

AT+IFC=0,0 : Agar mode serial control = none

ATE0 : Agar karakter yg dikirim tidak di echo/kembalikan
AT+CMGF=1 : mode sms "teks"

dan yang baru adalah :

AT+CNMI=2,2 : mode SMS terima langsung tampil teksnya

jika sms diterima dengan mode diatas, maka ketika sms diterima akan muncul seperti ini di modem :


+CMT :"+628155555555","11/10/01,12 :30 :00+00",
pesan sms disini
dan dari teks sms yg diterima kemudian diolah oleh micro (parsing) untuk melakukan keputusan yg diinginkan.

Lanjut kita ke proyek sebenarnya, kali ini kita menggunakan micro ATMEGA 8515 dengan circuit seperti berikut (micro lain menyesuaikan aja):


(klik untuk memperbesar skematik)

*) modem wavecom memiliki mode komunikasi serial yg "cross" jadi jangan lupa untuk melakukan cros TX & RX (pin 2 vs pin 3 dari DB9)

selanjutnya kita akan bahas scriptnya

-Inisialisasi

kita akan menggunakan library uartnya si pleury, dengan mengcopy "uart.h" serta "uart.c" ke folder avr studio dan menambah source uart.c dan include uart.h


#define F_CPU 7372800UL //xtal yg digunakan biar error 0%
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h> 

#include "uart.h"  //pastikan sudah tersedia di folder program

//definisi baudrate RS232

#define UART_BAUD_RATE 9600 


char buffer[10];  //definisi buffer teks
int indexbuf=0;

cara menambahkan uart.c :



- Inisialisasi I/O port dan modem wavecom



int main(void)
{  

   DDRA  |= (1<<PA6)|(1<<PA7); //port yg digunakan PA6 & PA7
    
  unsigned int c;
  uint8_t a;

   //inisialisai UART dari library pfleury

    uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); 
    sei(); // mode receive interupt

   
    uart_puts_P("ATE0\r");   // biar tidak memenuhi buffer
   _delay_ms(500);
    uart_puts_P("AT+CMGF=1\r"); //mode smsteks
   _delay_ms(500);
    uart_puts_P("AT+CNMI=2,2\r"); // mode langsung baca sms
sebelumnya agar diingat untuk mengedit uart.h dibagian dibawah ini, sesuaikan dengan panjang sms teks yg diterima
Code:
/** Size of the circular receive buffer, must be power of 2 */
#ifndef UART_RX_BUFFER_SIZE
#define UART_RX_BUFFER_SIZE 64
#endif
/** Size of the circular transmit buffer, must be power of 2 */
#ifndef UART_TX_BUFFER_SIZE
#define UART_TX_BUFFER_SIZE 64
#endif

- Parsing SMS

Kita lanjut dengan Parsing SMS yg masuk, dimana akan meng-ON/OFF Led di port A6 & A7. Untuk mepermudah parsing, kita gunakan trigger karakter khusus sehingga dapat menandai SMS yg akan diparsing ( kali ini menggunakan " $ ")


PORTA &= ~_BV(PA6) & ~_BV(PA7);


   while(1)

   {   


        c = uart_getc();
        if ( c & UART_NO_DATA ) // jika ga ada data masuk
        {

        }
        else
        {
 
         if( c == '$') indexbuf=0;  //jika triger $, maka mulai parsing (index aray buffer = 0 )
  
     

   buffer[indexbuf] = c; //masukkan teks sms ke buffer

   indexbuf++; //index array ditambah 
    

        }
    
   // Jika yg diterima sms "$LED1ON", maka Led di PA6 akan hidup
    if( buffer[0]=='$' &&  buffer[1]=='L' &&buffer[2]=='E' &&
     buffer[3]=='D' && buffer[4]=='1' &&
        buffer[4]=='O' &&  buffer[5]=='N')

       { PORTA |= _BV(PA6); 
    
      for(a=0;a<10;a++) buffer[a]=0; // bersihkan buffer
    
    
    }

   // Jika yg diterima sms "$LED2ON", maka Led di PA7 akan hidup
    if( buffer[0]=='$' &&  buffer[1]=='L' &&buffer[2]=='E' &&
     buffer[3]=='D' && buffer[4]=='2' &&
        buffer[4]=='O' &&  buffer[5]=='N')

       { PORTA |= _BV(PA7); 
    
      for(a=0;a<10;a++) buffer[a]=0; // bersihkan buffer
    
    
    }

   // Jika yg diterima sms "$LED1OFF", maka Led di PA6 akan mati
    if( buffer[0]=='$' &&  buffer[1]=='L' &&buffer[2]=='E' &&
     buffer[3]=='D' && buffer[4]=='1' && 
             buffer[5]=='O' &&  buffer[6]=='F' &&  buffer[7]=='F')

       { PORTA &= ~_BV(PA6); 
    
      for(a=0;a<10;a++) buffer[a]=0; // bersihkan buffer
    
    
    }

   // Jika yg diterima sms "$LED2OFF", maka Led di PA7 akan mati
    if( buffer[0]=='$' &&  buffer[1]=='L' &&buffer[2]=='E' &&
     buffer[3]=='D' && buffer[4]=='2' && 
             buffer[5]=='O' &&  buffer[6]=='F' &&  buffer[7]=='F')


       { PORTA &= ~_BV(PA7); 
    
      for(a=0;a<10;a++) buffer[a]=0;// bersihkan buffer
    
    
    }
  
 }

   


}


Cara parsing pada script diatas masih menggunakan logika sederhana seperti penjelasan berikut :

1. Format SMS dimulai dengan karakter '$', sehingga parsing akan menunggu karakter ini muncul lalu kemudian diarahkan menuju posisi array buffer 0
2. Tiap array buffer kemudian di cek satu per satu sampai menemukan format kata sesuai keinginan, seperti contoh yg digunakan berupa kata $LED1ON :

  if( buffer[0]=='$' &&  buffer[1]=='L' &&buffer[2]=='E' &&
      buffer[3]=='D' && buffer[4]=='1' &&
      buffer[4]=='O' &&  buffer[5]=='N')


       { PORTA |= _BV(PA6); 
                  }

3. Diakhiri dengan pembersihan isi buffer agar bisa digunakan selanjutnya.



Kontrol micro via sms ini memiliki banyak kemungkinan aplikasi sesuai kreativitas diantaranya :

1. Menghidupkan Lampu otomatis via SMS
2. Membaca data suhu atau kondisi on/off setelah sms dikirim (tanpa harus menerima report terus menerus seperti contoh sebelumnya)
3. Trigger BO** .....duhhh jangan yaaa....INGAT ! Pisau didapur bisa bikin masakan enak, tapi ditangan orang tidak bertanggung jawab maka pisau dapur bisa menjadi alat pembunuh...


SELAMAT MENCOBA
Share:

SMS KONTROL: Kirim SMS dengan AVR ATTiny 2313



  


Pada praktek kali ini kita akan memanfaatkan ATtiny 2313 sebagai controller untuk mengirim sms ketika tombol ditekan


Baud rate untuk komunikasi RS232 adalah 9600, sehingga sebelum menggunakan modem (modem yg dipake modem wavecom dengan port rs232) perlu diset baud rate nya 9600 dengan AT command melalui PC dengan software terminal seperti hyperterminal atau putty. Ingat secara default modem wavecom memiliki baudrate 115200 sehingga koneksi awal menggunakan baudrate 115200. Setting juga mode control dari komunikasi serial yang hanya menggunakan 3 kabel (tx rx gnd) sehingga dipilih control mode = none.


AT+IPR=9600<enter>
OK
AT+IFC=0,0<enter>
OK
AT&W<enter>



Rangkaian elektronik nya sebagai berikut : (klik untuk memperjelas)


*) koneksi dari PORT Serial ke Serial DB9 secara cross , 1 vs 3(DB9-Rx) , 2 vs 2(DB9-Tx) , GND=5(DB9)
**) xtal yg digunakan nilainya khusus (7372800), jika menggunakan yg umum (4/8 mhz) atau default 1Mhz maka akan terjadi error 0,2%, tetapi tidak terlalu signifikan jika hanya kirim sms
***) ketika tombol ditekan maka micro akan mengirimkan perintah ke wavecom untuk mengirim sms


secara bertahap kita akan bahas programming dalam GCC-WINAVR-AVRSTUDIO




Inisialisasi Awal

Yang utama dari bagian inisialisasi adalah penulisan clock CPU yang digunakan, sebaiknya membaca datasheet dibagian BAUD RATE dan hubungannya dengan persentase error akibat pembagian clock yang tidak bulat.

#define F_CPU 7372800UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h> 

//definisi baudrate RS232

#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)


Inisialisasi command2 AT COMMAND sebagai variabel constant



//ganti nomer HP 
const char sms[] PROGMEM=  "AT+CMGS=0812345678\r test dari micro";

const char smsend[] PROGMEM= {0x1A}; // ascii dari CTRL+Z

Routine untuk inisialisasi USART


void init_usart(void)
{


   UCSRB |= (1 << RXEN) | (1 << TXEN);   
   UCSRC |= (1 << UCSZ0) | (1 << UCSZ1); 
   UBRRL = BAUD_PRESCALE; 
   UBRRH = (BAUD_PRESCALE >> 8);
   UCSRB |= (1 << RXCIE);  //interupt serial usart

  }


Routine untuk kirim karakter melalui RS232



void USART_Tx(unsigned char data)
{   
    
   while (!(UCSRA & (1<<UDRE)));{} // wait till transmit Data register is empty
    UDR = data; // Send data to the computer
}

void kirim_text(const char *data)
{
   while (pgm_read_byte(data) != 0x00)
     USART_Tx(pgm_read_byte(data++));
}

Routine interupt untuk membaca tombol dan kirim sms



SIGNAL (SIG_INT0)
{

kirim_text(sms);
kirim_text(smsend); 
}
Routine main program


int main(void)
{
   GIMSK |= (1<<INT0) ; // tombol interupt  0
   MCUCR |= (1<<ISC01)| (1<<ISC00); //rising edge interupt

   init_usart(); // inisialisai komunikasi usart
 
   sei(); //hidupkan interupt


while(1)

   {
   }


}

Jika menggunakan clock external / xtal , jangan lupa untuk mengaktifkan clock external dari Attiny di fusebit/CKSEL, pilihlah frek yg high. 




Aplikasi pada contoh praktek kali ini dapat digunakan juga dalam berbagai keperluan, diantaranya:


- Alarm (contoh pintu terbuka langsung kirim sms, sensor menggunakan limit switch)
- Deteksi level tegangan AC jika drop langsung kirim sms (sensor menggunakan komparator)
- Deteksi level air, misal untuk pendeteksi banjir maka otomatis mengirim sms (sensor level air sederhana menggunakan transistor FET)

- dsb

SELAMAT MENCOBA
Share:

Jumat, 17 Mei 2013

DHT-11: Sensor suhu dan kelembaban murah meriah

courtesy of : http://www.candrian.gr/index.php/dht-11-one-wire-bus/

Sensor DHT-11 merupakan sensor suhu & kelembaban versi LOW COST dengan hasil yang "cukup". Jika membutuhkan hasil yang lebih stabil maka kita perlu menggunakan sensor buatan sensirion SHT-11 dan seri sejenis.


Spesifikasi:

Supply Voltage: +5 V
Temperature range :0-50 °C error of ± 2 °C
Humidity :20-90% RH ± 5% RH error
Interface: Digital


  



Data bus sensor ini bukan TWI / I2C melainkan bus tersendiri dimana nilai 1 & 0 dibedakan melalui LEBAR PULSA HIGH

sebelum lanjut lebih mendalam, sebaiknya bagi yang belum menguasai penulisan ke LCD agar mempelajarinya disini.


skematik yang kita gunakan adalah sebagai berikut:






Lanjut kita akan bahas scriptnya, tapi hanya dibagian DHT11 nya, untuk detail LCD harap membaca posting sebelumnya (LCD & ADC/termometer LM35 terutama dibagian ITOA)

seperti sumber link diatas , 1 PIN I/O akan berfungsi sebagai Output dan Input bergantian, untuk langkah pertama akan dikirimkan perintah START oleh micro ke DHT 11



jadi kita kirim pulsa Low 18ms dan High 40us, lalu kita tunggu sebentar sampai ada response/jawaban dari DHT 11 berupa pulsa low - high selebar 54us & 80us



setelah itu hasil pengukuran akan dikirimkan sensor menggunakan format 8bit sebanyak 5 kali


scriptnya seperti yang dibawah ini :


void baca_sensor()
{

char dum;  // variabel sementara

suhu=0;
humi=0;
counter=0;

DDRD|=(1<<PD3); //PD3 sebagai output
_delay_ms(250);

PORTD &=~(1<<PD3); // nolkan PD3
_delay_ms(18); //tunggu 18 ms

PORTD |=(1<<PD3); // naikkan PD3
_delay_us(40); //tunggu 40us


DDRD &=~(1<<PD3); //PD3 sebagai input

//tunggu response dari DHT11

while(counter <100)
{
_delay_us(1);
counter++;
if (bit_is_set(PIND, 3)) break;
}

counter=0;

while(counter <100)
{
_delay_us(1);
counter++;
if (bit_is_clear(PIND, 3)) break;
}


//baca data setelah response, lihat script di pembahasan selanjutnya untuk routine hitung()

//8 bit pertama ( puluhan kelembaban )
humi=hitung();
//8 bit kedua( satuan kelembaban ), tidak usah di baca karena nilai selalu 0 untuk DHT11
hitung();
//8 bit ketiga ( puluhan suhu )
suhu=hitung();
//8 bit keempat ( satuan suhu ), tidak usah di baca karena nilai selalu 0 untuk DHT11
hitung();

//8 bit ke 5 tidak perlu dihitung 
//tulis lcd
lcd_gotoxy(9,0);
itoa(suhu,&dum;);
lcd_puts(&dum;);

lcd_gotoxy(9,1);
itoa(humi,&dum;);
lcd_puts(&dum;);



}
pada script diatas ada trick menggunakan variabel counter dan delay 1us, ini cara yg paling gampang dan menyederhanakan proses counter terhadap lebar pulsa
Setiap bit yang dikirim dimulai sinyal Low sepanjang 54uS , kemudian dikuti 24uS sampai 70uS sesuai bit yang diwakilinya. 
Bit '0' : ~54uS Low  kemudian ~24uS High
Bit '1' : ~54uS Low kemudian ~70uS High

Pada akhir paket data yg diberikan oleh DHT-11 akan muncul sinyal Low sepanjang 54uS dan kemudian bus menjadi high selamanya dan masuk ke sleep mode.

Script berikut menyederhanakan perhitungan dengan trick counter dan delay, dimana jika counter melebihi 24 , maka kita anggap nilainya 1 dan sebaliknya

uint8_t hitung(void)
{

uint8_t a,counter,hasil;

counter=0;
hasil=0;

for (a=8;a>0;a--) // 8 kali tiap perhitungan
{


while(counter <100) // deteksi saat LOW ( tidak ada perhitungan)
{
_delay_us(1);
counter++;
if (bit_is_set(PIND, 3)) break; //tunggu sampai high dan keluar loop
}

counter=0;

while(counter <100)
{
_delay_us(1);
counter++; // counter mendeteksi lebar pulsa
if (bit_is_clear(PIND, 3)) break; //jika low maka keluar dari loop
}

// perhitungan 8 bit decimal dengan geser-geser bit
//jika lebih 25us =1 , kurang < 25 us = 0
 
if(counter > 25) hasil += (1 << (a-1)) ; 

counter=0;

}

return hasil;


}

mudah bukan ? dan hasilnya lumayan mengecewakan jika dibanding dengan sensor yg paten sekelas SHT 11



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 (12) antares (10) arduino (26) 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) iklan (1) infrared (2) Input Output (3) iot (62) 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 (10) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (1) 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 (7) radio (28) raspberry pi (4) 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) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) transistor (2) troubleshoot (3) tulisan (93) tutorial (108) tv digital (6) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika