Acme-FishFarm
view release on metacpan or search on metacpan
lib/Acme/FishFarm/WaterConditionMonitor.pm view on Meta::CPAN
our $VERSION = '1.01';
=head1 SYNOPSIS
use 5.010;
use Acme::FishFarm::WaterConditionMonitor;
use Acme::FishFarm::OxygenMaintainer;
my $water_monitor = Acme::FishFarm::WaterConditionMonitor->install;
my $oxygen = Acme::FishFarm::OxygenMaintainer->install( DO_generation_volume => 1.92 );
$water_monitor->add_oxygen_maintainer( $oxygen );
# always check water conditions before checking LEDs and buzzers
# also, these four method will return 1 or 0, upon calling them, the status of LEDs and buzzers will also be updated
$water_monitor->ph_is_normal;
$water_monitor->temperature_is_normal;
$water_monitor->lacking_oxygen;
$water_monitor->water_dirty;
if ( $water_monitor->is_on_LED_DO ) {
# do something, same goes to the rest of the LEDs
}
if ( $water_monitor->is_on_buzzer_short ) {
# do something
} elsif ( $water_monitor->is_on_buzzer_long ) {
# do something
}
=head1 EXPORT
None
=head1 NOTES
Some of the methods in this module can be confusing expecially when it comes to checking abnormal water conditions.
B<Please always always always check the water condition before checking the LEDs and buzzers status.>
C<Acme::FishFarm> contains subroutines to check all the abnormal water conditions to ease this job.
=head1 CREATION RELATED SUBROUTINES/METHODS
Only 3 sensors are built-in. However, there is a 4th socket for the oxygen maintainer. For this socket, you'll need to manuall connect an Acme::FishFarm::OxygenMaintainer object by calling the C<add_oxygen_maintainer> method.
More sockets might be available in the future.
=head2 install ( %sensors )
Installs a water condition monitoring system.
The C<%sensors> included are:
=over 4
=item pH
Optional. The default threshold range is C<[6.5, 7.5]> and the default pH is C<7.0>.
This will set the threshold value of the water pH. Please pass in an array reference to this key
in the form of C<[min_pH, max_pH]>
The values are in the range of C<1-14>. However, this range is not checked for incorrect values.
=item temperature
Optional. The default threshold range is C<[20, 25]> degree celcius and the default temprature is C<25>.
This will set the threshold value of the water temperature. Please pass in an array reference to this key
in the form of C<[min_temperature, max_temperature]>
The ranges of values are between C<0> and C<50> degree B<celcius>. However, this range is not checked for incorrect values. The unit C<celcius> is just a unit, it doesn't show up if you call any of it's related getters.
=item turbidity
Optional. The default threshold is C<180 ntu> and the default turbidity is set to C<10 ntu>.
This will set the threshold of the turbidity of the water.
The range of values are between C<0 ntu> and C<300 ntu>. However, this range is not checked for incorrect values. The unit C<ntu> is just a unit, it doesn't show up if you call any of it's related getters.
=back
=cut
sub install {
my $class = shift;
my %sensors = @_;
if ( not $sensors{pH} ) {
$sensors{pH_range} = [6.5, 7.5];
$sensors{current_pH} = 7.0;
$sensors{pH_LED_on} = 0;
}
if ( not $sensors{temperature} ) {
$sensors{temperature_range} = [20, 25];
$sensors{current_temperature} = 23;
$sensors{temperature_LED_on} = 0;
}
if ( not $sensors{turbidity} ) {
$sensors{turbidity_threshold} = 180;
$sensors{current_turbidity} = 10;
$sensors{turbidity_LED_on} = 0;
}
# low DO led, use Acme::FishFarm::OxygenMaintainer to determine
$sensors{DO_LED_on} = 0;
$sensors{lighted_LED_count} = 0;
$sensors{short_buzzer_on} = 0;
$sensors{long_buzzer_on} = 0;
bless \%sensors, "Acme::FishFarm::WaterConditionMonitor";
}
=head2 add_oxygen_maintainer ( $oxygen_maintainer )
Connects the oxygen maintainer ie C<Acme::FishFarm::OxygenMaintainer> system to this monitoring system.
For now, this module can only check if the oxygen is lacking or not. This module contains a user friendly method compared to the standard terminology used in the C<Acme::FishFarm::OxygenMaintainer> module. Other user friendly methods will be added in...
=cut
sub add_oxygen_maintainer {
ref( my $self = shift ) or croak "Please use this the OO way";
if ( ref( my $oxygen_maintainer = shift ) ne "Acme::FishFarm::OxygenMaintainer") {
croak "Please pass in an Acme::FishFarm::OxygenMaintainer object!";
} else {
$self->{oxygen_maintainer} = $oxygen_maintainer;
}
}
=head1 WATER CONDITIONS RELATED SUBROUTINES/METHODS
( run in 1.115 second using v1.01-cache-2.11-cpan-39bf76dae61 )