Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

4 Digit 7 Segment LED

4_digit_7_segment_led.livemd

4 Digit 7 Segment LED

準備

import Bitwise

ピンを開く

Circuits.GPIO.enumerate()
|> Kino.DataTable.new()
{:ok, sdi} = Circuits.GPIO.open("GPIO24", :output)
{:ok, rclk} = Circuits.GPIO.open("GPIO23", :output)
{:ok, srclk} = Circuits.GPIO.open("GPIO18", :output)
place_pins =
  [
    "SPI_MOSI",
    "GPIO22",
    "GPIO27",
    "GPIO17"
  ]
  |> Enum.map(fn label ->
    label
    |> Circuits.GPIO.open(:output)
    |> elem(1)
  end)

関数を定義する

clear_display = fn sdi, rclk, srclk ->
  Enum.each(1..8, fn _ ->
    Circuits.GPIO.write(sdi, 1)
    Circuits.GPIO.write(srclk, 1)
    Circuits.GPIO.write(srclk, 0)
  end)

  Circuits.GPIO.write(rclk, 1)
  Circuits.GPIO.write(rclk, 0)
end
shift_out = fn data, sdi, rclk, srclk ->
  for bit <- 0..7 do
    bit = data <<< bit &amp;&amp;&amp; 0x80
    Circuits.GPIO.write(sdi, bit)
    Circuits.GPIO.write(srclk, 1)
    Process.sleep(1)
    Circuits.GPIO.write(srclk, 0)
  end

  Circuits.GPIO.write(rclk, 1)
  Process.sleep(1)
  Circuits.GPIO.write(rclk, 0)
end
pick_digit = fn place_pins, digit ->
  Enum.each(place_pins, fn pin ->
    Circuits.GPIO.write(pin, 0)
  end)

  place_pins
  |> Enum.at(digit)
  |> Circuits.GPIO.write(1)
end
clear_display.(sdi, rclk, srclk)

pick_digit.(place_pins, 0)

seg_code
|> Enum.at(0)
|> shift_out.(sdi, rclk, srclk)
clear_display.(sdi, rclk, srclk)

pick_digit.(place_pins, 1)

seg_code
|> Enum.at(2)
|> shift_out.(sdi, rclk, srclk)
display = fn char, place, place_pins, sdi, rclk, srclk ->
  clear_display.(sdi, rclk, srclk)

  pick_digit.(place_pins, place)

  shift_out.(char, sdi, rclk, srclk)
end

COOL を表示する

cool_code = [
  0b00111001,
  0b00111111,
  0b00111111,
  0b00111000
]

0..100
|> Enum.map(fn _ ->
  ~~~Enum.at(cool_code, 3)
  |> display.(0, place_pins, sdi, rclk, srclk)

  ~~~Enum.at(cool_code, 2)
  |> display.(1, place_pins, sdi, rclk, srclk)

  ~~~Enum.at(cool_code, 1)
  |> display.(2, place_pins, sdi, rclk, srclk)

  ~~~Enum.at(cool_code, 0)
  |> display.(3, place_pins, sdi, rclk, srclk)
end)

4桁カウンターを表示する

seg_code = [0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90]
0..1000
|> Enum.map(fn counter ->
  seg_code
  |> Enum.at(rem(counter, 10))
  |> display.(0, place_pins, sdi, rclk, srclk)

  seg_code
  |> Enum.at(div(rem(counter, 100), 10))
  |> display.(1, place_pins, sdi, rclk, srclk)

  seg_code
  |> Enum.at(div(rem(counter, 1000), 100))
  |> display.(2, place_pins, sdi, rclk, srclk)

  seg_code
  |> Enum.at(div(rem(counter, 10000), 1000))
  |> display.(3, place_pins, sdi, rclk, srclk)
end)

ピンを閉じる

Circuits.GPIO.close(sdi)
Circuits.GPIO.close(rclk)
Circuits.GPIO.close(srclk)
place_pins
|> Enum.map(fn pin ->
  Circuits.GPIO.close(pin)
end)