如何获得变量伏特在LCD上显示浮点数?
LCD仅显示带有大量小数位的浮点值,最后是E.我只需要2位小数,所以如何显示它?
int main (void){
adcinit();
lcd_init();//initializes LCD
lcd_clear();//clear screen
lcd_home();
uint16_t value;
float volts;
while(1){
ADCSRA |= (1<<ADSC);//start ADC conversion
delay_ms(54);//delay 54 millisecond
value = ADCW;//assign ADC conversion to value
volts=(value*5)/1023;
lcd_goto_xy(0,0);// coordinates of the cursor on LCD Display
lcd_printf("ADC Value: %d ",value);//display on LCD
lcd_goto_xy(0,1);// coordinates of the cursor on LCD Display
lcd_printf("Volts: %f ",volts);//display on LCD
}
}
答案 0 :(得分:1)
我在原帖的最后一句中回答了这个问题 - 而不是标题。但这是您项目的正确答案。
你说&#34;我只需要2位小数&#34; - 所以这应该告诉你,不需要浮点数学。物理学家和工程师需要花车代表非常,非常小或非常非常大的数量,但你需要&#34;固定点&#34; - 这意味着要进行整数数学运算并正确选择单位。固定点更快,更准确并减少了编译二进制文件的大小,因为不需要浮点代码。
最简单的解决方案是使用整数和显示毫伏,就像你刚刚使用的delay()函数采用整数毫秒的参数一样,而不是一个小数秒。
#define VREF 5000
uint32_t mvolts;
.
.
mvolts=(value*VREF)>>10; // No floats here...
lcd_printf("milliVolts: %d",mvolts); // ...and no casts
如果你必须显示伏特,那么这就可以了:
lcd_printf("Volts: %d.%02d ",mvolts/1000, (mvolts%1000)/10);
顺便提一下,请注意,mvolts是一个32位整数,因为你现在将10位数乘以5000并且不能适合16位。这是必需的,因为您需要在进行缩放时保持值的准确性。我不认为这是偏离主题的,因为我认为你确实想要显示正确的值,或者显示这两个小数位没有意义。< / p>
除非你小心,否则编译器会计算出5000/1024 - 4.8828125的值 - 然后进行整数运算,这会截断小数部分并最终将ADC结果乘以4.保证正确的行为,乘以5000然后除以 - 2个单独的操作。当1024是2 ** 10时,向右移10位与除以1024相同。
最后 - 不要假设从ADC读取1023实际上意味着5.000伏到4位有效数字;通过调整#define VREF
来校准测试的电压表,以获得正确的结果。
答案 1 :(得分:0)
试试这个:
编辑:我刚编辑了电压显示,因为值为int。但是普林西比会是一样的。
int main (void){
adcinit();
lcd_init();//initializes LCD
lcd_clear();//clear screen
lcd_home();
uint16_t value;
float volts;
while(1){
ADCSRA |= (1<<ADSC);//start ADC conversion
delay_ms(54);//delay 54 millisecond
value = ADCW;//assign ADC conversion to value
volts=(float)(value*5)/1023;
lcd_goto_xy(0,0);// coordinates of the cursor on LCD Display
lcd_printf("ADC Value: %d ",value);//display on LCD
lcd_goto_xy(0,1);// coordinates of the cursor on LCD Display
lcd_printf("Volts: %.2f ",volts);//display on LCD
}
}
答案 2 :(得分:0)
如果函数lcd_printf()
基于与Arduino函数sprintf()
相同的库,则格式说明符'%f'
即使用作'%.2f'
也不能很好地管理。
步骤1:在提出替代解决方案之前,必须从模数转换器读取的数值中获得计算良好的浮点值。
如果ADC是 10位,则范围应为 1024 (而不是1023)。
value = ADCW;//assign ADC conversion to value
volts=((float)value*5.0f)/(1024.0f);
Step2.1:显示2位小数固定浮点值的第一个快速解决方案是将其转换为2个整数。
lcd_printf("Volts: %d.%02d ",(int)volts, (int)(volts*100)%100));//display on LCD
而不是
lcd_printf("Volts: %.2f ",volts);//display on LCD
步骤2.2:更多官员&#39;显示2位小数固定浮点值的解决方案是使用"Arduino sprintf float not formatting"中建议的dtostrf()
函数。
char str_volts[15]; // to store the float-to-string converted value
lcd_printf("Volts: %s ",dtostrf(volts, 4, 2, str_volts));//display on LCD
// 4 = minimum number of char ('X.XX'), 2 = number of decimals
而不是
lcd_printf("Volts: %.2f ",volts);//display on LCD