Would you like to surprise someone with a song?
Things used in this project
Hardware components |
||||||
|
× | 1 | ||||
|
× | 1 | ||||
|
× | 1 | ||||
|
× | 1 | ||||
|
× | 1 |
Story
Would you like to surprise someone with a song? You pretend you forgot a birthday and suddenly the song starts playing while you give the present. Arduino can help you with this incredible gift. It can be either Happy Birthday, Star Wars or ABBA. You only introduce the musical notes (pretty easy nowadays, even if you don’t know sol-fa), a timer, and voilà: the perfect gift.
This project consists of a web page where you choose the song you want to play among those that are already programmed with Arduino/Genuino MKR1000.
This program has multiple options: songs can be played by choosing one of those programmed in the web page, playing all of them in a row or setting a timer to play a song automatically.
To make it more versatile, a time is added, so that the song can be played without the need of doing it on the spot, but programming the Arduino for it to play in a certain moment.
Moreover, as every note sounds, a led turns on, alternating red and green colours.
Knowing the frequencies of every note, showed below in the image, and having the music sheets, songs can be created.
Some of the programmed songs are Happy Birthday, La Cucaracha, The Rains of Castamere and Star Wars, but any other song can be played.
The command to introduce one note is beep(note,duration) where note is the name of the note (Do, Re, Mi, etc., already defined with their frequencies) and duration means how long the note is (minim, crotchet, quaver, etc.), and delay is used for the silences.
Code
MKR1000 Singing Arduino
C/C++
#include <WiFi101.h>
#include <WiFiClient.h>
#include <WiFiServer.h>
#include <WiFiSSLClient.h>
#include <SPI.h>
char ssid[] = "your network SSID"; // your network SSID (name)
char pass[] = "your network password"; // your network password
int keyIndex = 0; // your network key Index number (needed only for WEP)
int ledpin = 6;
int value = 0;
bool val = true;
/***************************/
/* In English Nomenclature */
/* Used in Star Wars */
#define c 261
#define d 294
#define e 329
#define f 349
#define g 391
#define gS 415
#define a 440
#define aS 455
#define b 466
#define cH 523
#define cSH 554
#define dH 587
#define dSH 622
#define eH 659
#define fH 698
#define fSH 740
#define gH 784
#define gSH 830
#define aH 880
/***************************/
/* In Spanish Nomenclature */
const int la = 110; //La
const int d = 131;//Do
const int r = 147;//Re
const int m = 165;//Mi
const int f = 174;//Fa
const int s = 196;//Sol
const int l = 220;//La
const int lS = 233;//La#
const int si = 247;//si
const int Do = 262;//do
const int Re = 294; //re
const int Mi = 329;//Mi
const int Fa = 349;//Fa
const int Sol = 392;//Sol
const int La = 440;//La
const int LaS = 466;//La#
const int Si = 494;//si
const int Doo = 523;//do
/***************************/
const int buzzerPin = 8;
const int ledPin1 = 12;
const int ledPin2 = 13;
int counter;
int status = WL_IDLE_STATUS;
WiFiServer server(80);
void setup() {
Serial.begin(115200); // initialize serial communication
Serial.print("Start Serial ");
pinMode(ledpin, OUTPUT); // set the LED pin mode
// Check for the presence of the shield
Serial.print("WiFi101 shield: ");
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("NOT PRESENT");
return; // don't continue
}
Serial.println("DETECTED");
// attempt to connect to Wifi network:
while ( status != WL_CONNECTED) {
digitalWrite(ledpin, LOW);
Serial.print("Attempting to connect to Network named: ");
Serial.println(ssid); // print the network name (SSID);
digitalWrite(ledpin, HIGH);
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
status = WiFi.begin(ssid, pass);
// wait 10 seconds for connection:
delay(10000);
}
server.begin(); // start the web server on port 80
printWifiStatus(); // you're connected now, so print out the status
pinMode(buzzerPin, OUTPUT);
}
void loop() {
WiFiClient client = server.available(); // listen for incoming clients
if (client) { // if you get a client,
Serial.println("new client"); // print a message out the serial port
String currentLine = ""; // make a String to hold incoming data from the client
while (client.connected()) { // loop while the client's connected
if (client.available()) { // if there's bytes to read from the client,
char c = client.read(); // read a byte, then
Serial.write(c); // print it out the serial monitor
if (c == '\n') { // if the byte is a newline character
// if the current line is blank, you got two newline characters in a row.
// that's the end of the client HTTP request, so send a response:
if (currentLine.length() == 0) {
// HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
// and a content-type so the client knows what's coming, then a blank line:
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println();
// the content of the HTTP response follows the header:
client.print("Click <a href=\"/S\">here</a> listen to Star Wars<br>");
client.print("Click <a href=\"/R\">here</a> listen to 'The Rains of Castamere'<br>");
client.print("Click <a href=\"/C\">here</a> listen to 'Cucaracha'<br>");
client.print("Click <a href=\"/H\">here</a> listen to 'Happy Birthday'<br>");
// The HTTP response ends with another blank line:
client.println();
// break out of the while loop:
break;
}
else { // if you got a newline, then clear currentLine:
currentLine = "";
}
}
else if (c != '\r') { // if you got anything else but a carriage return character,
currentLine += c; // add it to the end of the currentLine
}
// Check to see if the client request was "GET /H" or "GET /L":
if (currentLine.endsWith("GET /H")) {
HappyBirthday();
}
if (currentLine.endsWith("GET /S")) {
StarWars();
}
if (currentLine.endsWith("GET /R")) {
The Rains of Castamere();
}
if (currentLine.endsWith("GET /C")) {
Cucaracha();
}
}
}
// close the connection:
client.stop();
Serial.println("client disonnected");
}
}
void printWifiStatus() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// print your WiFi shield's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
// print where to go in a browser:
Serial.print("To see this page in action, open a browser to http://");
Serial.println(ip);
}
void beep(int note, int duration)
{
//Play tone on buzzerPin
tone(buzzerPin, note, duration);
if (counter % 2 == 0)
{
digitalWrite(ledPin1, HIGH);
delay(duration);
digitalWrite(ledPin1, LOW);
} else
{
digitalWrite(ledPin2, HIGH);
delay(duration);
digitalWrite(ledPin2, LOW);
}
noTone(buzzerPin);
delay(50);
counter++;
}
void HappyBirthday() {
beep(Do, 250);
beep(Do, 250);
beep(Re, 500);
beep(Do, 500);
beep(Fa, 500);
beep(Mi, 1000);
beep(Do, 250);
beep(Do, 250);
beep(Re, 500);
beep(Do, 500);
beep(Sol, 500);
beep(Fa, 1000);
beep(Do, 250);
beep(Do, 250);
beep(Doo, 500);
beep(La, 500);
beep(Fa, 500);
beep(Mi, 500);
beep(Re, 1000);
beep(LaS, 250);
beep(LaS, 250);
beep(La, 500);
beep(Fa, 500);
beep(Sol, 500);
beep(Fa, 1000);
}
void Cucaracha() {
beep(d, 250);
beep(d, 250);
beep(d, 250);
beep(f, 250);
delay(250);
beep(l, 250);
delay(250);
beep(d, 250);
beep(d, 250);
beep(d, 250);
delay(250);
beep(f, 500);
beep(l, 1250);
delay(500);
beep(f, 250);
beep(f, 250);
beep(m, 250);
beep(m, 250);
beep(r, 250);
beep(r, 250);
beep(d, 1000);
delay(250);
beep(d, 250);
beep(d, 250);
beep(d, 250);
beep(m, 500);
delay(250);
beep(s, 250);
delay(250);
delay(250);
beep(d, 250);
beep(d, 250);
beep(d, 250);
beep(m, 500);
delay(250);
beep(s, 1250);
delay(500);
beep(Do, 250);
beep(Re, 250);
beep(Do, 250);
beep(lS, 250);
beep(l, 250);
beep(s, 250);
beep(f, 500);
delay(2000);
beep(d, 250);
beep(d, 250);
beep(f, 250);
beep(f, 250);
beep(l, 250);
beep(l, 250);
beep(Do, 500);
delay(250);
beep(l, 1250);
delay(250);
beep(Do, 500);
beep(Re, 250);
beep(Do, 250);
beep(lS, 250);
beep(l, 250);
beep(Do, 250);
beep(lS, 500);
delay(250);
beep(s, 1250);
delay(500);
beep(d, 250);
beep(d, 250);
beep(m, 250);
beep(m, 250);
beep(s, 250);
beep(s, 250);
beep(lS, 500);
delay(250);
beep(s, 1250);
delay(250);
beep(Do, 500);
beep(Re, 250);
beep(Do, 250);
beep(lS, 250);
beep(l, 250);
beep(s, 250);
beep(f, 1000);
delay(2000);
}
void TheRainsofCastamere() {
beep(la, 500);
beep(f, 750);
beep(la, 250);
beep(m, 750);
beep(la, 250);
beep(f, 500);
beep(s, 500);
beep(m, 750);
beep(la, 250);
beep(s, 500);
beep(f, 500);
beep(m, 500);
beep(r, 500);
beep(m, 2000);
beep(l, 250);
beep(l, 500);
beep(lS, 250);
beep(s, 500);
beep(d, 250);
beep(d, 250);
beep(l, 500);
beep(lS, 500);
beep(s, 750);
beep(l, 250);
beep(lS, 500);
beep(l, 500);
beep(s, 500);
beep(f, 500);
beep(m, 1500);
beep(la, 250);
beep(la, 250);
beep(f, 750);
beep(la, 125);
beep(m, 750);
beep(la, 250);
beep(f, 500);
beep(s, 500);
beep(m, 750);
beep(la, 250);
beep(s, 500);
beep(f, 500);
beep(m, 500);
beep(r, 500);
beep(m, 1500);
beep(d, 500);
beep(l, 750);
beep(lS, 250);
beep(s, 750);
beep(d, 250);
beep(l, 500);
beep(lS, 500);
beep(s, 750);
beep(l, 250);
beep(lS, 500);
beep(l, 500);
beep(s, 500);
beep(f, 500);
beep(m, 1500);
beep(d, 500);
beep(l, 750);
beep(lS, 250);
beep(s, 750);
beep(d, 250);
beep(l, 500);
beep(lS, 500);
beep(s, 750);
beep(l, 250);
beep(lS, 500);
beep(l, 500);
beep(s, 500);
beep(f, 500);
beep(r, 2000);
delay(1500);
beep(la, 500);
beep(m, 250);
beep(f, 250);
beep(r, 1000);
beep(f, 500);
beep(f, 250);
beep(m, 250);
beep(la, 1000);
delay(250);
beep(la, 250);
beep(f, 250);
beep(f, 250);
beep(r, 1000);
beep(f, 500);
beep(f, 250);
beep(m, 1250);
beep(la, 500);
beep(m, 250);
beep(f, 250);
beep(r, 1000);
beep(l, 500);
beep(l, 500);
beep(s, 500);
beep(r, 750);
beep(f, 250);
beep(f, 750);
beep(r, 250);
beep(m, 750);
beep(f, 250);
beep(r, 1500);
beep(la, 500);
beep(m, 250);
beep(f, 250);
beep(l, 500);
beep(l, 500);
beep(s, 500);
beep(r, 750);
beep(f, 250);
beep(f, 750);
beep(r, 250);
beep(l, 250);
beep(s, 250);
beep(m, 250);
beep(f, 250);
beep(r, 2000);
}
void StarWars() {
beep( a, 500);
beep( a, 500);
beep( a, 500);
beep( f, 350);
beep( cH, 150);
beep( a, 500);
beep( f, 350);
beep( cH, 150);
beep( a, 1000);
beep( eH, 500);
beep( eH, 500);
beep( eH, 500);
beep( fH, 350);
beep( cH, 150);
beep(gS, 500);
beep( f, 350);
beep( cH, 150);
beep( a, 1000);
beep( aH, 500);
beep( a, 350);
beep( a, 150);
beep( aH, 500);
beep( gSH, 250);
beep( gH, 250);
beep( fSH, 125);
beep( fH, 125);
beep( fSH, 250);
delay(250);
beep( aS, 250);
beep( dSH, 500);
beep( dH, 250);
beep( cSH, 250);
beep(cH, 125);
beep( b, 125);
beep( cH, 250);
delay(250);
beep( f, 125);
beep( gS, 500);
beep( f, 375);
beep( a, 125);
beep( cH, 500);
beep( a, 375);
beep( cH, 125);
beep(eH, 1000);
beep( aH, 500);
beep( a, 350);
beep( a, 150);
beep( aH, 500);
beep( gSH, 250);
beep(gH, 250);
beep(fSH, 125);
beep( fH, 125);
beep( fSH, 250);
delay(250);
beep(aS, 250);
beep( dSH, 500);
beep( dH, 250);
beep( cSH, 250);
beep( cH, 125);
beep( b, 125);
beep( cH, 250);
delay(250);
beep( f, 250);
beep( gS, 500);
beep( f, 375);
beep( cH, 125);
beep(a, 500);
beep(f, 375);
beep( c, 125);
beep( a, 1000);
}
Source : Singing Arduino