Skip to content

Commit a58fdcd

Browse files
committed
optimised buzzer function
1 parent 375198f commit a58fdcd

5 files changed

Lines changed: 94 additions & 54 deletions

File tree

api.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,7 @@ func HandleRequest(conn net.Conn) {
103103
fmt.Fprintf(conn, "Content-Type: text/plain; charset=utf-8\r\n\r\n")
104104
fmt.Fprintf(conn, "BUZZER OK\r\n")
105105
//ブザーを1秒鳴らす
106-
doBuzzer = true
107-
buzzerTone = tone
108-
buzzerTime = time.Duration(duration) * time.Millisecond
106+
ringBuzzer(tone, time.Duration(duration)*time.Millisecond, 0)
109107
return
110108
}
111109

gpio.go

Lines changed: 88 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -34,30 +34,56 @@ func RunGPIO(chgpio chan bool) {
3434
button2.Input()
3535
button2.PullUp()
3636

37-
//GPIO12をブザーPWMに設定。出力
38-
buzzer := rpio.Pin(13)
39-
buzzer.Mode(rpio.Pwm)
40-
buzzer.Freq(64000)
41-
buzzer.DutyCycle(0, 32)
42-
4337
// ここで音楽を鳴らす
44-
buzzer.Freq(1244 * 64)
45-
buzzer.DutyCycle(16, 32)
46-
time.Sleep(time.Millisecond * 100)
47-
buzzer.Freq(1108 * 64)
48-
time.Sleep(time.Millisecond * 100)
49-
buzzer.Freq(739 * 64)
50-
time.Sleep(time.Millisecond * 150)
51-
buzzer.DutyCycle(0, 32)
52-
time.Sleep(time.Millisecond * 100)
53-
buzzer.Freq(1479 * 64)
54-
buzzer.DutyCycle(16, 32)
55-
time.Sleep(time.Millisecond * 100)
56-
buzzer.DutyCycle(0, 32)
57-
time.Sleep(time.Millisecond * 100)
58-
buzzer.DutyCycle(16, 32)
59-
time.Sleep(time.Millisecond * 100)
60-
buzzer.DutyCycle(0, 32)
38+
// buzzer.Freq(1244 * 64)
39+
// buzzer.DutyCycle(16, 32)
40+
// time.Sleep(time.Millisecond * 100)
41+
// buzzer.Freq(1108 * 64)
42+
// time.Sleep(time.Millisecond * 100)
43+
// buzzer.Freq(739 * 64)
44+
// time.Sleep(time.Millisecond * 150)
45+
// buzzer.DutyCycle(0, 32)
46+
// time.Sleep(time.Millisecond * 100)
47+
// buzzer.Freq(1479 * 64)
48+
// buzzer.DutyCycle(16, 32)
49+
// time.Sleep(time.Millisecond * 100)
50+
// buzzer.DutyCycle(0, 32)
51+
// time.Sleep(time.Millisecond * 100)
52+
// buzzer.DutyCycle(16, 32)
53+
// time.Sleep(time.Millisecond * 100)
54+
// buzzer.DutyCycle(0, 32)
55+
56+
ringBuzzer(0, 100*time.Millisecond, 1244)
57+
ringBuzzer(0, 100*time.Millisecond, 1108)
58+
ringBuzzer(0, 150*time.Millisecond, 739)
59+
time.Sleep(100 * time.Millisecond)
60+
ringBuzzer(0, 100*time.Millisecond, 1479)
61+
time.Sleep(100 * time.Millisecond)
62+
ringBuzzer(0, 100*time.Millisecond, 1479)
63+
64+
// ringBuzzer(0, 1000*time.Millisecond) //ラ#
65+
// ringBuzzer(1, 1000*time.Millisecond) //シ
66+
// ringBuzzer(2, 1000*time.Millisecond) //ド
67+
// ringBuzzer(3, 1000*time.Millisecond) //ド#
68+
// ringBuzzer(4, 1000*time.Millisecond) //レ
69+
// ringBuzzer(5, 1000*time.Millisecond) //レ#
70+
// ringBuzzer(6, 1000*time.Millisecond) //ミ
71+
// ringBuzzer(7, 1000*time.Millisecond) //ファ
72+
// ringBuzzer(8, 1000*time.Millisecond) //ファ#
73+
// ringBuzzer(9, 1000*time.Millisecond) //ソ
74+
// ringBuzzer(10, 1000*time.Millisecond) //ソ#
75+
// ringBuzzer(11, 1000*time.Millisecond) //ラ
76+
// ringBuzzer(12, 1000*time.Millisecond) //ラ#
77+
// ringBuzzer(13, 1000*time.Millisecond) //シ
78+
// ringBuzzer(14, 1000*time.Millisecond) //ド
79+
// ringBuzzer(15, 1000*time.Millisecond) //ド#
80+
// ringBuzzer(16, 1000*time.Millisecond) //レ
81+
// ringBuzzer(17, 1000*time.Millisecond) //レ#
82+
// ringBuzzer(18, 1000*time.Millisecond) //ミ
83+
// ringBuzzer(19, 1000*time.Millisecond) //ファ
84+
// ringBuzzer(20, 1000*time.Millisecond) //ファ#
85+
// ringBuzzer(21, 1000*time.Millisecond) //ソ
86+
// ringBuzzer(22, 1000*time.Millisecond) //ソ#
6187

6288
//GPIO 6, 25, 4, 5 を DIP 1, 2, 3, 4 に設定。入力
6389
dip1 := rpio.Pin(4)
@@ -91,38 +117,49 @@ func RunGPIO(chgpio chan bool) {
91117
for {
92118
//電圧降下検知
93119
if recvdata.Volt <= uint8(alarmVoltage) {
120+
log.Println("BATTERY ALARM")
94121
for {
95-
buzzer.Freq(1200 * 64)
96-
buzzer.DutyCycle(16, 32)
122+
if recvdata.Volt <= uint8(BATTERY_CRITICAL_THRESHOULD) {
123+
ringBuzzer(25, 5000*time.Millisecond, 0)
124+
continue
125+
}
97126

98-
//高速チカチカ
99127
led2.High()
100-
time.Sleep(100 * time.Millisecond)
101-
102-
buzzer.Freq(760 * 64)
128+
go ringBuzzer(25, 50*time.Millisecond, 0)
129+
time.Sleep(60 * time.Millisecond)
130+
go ringBuzzer(20, 90*time.Millisecond, 0)
103131
led2.Low()
104-
time.Sleep(150 * time.Millisecond)
132+
time.Sleep(120 * time.Millisecond)
105133

106134
if button1.Read()^1 == rpio.High || alarmIgnore {
107135
//一時的にアラーム解除する
108136
log.Println("BATTERY ALARM IGNORED")
109137
alarmVoltage = BATTERY_CRITICAL_THRESHOULD
138+
time.Sleep(100 * time.Millisecond)
139+
go ringBuzzer(20, 20*time.Millisecond, 0)
140+
time.Sleep(300 * time.Millisecond)
141+
go ringBuzzer(20, 20*time.Millisecond, 0)
142+
time.Sleep(300 * time.Millisecond)
143+
go ringBuzzer(20, 20*time.Millisecond, 0)
144+
time.Sleep(300 * time.Millisecond)
110145
break
111146
}
112147
}
113148
} else {
114149
//通常チカチカ。ボタンが押されたら高速チカチカ
115150
//button2はkickボタン
116-
buzzer.Freq(1479 * 64)
151+
// buzzer.Freq(1479 * 64)
117152
time.Sleep(ledsec)
118153
led.Write(rpio.High)
119154
if button1.Read()^1 == rpio.High {
120-
ledsec = 100 * time.Millisecond
121-
buzzer.DutyCycle(16, 32)
155+
ledsec = 75 * time.Millisecond
156+
go ringBuzzer(20, 20*time.Millisecond, 0)
122157
} else {
123158
ledsec = 500 * time.Millisecond
124159
}
125160
if button2.Read()^1 == rpio.High {
161+
go ringBuzzer(10, 50*time.Millisecond, 0)
162+
126163
//log.Println(button2.Read())
127164
//kickする
128165
//buzzer.DutyCycle(16, 32)
@@ -133,15 +170,24 @@ func RunGPIO(chgpio chan bool) {
133170
}
134171
time.Sleep(ledsec)
135172
led.Write(rpio.Low)
136-
buzzer.DutyCycle(0, 32)
137-
138-
if doBuzzer {
139-
buzzer.Freq(int(440*math.Pow(1.0595, float64(buzzerTone))) * 64)
140-
buzzer.DutyCycle(16, 32)
141-
time.Sleep(buzzerTime)
142-
buzzer.DutyCycle(0, 32)
143-
doBuzzer = false
144-
}
145173
}
146174
}
147175
}
176+
177+
func ringBuzzer(buzzerTone int, buzzerTime time.Duration, freq int) {
178+
//GPIO12をブザーPWMに設定。出力
179+
buzzer := rpio.Pin(13)
180+
buzzer.Mode(rpio.Pwm)
181+
182+
if freq == 0 {
183+
freq = int(440*math.Pow(1.0595, float64(buzzerTone))) * 64
184+
} else {
185+
freq = freq * 64
186+
}
187+
188+
buzzer.Freq(freq)
189+
buzzer.DutyCycle(16, 32)
190+
time.Sleep(buzzerTime)
191+
buzzer.DutyCycle(0, 32)
192+
193+
}

main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func kickCheck(chkicker chan bool) {
4646
func main() {
4747

4848
//自動アップデート
49-
go confirmAndSelfUpdate()
49+
// go confirmAndSelfUpdate()
5050
//GPIOの初期化
5151
if err := rpio.Open(); err != nil {
5252
fmt.Println(err)

serial.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func RunSerial(chclient chan bool, MyID uint32) {
3333
if err := port.SetMode(mode); err != nil {
3434
log.Fatal(err)
3535
}
36-
last_recv_time = time.Now()
36+
last_recv_time = time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)
3737

3838
for {
3939
//受信できるまで読み込む。バイトが0xFF, 0x00, 0xFF, 0x00のときは受信できると判断する
@@ -141,15 +141,11 @@ func RunSerial(chclient chan bool, MyID uint32) {
141141

142142
if !isReceived && pre_isReceived {
143143
log.Println("No Data Recv")
144-
doBuzzer = true
145-
buzzerTone = 14
146-
buzzerTime = 1000 * time.Millisecond
144+
go ringBuzzer(3, 500*time.Millisecond, 0)
147145
}
148146

149147
if isReceived && !pre_isReceived {
150-
doBuzzer = true
151-
buzzerTone = 12
152-
buzzerTime = 500 * time.Millisecond
148+
go ringBuzzer(10, 500*time.Millisecond, 0)
153149
}
154150

155151
if kicker_enable {

variables.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ var sendarray bytes.Buffer //送信用バッファ
2121
type RecvStruct struct {
2222
Volt uint8
2323
IsDetectPhotosensor bool
24-
IsTouchingDribbler bool
24+
// IsTouchingDribbler bool
2525
CapPower uint8
2626
}
2727

0 commit comments

Comments
 (0)