Skip to content

Latest commit

 

History

History
93 lines (70 loc) · 1.99 KB

notebook.livemd

File metadata and controls

93 lines (70 loc) · 1.99 KB

Hackathon 14

Hot Button

Interaction withe the system LED of the raspberry pi.

defmodule LED do
  @led Path.join("/sys/class/leds", "led0")

  def switch(:on) do
    File.write(Path.join(@led, "brightness"), "1")
  end

  def switch(:off) do
    File.write(Path.join(@led, "brightness"), "0")
  end
end

Various Mix.install examples: https://github.com/wojtekmach/mix_install_examples

Slack Webhook

Install elixir http client via mix.

Mix.install([
  {:castore, "~> 0.1.0"},
  {:mint, "~> 1.0"}
])

defmodule Slack do
  @url "hooks.slack.com"

  def post do
    {:ok, conn} = Mint.HTTP.connect(:https, @url, 443)

    {:ok, _conn, _request_ref} =
      Mint.HTTP.request(
        conn,
        "POST",
        Application.fetch_env!(:hot_button, :slack_webhook),
        [],
        "{\"channel\": \"#_hot_button\", \"username\": \"Hot Button\", \"text\": \"Someone pressed the hot button and it was successfully debounced by our awesome script.\", \"icon_emoji\": \":ghost:\"}"
      )
  end
end
{:ok, button_input} = Circuits.GPIO.open(21, :input)

# We will configure the button interrupts for both rising and falling.
Circuits.GPIO.set_interrupts(button_input, :both, suppress_glitches: true)
Circuits.GPIO.set_pull_mode(button_input, :pulldown)

defmodule Button do
  # The threshold is in nano seconds
  @threshold 500 * 10 ** 4

  # Watch for the button press
  def listen_forever(last \\ 0) do
    receive do
      {:circuits_gpio, _p, now, state} ->
        state
        |> to_action()
        |> receive_msg(last, now)
    end
  end

  def to_action(1), do: :on
  def to_action(0), do: :off

  def receive_msg(action, last, now) when now >= last + @threshold do
    IO.puts("#{now} #{action}")

    :ok = LED.switch(action)

    maybe_notify(action)
    listen_forever(now)
  end

  def receive_msg(_action, last, _now), do: listen_forever(last)

  def maybe_notify(:on), do: Slack.post()
  def maybe_notify(:off), do: nil
end
Button.listen_forever()