#include <Arduino.h>
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
#define ButtonR 9
#define ButtonG 10
#define ButtonB 11
#define ButtonY 12
#define ButtonM 13
#define TempPin A0
#define BatteryPin A1
#define ADCtoVbatt 0.12 //Conversion constant for ADC to Voltage for battery
#define BattZero 3.2 //Zero percent voltage
#define BattScale 100 //Scale factor for battery conversion
#define UpdateInterval 1000
uint8_t Buttons = 0;
uint16_t TempLogPosition = 0;
uint8_t TempLog[400];
uint16_t TempFifteenSec = 0;
uint8_t TempFifteenCursor = 0;
uint16_t TimerOld = 0;
uint16_t Timer = 0;
uint8_t TimerMin = 0;
uint16_t TimerPreheatS = 0;
uint8_t TimerPreheatM = 0;
uint16_t TempAvg = 0;
uint16_t TempPeaks[10];
uint16_t TempCurrent = 0;
float BattVoltage = 0.0;
uint8_t BattPercentage = 0;
unsigned long pMillis = 0;
struct {
unsigned int QuarterMin : 1;
unsigned int HalfMin : 1;
unsigned int FullMin : 1;
unsigned int Error : 1;
unsigned int MaxReached : 1;
unsigned int Record : 1;
unsigned int Pause : 1;
unsigned int Stop : 1;
unsigned int Scale : 2; //0 = SCALE400; 1 = SCALE200; 2 = SCALE100; 3 = SCALE50
} Status;
void setup() {
// put your setup code here, to run once:
u8g2.begin();
pinMode(ButtonR, INPUT);
pinMode(ButtonG, INPUT);
pinMode(ButtonB, INPUT);
pinMode(ButtonY, INPUT);
pinMode(ButtonM, INPUT);
batteryMeasurement();
Status.QuarterMin = 1;
Status.HalfMin = 0;
Status.FullMin = 0;
Status.Error = 0;
Status.MaxReached = 0;
Status.Record = 0;
Status.Pause = 0;
Status.Stop = 1;
Status.Scale = 0;
TempCurrent = getTemperature(TempPin);
//----Start screen
u8g2.clearBuffer(); // clear the internal memory
u8g2.setFont(u8g2_font_tiny5_tf); // choose a suitable font
drawScreenBase();
u8g2.sendBuffer();
//----End
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void loop() {
// put your main code here, to run repeatedly:
if(digitalRead(ButtonR) == 0){ //START PAUSE button
Buttons = 1;
if(Status.Stop == 1){
Status.Record = 1;
//Status.Stop = 0;
}
else if(Status.Pause == 1){
Status.Record = 1;
Status.Pause = 0;
}
else if(Status.Record == 1){
Status.Record = 0;
Status.Pause = 1;
}
delay(1000);
}
else if(digitalRead(ButtonG) == 0){ //STOP button
Buttons = 2;
}
else if(digitalRead(ButtonB) == 0){ //SCALE + button
Buttons = 4;
}
else if(digitalRead(ButtonY) == 0){ //SCALE - button
Buttons = 8;
}
else{
Buttons = 0;
}
if(Status.Record == 1){
if(Status.Stop == 1){ //check if the start just been pressed
Status.Stop = 0; //clearing first start flag
startTimer();
}
if(pMillis <= millis()-UpdateInterval){
TimerIncrement();
pMillis = millis();
updateTT();
}
TempCurrent = getTemperature(TempPin);
if(Timer == TimerOld+1){
TempFifteenSec = TempFifteenSec + TempCurrent;
TempFifteenCursor++;
if (TempFifteenCursor == 15){
TempFifteenCursor = 0;
TempLog[TempLogPosition] = TempFifteenSec/15;
TempFifteenSec = 0;
}
}
u8g2.clearBuffer(); // clear the internal memory
u8g2.setFont(u8g2_font_tiny5_tf); // choose a suitable font
drawScreenBase();
plotGraph(TempLogPosition);
u8g2.sendBuffer();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/*
u8g2.clearBuffer(); // clear the internal memory
u8g2.setFont(u8g2_font_tiny5_tf); // choose a suitable font
u8g2.drawStr(0,10,"0123456789ABCDEabcde"); // write something to the internal memory
u8g2.setCursor(0, 20);
switch (Buttons){
case 0:
u8g2.print("OFF");
break;
case 1:
u8g2.print("RED");
break;
case 2:
u8g2.print("GREEN");
break;
case 4:
u8g2.print("BLUE");
break;
case 8:
u8g2.print("YELLOW");
break;
}
u8g2.setCursor(0, 40);
u8g2.print(analogRead(TempPin));
u8g2.setCursor(10, 60);
u8g2.print(analogRead(BatteryPin));
u8g2.sendBuffer(); // transfer internal memory to the display */
delay(1000);
}
void drawScreenBase(void){
u8g2.setCursor(4, 5);
TimerMin = Timer/60;
u8g2.print(TimerMin);
u8g2.setCursor(8, 5);
u8g2.print(":");
u8g2.setCursor(10, 5);
u8g2.print(Timer-(TimerMin*60));
TimerPreheatM = TimerPreheatS/60;
u8g2.setCursor(16, 5);
u8g2.print(TimerPreheatM);
u8g2.setCursor(21, 5);
u8g2.print(":");
u8g2.setCursor(25, 5);
u8g2.print(TimerPreheatS-(TimerPreheatM*60));
u8g2.setCursor(36, 5);
u8g2.print(TempAvg);
u8g2.setCursor(40, 5);
u8g2.print("F");
u8g2.setCursor(50, 5);
u8g2.print(TempCurrent);
u8g2.setCursor(60, 5);
u8g2.print("F");
u8g2.setCursor(107, 5);
u8g2.print(BattPercentage);
u8g2.setCursor(115, 5);
u8g2.print("%");
drawBattery();
u8g2.drawHLine(0, 6, 128); //Top line
u8g2.drawHLine(0, 14, 128); //Middle line
u8g2.drawHLine(0, 56, 128); //Bottom line
for(int i = 1; i<33; i++){
u8g2.drawPixel((i*4)-1, 57); //Digit marks
};
u8g2.setCursor(6, 64);
u8g2.print("2");
u8g2.setCursor(14, 64);
u8g2.print("4");
u8g2.setCursor(22, 64);
u8g2.print("6");
u8g2.setCursor(30, 64);
u8g2.print("8");
u8g2.setCursor(36, 64);
u8g2.print("10");
u8g2.setCursor(52, 64);
u8g2.print("14");
u8g2.setCursor(68, 64);
u8g2.print("18");
u8g2.setCursor(84, 64);
u8g2.print("22");
u8g2.setCursor(100, 64);
u8g2.print("26");
u8g2.setCursor(116, 64);
u8g2.print("30");
};
void drawBattery(void){
u8g2.drawFrame(121, 0, 7, 5);
u8g2.drawVLine(120, 1, 3);
if(BattPercentage>90){
u8g2.drawBox(122, 1, 5, 3); //Battery percentage
}
else if(BattPercentage>70){
u8g2.drawBox(123, 1, 4, 3); //Battery percentage
}
else if(BattPercentage>50){
u8g2.drawBox(124, 1, 3, 3); //Battery percentage
}
else if(BattPercentage>30){
u8g2.drawBox(125, 1, 2, 3); //Battery percentage
}
else if(BattPercentage>10){
u8g2.drawVLine(126, 1, 3); //Battery percentage
};
};
void batteryMeasurement(void){
BattVoltage = ADCtoVbatt*analogRead(BatteryPin);
BattPercentage = (BattVoltage-BattZero)*BattScale;
};
uint16_t getTemperature(uint8_t pin){
uint16_t Temperature = 1 / (log(1 / (1023. / analogRead(pin) - 1)) / 3950. + 1.0 / 298.15) - 273.15;\
return Temperature;
};
void startTimer(void){
pMillis = millis();
};
void TimerIncrement(void){
Timer++;
};
void plotGraph( uint16_t pos ){
for(byte i; i<pos; i++){
uint8_t Pixel = 0;
switch(Status.Scale){
case 0: //SCALE400
Pixel = -0.1*TempLog[i]+63;
break;
case 1: //SCALE200
Pixel = -0.2*TempLog[i]+93;
break;
case 2: //SCALE100
Pixel = -0.4*TempLog[i]+173;
break;
case 3: //SCALE50
//-0.1*TempLog[i]+63;
break;
}
u8g2.drawPixel(i,Pixel);
}
};
void updateTT(void){
};