// Gaggia shot timer 32line display
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeSans9pt7b.h>
#include <Fonts/FreeSans12pt7b.h>
#include <Fonts/FreeSansBold12pt7b.h>
//#include <max6675.h>
#include <elapsedMillis.h>
const int baudrate = 9600; //baud rate for serial monitor
const int sensorReadDelay = 250; //sensor read delay in milliseconds
//max6675: CLK 6, CS 7, DO 8
//MAX6675 thermocouple(6,7,8);
// Gaggia switches
#define BTN_PRIME 9
#define BTN_BREW 10
// Pressure Transducer
//const int pressureInput = A0; //analog input pin
//const int pressureZero = 102.4; //analog reading at 0psi
//const int pressureMax = 921.6; //analog reading at 200psi
//const int PTmaxPSI = 200;
//float pressureValue = 0; //variable to store incoming PT value
elapsedMillis sinceBrewDone;
int faseTimeSoak;
int faseTimeRest;
int faseTimeBrew;
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
// SDA 2, SCL 3
#define OLED_RESET 0 // GPIO0
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#define SCREEN_ADDRESS 0x3C // 0x3C for 128x64 screen 1, 0x3D for 128x64 screen 2
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
pinMode(BTN_PRIME,INPUT_PULLUP); //Prime Switch
pinMode(BTN_BREW,INPUT_PULLUP); //Brew Switch
display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS); // initialize with the I2C addr
//display.display();
display.clearDisplay();
display.setFont(&FreeSansBold12pt7b);
display.setTextColor(WHITE);
display.setCursor(3,20);
display.print("Good Day!");
display.display();
delay(1000);
//display.clearDisplay();
//display.display();
}
int sec1=0;
int min1=0;
unsigned long msec=0;
unsigned long mili=0;
int pres=0;
int fase=0;
int start=0;
unsigned long tim=0;
void loop(){
Serial.begin(baudrate);
display.clearDisplay();
if(digitalRead(BTN_PRIME)==0){
if(pres==0){
if (fase==9){
fase=0;
}
fase = 1;
pres = 1;
}
}else{pres=0;}
if(digitalRead(BTN_PRIME)==1){
if(fase==1){
fase = 2;
pres = 1;
}
//if (fase==9){fase=0;}
}
if(digitalRead(BTN_BREW)==0){
fase = 3;
pres = 1;
}
if(digitalRead(BTN_BREW)==1){
if(fase==3){
fase = 9;
pres = 1;
sinceBrewDone = 0;
}
}
if(fase==0){
start=0;
sec1=0;
min1=0;
tim=0;
mili=0;
msec=0;
faseTimeSoak=0;
faseTimeRest=0;
faseTimeBrew=0;
showSensorReadings();
}
if(fase==1){
//display.clearDisplay();
//display.setFont(&FreeSans9pt7b);
display.setCursor(0,24);
display.print("Pre-Infusion");
show_elapsed_time();
faseTimeSoak = get_fase_time();
}
if(fase==2){
//display.setFont(&FreeSans9pt7b);
display.setCursor(0,24);
display.print("Resting");
show_elapsed_time();
faseTimeRest = get_fase_time();
faseTimeRest = faseTimeRest - faseTimeSoak;
//show_fase_time();
}
if(fase==3){
//display.setFont(&FreeSans9pt7b);
display.setCursor(0,24);
display.print("Brewing");
show_elapsed_time();
faseTimeBrew = get_fase_time();
faseTimeBrew = faseTimeBrew - faseTimeRest - faseTimeSoak;
//show_fase_time();
}
if(fase==9){
//display.setFont(&FreeSans9pt7b);
display.setCursor(0,0);
if (sec1 < 20){
display.print("gRiNd FiNeR!");
}
else {
display.print("Enjoy your");
display.setCursor(0,12);
display.print("drink!");
}
//display.setFont(&FreeSansBold12pt7b);
display.setCursor(80,0);
display.print(sec1);
display.print(".");
display.print(mili);
show_fase_time();
start=0;
if (sinceBrewDone > 10000){
fase = 0;
}
}
display.display();
}
void showSensorReadings(){
display.setFont(&FreeSans12pt7b);
display.setCursor(0,16);
//display.print(thermocouple.readCelsius(), 1);
display.print(100);
//display.setFont(&FreeSans12pt7b);
display.setCursor(58,16);
display.print("6");
if (sec1<10){display.setCursor(104,16);}
else {display.setCursor(92,16);}
display.print(sec1);
display.setFont();
display.setCursor(40,1);
display.print("8");
display.setCursor(74,1);
display.print("5");
display.setCursor(120,1);
display.print(mili);
if (start==0){
display.setCursor(32,20);
display.print((char)247);
display.print("C");
display.setCursor(60,20);
display.print("bar");
display.setCursor(94,20);
display.print("secs");
}
delay(sensorReadDelay);
}
void show_elapsed_time(){
if(start==0){
start=1;
tim=millis();
}
msec=(millis()-tim);
sec1=msec/1000;
mili=(msec%1000)/100;
//display.setFont(&FreeSansBold12pt7b);
//display.setCursor(50,40);
//display.print(sec1);
//display.print(".");
//display.print(mili);
showSensorReadings();
}
int get_fase_time(){
unsigned long fase_tim=millis();
unsigned long fase_msec=(millis()-tim);
int fase_sec1=msec/1000;
int fase_mili=(msec%1000)/100;
return fase_msec/1000;
}
void show_fase_time(){
//display.setFont(&FreeSans9pt7b);
display.setCursor(0,24);
if (faseTimeSoak > 0){
display.print(faseTimeSoak);
display.print(" + ");
}
if (faseTimeRest > 0){
display.print(faseTimeRest);
display.print(" + ");
}
if (faseTimeSoak > 0 || faseTimeRest > 0){
display.print(faseTimeBrew);
display.print(" = ");
display.print(faseTimeSoak + faseTimeRest + faseTimeBrew);
}
}