// Arduino Dead or Alive
// vgmlr
#include "FastLED.h"
#include "LiquidCrystal.h"
#include "Servo.h"
#define NUM_LEDS 5
CRGB leds[NUM_LEDS];
#define PIN 6
// Beat Var LED
int bpm_led_delay = 500;
// Buzzer Pin
const int ekg = 9;
// LCD
const int rs = 12, en = 11, d4 = 5,
d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
// Switch
int aux = 7;
int aux_state = 0;
// Servo
Servo srv;
int st = 110;
int ps = 45;
// Pulse
int pulse = A0
int val;
int tot;
int nxt;
int high;
void setup()
{
Serial.begin(9600);
FastLED.addLeds< WS2812, PIN, GRB >
(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
pinMode(ekg, OUTPUT);
digitalWrite(ekg, LOW);
pinMode(aux, INPUT);
srv.attach(10);
srv.write(st);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Dead or Alive?");
}
void loop() {
// Motor and Buzzer Switch On/Off
aux_state = digitalRead(aux);
// Reset Value
tot = 0;
nxt = 0;
set_bpm = 0;
// Smoothing Pulse
for (int n = 0; n <= 5; n++) {
for (int i = 0; i <= 25; i++) {
val = analogRead(pulse);
tot = val + tot;
// Display Per Peak
if (val > 580) { // Adjust
// If Motor and Buzzer
if (aux_state == HIGH) {
beat_led(0xff, 0x00, 0x00);
delay(bpm_led_delay);
// If No Motor and Buzzer
} else if (aux_state == LOW) {
beat_led_non(0xff, 0x00, 0x00);
delay(bpm_led_delay);
}
}
delay(2);
}
nxt = tot / 25;
set_bpm = set_bpm + nxt;
}
// BPM Maths
bpm = set_bpm * 12;
// Not Very Accurate .. Meh!
if (bpm > 30) {
lcd.setCursor(0, 0);
lcd.print("Alive!");
lcd.setCursor(0, 1);
lcd.print(bpm);
lcd.print(" BPM");
} else if (bpm <= 30) {
lcd.setCursor(0, 0);
lcd.print("Undead!");
}
}
// Neopixel FastLED Fade Red
// via http://tweaking4all.com
void beat_led(byte red, byte green, byte blue) {
float r, g, b;
for (int k = 0; k < 256; k = k + 8) {
r = (k / 256.0) * red;
g = (k / 256.0) * green;
b = (k / 256.0) * blue;
setAll(r, g, b);
showStrip();
digitalWrite(ekg, HIGH);
srv.write(ps);
}
digitalWrite(ekg, LOW);
srv.write(st);
for (int k = 255; k >= 0; k = k - 10) {
r = (k / 256.0) * red;
g = (k / 256.0) * green;
b = (k / 256.0) * blue;
setAll(r, g, b);
showStrip();
}
}
void beat_led_non(byte red, byte green, byte blue) {
float r, g, b;
for (int k = 0; k < 256; k = k + 8) {
r = (k / 256.0) * red;
g = (k / 256.0) * green;
b = (k / 256.0) * blue;
setAll(r, g, b);
showStrip();
}
for (int k = 255; k >= 0; k = k - 10) {
r = (k / 256.0) * red;
g = (k / 256.0) * green;
b = (k / 256.0) * blue;
setAll(r, g, b);
showStrip();
}
}
void showStrip() {
#ifdef ADAFRUIT_NEOPIXEL_H
strip.show();
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
FastLED.show();
#endif
}
void setPixel(int Pixel, byte red, byte green, byte blue) {
#ifdef ADAFRUIT_NEOPIXEL_H
strip.setPixelColor(Pixel, strip.Color(red, green, blue));
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
leds[Pixel].r = red;
leds[Pixel].g = green;
leds[Pixel].b = blue;
#endif
}
void setAll(byte red, byte green, byte blue) {
for (int i = 0; i < NUM_LEDS; i++ ) {
setPixel(i, red, green, blue);
}
showStrip();
}