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: