Current section

Files

Jump to
aht20 lib aht20.ex
Raw

lib/aht20.ex

defmodule AHT20 do
@moduledoc """
Read temperature and humidity from a AHT20 sensor.
"""
use GenServer
@typedoc """
AHT20 GenServer start_link options
* `:name` - a name for the GenServer
* `:bus_name` - which I2C bus to use (e.g., `"i2c-1"`)
* `:bus_address` - the address of the AHT20 (defaults to 0x38)
"""
@type options() ::
[
name: GenServer.name()
]
| AHT20.Sensor.config()
@doc """
Detect devices on I2C buses.
"""
def detect_device(), do: Circuits.I2C.detect_devices()
@doc """
Start a new GenServer for interacting with a AHT20.
Normally, you'll want to pass the `:bus_name` option to specify the I2C
bus going to the AHT20.
"""
@spec start_link(options()) :: GenServer.on_start()
def start_link(init_arg) do
options = Keyword.take(init_arg, [:name])
GenServer.start_link(__MODULE__, init_arg, options)
end
def measure(server \\ __MODULE__), do: GenServer.call(server, :measure)
@deprecated "Use AHT20.measure/1 instead"
def read(server \\ __MODULE__), do: measure(server)
@deprecated "Use AHT20.measure/1 instead"
def read_data(server \\ __MODULE__), do: measure(server)
@deprecated "Will be removed in next release"
def read_state(server \\ __MODULE__), do: GenServer.call(server, :read_state)
@impl true
def init(config) do
{:ok, _sensor} = AHT20.Sensor.start(config)
end
@impl true
def handle_call(:measure, _from, sensor) do
case AHT20.Sensor.read_data(sensor) do
{:ok, sensor_output} ->
measurement = AHT20.Measurement.from_sensor_output(sensor_output)
{:reply, {:ok, measurement}, sensor}
{:error, reason} ->
{:reply, {:error, reason}, sensor}
end
end
def handle_call(:read_state, _from, sensor) do
case AHT20.Sensor.read_state(sensor) do
{:ok, sensor_output} ->
sensor_state = AHT20.State.from_sensor_output(sensor_output)
{:reply, {:ok, sensor_state}, sensor}
{:error, reason} ->
{:reply, {:error, reason}, sensor}
end
end
end