Go Down

Topic: Display sensor data on a Nokia 3310? (Read 1 time) previous topic - next topic

chris13409

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]);

PaulS

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.
The art of getting good answers lies in asking good questions.

chris13409

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

PaulS

Code: [Select]
char buffer[8];
sprintf(buffer, "%4d", temperature);
The art of getting good answers lies in asking good questions.

chris13409

Thanks,  that's what I needed.

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


Go Up