//#include <SPI.h>
//#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "OneButton.h"
//#include <EEPROM.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // 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
#define LOGO_HEIGHT 16
#define LOGO_WIDTH 16
static const unsigned char PROGMEM logo_bmp[] =
{ B00000000, B11000000,
B00000001, B11000000,
B00000001, B11000000,
B00000011, B11100000,
B11110011, B11100000,
B11111110, B11111000,
B01111110, B11111111,
B00110011, B10011111,
B00011111, B11111100,
B00001101, B01110000,
B00011011, B10100000,
B00111111, B11100000,
B00111111, B11110000,
B01111100, B11110000,
B01110000, B01110000,
B00000000, B00110000 };
#define EESIZE 256
#define EEPROM_MIN 10 //adresse minutes in EEProm
#define EEPROM_SEC 11 //adresse seconds in EEProm
byte zero = 0x00;
int col = 0;
int iStoredMin, iStoredSec, iRunTimeSec, iTimeRemain;
long int iOneSecCnt = 0;
uint8_t progress = 0;
typedef enum {
STANDBY,
ADJUST,
RUNNING,
PAUSE
} eMode;
eMode Mode = STANDBY;
#define ENCODER_CLK 2
#define ENCODER_DT 3
#define ENCODER_SW 4
// Push Button PIN definition
#define PIN_BTN_1 A2
#define PIN_BTN_2 A3
OneButton button1(PIN_BTN_1, true);
OneButton button2(PIN_BTN_2, true);
void setup() {
Serial.begin(9600);
// for terminal output see
// https://wokwi.com/arduino/projects/308893120796295745
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { //Ive changed the address //already chill
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
// Show initial display buffer contents on the screen --
// the library initializes this with an Adafruit splash screen.
display.display();
delay(2000); // Pause for 2 seconds
// Clear the buffer
display.clearDisplay();
// Draw a single pixel in white
//display.drawPixel(10, 10, SSD1306_WHITE);
//display.display();
delay(100);
// display.display() is NOT necessary after every single drawing command,
// unless that's what you want...rather, you can batch up a bunch of
// drawing operations and then update the screen all at once by calling
// display.display(). These examples demonstrate both approaches...
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
pinMode(ENCODER_SW, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(ENCODER_CLK), Encoder_INTR, FALLING);
//attachInterrupt(digitalPinToInterrupt(ENCODER_SW), EncoderSW_INTR, FALLING);
updateDisplay();
//setDateTime();
//setEEPromDefault();
button1.attachClick(singleClick_1);
button1.attachDoubleClick(doubleClick_1);
button1.attachLongPressStart(longPressStart_1);
button2.attachClick(singleClick_ENC_btn);
button2.attachDoubleClick(doubleClick_ENC_btn);
button2.attachLongPressStart(longPress_ENC_btn);
iStoredMin = 3;
iStoredSec = 33;
//sprintf(strLine[2], "TeaTime: %imin %isec", iStoredMin, iStoredSec);
updateDisplay();
Serial.println(iStoredMin);
Serial.println(iStoredSec);
delay(100);
iOneSecCnt = millis();
}
/*
############# Main Loop ##############
*/
void loop() {
button1.tick();
button2.tick();
if (millis() - iOneSecCnt > 1000)
{
iOneSecCnt = millis();
updateDisplay();
checkTimeStatus();
int iActCount = getCounts();
if (iActCount != 0)
Serial.println(iActCount);
}
delay (10);
}
void checkTimeStatus()
{
if (Mode == RUNNING)
{
if (iTimeRemain > 0)
{
iTimeRemain--;
Serial.print("remaining: ");
Serial.println(iTimeRemain);
updateProgress();
}
else
{
Mode = STANDBY;
Serial.println("Done");
}
}
}
int pulse_cnt = 0;
void Encoder_INTR() {
int dtValue = digitalRead(ENCODER_DT);
if (dtValue == HIGH) {
pulse_cnt++; // Clockwise
}
if (dtValue == LOW) {
pulse_cnt--; // Counterclockwise
}
}
// Get the counter value, disabling interrupts.
// This make sure readEncoder() doesn't change the value
// while we're reading it.
int getCounts() {
int result;
noInterrupts();
result = pulse_cnt;
pulse_cnt = 0;
interrupts();
return result;
}
void resetCounter() {
noInterrupts();
pulse_cnt = 0;
interrupts();
}
void updateValue(int delta) {
}
void updateDisplay()
{
display.clearDisplay();
display.setFont();
display.setTextColor(1);
display.setCursor(32, 2);
display.print("Cooktimer");
display.setCursor(48, 22);
switch (Mode)
{
case STANDBY:
display.print("standby");
break;
case ADJUST:
display.print("adjust");
break;
case RUNNING:
display.print("running");
break;
case PAUSE:
display.print("pause");
break;
}
display.setCursor(42, 42);
display.print("Restzeit");
display.drawRoundRect(10, 52, 102, 9, 2, WHITE);
display.fillRect(11, 53, progress, 7, WHITE);
if (Mode == RUNNING) {
display.setCursor(32, 42);
display.print(">");
}
display.display();
}
void updateProgress()
{
static float iDots = 100.0;
static float iLastDots = 0.0;
if (Mode == RUNNING)
{
float fTemp = iRunTimeSec/100.0;
iDots = (int)((float)iTimeRemain/fTemp);
if (iDots != iLastDots)
{
iLastDots = iDots;
progress = constrain(iDots, 0, 100);
updateDisplay();
}
//Serial.print("Dots: ");
//Serial.println(iDots);
}
else
{
iDots = 100;
//sprintf(strLine[3], "%20s", "start press 3s \"S\" ");
updateDisplay();
}
}
void singleClick_ENC_btn()
{
Serial.println("Single Click Encoder Button");
//iTimeRemain = iRunTimeSec = 60*iStoredMin + iStoredSec;
switch (Mode)
{
case STANDBY:
iTimeRemain = iRunTimeSec = 0;
Mode = ADJUST;
break;
case ADJUST:
iTimeRemain = iRunTimeSec = 60*iStoredMin + iStoredSec;
if (iTimeRemain > 0)
Mode = RUNNING;
break;
case RUNNING:
Mode = PAUSE;
break;
case PAUSE:
Mode = RUNNING;
//progress = constrain(progress + delta, 0, 100);
Serial.print("pause");
break;
}
} // singleClick
void doubleClick_ENC_btn()
{
Serial.println("Double Click Encoder Button");
} // doubleClick
void longPress_ENC_btn()
{
// longPress Timer Reset
Serial.println("long press Encoder Button");
iTimeRemain = iRunTimeSec = 60*iStoredMin + iStoredSec;
Mode = STANDBY;
Serial.print("Mode: ");
Serial.println((int)Mode);
}
void singleClick_1()
{
Serial.println("Single Click Button 2");
} // singleClick
void doubleClick_1()
{
Serial.println("Double Click Button 2");
} // doubleClick
void longPressStart_1()
{
Serial.println("long press Button 2");
}