UdonLibrary 1.0.0
機械システム研究部 C++ ライブラリ
読み取り中…
検索中…
一致する文字列を見つけられません
SegmentsLed.hpp
[詳解]
1//
2// 7セグメントLED
3//
4// Copyright (c) 2022-2024 udonrobo
5//
6
7#pragma once
8
9#ifdef ARDUINO
10
11# include <Udon/Stl/EnableSTL.hpp>
12# include <array>
13# include <vector>
14# include <stdint.h>
15
16namespace Udon
17{
18
23 class SegmentsLed
24 {
25 std::array<uint8_t, 7> cathode;
26 std::vector<uint8_t> anode;
27 std::array<uint8_t, 10> format;
28
29 uint8_t value; // 表示する値
30 uint8_t digit; // 表示中の桁
31
32 public:
43 SegmentsLed(std::array<uint8_t, 7>&& cathode,
44 std::vector<uint8_t>&& anode,
45 std::array<uint8_t, 10>&& format = {
46 0b0111111, // 0
47 0b0000110, // 1
48 0b1011011, // 2
49 0b1001111, // 3
50 0b1100110, // 4
51 0b1101101, // 5
52 0b1111101, // 6
53 0b0100111, // 7
54 0b1111111, // 8
55 0b1101111 // 9
56 })
57 : cathode(cathode)
58 , anode(std::move(anode))
59 , format(format)
60 {
61 }
62
64 void begin()
65 {
66 for (auto&& pin : cathode)
67 {
68 pinMode(pin, OUTPUT);
69 }
70 for (auto&& pin : anode)
71 {
72 pinMode(pin, OUTPUT);
73 }
74 }
75
78 void setValue(int num)
79 {
80 value = num;
81 }
82
84 void show()
85 {
86 // ループ毎に1桁ずつ表示
87 const uint8_t single = static_cast<uint8_t>(value / pow(10, digit)) % 10;
88
89 // 表示中の桁消灯
90 digitalWrite(anode.at(digit), HIGH);
91
92 digit++;
93 if (digit >= anode.size())
94 {
95 digit = 0;
96 }
97
98 for (uint8_t i = 0; i < cathode.size(); i++)
99 {
100 digitalWrite(cathode.at(i), not bitRead(format.at(single), i));
101 }
102
103 // 桁点灯
104 digitalWrite(anode.at(digit), LOW);
105 }
106
107 void showNan()
108 {
109 for (auto&& pin : anode)
110 {
111 digitalWrite(pin, HIGH);
112 }
113
114 // 中央のLEDのみ点灯させる
115 for (int i = 0; i < 6; ++i)
116 {
117 digitalWrite(cathode.at(i), HIGH);
118 }
119 digitalWrite(cathode.at(6), LOW);
120 }
121 };
122
123} // namespace Udon
124
125#endif
Definition Bit.hpp:12
Definition Typedef.hpp:94