Arduino Forum

Using Arduino => Programming Questions => Topic started by: chris13409 on Mar 29, 2011, 06:00 am

Title: Display sensor data on a Nokia 3310?
Post by: chris13409 on Mar 29, 2011, 06:00 am
I'm trying to interface a Bosch BMP085 and a Nokia 3310 LCD.  I'm a rank beginner, but I'm almost there.
I can get the sensor data to display in the Serial Monitor,  but I don't know how to display that data on the LCD.
I can the Lcdstring ("temp") and ("press") on the LCD.  I understand that comes from the ASCII table.
How do I get (temperature,DEC) and (pressure,DEC) to work on the LCD?

Code: [Select]

void setup()
{
LcdInitialise();
LcdClear();
Serial.begin(9600); // start serial for output
Serial.println("Setting up BMP085");
Wire.begin();
bmp085_get_cal_data();
}
void bmp085_read_temperature_and_pressure(int& temperature, long& pressure);

void loop()
{

int temperature = 0;
long pressure = 0;

bmp085_read_temperature_and_pressure(&temperature,&pressure);
Serial.print(temperature,DEC);
Serial.print("   ");
Serial.print(pressure,DEC);
Serial.println();[/color]
delay(100);

gotoXY(1,0);
LcdString("temp");
gotoXY(1,3);
LcdString("press");
}

 
void bmp085_read_temperature_and_pressure(int* temperature, long* pressure) {
long ut= bmp085_read_ut();
long up = bmp085_read_up();
long x1, x2, x3, b3, b5, b6, p;
unsigned long b4, b7;

//calculate the temperature
x1 = ((long)ut - ac6) * ac5 >> 15;
x2 = ((long) mc << 11) / (x1 + md);
b5 = x1 + x2;
*temperature = (b5 + 8) >> 4;

//calculate the pressure
b6 = b5 - 4000;
x1 = (b2 * (b6 * b6 >> 12)) >> 11;
x2 = ac2 * b6 >> 11;
x3 = x1 + x2;

//b3 = (((int32_t) ac1 * 4 + x3)<> 2;

if (oversampling_setting == 3) b3 = ((int32_t) ac1 * 4 + x3 + 2) << 1;
if (oversampling_setting == 2) b3 = ((int32_t) ac1 * 4 + x3 + 2);
if (oversampling_setting == 1) b3 = ((int32_t) ac1 * 4 + x3 + 2) >> 1;
if (oversampling_setting == 0) b3 = ((int32_t) ac1 * 4 + x3 + 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 >> oversampling_setting);
p = b7 < 0x80000000 ? (b7 * 2) / b4 : (b7 / b4) * 2;

x1 = (p >> 8) * (p >> 8);
x1 = (x1 * 3038) >> 16;
x2 = (-7357 * p) >> 16;
*pressure = p + ((x1 + x2 + 3791) >> 4);

}

unsigned int bmp085_read_ut()
{
write_register(0xf4,0x2e);
delay(5); //longer than 4.5 ms
return read_int_register(0xf6);
}

void bmp085_get_cal_data() {
Serial.println("Reading Calibration Data");
ac1 = read_int_register(0xAA);
Serial.print("AC1: ");
Serial.println(ac1,DEC);
ac2 = read_int_register(0xAC);
Serial.print("AC2: ");
Serial.println(ac2,DEC);
ac3 = read_int_register(0xAE);
Serial.print("AC3: ");
Serial.println(ac3,DEC);
ac4 = read_int_register(0xB0);
Serial.print("AC4: ");
Serial.println(ac4,DEC);
ac5 = read_int_register(0xB2);
Serial.print("AC5: ");
Serial.println(ac5,DEC);
ac6 = read_int_register(0xB4);
Serial.print("AC6: ");
Serial.println(ac6,DEC);
b1 = read_int_register(0xB6);
Serial.print("B1: ");
Serial.println(b1,DEC);
b2 = read_int_register(0xB8);
Serial.print("B2: ");
Serial.println(b1,DEC);
mb = read_int_register(0xBA);
Serial.print("MB: ");
Serial.println(mb,DEC);
mc = read_int_register(0xBC);
Serial.print("MC: ");
Serial.println(mc,DEC);
md = read_int_register(0xBE);
Serial.print("MD: ");
Serial.println(md,DEC);
}

long bmp085_read_up() {
write_register(0xf4,0x34+(oversampling_setting<<6));
delay(pressure_waittime[oversampling_setting]);
Title: Re: Display sensor data on a Nokia 3310?
Post by: PaulS on Mar 29, 2011, 10:46 am
Quote
How do I get (temperature,DEC) and (pressure,DEC) to work on the LCD?

The Serial.print(temperature, DEC); function is converting the value in the temperature variable to a string, with a base 10 representation of the value, then sending that string to the serial port.

You need to do the same thing, except send the resulting string to the LCD, using LcdString().

Look at the sprintf function. It converts numbers to strings.
Title: Re: Display sensor data on a Nokia 3310?
Post by: chris13409 on Mar 30, 2011, 03:37 am
I need some spoon feeding on this.  I looked up sprintf,  but don't get how to use it. 
I tried putting  sprintf(temperature,DEC); into the setup (just a guess).  It didn't work. 
Thanks. 

Code: [Select]
void loop()
{
int temperature = 0;
long pressure = 0;
bmp085_read_temperature_and_pressure(&temperature,&pressure);
Serial.print(temperature,DEC);
Serial.print(" ");
Serial.print(pressure,DEC);
Serial.println();
delay(100);

LcdClear();
gotoXY(1,1);
LcdString("TEMP");
gotoXY(1,3);
LcdString("PRES");

sprintf(temperature,DEC);  // this causes a bunch of errors
Title: Re: Display sensor data on a Nokia 3310?
Post by: PaulS on Mar 30, 2011, 12:25 pm
Code: [Select]
char buffer[8];
sprintf(buffer, "%4d", temperature);
Title: That works. Thanks
Post by: chris13409 on Mar 30, 2011, 11:33 pm
Thanks,  that's what I needed.

I had some trouble with pressure, but following your post to someone else I changed "%4d" to "%ld".