module System.Hardware.Arduino.SamplePrograms.Distance where
import Control.Monad (forever)
import Control.Monad.Trans (liftIO)
import Numeric (showGFloat)
import System.Hardware.Arduino
microSecondsToCentimeters :: Int -> Float
microSecondsToCentimeters :: Int -> Float
microSecondsToCentimeters Int
d = Float
1.716e-2 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Int -> Float
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
d
distance :: IO ()
distance :: IO ()
distance = Bool -> FilePath -> Arduino () -> IO ()
withArduino Bool
False FilePath
"/dev/cu.usbmodemFD131" (Arduino () -> IO ()) -> Arduino () -> IO ()
forall a b. (a -> b) -> a -> b
$ do
Pin -> PinMode -> Arduino ()
setPinMode Pin
sensor PinMode
INPUT
Pin -> PinMode -> Arduino ()
setPinMode Pin
led PinMode
OUTPUT
Arduino ()
forall {b}. Arduino b
update
where sensor :: Pin
sensor = Word8 -> Pin
digital Word8
2
led :: Pin
led = Word8 -> Pin
digital Word8
13
measure :: Arduino ()
measure = do Maybe Int
mbd <- Pin -> Bool -> Int -> Maybe Int -> Arduino (Maybe Int)
pulse Pin
sensor Bool
True Int
10 Maybe Int
forall a. Maybe a
Nothing
case Maybe Int
mbd of
Maybe Int
Nothing -> IO () -> Arduino ()
forall a. IO a -> Arduino a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> Arduino ()) -> IO () -> Arduino ()
forall a b. (a -> b) -> a -> b
$ FilePath -> IO ()
putStrLn FilePath
"Distance: No measurement received."
Just Int
d -> do let c :: Float
c = Int -> Float
microSecondsToCentimeters Int
d
IO () -> Arduino ()
forall a. IO a -> Arduino a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> Arduino ()) -> IO () -> Arduino ()
forall a b. (a -> b) -> a -> b
$ FilePath -> IO ()
putStrLn (FilePath -> IO ()) -> FilePath -> IO ()
forall a b. (a -> b) -> a -> b
$ FilePath
"Distance: " FilePath -> FilePath -> FilePath
forall a. [a] -> [a] -> [a]
++ Maybe Int -> Float -> FilePath -> FilePath
forall a. RealFloat a => Maybe Int -> a -> FilePath -> FilePath
showGFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
2) Float
c FilePath
" centimeters."
Pin -> Bool -> Arduino ()
digitalWrite Pin
led (Float
c Float -> Float -> Bool
forall a. Ord a => a -> a -> Bool
< Float
5)
update :: Arduino b
update = Arduino () -> Arduino b
forall (f :: * -> *) a b. Applicative f => f a -> f b
forever (Arduino () -> Arduino b) -> Arduino () -> Arduino b
forall a b. (a -> b) -> a -> b
$ do Arduino ()
measure
Int -> Arduino ()
delay Int
1000