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