I have this digital thermometer from Sparkfun: tmp102. I used the example code linked on the product page to get values from the thing. But I have an issue from there. I want to take the value given and print (strobe) them to a 4x7 segment display. My issue is getting from a float of some unknown length to four integers.
Let's say the value read is 70.68. I need to get it so that:
a=7
b=0
c=7 (because it rounded up)
Or if the value is 101.56:
a=1
b=0
c=2 (because it rounds up)
The purpose of the fourth digit is to determine if the third gets rounded. But the three digits get printed to the display.
I've got:
//Arduino 1.0+ Only
//Arduino 1.0+ Only
//////////////////////////////////////////////////////////////////
//©2011 bildr
//Released under the MIT License - Please reuse change and share
//Simple code for the TMP102, simply prints temperature via serial
//////////////////////////////////////////////////////////////////
// SDA is on analog pin 4, and SCL is on analog pin 5
#include <Wire.h>
int tmp102Address = 0x48;
const int numbers[] = {0b11111100,0b01100000,0b11011010,0b11110010,0b01100110,0b10110110,0b01111010,0b11100000,0b11111110,0b11100110}; // 0-9
const int ser = 8;
const int load = 10;
const int sck = 9;
const int a1 = 2;
const int a2 = 3;
const int a3 = 4;
const int a4 = 5;
void setup(){
Wire.begin();
pinMode(ser,OUTPUT);
pinMode(sck,OUTPUT);
pinMode(load,OUTPUT);
pinMode(a1,OUTPUT);
pinMode(a2,OUTPUT);
pinMode(a3,OUTPUT);
pinMode(a4,OUTPUT);
digitalWrite(load,0);
shiftOut(ser,sck,LSBFIRST,0);
digitalWrite(a1,1);
digitalWrite(a2,1);
digitalWrite(a3,1);
digitalWrite(a4,1);
digitalWrite(load,1);
}
int a;
int b;
int c;
int s;
void loop(){
int dp;
float celsius = getTemperature();
float fahrenheit = (1.8 * celsius) + 32;
// delay(200); //just here to slow down the output. You can remove this
int f=(int)(fahrenheit*10.0);
int g=f;
if(g/1000 != 0){
a=g/1000;
b=(g/100)-(a*10);
c=(g/10)-(((a*10)+b)*10);
if((g-((a*100)+(b*10)+c)*10) > 4){
c++;
dp = 0;
}
}
else{
a=g/100;
b=(g/100)-(a*10);
c=g-(((a*10)+b)*10);
}
digitalWrite(load,0);
digitalWrite(a1,1);digitalWrite(a2,1);digitalWrite(a3,1);digitalWrite(a4,1);
shiftOut(ser,sck,LSBFIRST,0b10001110);
digitalWrite(load,1);
digitalWrite(a1,0);digitalWrite(a2,1);digitalWrite(a3,1);digitalWrite(a4,1);
delay(5);
digitalWrite(load,0);
digitalWrite(a1,1);digitalWrite(a2,1);digitalWrite(a3,1);digitalWrite(a4,1);
shiftOut(ser,sck,LSBFIRST,numbers[a]);
digitalWrite(load,1);
digitalWrite(a1,1);digitalWrite(a2,0);digitalWrite(a3,1);digitalWrite(a4,1);
delay(5);
if(dp==0){
s = numbers[b];
}
else{
s = numbers[b]+1;
}
digitalWrite(load,0);
digitalWrite(a1,1);digitalWrite(a2,1);digitalWrite(a3,1);digitalWrite(a4,1);
shiftOut(ser,sck,LSBFIRST,s);
digitalWrite(load,1);
digitalWrite(a1,1);digitalWrite(a2,1);digitalWrite(a3,0);digitalWrite(a4,1);
delay(5);
digitalWrite(load,0);
digitalWrite(a1,1);digitalWrite(a2,1);digitalWrite(a3,1);digitalWrite(a4,1);
shiftOut(ser,sck,LSBFIRST,numbers[c]);
digitalWrite(load,1);
digitalWrite(a1,1);digitalWrite(a2,1);digitalWrite(a3,1);digitalWrite(a4,0);
// delay(10);
}
float getTemperature(){
Wire.requestFrom(tmp102Address,2);
byte MSB = Wire.read();
byte LSB = Wire.read();
//it's a 12bit int, using two's compliment for negative
int TemperatureSum = ((MSB << 8) | LSB) >> 4;
float celsius = TemperatureSum*0.0625;
return celsius;
}