gobot.io/x/gobot@v1.16.0/drivers/gpio/buzzer_driver.go (about) 1 package gpio 2 3 import ( 4 "time" 5 6 "gobot.io/x/gobot" 7 ) 8 9 const ( 10 Whole = 4 11 Half = 2 12 Quarter = 1 13 Eighth = 0.500 14 ) 15 16 const ( 17 Rest = 0 18 C0 = 16.35 19 Db0 = 17.32 20 D0 = 18.35 21 Eb0 = 19.45 22 E0 = 20.60 23 F0 = 21.83 24 Gb0 = 23.12 25 G0 = 24.50 26 Ab0 = 25.96 27 A0 = 27.50 28 Bb0 = 29.14 29 B0 = 30.87 30 C1 = 32.70 31 Db1 = 34.65 32 D1 = 36.71 33 Eb1 = 38.89 34 E1 = 41.20 35 F1 = 43.65 36 Gb1 = 46.25 37 G1 = 49.00 38 Ab1 = 51.91 39 A1 = 55.00 40 Bb1 = 58.27 41 B1 = 61.74 42 C2 = 65.41 43 Db2 = 69.30 44 D2 = 73.42 45 Eb2 = 77.78 46 E2 = 82.41 47 F2 = 87.31 48 Gb2 = 92.50 49 G2 = 98.00 50 Ab2 = 103.83 51 A2 = 110.00 52 Bb2 = 116.54 53 B2 = 123.47 54 C3 = 130.81 55 Db3 = 138.59 56 D3 = 146.83 57 Eb3 = 155.56 58 E3 = 164.81 59 F3 = 174.61 60 Gb3 = 185.00 61 G3 = 196.00 62 Ab3 = 207.65 63 A3 = 220.00 64 Bb3 = 233.08 65 B3 = 246.94 66 C4 = 261.63 67 Db4 = 277.18 68 D4 = 293.66 69 Eb4 = 311.13 70 E4 = 329.63 71 F4 = 349.23 72 Gb4 = 369.99 73 G4 = 392.00 74 Ab4 = 415.30 75 A4 = 440.00 76 Bb4 = 466.16 77 B4 = 493.88 78 C5 = 523.25 79 Db5 = 554.37 80 D5 = 587.33 81 Eb5 = 622.25 82 E5 = 659.25 83 F5 = 698.46 84 Gb5 = 739.99 85 G5 = 783.99 86 Ab5 = 830.61 87 A5 = 880.00 88 Bb5 = 932.33 89 B5 = 987.77 90 C6 = 1046.50 91 Db6 = 1108.73 92 D6 = 1174.66 93 Eb6 = 1244.51 94 E6 = 1318.51 95 F6 = 1396.91 96 Gb6 = 1479.98 97 G6 = 1567.98 98 Ab6 = 1661.22 99 A6 = 1760.00 100 Bb6 = 1864.66 101 B6 = 1975.53 102 C7 = 2093.00 103 Db7 = 2217.46 104 D7 = 2349.32 105 Eb7 = 2489.02 106 E7 = 2637.02 107 F7 = 2793.83 108 Gb7 = 2959.96 109 G7 = 3135.96 110 Ab7 = 3322.44 111 A7 = 3520.00 112 Bb7 = 3729.31 113 B7 = 3951.07 114 C8 = 4186.01 115 Db8 = 4434.92 116 D8 = 4698.63 117 Eb8 = 4978.03 118 E8 = 5274.04 119 F8 = 5587.65 120 Gb8 = 5919.91 121 G8 = 6271.93 122 Ab8 = 6644.88 123 A8 = 7040.00 124 Bb8 = 7458.62 125 B8 = 7902.13 126 ) 127 128 var _ gobot.Driver = (*BuzzerDriver)(nil) 129 130 // BuzzerDriver represents a digital buzzer 131 type BuzzerDriver struct { 132 pin string 133 name string 134 connection DigitalWriter 135 high bool 136 BPM float64 137 } 138 139 // NewBuzzerDriver return a new BuzzerDriver given a DigitalWriter and pin. 140 func NewBuzzerDriver(a DigitalWriter, pin string) *BuzzerDriver { 141 l := &BuzzerDriver{ 142 name: gobot.DefaultName("Buzzer"), 143 pin: pin, 144 connection: a, 145 high: false, 146 BPM: 96.0, 147 } 148 149 return l 150 } 151 152 // Start implements the Driver interface 153 func (l *BuzzerDriver) Start() (err error) { return } 154 155 // Halt implements the Driver interface 156 func (l *BuzzerDriver) Halt() (err error) { return } 157 158 // Name returns the BuzzerDrivers name 159 func (l *BuzzerDriver) Name() string { return l.name } 160 161 // SetName sets the BuzzerDrivers name 162 func (l *BuzzerDriver) SetName(n string) { l.name = n } 163 164 // Pin returns the BuzzerDrivers name 165 func (l *BuzzerDriver) Pin() string { return l.pin } 166 167 // Connection returns the BuzzerDrivers Connection 168 func (l *BuzzerDriver) Connection() gobot.Connection { 169 return l.connection.(gobot.Connection) 170 } 171 172 // State return true if the buzzer is On and false if the led is Off 173 func (l *BuzzerDriver) State() bool { 174 return l.high 175 } 176 177 // On sets the buzzer to a high state. 178 func (l *BuzzerDriver) On() (err error) { 179 if err = l.connection.DigitalWrite(l.Pin(), 1); err != nil { 180 return 181 } 182 l.high = true 183 return 184 } 185 186 // Off sets the buzzer to a low state. 187 func (l *BuzzerDriver) Off() (err error) { 188 if err = l.connection.DigitalWrite(l.Pin(), 0); err != nil { 189 return 190 } 191 l.high = false 192 return 193 } 194 195 // Toggle sets the buzzer to the opposite of it's current state 196 func (l *BuzzerDriver) Toggle() (err error) { 197 if l.State() { 198 err = l.Off() 199 } else { 200 err = l.On() 201 } 202 return 203 } 204 205 func (l *BuzzerDriver) Tone(hz, duration float64) (err error) { 206 // calculation based off https://www.arduino.cc/en/Tutorial/Melody 207 tone := (1.0 / (2.0 * hz)) * 1000000.0 208 209 tempo := ((60 / l.BPM) * (duration * 1000)) 210 211 for i := 0.0; i < tempo*1000; i += tone * 2.0 { 212 if err = l.On(); err != nil { 213 return 214 } 215 time.Sleep(time.Duration(tone) * time.Microsecond) 216 217 if err = l.Off(); err != nil { 218 return 219 } 220 time.Sleep(time.Duration(tone) * time.Microsecond) 221 } 222 223 return 224 }