BMP180 ohne Bibliothek - AZ-Delivery

Heute wollen wir eine interessante M'glichkeit aufzeigen unseren BMP180 ohne extra Libary anzusteuern. Durch den verbauten Festspannungsregler ist bser bwohl mit 3.3V als auch mit 5V kompatibel, allerdings werden die Werte unterschiedlich kalkuliert, quindi das folgender Sketch mit 5V die richtigen Werte ausbtgi. Die Verkabelung ist einfach:

codice und der dazugeh-rgie:

 

/-Based in gran parte sul codice di Jim Lindblom

 Ottenere pressione, altitudine e temperatura dal BMP180.
 Serial.print a 9600 baud al monitor seriale.
 */

#include <Filo.H>

# define BMP180_ADDRESS 0x77 (in via di sinfamin2  Indirizzo I2C di BMP180

Const Unsigned Char Oss = 0;  Impostazione di sovracampionamento

Valori di calibrazione
Int ac1 (in modo;
Int ac2;
Int ac3;
Unsigned Int ac4;
Unsigned Int ac5;
Unsigned Int ac6;
Int b1;
Int B2;
Int Mb;
Int Mc;
Int Md;

b5 viene calcolato in bmp180GetTemperature(...), questa variabile viene utilizzata anche in bmp180GetPressure(...)
Così... La temperatura(...) deve essere chiamata prima di ... Pressione(...).
Lungo b5; 

Vuoto Installazione(){   Seriale.Iniziare(9600);   Filo.Iniziare();   bmp180Calibrazione();
}

Vuoto Ciclo()
{   Galleggiante Temperatura = bmp180GetTemperature(bmp180LetturaUT()); DEVE essere chiamato per primo   Galleggiante Pressione = bmp180GetPressure(bmp180Lettura());   Galleggiante Atm = Pressione / 101325; "atmosfera standard"   Galleggiante Altitudine = calcAltitude(Pressione); Caculazione non compensata - in Metri    Seriale.Stampare("Temperatura": ");   Seriale.Stampare(Temperatura, 2); visualizzare 2 cifre decimali   Seriale.println("deg C");   Seriale.Stampare("Pressione: ");   Seriale.Stampare(Pressione, 0); solo numero intero.   Seriale.println(" Pa");   Seriale.Stampare("Atmosfera standard: ");   Seriale.println(Atm, 4); visualizzare 4 cifre decimali   Seriale.Stampare("Altitude: ");   Seriale.Stampare(Altitudine, 2); visualizzare 2 cifre decimali   Seriale.println(" M ");   Seriale.println();interruzione di riga   Ritardo(1000); attendere un secondo e ottenere nuovamente i valori.
}

Memorizza tutti i valori di calibrazione del bmp180 in variabili globali
I valori di calibrazione sono necessari per calcolare la temperatura e la pressione
Questa funzione deve essere chiamata all'inizio del programma
Vuoto bmp180Calibrazione()
{   ac1 (in modo = bmp180ReadInt (int).(0xAA);   ac2 = bmp180ReadInt (int).(0xAC (in formato 0xAC));   ac3 = bmp180ReadInt (int).(0xAE (in timo));   ac4 = bmp180ReadInt (int).(0xB0 (in modo 0xB0));   ac5 = bmp180ReadInt (int).(0xB2 (in modo 0xB2));   ac6 = bmp180ReadInt (int).(0xB4 (in modo 0xB4));   b1 = bmp180ReadInt (int).(0xB6 (in inglese));   B2 = bmp180ReadInt (int).(0xB8 (in modo 0xB8));   Mb = bmp180ReadInt (int).(0xBA (in via 0xBA));   Mc = bmp180ReadInt (int).(0xBC (la xcla));   Md = bmp180ReadInt (int).(0xBE (in modo 0xBE));
}

Calcolare la temperatura in gradi C
Galleggiante bmp180GetTemperature(Unsigned Int Ut){   Lungo x1 (in modo non in0, x2 (in modo non in0;   x1 (in modo non in0 = (((Lungo)Ut - (Lungo)ac6)*(Lungo)ac5) >> 15;   x2 (in modo non in0 = ((Lungo)Mc << 11)/(x1 (in modo non in0 + Md);   b5 = x1 (in modo non in0 + x2 (in modo non in0;   Galleggiante Temp = ((b5 + 8)>>4);   Temp = Temp /10;   Ritorno Temp;
}

Calcolare la pressione assegnata
i valori di calibrazione devono essere noti
b5 è necessario anche in modo bmp180GetTemperature(...) deve essere chiamato prima.
Il valore restituito sarà la pressione in unità di Pa.
Lungo bmp180GetPressure(Unsigned Lungo fino){   Lungo x1 (in modo non in0, x2 (in modo non in0, x3 (in modo non instato, b3 (in questo modo), b6, P;   Unsigned Lungo b4, b7 (in questo stato inquesto;   b6 = b5 - 4000;   Calcola B3   x1 (in modo non in0 = (B2 * (b6 * b6)>>12)>>11;   x2 (in modo non in0 = (ac2 * b6)>>11;   x3 (in modo non instato = x1 (in modo non in0 + x2 (in modo non in0;   b3 (in questo modo) = (((((Lungo)ac1 (in modo)*4 + x3 (in modo non instato)<<Oss) + 2)>>2;   Calcola B4   x1 (in modo non in0 = (ac3 * b6)>>13;   x2 (in modo non in0 = (b1 * ((b6 * b6)>>12))>>16;   x3 (in modo non instato = ((x1 (in modo non in0 + x2 (in modo non in0) + 2)>>2;   b4 = (ac4 * (Unsigned Lungo)(x3 (in modo non instato + 32768))>>15;   b7 (in questo stato inquesto = ((Unsigned Lungo)(fino - b3 (in questo modo)) * (50000>>Oss));   Se (b7 (in questo stato inquesto < 0x80000000)     P = (b7 (in questo stato inquesto<<1)/b4;   Altro     P = (b7 (in questo stato inquesto/b4)<<1;   x1 (in modo non in0 = (P>>8) * (P>>8);   x1 (in modo non in0 = (x1 (in modo non in0 * 3038)>>16;   x2 (in modo non in0 = (-7357 * P)>>16;   P += (x1 (in modo non in0 + x2 (in modo non in0 + 3791)>>4;   Lungo Temp = P;   Ritorno Temp;
}

Leggere 1 byte dal BMP180 a 'indirizzo'
Char bmp180Lettura(Unsigned Char Indirizzo)
{   Unsigned Char Dati;   Filo.beginTransmission(BMP180_ADDRESS);   Filo.Scrivere(Indirizzo);   Filo.endTransmission();   Filo.richiestaDa(BMP180_ADDRESS, 1);   Mentre(!Filo.Disponibile())     ;   Ritorno Filo.Leggere();
}

Leggere 2 byte dal BMP180
Il primo byte sarà da 'indirizzo'
Il secondo byte sarà da 'indirizzo'
Int bmp180ReadInt (int).(Unsigned Char Indirizzo)
{   Unsigned Char Msb, Lsb;   Filo.beginTransmission(BMP180_ADDRESS);   Filo.Scrivere(Indirizzo);   Filo.endTransmission();   Filo.richiestaDa(BMP180_ADDRESS, 2);   Mentre(Filo.Disponibile()<2)     ;   Msb = Filo.Leggere();   Lsb = Filo.Leggere();   Ritorno (Int) Msb<<8 | Lsb;
}

Leggere il valore della temperatura non compensato
Unsigned Int bmp180LetturaUT(){   Unsigned Int Ut;   Scrivere 0x2E nel registro 0xF4   Questo richiede una lettura della temperatura   Filo.beginTransmission(BMP180_ADDRESS);   Filo.Scrivere(0xF4 (in modo 0xF4));   Filo.Scrivere(0x2E);   Filo.endTransmission();   Attendere almeno 4,5 ms   Ritardo(5);   Leggere due byte dai registri 0xF6 e 0xF7Read two bytes from registers 0xF6 and 0xF7   Ut = bmp180ReadInt (int).(0xF6 (in inglese));   Ritorno Ut;
}

Leggere il valore di pressione non compensato
Unsigned Lungo bmp180Lettura(){   Unsigned Char Msb, Lsb, Xlsb;   Unsigned Lungo fino = 0;   Scrivere 0x34 (OSS<<6) nel registro 0xF4   Richiedere un'impostazione di lettura a pressione w/ sovracampionamento   Filo.beginTransmission(BMP180_ADDRESS);   Filo.Scrivere(0xF4 (in modo 0xF4));   Filo.Scrivere(0x34 (in questo 0x34) + (Oss<<6));   Filo.endTransmission();   Attendere la conversione, ritardo tempo dipende da OSS   Ritardo(2 + (3<<Oss));   Lettura registro 0xF6 (MSB), 0xF7 (LSB) e 0xF8 (XLSB)   Msb = bmp180Lettura(0xF6 (in inglese));   Lsb = bmp180Lettura(0xF7 (in modo 0xF7));   Xlsb = bmp180Lettura(0xF8 (in modo 0xF8));   fino = (((Unsigned Lungo) Msb << 16) | ((Unsigned Lungo) Lsb << 8) | (Unsigned Lungo) Xlsb) >> (8-Oss);   Ritorno fino;
}

Vuoto writeRegister(Int deviceAddress, byte Indirizzo, byte Val) {   Filo.beginTransmission(deviceAddress); avviare la trasmissione al dispositivo    Filo.Scrivere(Indirizzo);       indirizzo di registrazione di invio   Filo.Scrivere(Val);         inviare valore per scrivere   Filo.endTransmission();     trasmissione finale
}

Int readRegister (Registro stati qui,(Int deviceAddress, byte Indirizzo){   Int Presso;   Filo.beginTransmission(deviceAddress);   Filo.Scrivere(Indirizzo); registrarsi per leggere   Filo.endTransmission();   Filo.richiestaDa(deviceAddress, 1); leggere un byte   Mentre(!Filo.Disponibile()) {     Attesa   }   Presso = Filo.Leggere();   Ritorno Presso;
}

Galleggiante calcAltitude(Galleggiante Pressione){   Galleggiante Un = Pressione/101325;   Galleggiante B = 1/5.25588;   Galleggiante C = Pow(Un,B);   C = 1 - C;   C = C /0.0000225577;   Ritorno C;
}

Così kann der BMP180 ressourcensparend eingesetzt werden und der Code ist f'r fortgeschrittene Benutzer leicht fàere Atmel Controller adaptierbar.

 

Für arduinoProjekte für anfängerSensoren

1 commento

Achim

Achim

Erst einmal danke für den Beispiel-Code.
Zitat “ist unser BMP sowohl mit 3.3V als auch mit 5V kompatibel, allerdings werden die Werte unterschiedlich kalkuliert”.

Wenn auf der Platine ein Festspannungsregler ist, frage ich mich, warum die Werte unterschiedlich kalkuliert werden?

Lascia un commento

Tutti i commenti vengono moderati prima della pubblicazione