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  }