mirror of
https://github.com/KevinMidboe/oled_workout_tracker.git
synced 2025-10-29 01:30:29 +00:00
Init commit. README and working example.
This commit is contained in:
12
README.md
Normal file
12
README.md
Normal file
@@ -0,0 +1,12 @@
|
||||
|
||||
# Mini-OLED Workout display
|
||||
A small wall-mounted display with input to set and display excersize repetitions per day.
|
||||
|
||||
## Components
|
||||
OLED screen - wakes and dims on a timeout.
|
||||
Potentiometer - setting value to display based on put input.
|
||||
|
||||
Either button or time based commit to off-chip db over http.
|
||||
|
||||
# Graphics
|
||||
Ideas for what to display on the screen
|
||||
179
writingText/writingText.ino
Normal file
179
writingText/writingText.ino
Normal file
@@ -0,0 +1,179 @@
|
||||
/**************************************************************************
|
||||
This is an example for our Monochrome OLEDs based on SSD1306 drivers
|
||||
|
||||
Pick one up today in the adafruit shop!
|
||||
------> http://www.adafruit.com/category/63_98
|
||||
|
||||
This example is for a 128x32 pixel display using I2C to communicate
|
||||
3 pins are required to interface (two I2C and one reset).
|
||||
|
||||
Adafruit invests time and resources providing this open
|
||||
source code, please support Adafruit and open-source
|
||||
hardware by purchasing products from Adafruit!
|
||||
|
||||
Written by Limor Fried/Ladyada for Adafruit Industries,
|
||||
with contributions from the open source community.
|
||||
BSD license, check license.txt for more information
|
||||
All text above, and the splash screen below must be
|
||||
included in any redistribution.
|
||||
**************************************************************************/
|
||||
|
||||
#include <SPI.h>
|
||||
#include <Wire.h>
|
||||
#include <Adafruit_GFX.h>
|
||||
#include <Adafruit_SSD1306.h>
|
||||
|
||||
#define SCREEN_WIDTH 128 // OLED display width, in pixels
|
||||
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
|
||||
|
||||
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
|
||||
#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
|
||||
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
|
||||
|
||||
#define NUMFLAKES 10 // Number of snowflakes in the animation example
|
||||
|
||||
// input pin definition
|
||||
int buttonModePin = 2;
|
||||
int potPin = 2;
|
||||
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
|
||||
// Setup button interrupt for changing modes
|
||||
pinMode(buttonModePin, INPUT_PULLUP);
|
||||
attachInterrupt(digitalPinToInterrupt(2), changeMode, FALLING);
|
||||
|
||||
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
|
||||
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32
|
||||
Serial.println(F("SSD1306 allocation failed"));
|
||||
for(;;); // Don't proceed, loop forever
|
||||
}
|
||||
|
||||
// Clear the buffer
|
||||
display.clearDisplay();
|
||||
display.setTextColor(SSD1306_WHITE);
|
||||
display.display();
|
||||
}
|
||||
|
||||
String input;
|
||||
void displayFromSerialInput() {
|
||||
while (Serial.available() > 0) {
|
||||
input = Serial.readString();
|
||||
Serial.print("Displaying input text: ");
|
||||
Serial.println(input);
|
||||
|
||||
display.clearDisplay();
|
||||
drawHeader("Push-ups:");
|
||||
drawText(input);
|
||||
display.display();
|
||||
}
|
||||
}
|
||||
|
||||
void drawHeader(String textToDisplay) {
|
||||
display.setTextSize(1);
|
||||
display.setCursor(2,0);
|
||||
display.println(textToDisplay);
|
||||
}
|
||||
|
||||
void drawText(String textToDisplay) {
|
||||
display.setTextSize(3);
|
||||
display.setCursor(2, 10);
|
||||
display.println(textToDisplay);
|
||||
}
|
||||
|
||||
void drawPushups(int count) {
|
||||
Serial.print("refreshing display w/ value: ");
|
||||
Serial.println(count);
|
||||
|
||||
display.clearDisplay();
|
||||
drawHeader("Daily push-ups:");
|
||||
drawText(String(count));
|
||||
display.display();
|
||||
}
|
||||
|
||||
int positionBuffer = 10;
|
||||
int getPotValue() {
|
||||
return analogRead(potPin) / positionBuffer;
|
||||
}
|
||||
|
||||
|
||||
bool mode = false;
|
||||
|
||||
int pos = 0;
|
||||
int currentPos;
|
||||
bool active;
|
||||
|
||||
unsigned long lastEvent = 0;
|
||||
unsigned long currentTime;
|
||||
const long timeout = 1000;
|
||||
void displayNumberWithPotValue() {
|
||||
currentPos = getPotValue();
|
||||
if (currentPos < pos - 2 || currentPos > pos + 2) {
|
||||
active = true;
|
||||
}
|
||||
|
||||
while (active && mode == false) {
|
||||
currentTime = millis();
|
||||
if (currentTime - lastEvent > timeout) {
|
||||
active = false;
|
||||
}
|
||||
|
||||
currentPos = getPotValue();
|
||||
if (currentPos != pos) {
|
||||
lastEvent = currentTime;
|
||||
pos = currentPos;
|
||||
drawPushups(pos);
|
||||
}
|
||||
delay(10);
|
||||
}
|
||||
}
|
||||
|
||||
String menuLookup[4] = { "daily", "weekly", "goal" };
|
||||
|
||||
void displayMenuSelect() {
|
||||
currentPos = analogRead(potPin) / 257; // split in four (1028/4)
|
||||
|
||||
if (pos == currentPos) {
|
||||
return;
|
||||
}
|
||||
|
||||
pos = currentPos;
|
||||
display.clearDisplay();
|
||||
display.setTextSize(1);
|
||||
display.setCursor(0,0);
|
||||
|
||||
for (int i = 0; i < 4; i++) {
|
||||
if (pos == i) {
|
||||
display.print("- ");
|
||||
} else {
|
||||
display.print(" ");
|
||||
}
|
||||
display.println(menuLookup[i]);
|
||||
}
|
||||
display.display();
|
||||
}
|
||||
|
||||
bool beingPressed = false;
|
||||
void changeMode() {
|
||||
if (beingPressed == true) {
|
||||
return;
|
||||
}
|
||||
Serial.println("CHANGING MODE");
|
||||
|
||||
beingPressed = true;
|
||||
mode = !mode;
|
||||
delay(800);
|
||||
beingPressed = false;
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// displayFromSerialInput();
|
||||
|
||||
if (mode == false) {
|
||||
displayNumberWithPotValue();
|
||||
} else {
|
||||
displayMenuSelect();
|
||||
}
|
||||
delay(10);
|
||||
}
|
||||
Reference in New Issue
Block a user