BMP180 ohne Bibliothek - AZ-Delivery

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.

 

Für arduinoProjekte für anfängerSensoren

1 commentaire

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?

Laisser un commentaire

Tous les commentaires sont modérés avant d'être publiés

Articles de blog recommandés

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery