http://www.perlmonks.org?node_id=1139037


in reply to Match Numeric Range

Hi PilotinControl,

You may apply hystersis. The state will be set to 1 if the value goes above three times the upper limit or it will be set to 0 if the value goes below lower limit three times.

#!/usr/bin/perl use strict; use warnings; my $state = 0; # 0 - light off, 1 - light on my $uplim = 102; # upper limit my $lolim = 98; # lower limit my $n = 3; # my $counter = 0; # Set initial state # This part may need more work in order to avoid eventual starting gli +tch. my $value = <DATA>; chomp $value; if ($value > (($uplim + $lolim) / 2.0)) { $state = 1; } else { $state = 0; } # work continuously while ($value = <DATA>) { chomp $value; # Adjust counter if ($value > $uplim) { if ($counter < 0) { $counter = 0; } else { $counter++; } } elsif ($value < $lolim) { if ($counter > 0) { $counter = 0; } else { $counter--; } } else { $counter = 0; } # Set state if ($counter > $n) { $state = 1; } elsif ($counter < -$n) { $state = 0; } # Print my ($below, $between, $above); $below = $between = $above = '---'; if ($value > $uplim) { $above = $value; } elsif ($value < $lolim) { $below = $value; } else { $between = $value; } printf "state: %d cnt: %+3d %3s<%3d>%3s<%3d>%3s\n", $state, $counter +, $below, $lolim, $between, $uplim, $above; } __DATA__ 100 101 102 103 104 105 106 105 104 103 102 101 100 99 98 97 96 95 94 101 102 103 103 102 103 103 104 104