Adafruit Metro Mini
MPU 6050 Accelerometer
8X8 64 LED Matrix Display
Female USB Module
Toggle Switch
![](images/standtilttimer_1.jpg)
![](images/standtilttimer_2.jpg)
- // silent tilt stand timer
- // pkvi
- #include <LedControl.h>
- #include "Wire.h"
- #include <MPU6050_light.h>
- // SCL A4 SDA A5
- MPU6050 mpu(Wire);
- unsigned long timer = 0;
- // display pins
- int DIN = 7;
- int CS = 6;
- int CLK = 5;
- // credit: xantorohara.github.io/led-matrix-editor/
- // 00 to 30
- const uint8_t numbers_off[][8] = {
- {
- 0b00111110, 0b01000001, 0b01000001, 0b00111110, 0b00111110, 0b01000001, 0b01000001, 0b00111110
- }, {
- 0b00111110, 0b01000001, 0b01000001, 0b00111110, 0b00000000, 0b00000000, 0b01111111, 0b00000000
- }, {
- 0b00111110, 0b01000001, 0b01000001, 0b00111110, 0b00110001, 0b01001001, 0b01001001, 0b01000110
- }, {
- 0b00111110, 0b01000001, 0b01000001, 0b00111110, 0b01000001, 0b01001001, 0b01001001, 0b00110110
- }, {
- 0b00111110, 0b01000001, 0b01000001, 0b00111110, 0b00000111, 0b00001000, 0b00001000, 0b01111111
- }, {
- 0b00111110, 0b01000001, 0b01000001, 0b00111110, 0b01000110, 0b01001001, 0b01001001, 0b00110001
- }, {
- 0b00111110, 0b01000001, 0b01000001, 0b00111110, 0b00111110, 0b01001001, 0b01001001, 0b00110000
- }, {
- 0b00111110, 0b01000001, 0b01000001, 0b00111110, 0b00000001, 0b00000001, 0b01111001, 0b00000111
- }, {
- 0b00111110, 0b01000001, 0b01000001, 0b00111110, 0b00110110, 0b01001001, 0b01001001, 0b00110110
- }, {
- 0b00111110, 0b01000001, 0b01000001, 0b00111110, 0b00000110, 0b01001001, 0b01001001, 0b00111110
- }, {
- 0b00000000, 0b00000000, 0b01111111, 0b00000000, 0b00111110, 0b01000001, 0b01000001, 0b00111110
- }, {
- 0b00000000, 0b00000000, 0b01111111, 0b00000000, 0b00000000, 0b00000000, 0b01111111, 0b00000000
- }, {
- 0b00000000, 0b00000000, 0b01111111, 0b00000000, 0b00110001, 0b01001001, 0b01001001, 0b01000110
- }, {
- 0b00000000, 0b00000000, 0b01111111, 0b00000000, 0b01000001, 0b01001001, 0b01001001, 0b00110110
- }, {
- 0b00000000, 0b00000000, 0b01111111, 0b00000000, 0b00000111, 0b00001000, 0b00001000, 0b01111111
- }, {
- 0b00000000, 0b00000000, 0b01111111, 0b00000000, 0b01000110, 0b01001001, 0b01001001, 0b00110001
- }, {
- 0b00000000, 0b00000000, 0b01111111, 0b00000000, 0b00111110, 0b01001001, 0b01001001, 0b00110000
- }, {
- 0b00000000, 0b00000000, 0b01111111, 0b00000000, 0b00000001, 0b00000001, 0b01111001, 0b00000111
- }, {
- 0b00000000, 0b00000000, 0b01111111, 0b00000000, 0b00110110, 0b01001001, 0b01001001, 0b00110110
- }, {
- 0b00000000, 0b00000000, 0b01111111, 0b00000000, 0b00000110, 0b01001001, 0b01001001, 0b00111110
- }, {
- 0b00110001, 0b01001001, 0b01001001, 0b01000110, 0b00111110, 0b01000001, 0b01000001, 0b00111110
- }, {
- 0b00110001, 0b01001001, 0b01001001, 0b01000110, 0b00000000, 0b00000000, 0b01111111, 0b00000000
- }, {
- 0b00110001, 0b01001001, 0b01001001, 0b01000110, 0b00110001, 0b01001001, 0b01001001, 0b01000110
- }, {
- 0b00110001, 0b01001001, 0b01001001, 0b01000110, 0b01000001, 0b01001001, 0b01001001, 0b00110110
- }, {
- 0b00110001, 0b01001001, 0b01001001, 0b01000110, 0b00000111, 0b00001000, 0b00001000, 0b01111111
- }, {
- 0b00110001, 0b01001001, 0b01001001, 0b01000110, 0b01000110, 0b01001001, 0b01001001, 0b00110001
- }, {
- 0b00110001, 0b01001001, 0b01001001, 0b01000110, 0b00111110, 0b01001001, 0b01001001, 0b00110000
- }, {
- 0b00110001, 0b01001001, 0b01001001, 0b01000110, 0b00000001, 0b00000001, 0b01111001, 0b00000111
- }, {
- 0b00110001, 0b01001001, 0b01001001, 0b01000110, 0b00110110, 0b01001001, 0b01001001, 0b00110110
- }, {
- 0b00110001, 0b01001001, 0b01001001, 0b01000110, 0b00000110, 0b01001001, 0b01001001, 0b00111110
- }, {
- 0b01000001, 0b01001001, 0b01001001, 0b00110110, 0b00111110, 0b01000001, 0b01000001, 0b00111110
- }
- };
- const uint8_t numbers_on[][8] = {
- {
- 0b00111110, 0b01000001, 0b01000001, 0b00111110, 0b00111110, 0b01000001, 0b01000001, 0b10111110
- }, {
- 0b00111110, 0b01000001, 0b01000001, 0b00111110, 0b00000000, 0b00000000, 0b01111111, 0b10000000
- }, {
- 0b00111110, 0b01000001, 0b01000001, 0b00111110, 0b00110001, 0b01001001, 0b01001001, 0b11000110
- }, {
- 0b00111110, 0b01000001, 0b01000001, 0b00111110, 0b01000001, 0b01001001, 0b01001001, 0b10110110
- }, {
- 0b00111110, 0b01000001, 0b01000001, 0b00111110, 0b00000111, 0b00001000, 0b00001000, 0b11111111
- }, {
- 0b00111110, 0b01000001, 0b01000001, 0b00111110, 0b01000110, 0b01001001, 0b01001001, 0b10110001
- }, {
- 0b00111110, 0b01000001, 0b01000001, 0b00111110, 0b00111110, 0b01001001, 0b01001001, 0b10110000
- }, {
- 0b00111110, 0b01000001, 0b01000001, 0b00111110, 0b00000001, 0b00000001, 0b01111001, 0b10000111
- }, {
- 0b00111110, 0b01000001, 0b01000001, 0b00111110, 0b00110110, 0b01001001, 0b01001001, 0b10110110
- }, {
- 0b00111110, 0b01000001, 0b01000001, 0b00111110, 0b00000110, 0b01001001, 0b01001001, 0b10111110
- }, {
- 0b00000000, 0b00000000, 0b01111111, 0b00000000, 0b00111110, 0b01000001, 0b01000001, 0b10111110
- }, {
- 0b00000000, 0b00000000, 0b01111111, 0b00000000, 0b00000000, 0b00000000, 0b01111111, 0b10000000
- }, {
- 0b00000000, 0b00000000, 0b01111111, 0b00000000, 0b00110001, 0b01001001, 0b01001001, 0b11000110
- }, {
- 0b00000000, 0b00000000, 0b01111111, 0b00000000, 0b01000001, 0b01001001, 0b01001001, 0b10110110
- }, {
- 0b00000000, 0b00000000, 0b01111111, 0b00000000, 0b00000111, 0b00001000, 0b00001000, 0b11111111
- }, {
- 0b00000000, 0b00000000, 0b01111111, 0b00000000, 0b01000110, 0b01001001, 0b01001001, 0b10110001
- }, {
- 0b00000000, 0b00000000, 0b01111111, 0b00000000, 0b00111110, 0b01001001, 0b01001001, 0b10110000
- }, {
- 0b00000000, 0b00000000, 0b01111111, 0b00000000, 0b00000001, 0b00000001, 0b01111001, 0b10000111
- }, {
- 0b00000000, 0b00000000, 0b01111111, 0b00000000, 0b00110110, 0b01001001, 0b01001001, 0b10110110
- }, {
- 0b00000000, 0b00000000, 0b01111111, 0b00000000, 0b00000110, 0b01001001, 0b01001001, 0b10111110
- }, {
- 0b00110001, 0b01001001, 0b01001001, 0b01000110, 0b00111110, 0b01000001, 0b01000001, 0b10111110
- }, {
- 0b00110001, 0b01001001, 0b01001001, 0b01000110, 0b00000000, 0b00000000, 0b01111111, 0b10000000
- }, {
- 0b00110001, 0b01001001, 0b01001001, 0b01000110, 0b00110001, 0b01001001, 0b01001001, 0b11000110
- }, {
- 0b00110001, 0b01001001, 0b01001001, 0b01000110, 0b01000001, 0b01001001, 0b01001001, 0b10110110
- }, {
- 0b00110001, 0b01001001, 0b01001001, 0b01000110, 0b00000111, 0b00001000, 0b00001000, 0b11111111
- }, {
- 0b00110001, 0b01001001, 0b01001001, 0b01000110, 0b01000110, 0b01001001, 0b01001001, 0b10110001
- }, {
- 0b00110001, 0b01001001, 0b01001001, 0b01000110, 0b00111110, 0b01001001, 0b01001001, 0b10110000
- }, {
- 0b00110001, 0b01001001, 0b01001001, 0b01000110, 0b00000001, 0b00000001, 0b01111001, 0b10000111
- }, {
- 0b00110001, 0b01001001, 0b01001001, 0b01000110, 0b00110110, 0b01001001, 0b01001001, 0b10110110
- }, {
- 0b00110001, 0b01001001, 0b01001001, 0b01000110, 0b00000110, 0b01001001, 0b01001001, 0b10111110
- }, {
- 0b01000001, 0b01001001, 0b01001001, 0b00110110, 0b00111110, 0b01000001, 0b01000001, 0b10111110
- }
- };
- const uint8_t arrow[][8] = {
- {
- 0b10000000, 0b11000000, 0b11100000, 0b11110000, 0b11110000, 0b11100000, 0b11000000, 0b10000000
- }, {
- 0b01000000, 0b01100000, 0b11110000, 0b11111000, 0b11111000, 0b11110000, 0b01100000, 0b01000000
- }, {
- 0b00100000, 0b00110000, 0b11111000, 0b11111100, 0b11111100, 0b11111000, 0b00110000, 0b00100000
- }, {
- 0b00010000, 0b00011000, 0b11111100, 0b11111110, 0b11111110, 0b11111100, 0b00011000, 0b00010000
- }, {
- 0b00001000, 0b00001100, 0b11111110, 0b11111111, 0b11111111, 0b11111110, 0b00001100, 0b00001000
- }
- };
- LedControl lc = LedControl(DIN, CLK, CS, 0);
- int state = 0;
- int number = 0;
- int last = 0;
- int x_angle;
- int y_angle;
- int z_angle;
- void setup() {
- Serial.begin(9600);
- Wire.begin();
- // display setup
- lc.shutdown(0, false);
- lc.setIntensity(0, 10);
- lc.clearDisplay(0);
- // calibrate
- byte status = mpu.begin();
- while (status != 0) { }
- delay(1000);
- mpu.calcOffsets();
- }
- void loop() {
- angle();
- if (state == 0) {
- if (last > 0) {
- number = last;
- }
- printByte(numbers_off[number]);
- } else if (state == 1) {
- if (number == 0) {
- arrow_up();
- } else {
- minute(number);
- }
- }
- }
- void minute(int m) {
- int p = 0;
- while (p < 30) {
- printByte(numbers_off[m]);
- delay(1000);
- printByte(numbers_on[m]);
- delay(1000);
- angle();
- if (state == 0 || state == 2) {
- break;
- }
- p++;
- }
- number--;
- }
- void angle() {
- mpu.update();
- delay(10);
- x_angle = mpu.getAngleX();
- y_angle = mpu.getAngleY();
- // z_angle = mpu.getAngleZ();
- // Serial.print("X: ");
- // Serial.print(x_angle);
- // Serial.print(" Y: ");
- // Serial.print(y_angle);
- // Serial.print(" Z: ");
- // Serial.println(z_angle);
- // left tilt count up
- if (y_angle > 25) {
- number++;
- last = number;
- delay(1000);
- // right tilt start-stop
- } else if (y_angle < -25) {
- if (state == 0) {
- state = 1;
- delay(1000);
- } else if (state == 1) {
- state = 2;
- delay(1000);
- } else if (state == 2) {
- state = 1;
- delay(1000);
- }
- // forward tilt reset
- } else if (x_angle < -10 && y_angle < 2 && y_angle > -2) {
- if (state == 0) {
- last = 0;
- }
- number = 0;
- state = 0;
- }
- }
- void arrow_up() {
- while (state == 1) {
- for (int k = 0; k < 4; k++) {
- printByte(arrow[k]);
- delay(300);
- }
- for (int k = 4; k > 0; k--) {
- printByte(arrow[k]);
- delay(300);
- }
- angle();
- }
- }
- void printByte(byte character []) {
- for (int g = 0; g < 9; g++) {
- lc.setRow(0, g, character[g]);
- }
- }