mirror of
https://github.com/zzzzDev4/IAS-Better-Tea.git
synced 2025-04-21 07:31:20 +02:00
Better sound, removed potentiometer
This commit is contained in:
parent
b4e402c601
commit
a6c5005eb0
6 changed files with 171 additions and 69 deletions
54
src/SmartSound.cpp
Normal file
54
src/SmartSound.cpp
Normal file
|
@ -0,0 +1,54 @@
|
|||
#include "SmartSound.hpp"
|
||||
#include "nevergonna.h"
|
||||
|
||||
SmartSound::SmartSound(int buzzerPin)
|
||||
{
|
||||
m_buzzerPin = buzzerPin;
|
||||
}
|
||||
|
||||
void SmartSound::play(Sound sound, int tempo)
|
||||
{
|
||||
switch (sound)
|
||||
{
|
||||
case NeverGonna:
|
||||
playSound(nevergonna, nevergonna_notes, tempo);
|
||||
break;
|
||||
case Bing:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SmartSound::playSound(int melody[], int notes, int tempo)
|
||||
{
|
||||
|
||||
// this calculates the duration of a whole note in ms
|
||||
int wholenote = (60000 * 4) / tempo;
|
||||
int divider = 0, noteDuration = 0;
|
||||
|
||||
// iterate over the notes of the melody.
|
||||
// Remember, the array is twice the number of notes (notes + durations)
|
||||
for (int thisNote = 0; thisNote < notes * 2; thisNote = thisNote + 2)
|
||||
{
|
||||
|
||||
// calculates the duration of each note
|
||||
divider = melody[thisNote + 1];
|
||||
if (divider > 0)
|
||||
{
|
||||
// regular note, just proceed
|
||||
noteDuration = (wholenote) / divider;
|
||||
}
|
||||
else if (divider < 0)
|
||||
{
|
||||
// dotted notes are represented with negative durations!!
|
||||
noteDuration = (wholenote) / abs(divider);
|
||||
noteDuration *= 1.5; // increases the duration in half for dotted notes
|
||||
}
|
||||
|
||||
// we only play the note for 90% of the duration, leaving 10% as a pause
|
||||
tone(m_buzzerPin, melody[thisNote], noteDuration * 0.9);
|
||||
// Wait for the specief duration before playing the next note.
|
||||
delay(noteDuration);
|
||||
// stop the waveform generation before the next note.
|
||||
noTone(m_buzzerPin);
|
||||
}
|
||||
}
|
20
src/SmartSound.hpp
Normal file
20
src/SmartSound.hpp
Normal file
|
@ -0,0 +1,20 @@
|
|||
#pragma once
|
||||
#include <Arduino.h>
|
||||
#include "pitches.h"
|
||||
|
||||
class SmartSound
|
||||
{
|
||||
public:
|
||||
enum Sound {
|
||||
NeverGonna,
|
||||
Bing,
|
||||
};
|
||||
|
||||
public:
|
||||
SmartSound(int buzzerPin);
|
||||
void play(Sound sound, int tempo = 144);
|
||||
|
||||
private:
|
||||
int m_buzzerPin;
|
||||
void playSound(int melody[], int notes, int tempo = 114);
|
||||
};
|
38
src/main.cpp
38
src/main.cpp
|
@ -1,6 +1,5 @@
|
|||
#include "main.hpp"
|
||||
#include "secrets.hpp"
|
||||
#include "song.h"
|
||||
#include <FastLED.h>
|
||||
|
||||
#define WIRE Wire
|
||||
|
@ -36,6 +35,8 @@ SmartDial smartDial(POTENTIOMETER_PIN);
|
|||
SmartDisplay smartDisplay(&display);
|
||||
TeaNetworking teaNet;
|
||||
|
||||
SmartSound sound(BUZZER_PIN);
|
||||
|
||||
SmartButton buttonLeft(TACTILE_BTN_LEFT);
|
||||
SmartButton buttonRight(TACTILE_BTN_RIGHT);
|
||||
|
||||
|
@ -122,8 +123,6 @@ void loop()
|
|||
{
|
||||
smartDisplay.printWaitForRFIDScreen();
|
||||
|
||||
// playSong();
|
||||
|
||||
// this blocks execution until a tag has been detected
|
||||
String uid = smartRFID.readTag();
|
||||
|
||||
|
@ -155,7 +154,7 @@ void loop()
|
|||
}
|
||||
case DISPLAY_SCANNED_TEA_CONFIG:
|
||||
{
|
||||
int dir = smartDial.smoothEdit(¤tTea.m_steepingSeconds, 0, 6000);
|
||||
// int dir = smartDial.smoothEdit(¤tTea.m_steepingSeconds, 0, 6000);
|
||||
|
||||
if (buttonLeft.isJustPressed())
|
||||
{
|
||||
|
@ -165,7 +164,15 @@ void loop()
|
|||
{
|
||||
currentTea.m_steepingSeconds += 10;
|
||||
}
|
||||
smartDisplay.printTeaConfigScreen(currentTea.m_teaName, currentTea.m_steepingSeconds, dir);
|
||||
smartDisplay.printTeaConfigScreen(currentTea.m_teaName, currentTea.m_steepingSeconds, 0);
|
||||
|
||||
if (isBtnPressed() && currentTea.m_steepingSeconds <= 0)
|
||||
{
|
||||
// rickroll
|
||||
Serial.println("Easter");
|
||||
sound.play(SmartSound::NeverGonna, 155);
|
||||
break;
|
||||
}
|
||||
|
||||
// change state if start pressed
|
||||
if (isBtnPressed())
|
||||
|
@ -201,27 +208,6 @@ void loop()
|
|||
};
|
||||
}
|
||||
|
||||
void playSong()
|
||||
{
|
||||
int size = sizeof(durations) / sizeof(int);
|
||||
|
||||
for (int note = 0; note < size; note++)
|
||||
{
|
||||
// to calculate the note duration, take one second divided by the note type.
|
||||
// e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
|
||||
int duration = 1000 / durations[note];
|
||||
tone(BUZZER_PIN, melody[note], duration);
|
||||
|
||||
// to distinguish the notes, set a minimum time between them.
|
||||
// the note's duration + 30% seems to work well:
|
||||
int pauseBetweenNotes = duration * 1.30;
|
||||
delay(pauseBetweenNotes);
|
||||
|
||||
// stop the tone playing:
|
||||
noTone(BUZZER_PIN);
|
||||
}
|
||||
}
|
||||
|
||||
void toggle_led()
|
||||
{
|
||||
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include "TeaNetworking.hpp"
|
||||
#include "TeaData.hpp"
|
||||
#include "SmartButton.hpp"
|
||||
#include "SmartSound.hpp"
|
||||
|
||||
void playSong();
|
||||
bool toggle_led(void *);
|
||||
|
|
84
src/nevergonna.h
Normal file
84
src/nevergonna.h
Normal file
|
@ -0,0 +1,84 @@
|
|||
#pragma once
|
||||
#include "pitches.h"
|
||||
|
||||
// notes of the moledy followed by the duration.
|
||||
// a 4 means a quarter note, 8 an eighteenth , 16 sixteenth, so on
|
||||
// !!negative numbers are used to represent dotted notes,
|
||||
// so -4 means a dotted quarter note, that is, a quarter plus an eighteenth!!
|
||||
int nevergonna[] = {
|
||||
|
||||
// Never Gonna Give You Up - Rick Astley
|
||||
// Score available at https://musescore.com/chlorondria_5/never-gonna-give-you-up_alto-sax
|
||||
// Arranged by Chlorondria
|
||||
|
||||
/*
|
||||
NOTE_D5, -4, NOTE_E5, -4, NOTE_A4, 4, // 1
|
||||
NOTE_E5, -4, NOTE_FS5, -4, NOTE_A5, 16, NOTE_G5, 16, NOTE_FS5, 8,
|
||||
NOTE_D5, -4, NOTE_E5, -4, NOTE_A4, 2,
|
||||
NOTE_A4, 16, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 8, NOTE_D5, 16,
|
||||
NOTE_D5, -4, NOTE_E5, -4, NOTE_A4, 4, // repeat from 1
|
||||
NOTE_E5, -4, NOTE_FS5, -4, NOTE_A5, 16, NOTE_G5, 16, NOTE_FS5, 8,
|
||||
NOTE_D5, -4, NOTE_E5, -4, NOTE_A4, 2,
|
||||
NOTE_A4, 16, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 8, NOTE_D5, 16,
|
||||
REST, 4, NOTE_B4, 8, NOTE_CS5, 8, NOTE_D5, 8, NOTE_D5, 8, NOTE_E5, 8, NOTE_CS5, -8,
|
||||
NOTE_B4, 16, NOTE_A4, 2, REST, 4,
|
||||
|
||||
REST, 8, NOTE_B4, 8, NOTE_B4, 8, NOTE_CS5, 8, NOTE_D5, 8, NOTE_B4, 4, NOTE_A4, 8, // 7
|
||||
NOTE_A5, 8, REST, 8, NOTE_A5, 8, NOTE_E5, -4, REST, 4,
|
||||
NOTE_B4, 8, NOTE_B4, 8, NOTE_CS5, 8, NOTE_D5, 8, NOTE_B4, 8, NOTE_D5, 8, NOTE_E5, 8, REST, 8,
|
||||
REST, 8, NOTE_CS5, 8, NOTE_B4, 8, NOTE_A4, -4, REST, 4,
|
||||
REST, 8, NOTE_B4, 8, NOTE_B4, 8, NOTE_CS5, 8, NOTE_D5, 8, NOTE_B4, 8, NOTE_A4, 4,
|
||||
NOTE_E5, 8, NOTE_E5, 8, NOTE_E5, 8, NOTE_FS5, 8, NOTE_E5, 4, REST, 4,*/
|
||||
|
||||
NOTE_D5, 2, NOTE_E5, 8, NOTE_FS5, 8, NOTE_D5, 8, // 13
|
||||
NOTE_E5, 8, NOTE_E5, 8, NOTE_E5, 8, NOTE_FS5, 8, NOTE_E5, 4, NOTE_A4, 4,
|
||||
REST, 2, NOTE_B4, 8, NOTE_CS5, 8, NOTE_D5, 8, NOTE_B4, 8,
|
||||
REST, 8, NOTE_E5, 8, NOTE_FS5, 8, NOTE_E5, -4, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
|
||||
NOTE_FS5, -8, NOTE_FS5, -8, NOTE_E5, -4, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
|
||||
|
||||
NOTE_E5, -8, NOTE_E5, -8, NOTE_D5, -8, NOTE_CS5, 16, NOTE_B4, -8, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16, // 18
|
||||
NOTE_D5, 4, NOTE_E5, 8, NOTE_CS5, -8, NOTE_B4, 16, NOTE_A4, 8, NOTE_A4, 8, NOTE_A4, 8,
|
||||
NOTE_E5, 4, NOTE_D5, 2, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
|
||||
NOTE_FS5, -8, NOTE_FS5, -8, NOTE_E5, -4, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
|
||||
NOTE_A5, 4, NOTE_CS5, 8, NOTE_D5, -8, NOTE_CS5, 16, NOTE_B4, 8, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
|
||||
|
||||
NOTE_D5, 4, NOTE_E5, 8, NOTE_CS5, -8, NOTE_B4, 16, NOTE_A4, 4, NOTE_A4, 8, // 23
|
||||
NOTE_E5, 4, NOTE_D5, 2, REST, 4, /*
|
||||
REST, 8, NOTE_B4, 8, NOTE_D5, 8, NOTE_B4, 8, NOTE_D5, 8, NOTE_E5, 4, REST, 8,
|
||||
REST, 8, NOTE_CS5, 8, NOTE_B4, 8, NOTE_A4, -4, REST, 4,
|
||||
REST, 8, NOTE_B4, 8, NOTE_B4, 8, NOTE_CS5, 8, NOTE_D5, 8, NOTE_B4, 8, NOTE_A4, 4,
|
||||
REST, 8, NOTE_A5, 8, NOTE_A5, 8, NOTE_E5, 8, NOTE_FS5, 8, NOTE_E5, 8, NOTE_D5, 8,
|
||||
|
||||
REST, 8, NOTE_A4, 8, NOTE_B4, 8, NOTE_CS5, 8, NOTE_D5, 8, NOTE_B4, 8, // 29
|
||||
REST, 8, NOTE_CS5, 8, NOTE_B4, 8, NOTE_A4, -4, REST, 4,
|
||||
NOTE_B4, 8, NOTE_B4, 8, NOTE_CS5, 8, NOTE_D5, 8, NOTE_B4, 8, NOTE_A4, 4, REST, 8,
|
||||
REST, 8, NOTE_E5, 8, NOTE_E5, 8, NOTE_FS5, 4, NOTE_E5, -4,
|
||||
NOTE_D5, 2, NOTE_D5, 8, NOTE_E5, 8, NOTE_FS5, 8, NOTE_E5, 4,
|
||||
NOTE_E5, 8, NOTE_E5, 8, NOTE_FS5, 8, NOTE_E5, 8, NOTE_A4, 8, NOTE_A4, 4,
|
||||
|
||||
REST, -4, NOTE_A4, 8, NOTE_B4, 8, NOTE_CS5, 8, NOTE_D5, 8, NOTE_B4, 8, // 35
|
||||
REST, 8, NOTE_E5, 8, NOTE_FS5, 8, NOTE_E5, -4, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
|
||||
NOTE_FS5, -8, NOTE_FS5, -8, NOTE_E5, -4, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
|
||||
NOTE_E5, -8, NOTE_E5, -8, NOTE_D5, -8, NOTE_CS5, 16, NOTE_B4, 8, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
|
||||
NOTE_D5, 4, NOTE_E5, 8, NOTE_CS5, -8, NOTE_B4, 16, NOTE_A4, 4, NOTE_A4, 8,
|
||||
|
||||
NOTE_E5, 4, NOTE_D5, 2, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16, // 40
|
||||
NOTE_FS5, -8, NOTE_FS5, -8, NOTE_E5, -4, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
|
||||
NOTE_A5, 4, NOTE_CS5, 8, NOTE_D5, -8, NOTE_CS5, 16, NOTE_B4, 8, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
|
||||
NOTE_D5, 4, NOTE_E5, 8, NOTE_CS5, -8, NOTE_B4, 16, NOTE_A4, 4, NOTE_A4, 8,
|
||||
NOTE_E5, 4, NOTE_D5, 2, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
|
||||
|
||||
NOTE_FS5, -8, NOTE_FS5, -8, NOTE_E5, -4, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16, // 45
|
||||
NOTE_A5, 4, NOTE_CS5, 8, NOTE_D5, -8, NOTE_CS5, 16, NOTE_B4, 8, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
|
||||
NOTE_D5, 4, NOTE_E5, 8, NOTE_CS5, -8, NOTE_B4, 16, NOTE_A4, 4, NOTE_A4, 8,
|
||||
NOTE_E5, 4, NOTE_D5, 2, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
|
||||
NOTE_FS5, -8, NOTE_FS5, -8, NOTE_E5, -4, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16, // 45
|
||||
|
||||
NOTE_A5, 4, NOTE_CS5, 8, NOTE_D5, -8, NOTE_CS5, 16, NOTE_B4, 8, NOTE_A4, 16, NOTE_B4, 16, NOTE_D5, 16, NOTE_B4, 16,
|
||||
NOTE_D5, 4, NOTE_E5, 8, NOTE_CS5, -8, NOTE_B4, 16, NOTE_A4, 4, NOTE_A4, 8,
|
||||
|
||||
NOTE_E5, 4, NOTE_D5, 2, REST, 4*/};
|
||||
|
||||
// sizeof gives the number of bytes, each int value is composed of two bytes (16 bits)
|
||||
// there are two values per note (pitch and duration), so for each note there are four bytes
|
||||
int nevergonna_notes = sizeof(nevergonna) / sizeof(nevergonna[0]) / 2;
|
43
src/song.h
43
src/song.h
|
@ -1,43 +0,0 @@
|
|||
#include "pitches.h"
|
||||
|
||||
int melody[] = {
|
||||
REST, REST, REST, NOTE_DS4,
|
||||
NOTE_E4, REST, NOTE_FS4, NOTE_G4, REST, NOTE_DS4,
|
||||
NOTE_E4, NOTE_FS4, NOTE_G4, NOTE_C5, NOTE_B4, NOTE_E4, NOTE_G4, NOTE_B4,
|
||||
NOTE_AS4, NOTE_A4, NOTE_G4, NOTE_E4, NOTE_D4,
|
||||
NOTE_E4, REST, REST, NOTE_DS4,
|
||||
|
||||
NOTE_E4, REST, NOTE_FS4, NOTE_G4, REST, NOTE_DS4,
|
||||
NOTE_E4, NOTE_FS4, NOTE_G4, NOTE_C5, NOTE_B4, NOTE_G4, NOTE_B4, NOTE_E5,
|
||||
NOTE_DS5,
|
||||
NOTE_D5, REST, REST, NOTE_DS4,
|
||||
NOTE_E4, REST, NOTE_FS4, NOTE_G4, REST, NOTE_DS4,
|
||||
NOTE_E4, NOTE_FS4, NOTE_G4, NOTE_C5, NOTE_B4, NOTE_E4, NOTE_G4, NOTE_B4,
|
||||
|
||||
NOTE_AS4, NOTE_A4, NOTE_G4, NOTE_E4, NOTE_D4,
|
||||
NOTE_E4, REST,
|
||||
REST, NOTE_E5, NOTE_D5, NOTE_B4, NOTE_A4, NOTE_G4, NOTE_E4,
|
||||
NOTE_AS4, NOTE_A4, NOTE_AS4, NOTE_A4, NOTE_AS4, NOTE_A4, NOTE_AS4, NOTE_A4,
|
||||
NOTE_G4, NOTE_E4, NOTE_D4, NOTE_E4, NOTE_E4, NOTE_E4
|
||||
};
|
||||
|
||||
int durations[] = {
|
||||
2, 4, 8, 8,
|
||||
4, 8, 8, 4, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8,
|
||||
2, 16, 16, 16, 16,
|
||||
2, 4, 8, 4,
|
||||
|
||||
4, 8, 8, 4, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8,
|
||||
1,
|
||||
2, 4, 8, 8,
|
||||
4, 8, 8, 4, 8, 8,
|
||||
8, 8, 8, 8, 8, 8, 8, 8,
|
||||
|
||||
2, 16, 16, 16, 16,
|
||||
4, 4,
|
||||
4, 8, 8, 8, 8, 8, 8,
|
||||
16, 8, 16, 8, 16, 8, 16, 8,
|
||||
16, 16, 16, 16, 16, 2
|
||||
};
|
Loading…
Add table
Reference in a new issue