Init
This commit is contained in:
commit
5fbf5ea2e0
212
Code/Code.ino
Normal file
212
Code/Code.ino
Normal file
@ -0,0 +1,212 @@
|
|||||||
|
//
|
||||||
|
// Cavaliere Heartbeat
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <EEPROM.h>
|
||||||
|
#include <Encoder.h> // Encoder by Paul Stoffregen
|
||||||
|
|
||||||
|
#include <Adafruit_SSD1306.h>
|
||||||
|
Adafruit_SSD1306 display(128, 64, &Wire, 4);
|
||||||
|
|
||||||
|
#define audio 12 // Pin for 3,5 Jack
|
||||||
|
#define led 13 // Pin for LED
|
||||||
|
#define rot_clk 4 // Rotary encoder CLK pin
|
||||||
|
#define rot_dt 3 // Rotary encoder DT pin
|
||||||
|
#define rot_sw 2 // Rotary encoder SW pin, 1 = not pushed, 0 = pushed
|
||||||
|
#define triggerLengthMS 50 // How long the trigger should stay on in milliseconds when triggerLength = 1
|
||||||
|
#define bpm_value_min 80 // 20 bpm is minimum (80 / 4)
|
||||||
|
#define bpm_value_max 1200 // 300 bpm is maximum (300 * 4)
|
||||||
|
#define offset_x 5 // Display offset
|
||||||
|
#define offset_y 5 // Display offset
|
||||||
|
|
||||||
|
int bpm; // BPM, who'd have thought
|
||||||
|
int bpms; // BPM to milliseconds
|
||||||
|
int eeprom_bpm; // BPM stored in EEPROM
|
||||||
|
int bpm_value; // Later bpm * 4 because of the 4 rotary encoder steps
|
||||||
|
int triggerLength = 2; // 1 = triggerLengthMS, 2 = half of bpm
|
||||||
|
int stayOnTime; // How long the trigger should stay on in milliseconds when triggerLength = 2
|
||||||
|
unsigned long currentTime; // Timing stuff
|
||||||
|
unsigned long previousTime = 0; // Timing stuff
|
||||||
|
int state = 0; // Prevent trigger flood
|
||||||
|
int rot_sw_state = 0; // Rotary encoder SW state
|
||||||
|
int rot_sw_temp = 0; // Some dumb temp shit
|
||||||
|
long rot_old_pos = 0; // Don't ask
|
||||||
|
|
||||||
|
// Pins for the rotary encoder up and down
|
||||||
|
Encoder rot_enc(rot_dt, rot_clk);
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(9600);
|
||||||
|
|
||||||
|
// Read stored BPM data
|
||||||
|
if (EEPROM.read(0) != 1) {
|
||||||
|
// No BPM data stored, let's initialize it with 120 BPM
|
||||||
|
EEPROM.write(0, 1); // Set byte 0 to 1
|
||||||
|
EEPROM.write(1, 1); // 1 x 100
|
||||||
|
EEPROM.write(2, 2); // 2 x 10
|
||||||
|
EEPROM.write(3, 0); // 0 x 1
|
||||||
|
bpm = 120;
|
||||||
|
bpm_value = bpm * 4;
|
||||||
|
bpms = 60000 / bpm;
|
||||||
|
Serial.println("No stored BPM found. Initialized with 120 BPM.");
|
||||||
|
} else {
|
||||||
|
// BPM data stored
|
||||||
|
int a = EEPROM.read(1);
|
||||||
|
int b = EEPROM.read(2);
|
||||||
|
int c = EEPROM.read(3);
|
||||||
|
eeprom_bpm = (a * 100) + (b * 10) + (c * 1);
|
||||||
|
bpm = eeprom_bpm;
|
||||||
|
bpm_value = bpm * 4;
|
||||||
|
bpms = 60000 / bpm;
|
||||||
|
Serial.print("Stored BPM data found: ");
|
||||||
|
Serial.println(eeprom_bpm);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Display
|
||||||
|
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
|
||||||
|
display.setTextColor(SSD1306_WHITE);
|
||||||
|
displayUpdate(bpm, bpm);
|
||||||
|
|
||||||
|
// Calculate how long the LED should stay on
|
||||||
|
if (triggerLength == 1) {
|
||||||
|
stayOnTime = triggerLengthMS;
|
||||||
|
} else if (triggerLength == 2) {
|
||||||
|
stayOnTime = bpms / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enable inputs and outputs
|
||||||
|
pinMode(audio, OUTPUT);
|
||||||
|
pinMode(led, OUTPUT);
|
||||||
|
pinMode(rot_clk, INPUT);
|
||||||
|
pinMode(rot_dt, INPUT);
|
||||||
|
pinMode(rot_sw, INPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// Beat stuff
|
||||||
|
currentTime = millis();
|
||||||
|
|
||||||
|
if (currentTime - previousTime >= bpms) {
|
||||||
|
triggerOn();
|
||||||
|
previousTime = currentTime;
|
||||||
|
state = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentTime - previousTime >= stayOnTime && state == 1) {
|
||||||
|
triggerOff();
|
||||||
|
state = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rotary encoder stuff
|
||||||
|
long rot_new_pos = rot_enc.read();
|
||||||
|
|
||||||
|
if (rot_new_pos != rot_old_pos) {
|
||||||
|
if (rot_new_pos > rot_old_pos) {
|
||||||
|
bpm_value++;
|
||||||
|
if (bpm_value > bpm_value_max) {
|
||||||
|
bpm_value = bpm_value_max;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rot_new_pos < rot_old_pos) {
|
||||||
|
bpm_value--;
|
||||||
|
if (bpm_value < bpm_value_min) {
|
||||||
|
bpm_value = bpm_value_min;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
displayUpdate(bpm, bpm_value / 4);
|
||||||
|
|
||||||
|
rot_old_pos = rot_new_pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rotary encoder button
|
||||||
|
rot_sw_state = digitalRead(rot_sw);
|
||||||
|
|
||||||
|
if (rot_sw_state == 1) {
|
||||||
|
rot_sw_temp = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rot_sw_state == 0 && rot_sw_temp == 0) {
|
||||||
|
rot_sw_push();
|
||||||
|
rot_sw_temp = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void triggerOn() {
|
||||||
|
Serial.print("Trigger ON at ");
|
||||||
|
Serial.print(currentTime);
|
||||||
|
Serial.println(" milliseconds");
|
||||||
|
|
||||||
|
digitalWrite(audio, HIGH);
|
||||||
|
digitalWrite(led, HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void triggerOff() {
|
||||||
|
Serial.print("Trigger OFF at ");
|
||||||
|
Serial.print(currentTime);
|
||||||
|
Serial.println(" milliseconds");
|
||||||
|
|
||||||
|
digitalWrite(audio, LOW);
|
||||||
|
digitalWrite(led, LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
void rot_sw_push() {
|
||||||
|
// Recalculate BPM stuff
|
||||||
|
bpm = bpm_value / 4;
|
||||||
|
bpms = 60000 / bpm;
|
||||||
|
if (triggerLength == 2) {
|
||||||
|
stayOnTime = bpms / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.print("BPM set to ");
|
||||||
|
Serial.println(bpm);
|
||||||
|
|
||||||
|
displayUpdate(bpm, bpm);
|
||||||
|
|
||||||
|
// Save new BPM to EEPROM
|
||||||
|
int a = bpm / 100;
|
||||||
|
int b = (bpm - (a * 100)) / 10;
|
||||||
|
int c = (bpm - (a * 100) - (b * 10));
|
||||||
|
EEPROM.write(1, a);
|
||||||
|
EEPROM.write(2, b);
|
||||||
|
EEPROM.write(3, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
int displayUpdate(int bpm, int bpm2) {
|
||||||
|
display.clearDisplay();
|
||||||
|
|
||||||
|
display.setTextSize(1);
|
||||||
|
display.setCursor(0 + offset_x, 0 + offset_y);
|
||||||
|
display.println("cavaliere HEARTBEAT");
|
||||||
|
|
||||||
|
display.setTextSize(2);
|
||||||
|
display.setCursor(0 + offset_x, 18 + offset_y);
|
||||||
|
display.println("BPM");
|
||||||
|
display.setCursor(0 + offset_x, 40 + offset_y);
|
||||||
|
display.println("NEW");
|
||||||
|
|
||||||
|
String bpmToStr;
|
||||||
|
String bpm2ToStr;
|
||||||
|
|
||||||
|
// Leading whitespace when bpm < 100
|
||||||
|
display.setCursor(68 + offset_x, 18 + offset_y);
|
||||||
|
if (bpm < 100) {
|
||||||
|
bpmToStr = " " + String(bpm);
|
||||||
|
} else {
|
||||||
|
bpmToStr = String(bpm);
|
||||||
|
}
|
||||||
|
display.println(bpmToStr);
|
||||||
|
|
||||||
|
// Leading whitespace when bpm2 < 100
|
||||||
|
display.setCursor(68 + offset_x, 40 + offset_y);
|
||||||
|
if (bpm2 < 100) {
|
||||||
|
bpm2ToStr = " " + String(bpm2);
|
||||||
|
} else {
|
||||||
|
bpm2ToStr = String(bpm2);
|
||||||
|
}
|
||||||
|
display.println(bpm2ToStr);
|
||||||
|
|
||||||
|
display.display();
|
||||||
|
return 0;
|
||||||
|
}
|
BIN
Fritzing/Circuit.fzz
Normal file
BIN
Fritzing/Circuit.fzz
Normal file
Binary file not shown.
BIN
Fritzing/Rotary Encoder with switch (KY-040).fzpz
Normal file
BIN
Fritzing/Rotary Encoder with switch (KY-040).fzpz
Normal file
Binary file not shown.
BIN
Front/Front Plate.psd
Normal file
BIN
Front/Front Plate.psd
Normal file
Binary file not shown.
BIN
Logo/LCDAssistant.exe
Normal file
BIN
Logo/LCDAssistant.exe
Normal file
Binary file not shown.
39
Logo/logo
Normal file
39
Logo/logo
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// File generated by LCD Assistant
|
||||||
|
// http://en.radzio.dxp.pl/bitmap_converter/
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
const unsigned char logo [] PROGMEM = {
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xEF, 0x01, 0x01, 0x01, 0x01, 0x01,
|
||||||
|
0x00, 0x00, 0xEF, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0xFF, 0xEF, 0x00, 0x1F, 0xDF, 0xC0, 0x80, 0x80,
|
||||||
|
0xDE, 0x5F, 0x1F, 0x00, 0xEF, 0xFF, 0x11, 0x11, 0x11, 0xFF, 0xFF, 0xEF, 0x00, 0xEF, 0xEF, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xEF, 0x00, 0xEF, 0xFF, 0x11, 0x11, 0x11, 0x11, 0x11,
|
||||||
|
0x00, 0x00, 0xEF, 0xFF, 0x11, 0x11, 0x71, 0xFF, 0xDF, 0x0F, 0x00, 0xEF, 0xFF, 0x11, 0x11, 0x11,
|
||||||
|
0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x81, 0x61, 0x10, 0x60, 0x80, 0x00, 0x01, 0x01, 0x00, 0x00,
|
||||||
|
0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xE0, 0xF1, 0xF1,
|
||||||
|
0xE0, 0xC1, 0xE1, 0xF1, 0xF1, 0xE1, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01,
|
||||||
|
0x01, 0x01, 0x81, 0x61, 0x10, 0x60, 0x81, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01,
|
||||||
|
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0,
|
||||||
|
0x00, 0x01, 0x01, 0x81, 0xC1, 0xC1, 0x01, 0xC1, 0xC1, 0x41, 0x40, 0x40, 0x40, 0x40, 0x01, 0x06,
|
||||||
|
0xC8, 0xC6, 0x41, 0x41, 0x41, 0xC1, 0xC1, 0xC1, 0x01, 0xC1, 0xC1, 0x41, 0x41, 0x41, 0xC0, 0xC0,
|
||||||
|
0xC0, 0x00, 0x41, 0x43, 0x47, 0x4F, 0x47, 0x43, 0x41, 0x00, 0x00, 0xC0, 0xC0, 0x41, 0x41, 0x41,
|
||||||
|
0xC1, 0xC1, 0xC1, 0x01, 0xC1, 0xC1, 0x40, 0x40, 0x40, 0x40, 0x41, 0x06, 0x08, 0xC6, 0xC1, 0x41,
|
||||||
|
0x41, 0x41, 0xC1, 0xC1, 0xC1, 0x01, 0x41, 0x41, 0x41, 0x41, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x7B, 0x7F, 0x04, 0x04, 0x04, 0x3F, 0x7F, 0x7B, 0x00, 0x7B, 0x7F, 0x44, 0x44, 0x44,
|
||||||
|
0x44, 0x44, 0x00, 0x00, 0x7B, 0x7F, 0x04, 0x04, 0x04, 0x3F, 0x7F, 0x7B, 0x00, 0x7B, 0x7F, 0x04,
|
||||||
|
0x04, 0x1C, 0x7F, 0x77, 0x43, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x7B,
|
||||||
|
0x7F, 0x44, 0x44, 0x44, 0x7F, 0x7F, 0x7B, 0x00, 0x7B, 0x7F, 0x44, 0x44, 0x44, 0x44, 0x44, 0x00,
|
||||||
|
0x00, 0x7B, 0x7F, 0x04, 0x04, 0x04, 0x3F, 0x7F, 0x7B, 0x00, 0x00, 0x00, 0x00, 0x77, 0x77, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
};
|
BIN
Logo/logo.bmp
Normal file
BIN
Logo/logo.bmp
Normal file
Binary file not shown.
After Width: | Height: | Size: 640 B |
Loading…
Reference in New Issue
Block a user