You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

216 lines
4.0 KiB

#include <EEPROM.h>
#include <LiquidCrystal.h>
#include <Encoder.h>
#include <stdio.h>
LiquidCrystal lcd(9, 3, 8, 7, 6, 5, 4);
Encoder rotEnc(A0, A1);
long encVal = 0;
int activeTimer=0;
int timerLens[3];
bool updateDisplay=false;
int eeAddr1 = 0;
int eeAddr2 = 5;
int eeAddr3 = 10;
void EEPROMWriteInt(int p_address, int p_value) {
byte lowByte = ((p_value >> 0) & 0xFF);
byte highByte = ((p_value >> 8) & 0xFF);
EEPROM.write(p_address, lowByte);
EEPROM.write(p_address + 1, highByte);
}
unsigned int EEPROMReadInt(int p_address) {
byte lowByte = EEPROM.read(p_address);
byte highByte = EEPROM.read(p_address + 1);
return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
}
bool buttonLeftPressed=false;
void buttonLeft() {
buttonLeftPressed=true;
}
bool buttonRightPressed=false;
void buttonRight() {
buttonRightPressed=true;
}
bool buttonMidPressed=false;
void buttonMid() {
buttonMidPressed=true;
}
bool turnedLeft=false;
void turnLeft() {
turnedLeft=true;
}
bool turnedRight=false;
void turnRight() {
turnedRight=true;
}
bool rotPressed=false;
void pressRot() {
rotPressed=true;
}
void lcdPut(char* text) {
char str[35];
sprintf(str, "%s", text);
lcd.clear(); lcd.home();
lcd.print(str);
}
void grind(int time) {
lcdPut("grinding...");
digitalWrite(2, HIGH);
delay(time);
digitalWrite(2, LOW);
lcdPut("Fin...");
delay(550);
updateDisplay=true;
}
void boilerplate() {
if(rotEnc.read() < encVal) {
encVal = rotEnc.read();
turnLeft();
return;
} else if(rotEnc.read() > encVal) {
encVal = rotEnc.read();
turnRight();
return;
}
if( digitalRead(A2) == LOW) {
for(int i=0; i<10; i++) {
if( digitalRead(A2) != LOW )
return;
delay(150);
}
pinMode(A2, INPUT);
digitalWrite(A2, LOW);
grind( timerLens[activeTimer] );
pinMode(A2, INPUT);
digitalWrite(A2, HIGH);
delay(25);
}
if( digitalRead(A3) == LOW ) {
buttonLeft();
delay(25);
}
if( digitalRead(A4) == LOW ) {
buttonMid();
delay(25);
}
if( digitalRead(A5) == LOW ) {
buttonRight();
delay(25);
}
}
void loop() {
boilerplate();
if(buttonLeftPressed) {
buttonLeftPressed=false;
activeTimer=0;
updateDisplay=true;
}
if(buttonRightPressed) {
buttonRightPressed=false;
activeTimer=2;
updateDisplay=true;
}
if(buttonMidPressed) {
buttonMidPressed=false;
activeTimer=1;
updateDisplay=true;
}
if(turnedLeft) {
turnedLeft=false;
timerLens[activeTimer] -= 5;
updateDisplay=true;
}
if(turnedRight) {
turnedRight=false;
timerLens[activeTimer] += 5;
updateDisplay=true;
}
if(rotPressed) {
rotPressed=false;
grind(timerLens[activeTimer]);
updateDisplay=true;
}
if(updateDisplay) {
char str[16];
sprintf(str, "T%1d:%5d", activeTimer, timerLens[activeTimer]);
lcdPut(str);
updateDisplay=false;
if(EEPROMReadInt(eeAddr1) != timerLens[0])
EEPROMWriteInt(eeAddr1, timerLens[0]);
if(EEPROMReadInt(eeAddr2) != timerLens[1])
EEPROMWriteInt(eeAddr2, timerLens[1]);
if(EEPROMReadInt(eeAddr3) != timerLens[2])
EEPROMWriteInt(eeAddr3, timerLens[2]);
}
}
void setup()
{
//Serial.begin(9600);
// EEPROMWriteInt(eeAddr1, 4500);
// EEPROMWriteInt(eeAddr2, 500);
// EEPROMWriteInt(eeAddr3, 10000);
timerLens[0] = EEPROMReadInt(eeAddr1);
timerLens[1] = EEPROMReadInt(eeAddr2);
timerLens[2] = EEPROMReadInt(eeAddr3);
pinMode(A2, INPUT);
digitalWrite(A2,HIGH);
pinMode(A3, INPUT);
digitalWrite(A3,HIGH);
pinMode(A4, INPUT);
digitalWrite(A4,HIGH);
pinMode(A5, INPUT);
digitalWrite(A5,HIGH);
pinMode(2, OUTPUT);
digitalWrite(2, LOW);
lcd.clear(); lcd.home();
lcd.print("INIT");
delay(2500);
updateDisplay=true;
}