#include <WiFi.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C
// size of each character in pixel: 6 x 8
// each line can display 21 characters at most with text size of 1
#define CHAR_WIDTH 6
#define CHAR_HEIGHT 8
unsigned int textSize = 1;
#define RESET_BUTTON 4
int prevResetButtonState = LOW;
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
unsigned int stepCounts = 0;
bool firstRun = true;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
if (!oled.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println("SSD1306 allocation failed!");
for(;;);
}
pinMode(RESET_BUTTON, INPUT);
digitalWrite(RESET_BUTTON, LOW);
oled.clearDisplay();
oled.setTextSize(textSize);
oled.setTextColor(SSD1306_WHITE);
// showing logo
const uint8_t logo_map[] = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x9f, 0xff, 0xcf, 0xc7, 0xff,
0xff, 0xff, 0xff, 0x9f, 0xff, 0x03, 0x9b, 0xff,
0xff, 0xff, 0xff, 0x8f, 0xfe, 0x31, 0xfb, 0x7f,
0xff, 0xff, 0xff, 0x0f, 0xfd, 0xf8, 0x67, 0x7f,
0xff, 0xff, 0xcf, 0x0f, 0xe3, 0xf9, 0x67, 0x7f,
0xff, 0xff, 0xcf, 0x6c, 0xe7, 0xf1, 0xef, 0xff,
0xff, 0xff, 0x8f, 0x6c, 0xff, 0xe3, 0xee, 0xff,
0xff, 0xff, 0x87, 0x6c, 0xff, 0xe7, 0x8e, 0xff,
0xfe, 0x3f, 0x26, 0x60, 0xff, 0xce, 0x6f, 0xff,
0xfe, 0x00, 0x26, 0x62, 0x40, 0x1a, 0xf5, 0xff,
0xfe, 0x3f, 0xf6, 0x72, 0x5f, 0x09, 0xff, 0xff,
0xff, 0xff, 0xf6, 0xf3, 0x5e, 0x07, 0xff, 0xff,
0xff, 0xff, 0xf2, 0xf3, 0x1c, 0x2f, 0xff, 0xff,
0xff, 0xff, 0xf2, 0xff, 0x18, 0x1f, 0xff, 0xff,
0xff, 0xff, 0xf8, 0xff, 0x18, 0x07, 0xff, 0xff,
0xff, 0xff, 0xf8, 0xff, 0xb8, 0x01, 0xff, 0xff,
0xff, 0xff, 0xf9, 0xff, 0xf0, 0x04, 0xff, 0xff,
0xff, 0xff, 0xf9, 0xff, 0xe0, 0xc1, 0x7f, 0xff,
0xff, 0xff, 0xfd, 0xff, 0xe1, 0xfb, 0x7f, 0xff,
0xff, 0xff, 0xff, 0xff, 0xc1, 0xf9, 0xbf, 0xff,
0xff, 0xff, 0xff, 0xff, 0xc3, 0xf4, 0x7f, 0xff,
0xff, 0xff, 0xff, 0xff, 0x87, 0xe1, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x0f, 0x87, 0xff, 0xff,
0xff, 0xff, 0xff, 0xfe, 0x1e, 0x3f, 0xff, 0xff,
0xff, 0xff, 0xff, 0xfc, 0x3c, 0x3f, 0xff, 0xff,
0xff, 0xff, 0xff, 0xfc, 0x7e, 0x3f, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf8, 0xff, 0x3f, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf1, 0xff, 0xbf, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
oled.drawBitmap(32, 0, logo_map, SCREEN_HEIGHT, SCREEN_HEIGHT, SSD1306_WHITE);
oled.display();
delay(3000);
oled.clearDisplay();
oled.display();
// date
oled.setCursor(0, 0);
oled.print("13-05-2024");
// temperature
char ch = 248; // degree symbol
String temp = "33" + String(ch) + "C";
oled.setCursor(SCREEN_WIDTH - temp.length() * CHAR_WIDTH * textSize, 0);
oled.print(temp);
// time
String strTime = "16:10";
unsigned int startX = (SCREEN_WIDTH - strTime.length() * CHAR_WIDTH * 2) / 2;
oled.fillRoundRect(startX - 4, 9, strTime.length() * CHAR_WIDTH * 2 + 8, 18, 8, SSD1306_WHITE);
oled.setTextSize(2);
oled.setTextColor(SSD1306_BLACK);
oled.setCursor(startX, 10);
oled.print(strTime);
// total steps
unsigned int steps = 1234;
String totalSteps = "Total: " + String(steps) + " steps";
oled.setTextSize(1);
oled.setTextColor(SSD1306_WHITE);
oled.setCursor((SCREEN_WIDTH - totalSteps.length() * CHAR_WIDTH * textSize) / 2, 29);
oled.print(totalSteps);
// current round
oled.drawRect(0, 40, 128, SCREEN_HEIGHT - 40, SSD1306_WHITE);
oled.display();
delay(2000);
}
String startTimestamp = "07:10";
String endTimestamp = "07:33";
void loop() {
int resetButtonState = digitalRead(RESET_BUTTON);
if (resetButtonState == HIGH) {
// turn on
if (prevResetButtonState == LOW) {
// erase previous time duration
oled.fillRect(1, 43, 126, 8, SSD1306_BLACK);
// print start time
String startTime = "Started at " + startTimestamp;
oled.setCursor((SCREEN_WIDTH - startTime.length() * CHAR_WIDTH * textSize) / 2, 43);
oled.print(startTime);
firstRun = false;
}
// continue to count steps
oled.fillRect(1, 54, 126, 8, SSD1306_BLACK);
String counting = "Counting: " + String(stepCounts);
oled.setCursor((SCREEN_WIDTH - counting.length() * CHAR_WIDTH * textSize) / 2, 54);
oled.print(counting);
stepCounts++;
}
else {
if (prevResetButtonState == HIGH) {
if (!firstRun) {
// erase start time
oled.fillRect(1, 43, 126, 8, SSD1306_BLACK);
String walkingDuration = "From " + startTimestamp + " to " + endTimestamp;
oled.setCursor((SCREEN_WIDTH - walkingDuration.length() * CHAR_WIDTH * textSize) / 2, 43);
oled.print(walkingDuration);
}
stepCounts = 0;
}
}
prevResetButtonState = resetButtonState;
oled.display();
delay(500); // this speeds up the simulation
}