Hi, i have been working on making a VU meter on Arduino using the multifunctional shield. the analog read from the potentiometer on the shield is the voltage i am reading and when a certain voltage is reached an led turns on. i want to use the 4 digit 7 segment display to cast the voltage but i have a float value and i know i need a byte instead. i am only able to get the segment display to show voltage such as '3' not '3.17' for example.
any one help me converting this float to byte, to cast on the 7 segment. i want to achieve this using no libraries whatsoever.
const int LED = 13;
const int LED1 = 12;
const int LED2 = 11;
const int LED3 = 10;
const int Button = A1;
int ButtonState = 0; // push status to value
int Value = 0; // take value from button state
int On = 0; // take power status
#define LATCH_DIO 4
#define CLK_DIO 7
#define DATA_DIO 8
const byte SEGMENT_MAP[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0X80,0X90};
const byte SEGMENT_SELECT[] = {0xF1,0xF2,0xF4,0xF8};
void setup() {
Serial.begin(9600);
pinMode(LED, OUTPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(Button, INPUT_PULLUP);
pinMode(LATCH_DIO,OUTPUT);
pinMode(CLK_DIO,OUTPUT);
pinMode(DATA_DIO,OUTPUT);
}
void WriteNumberToSegment(byte Segment, byte ValueX)
{
digitalWrite(LATCH_DIO,LOW);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_MAP[ValueX]);
shiftOut(DATA_DIO, CLK_DIO, MSBFIRST, SEGMENT_SELECT[Segment] );
digitalWrite(LATCH_DIO,HIGH);
}
void WriteNumber(int Number)
{
WriteNumberToSegment(0 , Number / 1000);
WriteNumberToSegment(1 , (Number / 100) % 10);
WriteNumberToSegment(2 , (Number / 10) % 10);
WriteNumberToSegment(3 , Number % 10);
}
void loop()
{
Value = digitalRead(Button); //read the button and copy the state to Value
if (Value == HIGH && On == LOW) //if value from button state is high and the power is off
{
ButtonState = 1 - ButtonState; //determines if power stays on or off
delay(100);
}
On = Value; //light and value have same state
if (ButtonState == HIGH) //if the button is pressed
{
digitalWrite(LED, HIGH);
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
}
else
{
{
float voltage = analogRead(A0) * 0.00488758553;
Serial.println(voltage);
if (voltage > 4)
{
digitalWrite(LED, LOW);
}
else
{
digitalWrite(LED, HIGH);
}
if (voltage > 3)
{
digitalWrite(LED1, LOW);
}
else
{
digitalWrite(LED1, HIGH);
}
if (voltage > 2)
{
digitalWrite(LED2, LOW);
}
else
{
digitalWrite(LED2, HIGH);
}
if (voltage > 1)
{
digitalWrite(LED3, LOW);
}
else
{
digitalWrite(LED3, HIGH);
}
WriteNumber(voltage);
}
}
}