Interface Sensor BMP180 Menggunakan Compiler Codevision AVR

Sensor BMP180 merupakan sensor digital untuk mendeteksi tekanan udara (Digital Barometric Pressure Sensor), sensor ini juga dapat difungsikan untuk mengukur suhu (Temperatur) dan tinggi dataran (Altitude). Untuk lebih jelasnya anda dapat mengunjungi artikel nyakmad.blogspot.co.id/2016/07/modul-bmp-180.html Untuk mengakses sensor ini kita akan menggukan mikrokontroler Atmega8535, sebenarnya kalau menggunakan mikrokontroler lain seperti atmega328  juga tidak masalah, mikrokontroler ini akan bertindak sebagai pusat pengolahan data dari sensor. Perlu diperhatikan bahwa untuk menghubungkan sensor ini harus menggunakan jalur komunikasi I2C sebagai media transfer data. untuk skemanya anda dapat melihatnya dibawah ini
Sensor BMP180 Menggunakan Compiler Codevision AVR
Skema Rangkaian
Pada skema diatas terlihat bahwa data pengukuran akan ditampilkan melalui komunikasi serial sedangkan input sensor menggunakan pin SCL dan SDA yang dihubungkan dengan resistor Pull-Up. Adapun untuk memulai memprogramnya anda dapat membuat project baru pada menu codevision AVR lalu sesuaikan Chip, Clock, USART, I2C dan jangan lupa Generate lalu save. Adapun source codenya dapat anda lihat dibawah ini
#include <mega8535.h>
#include <i2c.h>
#include <stdio.h>
#include <delay.h>
#include <stdint.h>
#include <math.h>
#include <stdlib.h>
#define oss 3
char suhu[10],tekanan[10];
int16_t ac1,ac2,ac3,b1,b2,mb,mc,md,get_ut;
uint16_t ac4,ac5,ac6;
int32_t tinggi,x1,x2,b5,b6,x3,b3,up,ut,p,t;
uint32_t b4,b7,get_up,databaca;
float temp;
uint32_t read(int addres)
{
i2c_start();
i2c_write(0xee);
i2c_write(addres);
i2c_start();
i2c_write(0xef);
databaca=i2c_read(0);
i2c_stop();
delay_ms(100);
return databaca;
}
void write(int datatulis)
{
i2c_start();
i2c_write(0xee);
i2c_write(0xf4);
i2c_write(datatulis);
i2c_stop();
delay_ms(100);
}
void kalkulasi()
{
write(0x2e);
get_ut=(read(0xf6)<<8)+read(0xf7);
ut=get_ut;
write(0x34+(oss<<6));
get_up= ((read(0xf6)<<16) + (read(0xf7)<<8) + read(0xf8)) >> (8-oss);
up=get_up;
x1=(((int32_t)ut-(int32_t)ac6)*(int32_t)ac5)>>15;
x2=((int32_t)mc<<11)/(x1+md);
b5=x1+x2;
t=(int16_t)(b5+8)>>4;
temp=t;
temp/=10;
ftoa(temp,1,suhu);
b6=b5-4000;
x1=(b2*(b6*b6)>>12)>>11;
x2=(ac2*b6)>>11;
x3=x1+x2;
b3=(((((int32_t)ac1)*4+x3)<<oss)+2)/4;
x1=(ac3*b6)>>13;
x2=(b1*(b6*b6>>12))>>16;
x3=((x1+x2)+2)>>2;
b4=(ac4*(uint32_t)(x3+32768))>>15;
b7=(uint32_t)(((up-b3))*(50000>>oss));
if(b7<0x80000000)
{
p=((b7<<1)/b4);
}
else
{
p=((b7/b4)<<1);
}
x1=(p>>8)*(p>>8);
x1=(x1*3038)>>16;
x2=(-7357*p)>>16;
p=p+((x1+x2+3791)>>4);
temp=p;
temp/=100;
ftoa(temp,2,tekanan);
temp=(float)p/101325;
temp=1-pow(temp,0.19029);
tinggi=44330*temp;
}
 
void main(void)
{
DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0);
PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (0<<WGM01) | (0<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0=0x00;
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0<<AS2;
TCCR2=(0<<WGM20) | (0<<COM21) | (0<<COM20) | (0<<WGM21) | (0<<CS22) | (0<<CS21) | (0<<CS20);
TCNT2=0x00;
OCR2=0x00;
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);
MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
MCUCSR=(0<<ISC2);
UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM);
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (1<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);
UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL);
UBRRH=0x00;
UBRRL=0x33;
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
SFIOR=(0<<ACME);
ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);
SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);
TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);
i2c_init();
ac1 = (read(0xaa)<<8)+read(0xab);
ac2 = (read(0xac)<<8)+read(0xad);
ac3 = (read(0xae)<<8)+read(0xaf);
ac4 = (read(0xb0)<<8)+read(0xb1);
ac5 = (read(0xb2)<<8)+read(0xb3);
ac6 = (read(0xb4)<<8)+read(0xb5);
b1 = (read(0xb6)<<8)+read(0xb7);
b2 = (read(0xb8)<<8)+read(0xb9);
mb = (read(0xba)<<8)+read(0xbb);
mc = (read(0xbc)<<8)+read(0xbd);
md = (read(0xbe)<<8)+read(0xbf);

while(1)
    {
    kalkulasi();
    printf("Tekanan : %s HPa Suhu : %s C Tinggi : %d M ",tekanan,suhu,tinggi);
    delay_ms(1000);
    }
}
Langkah pertama adalah membaca data koefisien AC1, AC2, AC3 dan seterusnya sebanyak 11 data. Data ini nantinya akan digunakan untuk perhitungan hasil pengukuran sensor agar akurat, baru selanjutnya kita dapat membaca hasil pengukuran sensor, instruksi ini dilakukan di sub program kalkulasi dan jangan lupa untuk menampilkan hasil pembacaan sensor. kalau berhasil akan muncul tampilan seperti dibawah ini.
Output bmp180
Output BMP180

Related Posts:

Arduino Watchdog

Watchdog Timer (WDT) adalah salah satu fitur dari mikrokontroler AVR untuk mengatasi kemacetan alur program/Hank yang disebabkan oleh faktor Hardware maupun Software. Dengan menggunakan WDT kita dapat mereset mikrokontroler secara otomatis ketika terjadi macet/hank.Sistem WDT terpisah dari CPU utama sehingga tidak akan terpengaruh dengan kondisi macet/Hank.Untuk lebih jelas tentang WDT kita dapat membuat analogi sebagai berikut: Ada seorang driver berangkat dari kota A ke kota B dengan ketentuan lamanya perjalanan selama 1 detik. Ketika si driver terjebak macet di tengah perjalanan dan waktu perjalanannya melebihi 1 detik maka si driver otomatis tereset ke kota A dan memulai kembali perjalanannya ke kota B.Perlu diketahui bahwa timeout/batas waktu WDT arduino yaitu 250MS, 500MS, 1S, 2S, 4S, dan 8S. Sekarang mari kita simulasikan project arduino ini menggunakan proteus 8.5. silahkan masuk ke source code/VSM studio lalu create project kemudian pilih arduino uno sehingga menjadi
Skema Rangkaian Arduino Uno
Skema Rangkaian
sekarang bagaimana listing programnya?
#include <avr/wdt.h>
void setup() {
Serial.begin(9600);
wdt_enable(WDTO_1S);
}
int i;
void loop() {
  i=i+1;
  Serial.println(i);
  wdt_reset();
}
Program diatas ketika dieksekusi akan mengaktifkan Watchdog dengan timeout 1 detik dan akan dilanjutkan dengan baris program selanjutnya, jika program ini tidak macet/Hank maka pada outpus serial akan muncul seperti dibawah ini
Tampilan Virtual Terminal
Tampilan Virtual Terminal
Listing program 2
#include <avr/wdt.h>
void setup() {
Serial.begin(9600);
wdt_enable(WDTO_1S);
}
int i;
void loop() {
  i=i+1;
  Serial.println(i);
  delay(2000);
  wdt_reset();
}
Mari kita analisa program ke dua ini, disini ada penambahan delay(2000), anggap saja ini bagian hank sistem. ketika program ini dijalankan maka sistem akan mendeteksi bahwa waktu untuk mereset WDT lebih lama daripada 1 detik dikarenakan delay(2000) dan sistem menganggapnya ini sebagai kondisi macet/hank, sehingga sub void loop() hanya dieksekusi sekali dan output serialnya akan menjadi sebagai berikut
Tampilan Virtual Terminal
Tampilan Virtual Terminal

Related Posts:

Skema Alat Tes IC SMPS

SMPS (Switch Mode Power Supply) adalah alat pengganti power supply trafo inti besi, SMPS ini memiliki beberapa kelebihan dibandingkan dengan power supply trafo inti besi. Adapun bagian-bagian dari SMPS itu sendiri adalah Penyearah, SMPS Controler Drive, Trafo inti Ferit, Filter dan beberapa komponen pendukung lainnya. Pada dasarnya bagian yang sangat vital yaitu SMPS kontrol Device, bagian ini berfungsi untuk membangkitkan osilator PWM (Pulsa Width Modulation), bagian ini biasanya menggunakan transistor maupun IC UC3842, UC3843, UC3844, UC3845, UC1842, UC1843, UC1844, UC1845 dan masih banyak jenis dan type lainnya. Namun bagaimana kita mengetahui osilator PWM sudah rusak atau masih berfungsi? kalau PWM tersebut menggunakan transistor maka kita dapat menggunakan AVO meter untuk mengeceknya tapi bagaimana kalau IC? kalau IC kita perlu menggunakan rangkaian dibawah ini.
Skema Alat Tes IC UC1842
Bentuk Gelombang Menggunakan Osiloskop
Bentuk Gelombang Menggunakan Osiloskop
Pada rangkaian ini saya menggunakan IC UC1842, rangkaian ini akan membangkitkan frekuensi sebesar 55 HZ pada bagian output. dikarenakan frekuensi ini dalam rentang pendengaran manusia (20-20.000 hz) maka output ini dapat dihubungkan dengan speaker, speaker akan berbunyi jika ic tersebut masih dalam kondisi bagus.

Related Posts:

Jam Digital Menggunakan IC 7490

IC 7490 adalah IC yang digunakan untuk operasi Counter dari bilangan 0-F Heksadesimal tapi biasanya digunakan untuk counter 0-9 Desimal, output ini dalam bilangan biner 4 bit (Q0, Q1, Q2, dan Q3). IC 7490 ini dapat diseri untuk mencapai nilai yang lebih tinggi misalkan dengan dua IC 7490 maka kita dapat membuata counter dari 0-99.
Counter 0-9 menggunakan IC 7490
Counter 0-9 menggunakan IC 7490
Ini merupakan rangkaian counter dengan memanfaatkan IC 7490. Pin R0(1) dan R0(2) digunakan untuk mereset output, misalkan kita ingin mereset ketika output bernilai 9 maka pin ini dihubungkan dengan output Q1 dan Q3. Kali ini kita akan merancang jam digital menggunakan IC 7490.
Rangkaian Jam Digital menggunakan IC 7490
Rangkaian Jam Digital menggunakan IC 7490
Adapun rangkaiannya seperti gambar diatas, sumber clock menggunakan frekuensi 1 Hz. Dua buah IC yang paling kanan digunakan untuk satuan Detik, ketika kedua IC ini menunjukkan nilai 59 dan akan berubah menjadi nilai 60 maka kedua ic akan merestar ke 00 dan akan memicu kedua IC selanjutnya yaitu IC untuk satuan Menit untuk meng-Counter, ketika kedua IC ini sudah bernilai 60 maka kedua ic ini akan merestart dan akan memicu kedua IC selanjutnya yaitu IC untuk satuan Jam untuk meng-counter, ketika kedua IC ini bernilai 24 maka keduan IC ini akan merestart.

Untuk lebih jelasnya anda dapat melihat video di bawah ini.
https://youtu.be/RotONtY-MY8

Related Posts: