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.
1 commento
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?