#include <Arduino.h>
// Just testing things out before connecting everything.
// A jingle shold play if the button is pressed and held
// Rest of the stuff is LED controls for a lantern
#define HI 1023
#define LO 0
#define PULSE_MAX 80
#define FIRE_MAX 400
#define GLOBAL_DELAY 100
void pause(int amount);
void PlayMusic();
void beep (unsigned int frequencyInHertz, unsigned long timeInMilliseconds, bool noteDelay=true);
const byte ledPin1 = 0;
const byte ledPin2 = 1;
const byte ledPin3 = 4;
const byte btnPin = 2;
const byte buzzPin = 3;
int scale = 1;
byte mode = 0;
int b1 = 0;
int b2 = 330;
int b3 = 660;
byte d1 = 10;
byte d2 = 15;
byte d3 = 20;
float bl1 = 0;
float bl2 = 10;
float bl3 = 30;
float dl1 = 0.5;
float dl2 = 1.1;
float dl3 = 1.3;
byte pulseMax = 80;
byte currentLight = ledPin1;
byte btnState = LOW;
unsigned long lastPress = 0;
unsigned long currentMillis = 0;
/* Eh, dunno
int melody[] = {
440, 440, 659, 587, 659, 659, 659, 659, 988, 988, 988, 740, 880, 0 , 0 , 392, 440, 440, 494, 440, 330, 330
};
int noteDurations[] = {
248, 248, 248, 248, 496, 372, 124, 248, 124, 124, 248, 248, 496, 496, 248, 248, 496, 248, 248, 496, 496, 496
};
*/
// Use this
int melody[] = {
587, 587, 587, 523, 440, 440, 440, 349, 392, 523, 523, 440, 440, 349, 392, 392, 523, 523, 440, 440, 392, 349, 392, 440, 392, 330, 294, 294, 330 //, 392, 392, 330, 392, 440, 392, 330, 294, 0, 0
};
int noteDurations[] = {
250, 250, 250, 250, 250, 250, 250, 250, 500, 250, 250, 500, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 500, 250, 250 //, 500, 250, 250, 250, 250, 250, 250, 500, 500, 0
};
void setup()
{
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(btnPin, INPUT);
pinMode(buzzPin, OUTPUT);
analogWrite(ledPin1, LO);
analogWrite(ledPin2, LO);
analogWrite(ledPin3, LO);
beep(440, 90, false);
beep(349, 90, false);
beep(523, 90, false);
btnState = LOW;
}
void loop() {
switch (mode) {
case 0:
// Pulsing
bl1 += dl1;
if (bl1 + dl1 > PULSE_MAX || bl1 + dl1 < 0)
dl1 = -dl1;
bl2 += dl2;
if (bl2 + dl2 > PULSE_MAX || bl2 + dl2 < 0)
dl2 = -dl2;
bl3 += dl3;
if (bl3 + dl3 > PULSE_MAX || bl3 + dl3 < 0)
dl3 = -dl3;
analogWrite(ledPin1, (int)bl1);
analogWrite(ledPin2, (int)bl2);
analogWrite(ledPin3, (int)bl3);
pause(80);
break;
case 1:
// Full fire
analogWrite(ledPin1, random(FIRE_MAX)); // 135
analogWrite(ledPin2, random(FIRE_MAX));
analogWrite(ledPin3, random(FIRE_MAX));
pause(random(GLOBAL_DELAY)); // 100
break;
case 2:
// Running lights
switch (currentLight) {
case ledPin3:
analogWrite(ledPin1, 0);
analogWrite(ledPin2, 0);
analogWrite(ledPin3, HI);
currentLight = ledPin2;
break;
case ledPin2:
analogWrite(ledPin1, 0);
analogWrite(ledPin2, HI);
analogWrite(ledPin3, 0);
currentLight = ledPin1;
break;
case ledPin1:
analogWrite(ledPin1, HI);
analogWrite(ledPin2, 0);
analogWrite(ledPin3, 0);
currentLight = ledPin3;
break;
}
pause(GLOBAL_DELAY*25);
break;
case 3:
// Steady yellow
analogWrite(ledPin1, HI);
analogWrite(ledPin2, 0);
analogWrite(ledPin3, 0);
pause(GLOBAL_DELAY);
break;
case 4:
// Steady orange
analogWrite(ledPin1, 0);
analogWrite(ledPin2, HI);
analogWrite(ledPin3, 0);
pause(GLOBAL_DELAY);
break;
case 5:
// Steady red
analogWrite(ledPin1, 0);
analogWrite(ledPin2, 0);
analogWrite(ledPin3, HI);
pause(GLOBAL_DELAY);
break;
case 6:
// Always on
analogWrite(ledPin1, HI);
analogWrite(ledPin2, HI);
analogWrite(ledPin1, HI);
pause(GLOBAL_DELAY);
break;
case 7:
// Always off
analogWrite(ledPin1, LO);
analogWrite(ledPin2, LO);
analogWrite(ledPin3, LO);
pause(GLOBAL_DELAY);
break;
}
}
void pause(int amount) {
byte input;
currentMillis = millis();
while (millis() < currentMillis + amount) {
input = digitalRead(btnPin);
if (input == HIGH) {
if (btnState == LOW) {
beep(300, 20);
beep(350, 20);
beep(400, 20);
beep(500, 20);
lastPress = millis();
}
btnState = HIGH;
mode++;
if (mode > 7)
mode = 0;
delay(300); // Budget debounce
}
if (input == LOW && btnState == HIGH) {
btnState = LOW;
lastPress = 0;
}
if (lastPress > 0 && btnState == HIGH && (millis() > (lastPress + 1500))) {
btnState = LOW;
lastPress = 0;
PlayMusic();
}
}
}
void PlayMusic() {
int size = sizeof(melody) / sizeof(int) - 1;
for(int i=0; i < size; i++) {
beep(melody[i], noteDurations[i]);
}
}
void beep (unsigned int frequencyInHertz, unsigned long timeInMilliseconds, bool noteDelay=true)
{
int x;
long delayAmount = (long)(1000000 / frequencyInHertz);
long loopTime = (long)((timeInMilliseconds * 1000) / (delayAmount * 2));
pinMode(buzzPin, OUTPUT);
for (x = 0; x < loopTime; x++) {
digitalWrite(buzzPin, HIGH);
delayMicroseconds(delayAmount);
digitalWrite(buzzPin, LOW);
delayMicroseconds(delayAmount);
}
if (noteDelay)
delay(50);
//pinMode(speakerPin, INPUT);
}