diff --git a/README.MD b/README.MD new file mode 100644 index 0000000..d508d0f --- /dev/null +++ b/README.MD @@ -0,0 +1,8 @@ +TODO: +- Add min and max values +- External clock +- Switch to U8G2 for screen +- Save state to EEPROM when stopped + +Timer library available here +https://github.com/PaulStoffregen/FlexiTimer2 diff --git a/software/GToE/GToE.ino b/software/GToE/GToE.ino index 80111ff..1e8796d 100644 --- a/software/GToE/GToE.ino +++ b/software/GToE/GToE.ino @@ -2,7 +2,7 @@ #include #include #include -#include +#include #include #define SCREEN_ADDRESS 0x3C @@ -13,18 +13,10 @@ #define ENC_D1_PIN 4 #define ENC_D2_PIN 3 #define START_STOP_BTN_PIN 14 - //Output pins are defined in the array below - -//TODO : -//Add min and max values -//External clock -//Switch to another timer lib (FlexiTimer?) -//Switch to U8G2 for screen -//Save state to EEPROM when stopped - int outsPins[6] = {5, 6, 7, 8, 9, 10}; + int outsValues[6] = {1, 2, 4, -4, 1, 1}; //positive - divide, negative - multiply, 0 - off int outsPeriods[6]; int outsClocksCounts[6] = {0, 0, 0, 0, 0, 0}; @@ -36,7 +28,9 @@ int clockCount = 0; int bpm = 120; int bpmPeriod; +int bpmClockCount; bool isPlaying = 0; +int needToResetChannel; int displayTab = 0; int displayTabOld; @@ -67,8 +61,8 @@ void setup() { updateScreen(); updatePeriods(); - MsTimer2::set(1, internalClock); // 1ms period - MsTimer2::start(); + FlexiTimer2::set(1, 1.0/1000, internalClock); // 1.0/1000 = 1ms period + FlexiTimer2::start(); } void loop() { @@ -84,12 +78,22 @@ void internalClock() { if (outsClocksCounts[i] == 0) { digitalWrite(outsPins[i], HIGH); } - if (outsClocksCounts[i] == 15) { + if (outsClocksCounts[i] == 15) { //15ms pulse digitalWrite(outsPins[i], LOW); } outsClocksCounts[i]++; } - } + if (bpmClockCount < bpmPeriod) { + bpmClockCount++; + } else { + bpmClockCount = 0; + if (needToResetChannel>=0) { + outsClocksCounts[needToResetChannel] = 0; + updatePeriods(); + needToResetChannel = -1; + } + } + } } void updatePeriods() { @@ -103,6 +107,12 @@ void updatePeriods() { } } +void resetClocks() { + for (int i = 0; i<6; i++) { + outsClocksCounts[i] = 0; + } +} + void checkInputs() { clockMode = digitalRead(INPUT_CONNECTED_PIN); if (clockMode != clockModeOld) { @@ -131,14 +141,15 @@ void checkInputs() { bpm = bpm + change; } else { outsValues[displayTab-1] = outsValues[displayTab-1] + change; + needToResetChannel = displayTab-1; } - updatePeriods(); updateScreen(); encPositionOld = encPosition; } if (!digitalRead(START_STOP_BTN_PIN) && !buttonPushed) { isPlaying = !isPlaying; + resetClocks(); buttonPushed = true; } else if (digitalRead(START_STOP_BTN_PIN) && buttonPushed) { buttonPushed = false; @@ -152,7 +163,7 @@ void updateScreen() { display.setCursor(0,0); display.setTextSize(1); if (displayTab == 0) { - display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); + display.setTextColor(SSD1306_BLACK, SSD1306_WHITE);resetClocks(); display.print(F(" ")); display.setTextColor(SSD1306_WHITE); display.print(F(" bpm ")); @@ -198,4 +209,4 @@ void updateScreen() { } display.display(); -} +} \ No newline at end of file