arduino-copilot-1.5.2: Examples/EEPROMrange/Demo.hs
{-# LANGUAGE RebindableSyntax #-}
module Examples.EEPROMrange.Demo where
import Copilot.Arduino.Uno
import qualified Copilot.Arduino.Library.EEPROMex as EEPROM
import qualified Copilot.Arduino.Library.Serial as Serial
import System.Environment
-- Change this to use a smaller part of the EEPROM.
sz :: Word16
sz = sizeOfEEPROM
main :: IO ()
main = do
z <- lookupEnv "ZERO"
arduino $ case z of
Just "y" -> mainZero
_ -> mainReal
-- Zero out the EEPROM, in preparation for mainReal.
mainZero :: Sketch ()
mainZero = do
EEPROM.maxAllowedWrites sz
range <- EEPROM.allocRange sz :: Sketch (EEPROM.Range Word8)
range =: EEPROM.sweepRange 0 (constant (0 :: Word8))
Serial.baud 9600
Serial.device =: [ Serial.str "EEPROM zeroing started" ]
@: firstIteration
mainReal :: Sketch ()
mainReal = do
EEPROM.maxAllowedWrites (sz * 10)
range <- EEPROM.allocRange sz :: Sketch (EEPROM.Range ADC)
v <- input' a1 ([10, 20..] :: [ADC])
range =: EEPROM.sweepRange 0 v @: frequency 3
oldv <- input' (EEPROM.scanRange range 1) [11..] :: Sketch (Behavior ADC)
led =: frequency 3
Serial.device =:
[ Serial.str "a1:"
, Serial.show v
, Serial.str " old EEPROM value:"
, Serial.show oldv
, Serial.char '\n'
]
delay =: MilliSeconds (constant 10000)
Serial.baud 9600