Heute wollen wir eine interessante M’glichkeit aufzeigen unseren BMP180 ohne extra Libary anzusteuern. Durch den verbauten Festspannungsregler ist unser BMP sowohl mit 3.3V als auch mit 5V kompatibel, allerdings werden die Werte unterschiedlich kalkuliert, so dass folgender Sketch nur mit 5V die richtigen Werte ausgibt. Die Verkabelung ist einfach:
und der dazugeh-rgie Code:
/-Basé en grande partie sur le code de Jim Lindblom Obtenez la pression, l’altitude et la température du BMP180. Serial.print it out à 9600 baud à moniteur en série. */ #include <Fil.h> #define BMP180_ADDRESS 0x77 Adresse I2C de BMP180 Const Unsigned char Oss = 0; Réglage de suréchantillon Valeurs d’étalonnage Int ac1; Int ac2; Int ac3 ac3; Unsigned Int ac4 ac4; Unsigned Int ac5; Unsigned Int ac6; Int b1; Int B2; Int Mb; Int Mc; Int Md; b5 est calculé en bmp180GetTemperature (...), cette variable est également utilisée dans bmp180GetPressure (...) ainsi... Température (...) doit être appelé avant ... Pression (...). Long b5; Vide Configuration(){ Série.Commencer(9600); Fil.Commencer(); bmp180Calibration(); } Vide Boucle() { Flotteur Température = bmp180GetTemperature(bmp180ReadUT()); DOIT être appelé en premier Flotteur Pression = bmp180GetPressure(bmp180ReadUP()); Flotteur Atm = Pression / 101325; "atmosphère standard" Flotteur Altitude = calcAlitude(Pression); Caculation non compensée - dans Les compteurs Série.Imprimer("Température: "); Série.Imprimer(Température, 2); afficher 2 décimales Série.println("deg C"); Série.Imprimer("Pression: "); Série.Imprimer(Pression, 0); nombre entier seulement. Série.println(" Pa "); Série.Imprimer("Atmosphère standard: "); Série.println(Atm, 4); afficher 4 décimales Série.Imprimer("Altitude: "); Série.Imprimer(Altitude, 2); afficher 2 décimales Série.println("M"); Série.println();rupture de ligne Retard(1000); attendre une seconde et obtenir des valeurs à nouveau. } Stocke toutes les valeurs d’étalonnage du bmp180 en variables mondiales Les valeurs d’étalonnage sont nécessaires pour calculer l’intérim et la pression Cette fonction devrait être appelée au début du programme Vide bmp180Calibration() { ac1 = bmp180ReadInt(0xAA); ac2 = bmp180ReadInt(0xAC); ac3 ac3 = bmp180ReadInt(0xAE (en)); ac4 ac4 = bmp180ReadInt(0xB0); ac5 = bmp180ReadInt(0xB2 (en)); ac6 = bmp180ReadInt(0xB4 (en)); b1 = bmp180ReadInt(0xB6 (en)); B2 = bmp180ReadInt(0xB8 (en)); Mb = bmp180ReadInt(0xBA (0xBA)); Mc = bmp180ReadInt(0xBC (en anglais)); Md = bmp180ReadInt(0xBE); } Calculer la température dans le deg C Flotteur bmp180GetTemperature(Unsigned Int Ut){ Long x1, x2; x1 = (((Long)Ut - (Long)ac6)*(Long)ac5) >> 15; x2 = ((Long)Mc << 11)/(x1 + Md); b5 = x1 + x2; Flotteur Temp = ((b5 + 8)>>4); Temp = Temp /10; Retour Temp; } Calculer la pression cédée les valeurs d’étalonnage doivent être connues b5 est également nécessaire afin bmp180GetTemperature (...) doit être appelé en premier. La valeur retournée sera la pression dans les unités de Pa. Long bmp180GetPressure(Unsigned Long jusqu’à){ Long x1, x2, x3, b3, b6 (en), P; Unsigned Long b4, b7; b6 (en) = b5 - 4000; Calculer B3 x1 = (B2 * (b6 (en) * b6 (en))>>12)>>11; x2 = (ac2 * b6 (en))>>11; x3 = x1 + x2; b3 = (((((Long)ac1)*4 + x3)<<Oss) + 2)>>2; Calculer B4 x1 = (ac3 ac3 * b6 (en))>>13; x2 = (b1 * ((b6 (en) * b6 (en))>>12))>>16; x3 = ((x1 + x2) + 2)>>2; b4 = (ac4 ac4 * (Unsigned Long)(x3 + 32768))>>15; b7 = ((Unsigned Long)(jusqu’à - b3) * (50000>>Oss)); Si (b7 < 0x8000000000) P = (b7<<1)/b4; Autre P = (b7/b4)<<1; x1 = (P>>8) * (P>>8); x1 = (x1 * 3038)>>16; x2 = (-7357 * P)>>16; P += (x1 + x2 + 3791)>>4; Long Temp = P; Retour Temp; } Lire 1 byte du BMP180 à 'adresse' char bmp180Lire(Unsigned char Adresse) { Unsigned char Données; Fil.commenceTransmission(BMP180_ADDRESS); Fil.Écrire(Adresse); Fil.endTransmission(); Fil.demandeDe(BMP180_ADDRESS, 1); Tandis que(!Fil.Disponible()) ; Retour Fil.Lire(); } Lire 2 octets du BMP180 First byte sera de «adresse» Deuxième byte sera de 'adresse'1 Int bmp180ReadInt(Unsigned char Adresse) { Unsigned char Msb, Lsb; Fil.commenceTransmission(BMP180_ADDRESS); Fil.Écrire(Adresse); Fil.endTransmission(); Fil.demandeDe(BMP180_ADDRESS, 2); Tandis que(Fil.Disponible()<2) ; Msb = Fil.Lire(); Lsb = Fil.Lire(); Retour (Int) Msb<<8 | Lsb; } Lire la valeur de température non compensée Unsigned Int bmp180ReadUT(){ Unsigned Int Ut; Écrivez 0x2E dans Register 0xF4 Cela demande une lecture de la température Fil.commenceTransmission(BMP180_ADDRESS); Fil.Écrire(0xF4); Fil.Écrire(0x2E); Fil.endTransmission(); Attendez au moins 4,5 m Retard(5); Lire deux octets des registres 0xF6 et 0xF7 Ut = bmp180ReadInt(0xF6); Retour Ut; } Lire la valeur de pression non compensée Unsigned Long bmp180ReadUP(){ Unsigned char Msb, Lsb, xlsb xlsb; Unsigned Long jusqu’à = 0; Écrivez 0x34MD (OSS-lt;lt;6) dans l’enregistrement 0xF4 Demander une lecture de pression w/ réglage de suréchantillon Fil.commenceTransmission(BMP180_ADDRESS); Fil.Écrire(0xF4); Fil.Écrire(0x34 + (Oss<<6)); Fil.endTransmission(); Attendre la conversion, le délai dépendant de l’OSS Retard(2 + (3<<Oss)); Lire le registre 0xF6 (MSB), 0xF7 (LSB) et 0xF8 (XLSB) Msb = bmp180Lire(0xF6); Lsb = bmp180Lire(0xF7); xlsb xlsb = bmp180Lire(0xF8); jusqu’à = (((Unsigned Long) Msb << 16) | ((Unsigned Long) Lsb << 8) | (Unsigned Long) xlsb xlsb) >> (8-Oss); Retour jusqu’à; } Vide writeRegister(Int deviceAddress, Octet Adresse, Octet Val) { Fil.commenceTransmission(deviceAddress); commencer la transmission à l’appareil Fil.Écrire(Adresse); envoyer l’adresse du registre Fil.Écrire(Val); envoyer de la valeur pour écrire Fil.endTransmission(); transmission de fin } Int lireRegister(Int deviceAddress, Octet Adresse){ Int C; Fil.commenceTransmission(deviceAddress); Fil.Écrire(Adresse); s’inscrire pour lire Fil.endTransmission(); Fil.demandeDe(deviceAddress, 1); lire un byte Tandis que(!Fil.Disponible()) { Attente } C = Fil.Lire(); Retour C; } Flotteur calcAlitude(Flotteur Pression){ Flotteur Un = Pression/101325; Flotteur B = 1/5.25588; Flotteur C = Pow(Un,B); C = 1 - C; C = C /0.0000225577; Retour C; }
So kann der BMP180 ressourcensparend eingesetzt werden und der Code ist f’r fortgeschrittene Benutzer leicht f’r andere Atmel Controller adaptierbar.
1 commentaire
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?