-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtsl2561.go
162 lines (141 loc) · 3.29 KB
/
tsl2561.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
package tsl2561
import (
"log"
"time"
. "github.com/eikeon/i2c"
)
const (
ADDRESS_LOW = 0x29
ADDRESS_FLOAT = 0x39
ADDRESS_HIGH = 0x49
COMMAND_BIT = 0x80
WORD_BIT = 0x20
CONTROL_POWERON = 0x03
CONTROL_POWEROFF = 0x00
REGISTER_CONTROL = 0x00
REGISTER_TIMING = 0x01
REGISTER_CHAN0_LOW = 0x0C
REGISTER_CHAN0_HIGH = 0x0D
REGISTER_CHAN1_LOW = 0x0E
REGISTER_CHAN1_HIGH = 0x0F
REGISTER_ID = 0x0A
GAIN_1X = 0x00
GAIN_16X = 0x10
INTEGRATIONTIME_13MS = 0x00 // rather 13.7ms
INTEGRATIONTIME_101MS = 0x01
INTEGRATIONTIME_402MS = 0x02
)
type TSL2561 struct {
bus *I2C
timing, gain byte
}
func NewTSL2561(bus, address byte) (t *TSL2561, err error) {
b, err := NewI2C(bus)
if err != nil {
return nil, err
}
t = &TSL2561{b, INTEGRATIONTIME_402MS, GAIN_16X}
err = b.SetAddress(address)
return
}
func (t *TSL2561) On() (err error) {
err = t.bus.WriteByte(COMMAND_BIT|REGISTER_CONTROL, CONTROL_POWERON)
if err != nil {
return err
}
err = t.bus.WriteByte(COMMAND_BIT|REGISTER_TIMING, t.timing|t.gain)
if err != nil {
return err
}
return
}
func (t *TSL2561) Off() (err error) {
err = t.bus.WriteByte(COMMAND_BIT|REGISTER_CONTROL, CONTROL_POWEROFF)
if err != nil {
return err
}
return
}
func (t *TSL2561) IntegrationDuration() (duration time.Duration) {
switch t.timing {
case INTEGRATIONTIME_13MS:
duration = time.Duration(13700 * time.Microsecond)
case INTEGRATIONTIME_101MS:
duration = time.Duration(102 * time.Millisecond)
case INTEGRATIONTIME_402MS:
duration = time.Duration(402 * time.Millisecond)
}
duration = duration * 780 / 735 // adjust from nominal to maximum
return
}
func (t *TSL2561) scale(value int) int {
switch t.timing {
case INTEGRATIONTIME_13MS:
value = value * 1000 / 34
case INTEGRATIONTIME_101MS:
value = value * 1000 / 252
case INTEGRATIONTIME_402MS:
default:
panic("unexpected timing")
}
switch t.gain {
case GAIN_1X:
value *= 16
case GAIN_16X:
default:
panic("unexpected gain")
}
return value
}
func (t *TSL2561) GetBroadband() (value int, err error) {
low, err := t.bus.ReadByte(COMMAND_BIT | WORD_BIT | REGISTER_CHAN0_LOW)
if err != nil {
return -1, err
}
high, err := t.bus.ReadByte(COMMAND_BIT | WORD_BIT | REGISTER_CHAN0_HIGH)
if err != nil {
return -1, err
}
value = t.scale(int(high)*256 + int(low))
return
}
func (t *TSL2561) GetInfrared() (value int, err error) {
low, err := t.bus.ReadByte(COMMAND_BIT | WORD_BIT | REGISTER_CHAN1_LOW)
if err != nil {
return -1, err
}
high, err := t.bus.ReadByte(COMMAND_BIT | WORD_BIT | REGISTER_CHAN1_HIGH)
if err != nil {
return -1, err
}
value = t.scale(int(high)*256 + int(low))
return
}
func (t *TSL2561) Broadband() chan int {
broadband := make(chan int, 1)
go func() {
ticker := time.NewTicker(1 * time.Second)
for {
select {
case <-ticker.C:
if err := t.On(); err != nil {
log.Println("WARNING: could not turn on: ", err)
close(broadband)
return
}
time.Sleep(t.IntegrationDuration())
if value, err := t.GetBroadband(); err == nil {
broadband <- value
} else {
log.Println("error getting broadband value:", err)
}
if err := t.Off(); err != nil {
log.Println("WARNING: Could not turn off: ", err)
close(broadband)
return
}
}
}
}()
return broadband
}