我使用A / D转换器来获得电导率探头的一些结果。我使用Sparky's Widgets的miniEC接口。我们运行校准并获得斜率和截距值。当我在静态脚本中使用此校准测试此值时,结果是正确的。
看到这里,不是一件大事,而是证明我的校准效果很好。结果是正确的。
#!/usr/bin/perl
my $slope = "0.048684077307972626";
my $intercept = "24.831896523430906";
$ECdec = 62.5;
print "$ECdec \n";
###lin
$EC1 = ( ( $ECdec - $intercept ) / $slope );
print "Electric Conductivity $EC1 µS/m \n";
输出是:
62.5
Electric Conductivity 773.725323749752 �S/m
当我将静态值$ECdec
交换到A / D转换器的输出并尝试获得结果时,这是完全错误的。谁能看到我的失败?
这是Perl,它从转换器读取探测值,交换字节,将其转换为十进制,然后添加线性回归。我做错了什么?
#!/usr/bin/perl
my $dir = '/var/www/motion';
my $slope = "0.048684077307972626";
my $intercept = "24.831896523430906";
###get value
my $EC = `sudo i2cget -y 1 0x4a 0x00 w` ;
print "$EC \n";
###swap
my $ECswap = $EC;
substr $ECswap, 4, 0, substr $ECswap, 2, 2, q();
print "$ECswap \n";
###convert to decimal
$ECdec = hex($ECswap);
print "$ECdec \n";
$ECvalue = ($ECdec - $ECintercept)/$slope);
print "$ECvalue"
#$rrd = `/usr/bin/rrdtool update $dir/homeec.rrd N:$ECdec`;
####system ("clear");
print "Electric Conductivity $ECdec µS/m \n";
这里的输出是:
0x5303
0x0353
851
Electric Conductivity 16969.9858590372 �S/m
答案 0 :(得分:1)
您正在输出中打印$ECdec
而不是$ECvalue
此外,请始终发布您的真实代码。您显示的程序将无法编译,显然不是给您带来问题的程序
这是你的程序看起来的样子
你必须始终 use strict
和use warnings 'all'
在最琐碎的Perl程序的顶部,并使用my
如果您的代码包含非ASCII字符,例如microSiemens中的希腊语mu use utf8
,则应始终µ
。 Perl不支持7位ASCII或UTF-8以外的其他编码源代码。我不知道您的终端是否需要UTF-8字符,您可能需要更改use open
语句
我已将您对i2cget的调用注释掉,以检索实际值并替换为常量字符串
我还在将字节换成速度之前将十六进制字符串转换为二进制字符串,但它远非关键,如果您发现它更具可读性,则应保留字符交换。我会使用正则表达式并像这样写
die unless $EChex =~ /0x(\p{hex}{2})(\p{hex}{2})/;
my $EC = hex($2.$1);
#!/usr/bin/perl
use utf8;
use strict;
use warnings 'all';
use open qw/ :std :encoding(utf8) /;
use constant DIR => '/var/www/motion';
use constant SLOPE => 0.048684077307972626;
use constant INTERCEPT => 24.831896523430906;
# my $EChex = `sudo i2cget -y 1 0x4a 0x00 w` ;
my $EChex = '0x5303';
printf "\$EChex = %s\n", $EChex;
my $EC = hex $EChex;
printf "\$EC = %s\n", $EC;
$EC = (($EC & 0xFF00) >> 8) | (($EC & 0xFF) << 8); # swap bytes
my $ECvalue = ($EC - INTERCEPT) / SLOPE;
printf "Electric Conductivity %.3fµS/m \n", $ECvalue;
$EChex = 0x5303
$EC = 21251
Electric Conductivity 16969.986µS/m