Why won't wire.h compile when included in a library?

CoderDojoPressureSensor.ino

// Warning: DO NOT connect to 5V; Connect to 3.3 instead
// Your sketch must #include this library, and the Wire library.
// (Wire is a standard library included with Arduino.):
#include "KeyStudioBMP180.h"



void setup()
{
  Serial.begin(9600);
  Wire.begin();
  bmp085Calibration();
}

void loop()
{
  
  float temperature = bmp085GetTemperature(bmp085ReadUT()); //MUST be called first
  float pressure = bmp085GetPressure(bmp085ReadUP());
  float atm = pressure / 101325; // "standard atmosphere"
  float altitude = calcAltitude(pressure); //Uncompensated caculation - in Meters 
  Serial.print("Temperature: ");
  Serial.print(temperature, 2); //display 2 decimal places
  Serial.println("deg C");
  Serial.print("Pressure: ");
  Serial.print(pressure, 0); //whole number only.
  Serial.println(" Pa");
  Serial.print("Standard Atmosphere: ");
  Serial.println(atm, 4); //display 4 decimal places
  Serial.print("Altitude: ");
  Serial.print(altitude, 2); //display 2 decimal places
  Serial.println(" M");
  Serial.println();//line break
  delay(1000); //wait a second and get values again.
}


KeyStudioBMP180.cpp

#include "KeyStudioBMP180.h"
#include <Wire.h>

const unsigned char OSS = 0;  // Oversampling Setting
// Calibration values
int ac1;
int ac2;
int ac3;
unsigned int ac4;
unsigned int ac5;
unsigned int ac6;
int b1;
int b2;
int mb;
int mc;
int md;
// b5 is calculated in bmp085GetTemperature(...), this variable is also used in bmp085GetPressure(...)
// so ...Temperature(...) must be called before ...Pressure(...).
long b5; 

// Stores all of the bmp085's calibration values into global variables
// Calibration values are required to calculate temp and pressure
// This function should be called at the beginning of the program
void bmp085Calibration()
{
  ac1 = bmp085ReadInt(0xAA);
  ac2 = bmp085ReadInt(0xAC);
  ac3 = bmp085ReadInt(0xAE);
  ac4 = bmp085ReadInt(0xB0);
  ac5 = bmp085ReadInt(0xB2);
  ac6 = bmp085ReadInt(0xB4);
  b1 = bmp085ReadInt(0xB6);
  b2 = bmp085ReadInt(0xB8);
  mb = bmp085ReadInt(0xBA);
  mc = bmp085ReadInt(0xBC);
  md = bmp085ReadInt(0xBE);
}

// Calculate temperature in deg C


float bmp085GetTemperature(unsigned int ut) {
  long x1, x2;
  x1 = (((long)ut - (long)ac6) * (long)ac5) >> 15;
  x2 = ((long)mc << 11) / (x1 + md);
  b5 = x1 + x2;
  float temp = ((b5 + 8) >> 4);
  temp = temp / 10;
  return temp;
}
// Calculate pressure given up
// calibration values must be known
// b5 is also required so bmp085GetTemperature(...) must be called first.
// Value returned will be pressure in units of Pa.
long bmp085GetPressure(unsigned long up) {
  long x1, x2, x3, b3, b6, p;
  unsigned long b4, b7;
  b6 = b5 - 4000;
  // Calculate B3
  x1 = (b2 * (b6 * b6) >> 12) >> 11;
  x2 = (ac2 * b6) >> 11;
  x3 = x1 + x2;
  b3 = (((((long)ac1) * 4 + x3) << OSS) + 2) >> 2;
  // Calculate B4
  x1 = (ac3 * b6) >> 13;
  x2 = (b1 * ((b6 * b6) >> 12)) >> 16;
  x3 = ((x1 + x2) + 2) >> 2;
  b4 = (ac4 * (unsigned long)(x3 + 32768)) >> 15;
  b7 = ((unsigned long)(up - b3) * (50000 >> OSS));
  if (b7 < 0x80000000)
    p = (b7 << 1) / b4;
  else
    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;
  return temp;
}
// Read 1 byte from the BMP085 at 'address'
char bmp085Read(unsigned char address)
{
  unsigned char data;

  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(address);
  Wire.endTransmission();
  Wire.requestFrom(BMP085_ADDRESS, 1);
  while (!Wire.available())
    ;
  return Wire.read();
}

// Read 2 bytes from the BMP085
// First byte will be from 'address'
// Second byte will be from 'address'+1
int bmp085ReadInt(unsigned char address)
{
  unsigned char msb, lsb;

  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(address);
  Wire.endTransmission();
  Wire.requestFrom(BMP085_ADDRESS, 2);
  while (Wire.available() < 2)
    ;
  msb = Wire.read();
  lsb = Wire.read();
  return (int) msb << 8 | lsb;
}
// Read the uncompensated temperature value
unsigned int bmp085ReadUT() {
  unsigned int ut;
  // Write 0x2E into Register 0xF4
  // This requests a temperature reading
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(0xF4);
  Wire.write(0x2E);
  Wire.endTransmission();
  // Wait at least 4.5ms
  delay(5);
  // Read two bytes from registers 0xF6 and 0xF7
  ut = bmp085ReadInt(0xF6);
  return ut;
}
// Read the uncompensated pressure value


unsigned long bmp085ReadUP() 
{
  unsigned char msb, lsb, xlsb;
  unsigned long up = 0;
  // Write 0x34+(OSS<<6) into register 0xF4
  // Request a pressure reading w/ oversampling setting
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(0xF4);
  Wire.write(0x34 + (OSS << 6));
  Wire.endTransmission();
  // Wait for conversion, delay time dependent on OSS
  delay(2 + (3 << OSS));
  // Read register 0xF6 (MSB), 0xF7 (LSB), and 0xF8 (XLSB)
  msb = bmp085Read(0xF6);
  lsb = bmp085Read(0xF7);
  xlsb = bmp085Read(0xF8);
  up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8 - OSS);
  return up;
}

void writeRegister(int deviceAddress, byte address, byte val) 
{
  Wire.beginTransmission(deviceAddress); // start transmission to device
  Wire.write(address);       // send register address
  Wire.write(val);         // send value to write
  Wire.endTransmission();     // end transmission
}

int readRegister(int deviceAddress, byte address) 
{
  int v;
  Wire.beginTransmission(deviceAddress);
  Wire.write(address); // register to read
  Wire.endTransmission();

  Wire.requestFrom(deviceAddress, 1); // read a byte

  while (!Wire.available()) {
    // waiting
  }
  v = Wire.read();
  return v;
}

float calcAltitude(float pressure)
{
  float A = pressure / 101325;
  float B = 1 / 5.25588;

  float C = pow(A, B);
  C = 1 - C;
  C = C / 0.0000225577;
  return C;
}

KeyStudioBMP180.h

#include <Arduino.h>


// https://wiki.keyestudio.com/Ks0054_keyestudio_BMP180_Digital_Barometric_Pressure_Sensor_Module_for_Arduino

#define BMP085_ADDRESS 0x77  // I2C address of BMP085
extern const unsigned char OSS = 0;  // Oversampling Setting
// Calibration values
extern int ac1;
extern int ac2;
extern int ac3;
extern unsigned int ac4;
extern unsigned int ac5;
extern unsigned int ac6;
extern int b1;
extern int b2;
extern int mb;
extern int mc;
extern int md;
// b5 is calculated in bmp085GetTemperature(...), this variable is also used in bmp085GetPressure(...)
// so ...Temperature(...) must be called before ...Pressure(...).
extern long b5; 

float calcAltitude(float pressure);

int readRegister(int deviceAddress, byte address);

void writeRegister(int deviceAddress, byte address, byte val);

unsigned long bmp085ReadUP();

unsigned int bmp085ReadUT();

int bmp085ReadInt(unsigned char address);

char bmp085Read(unsigned char address);

long bmp085GetPressure(unsigned long up);

float bmp085GetTemperature(unsigned int ut);

void bmp085Calibration();

In file included from C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:1:0:
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.h:10:28: warning: ‘OSS’ initialized and declared ‘extern’
extern const unsigned char OSS = 0; // Oversampling Setting
^~~
In file included from C:\Users\greg\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\cores\arduino/Print.h:27:0,
from C:\Users\greg\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\cores\arduino/Stream.h:26,
from C:\Users\greg\Documents\Arduino\libraries\Wire\src/Wire.h:26,
from C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:2:
C:\Users\greg\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\cores\arduino/Printable.h:25:1: error: unknown type name ‘class’; did you mean ‘labs’?
class Print;
^~~~~
labs
C:\Users\greg\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\cores\arduino/Printable.h:33:1: error: unknown type name ‘class’; did you mean ‘labs’?
class Printable
^~~~~
labs
C:\Users\greg\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\cores\arduino/Printable.h:34:1: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘attribute’ before ‘{’ token
{
^
In file included from C:\Users\greg\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\cores\arduino/Stream.h:26:0,
from C:\Users\greg\Documents\Arduino\libraries\Wire\src/Wire.h:26,
from C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:2:
C:\Users\greg\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\cores\arduino/Print.h:37:1: error: unknown type name ‘class’; did you mean ‘labs’?
class Print
^~~~~
labs
C:\Users\greg\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\cores\arduino/Print.h:38:1: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘attribute’ before ‘{’ token
{
^
In file included from C:\Users\greg\Documents\Arduino\libraries\Wire\src/Wire.h:26:0,
from C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:2:
C:\Users\greg\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\cores\arduino/Stream.h:49:1: error: unknown type name ‘class’; did you mean ‘labs’?
class Stream : public Print
^~~~~
labs
C:\Users\greg\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\cores\arduino/Stream.h:49:14: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘attribute’ before ‘:’ token
class Stream : public Print
^
In file included from C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:2:0:
C:\Users\greg\Documents\Arduino\libraries\Wire\src/Wire.h:33:1: error: unknown type name ‘class’; did you mean ‘labs’?
class TwoWire : public Stream
^~~~~
labs
C:\Users\greg\Documents\Arduino\libraries\Wire\src/Wire.h:33:15: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘attribute’ before ‘:’ token
class TwoWire : public Stream
^
C:\Users\greg\Documents\Arduino\libraries\Wire\src/Wire.h:82:8: error: unknown type name ‘TwoWire’
extern TwoWire Wire;
^~~~~~~
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c: In function ‘bmp085Read’:
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:70:7: error: request for member ‘beginTransmission’ in something not a structure or union
Wire.beginTransmission(BMP085_ADDRESS);
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:71:7: error: request for member ‘write’ in something not a structure or union
Wire.write(address);
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:72:7: error: request for member ‘endTransmission’ in something not a structure or union
Wire.endTransmission();
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:73:7: error: request for member ‘requestFrom’ in something not a structure or union
Wire.requestFrom(BMP085_ADDRESS, 1);
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:74:15: error: request for member ‘available’ in something not a structure or union
while (!Wire.available())
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:76:14: error: request for member ‘read’ in something not a structure or union
return Wire.read();
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c: In function ‘bmp085ReadInt’:
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:86:7: error: request for member ‘beginTransmission’ in something not a structure or union
Wire.beginTransmission(BMP085_ADDRESS);
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:87:7: error: request for member ‘write’ in something not a structure or union
Wire.write(address);
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:88:7: error: request for member ‘endTransmission’ in something not a structure or union
Wire.endTransmission();
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:89:7: error: request for member ‘requestFrom’ in something not a structure or union
Wire.requestFrom(BMP085_ADDRESS, 2);
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:90:14: error: request for member ‘available’ in something not a structure or union
while (Wire.available() < 2)
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:92:13: error: request for member ‘read’ in something not a structure or union
msb = Wire.read();
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:93:13: error: request for member ‘read’ in something not a structure or union
lsb = Wire.read();
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c: In function ‘bmp085ReadUT’:
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:101:7: error: request for member ‘beginTransmission’ in something not a structure or union
Wire.beginTransmission(BMP085_ADDRESS);
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:102:7: error: request for member ‘write’ in something not a structure or union
Wire.write(0xF4);
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:103:7: error: request for member ‘write’ in something not a structure or union
Wire.write(0x2E);
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:104:7: error: request for member ‘endTransmission’ in something not a structure or union
Wire.endTransmission();
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c: In function ‘bmp085ReadUP’:
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:120:7: error: request for member ‘beginTransmission’ in something not a structure or union
Wire.beginTransmission(BMP085_ADDRESS);
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:121:7: error: request for member ‘write’ in something not a structure or union
Wire.write(0xF4);
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:122:7: error: request for member ‘write’ in something not a structure or union
Wire.write(0x34 + (OSS << 6));
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:123:7: error: request for member ‘endTransmission’ in something not a structure or union
Wire.endTransmission();
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c: In function ‘writeRegister’:
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:136:7: error: request for member ‘beginTransmission’ in something not a structure or union
Wire.beginTransmission(deviceAddress); // start transmission to device
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:137:7: error: request for member ‘write’ in something not a structure or union
Wire.write(address); // send register address
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:138:7: error: request for member ‘write’ in something not a structure or union
Wire.write(val); // send value to write
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:139:7: error: request for member ‘endTransmission’ in something not a structure or union
Wire.endTransmission(); // end transmission
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c: In function ‘readRegister’:
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:145:7: error: request for member ‘beginTransmission’ in something not a structure or union
Wire.beginTransmission(deviceAddress);
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:146:7: error: request for member ‘write’ in something not a structure or union
Wire.write(address); // register to read
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:147:7: error: request for member ‘endTransmission’ in something not a structure or union
Wire.endTransmission();
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:149:7: error: request for member ‘requestFrom’ in something not a structure or union
Wire.requestFrom(deviceAddress, 1); // read a byte
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:151:15: error: request for member ‘available’ in something not a structure or union
while (!Wire.available()) {
^
C:\Users\greg\AppData\Local\Temp\arduino_build_954215\sketch\KeyStudioBMP180.c:154:11: error: request for member ‘read’ in something not a structure or union
v = Wire.read();
^
Multiple libraries were found for “Wire.h”
Used: C:\Users\greg\Documents\Arduino\libraries\Wire
Not used: C:\Users\greg\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3\libraries\Wire
Using library Wire at version 1.0 in folder: C:\Users\greg\Documents\Arduino\libraries\Wire
exit status 1
Error compiling for board Arduino Mega or Mega 2560.

The example wire.h sketches compile fine, but only when wire.h is included directly in the .ino file and all the wire.h related code is in there.

Arduino.h replaced wire.h back around version 1.0

Edit: (oops. I was thinking of Wiring.h. Wire.h is different (I2C)…)

There is a mismatch between what your post claims:

And what the output you shared shows:

The Wire library is written in C++. The.ino files of Arduino sketches are compiled as C++ after some minor preprocessing. But your KeyStudioBMP180.c file uses the .c file extension, which causes it to be compiled as C. There are differences between C++ and C. One of these is classes. There is no such thing as classes in C, which can cause you to get this sort of error if you try to use a C++ library from a C file:

Unless you’re really set on using C, the easy fix is to simply rename KeyStudioBMP180.c to KeyStudioBMP180.cpp. This will cause the Arduino IDE to compile it as C++, allowing it to use C++ code. If you are set on using C, then you won’t be able to use any C++ features in that code.

1 Like

We included wire.h in the .ino file and it seemed to fix the compile error.
Also changing the board back and forth seemed to force a full recompile and made the error go away.

And I did change the name back and forth between .c and .cpp and the compile error still occurred in both cases.

So I really don’t understand what was going on. But in the end we got it all to compile.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.