Anyone make it work with XOD?
I don’t see any existing nodes or libraries in XOD. A quick web search shows that it uses I2C communication, so theoretically you could just use the i2c nodes available in XOD, but there is quite a bit of initialization and calculations that need done, so wrapping an existing IDE library like https://github.com/adafruit/Adafruit-BMP085-Library might be a better option. At the very least, this particular library is C++ code, so you might be able to paste it into your own XOD nodes (but I’m sure at least some modification will be needed, so it is not a trivial task). https://xod.io/docs/guide/wrapping-arduino-libraries/ provides some information on wrapping existing IDE libraries for use in XOD.
In short, it shouldn’t be too difficult get it to work, but it is not a good first project for a XOD beginner…
I recently came across something similar where I put together an i2c patch for the PCF8519T 4x 8-bit A/D and 1x D/A module. Below is a picture of the blocks for reference which I put together after reading the data sheet . The blocks for talking to the BMP180 will probably be similar but it looks like more math is needed to get to the end user signals.
This is an example of arduino code that may help with figuring out the addresses to call.
/*********************************************************************
BMP180 /BMP085 sensor
Test program without external library
www.projetsdiy.fr
From original version of Leo Nutz, www.ALTDuino.de
**********************************************************/
#include <Wire.h>
#define ADDRESS_SENSOR 0x77 // Addresse du capteur
int16_t ac1, ac2, ac3, b1, b2, mb, mc, md; // Store sensor PROM values from BMP180
uint16_t ac4, ac5, ac6; // Store sensor PROM values from BMP180
// Ultra Low Power OSS = 0, OSD = 5ms
// Standard OSS = 1, OSD = 8ms
// High OSS = 2, OSD = 14ms
// Ultra High Resolution OSS = 3, OSD = 26ms
const uint8_t oss = 3; // Set oversampling setting
const uint8_t osd = 26; // with corresponding oversampling delay
float T, P; // Variables globales pour la température et la pression
void setup()
{
Serial.begin(9600);
while(!Serial){;} // On attend que le port série soit disponible
delay(5000);
Wire.begin(); // Active le bus I2C
init_SENSOR(); // Initialise les variables
delay(100);
}
void loop()
{
int32_t b5;
b5 = temperature(); // Lit et calcule la température (T)
Serial.print("Temperature: ");
Serial.print(T, 2);
Serial.print("*C, ");
P = pressure(b5); // Lit et calcule la pressure (P)
Serial.print("Pression: ");
Serial.print(P, 2);
Serial.print(" mbar, ");
Serial.print(P * 0.75006375541921, 2);
Serial.println(" mmHg");
Serial.println("");
delay(1000); // Delai entre chaque mesure
}
/**********************************************
Initialise les variables du capteur
**********************************************/
void init_SENSOR()
{
ac1 = read_2_bytes(0xAA);
ac2 = read_2_bytes(0xAC);
ac3 = read_2_bytes(0xAE);
ac4 = read_2_bytes(0xB0);
ac5 = read_2_bytes(0xB2);
ac6 = read_2_bytes(0xB4);
b1 = read_2_bytes(0xB6);
b2 = read_2_bytes(0xB8);
mb = read_2_bytes(0xBA);
mc = read_2_bytes(0xBC);
md = read_2_bytes(0xBE);
Serial.println("");
Serial.println("Données de calibration du capteur :");
Serial.print(F("AC1 = ")); Serial.println(ac1);
Serial.print(F("AC2 = ")); Serial.println(ac2);
Serial.print(F("AC3 = ")); Serial.println(ac3);
Serial.print(F("AC4 = ")); Serial.println(ac4);
Serial.print(F("AC5 = ")); Serial.println(ac5);
Serial.print(F("AC6 = ")); Serial.println(ac6);
Serial.print(F("B1 = ")); Serial.println(b1);
Serial.print(F("B2 = ")); Serial.println(b2);
Serial.print(F("MB = ")); Serial.println(mb);
Serial.print(F("MC = ")); Serial.println(mc);
Serial.print(F("MD = ")); Serial.println(md);
Serial.println("");
}
/**********************************************
Calcul de la pressure
**********************************************/
float pressure(int32_t b5)
{
int32_t x1, x2, x3, b3, b6, p, UP;
uint32_t b4, b7;
UP = read_pressure(); // Lecture de la pression renvoyée par le capteur
b6 = b5 - 4000;
x1 = (b2 * (b6 * b6 >> 12)) >> 11;
x2 = ac2 * b6 >> 11;
x3 = x1 + x2;
b3 = (((ac1 * 4 + x3) << oss) + 2) >> 2;
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; } // ou p = b7 < 0x80000000 ? (b7 * 2) / b4 : (b7 / b4) * 2;
x1 = (p >> 8) * (p >> 8);
x1 = (x1 * 3038) >> 16;
x2 = (-7357 * p) >> 16;
return (p + ((x1 + x2 + 3791) >> 4)) / 100.0f; // Retourne la pression en mbar
}
/**********************************************
Lecture de la température (non compensée)
**********************************************/
int32_t temperature()
{
int32_t x1, x2, b5, UT;
Wire.beginTransmission(ADDRESS_SENSOR); // Début de transmission avec l'Arduino
Wire.write(0xf4); // Envoi l'adresse de registre
Wire.write(0x2e); // Ecrit la donnée
Wire.endTransmission(); // Fin de transmission
delay(5);
UT = read_2_bytes(0xf6); // Lecture de la valeur de la TEMPERATURE
// Calcule la vrai température
x1 = (UT - (int32_t)ac6) * (int32_t)ac5 >> 15;
x2 = ((int32_t)mc << 11) / (x1 + (int32_t)md);
b5 = x1 + x2;
T = (b5 + 8) >> 4;
T = T / 10.0; // Retourne la température in celsius
return b5;
}
/**********************************************
Lecture de la pression
**********************************************/
int32_t read_pressure()
{
int32_t value;
Wire.beginTransmission(ADDRESS_SENSOR); // Début de transmission avec l'Arduino
Wire.write(0xf4); // Envoi l'adresse de registre
Wire.write(0x34 + (oss << 6)); // Ecrit la donnée
Wire.endTransmission(); // Fin de transmission
delay(osd);
Wire.beginTransmission(ADDRESS_SENSOR);
Wire.write(0xf6);
Wire.endTransmission();
Wire.requestFrom(ADDRESS_SENSOR, 3);
if(Wire.available() >= 3)
{
value = (((int32_t)Wire.read() << 16) | ((int32_t)Wire.read() << 8) | ((int32_t)Wire.read())) >> (8 - oss);
}
return value; // Renvoie la valeur
}
/**********************************************
Lecture d'un byte sur la capteur BMP
**********************************************/
uint8_t read_1_byte(uint8_t code)
{
uint8_t value;
Wire.beginTransmission(ADDRESS_SENSOR);
Wire.write(code);
Wire.endTransmission();
Wire.requestFrom(ADDRESS_SENSOR, 1);
if(Wire.available() >= 1)
{
value = Wire.read();
}
return value;
}
/**********************************************
Lecture de 2 bytes sur la capteur BMP
**********************************************/
uint16_t read_2_bytes(uint8_t code)
{
uint16_t value;
Wire.beginTransmission(ADDRESS_SENSOR);
Wire.write(code);
Wire.endTransmission();
Wire.requestFrom(ADDRESS_SENSOR, 2);
if(Wire.available() >= 2)
{
value = (Wire.read() << 8) | Wire.read(); // Récupère 2 bytes de données
}
return value; // Renvoie la valeur
}
Thanks guys. But things that you talking about are far beyond my abilities. Although I make it run via Arduino IDE. Because there is wayland/bmp280-barometer
library I thought that there is also BMP-180
.
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.