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  }