Skip to content

Instantly share code, notes, and snippets.

@serverwentdown
Last active April 20, 2017 16:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save serverwentdown/3b043cec2589d13024e748558a6fd4f6 to your computer and use it in GitHub Desktop.
Save serverwentdown/3b043cec2589d13024e748558a6fd4f6 to your computer and use it in GitHub Desktop.
https://www.instagram.com/p/BTHUAkggVJy/ cdtea based on github.com/achilikin/cdtea
#define PIN_MDOWN D0
#define PIN_MUP D3
#define PIN_MSPEED D1
#define MSPEED 255
#define PIN_BUTTON D4
typedef enum {
TRAY_OPEN,
TRAY_OPENING,
TRAY_CLOSE,
TRAY_CLOSING
} tray_state_type;
tray_state_type tray_state = TRAY_CLOSE;
unsigned long tray_start = 0;
#define TRAY_OPEN_TIME 1160
typedef enum {
BREW_IDLE,
BREW_STARTING,
BREW_PRESOAK,
BREW_RUNNING,
BREW_STOPPING
} brew_state_type;
brew_state_type brew_state = BREW_IDLE;
unsigned long brew_presoak_start = 0;
#define BREW_PRESOAK_TIME 10000
unsigned long brew_cycle_start = 0;
#define BREW_CYCLE_TIME 5000
typedef enum {
BUTTON_UNPRESSED,
BUTTON_PRESSING,
BUTTON_PRESSED,
BUTTON_UNPRESSING
} button_state_type;
button_state_type button_state = BUTTON_UNPRESSED;
void setup() {
pinMode(PIN_MDOWN, OUTPUT);
pinMode(PIN_MUP, OUTPUT);
pinMode(PIN_MSPEED, OUTPUT);
pinMode(PIN_BUTTON, INPUT_PULLUP);
analogWrite(PIN_MSPEED, MSPEED);
Particle.subscribe("ambrose_cdtea", event);
Particle.publish("ambrose_cdtea_ready");
// Serial.begin();
}
void loop() {
if (digitalRead(PIN_BUTTON) == LOW) {
if (button_state == BUTTON_UNPRESSED) {
button_state = BUTTON_PRESSING;
}
} else {
if (button_state == BUTTON_PRESSED) {
//button_state = BUTTON_UNPRESSING;
button_state = BUTTON_UNPRESSED;
}
}
if (brew_state == BREW_STARTING) {
if (tray_state == TRAY_CLOSE) {
Particle.publish("ambrose_cdtea_tray_opening");
tray_state = TRAY_OPENING;
}
if (button_state == BUTTON_PRESSING) {
button_state = BUTTON_PRESSED;
brew_state = BREW_PRESOAK;
Particle.publish("ambrose_cdtea_presoak");
}
} else if (brew_state == BREW_PRESOAK) {
if (tray_state == TRAY_OPEN) {
tray_state = TRAY_CLOSING;
} else if (tray_state == TRAY_CLOSE) {
if (millis() - brew_presoak_start >= BREW_PRESOAK_TIME) {
brew_state = BREW_RUNNING;
Particle.publish("ambrose_cdtea_running");
}
}
} else if (brew_state == BREW_RUNNING) {
if (tray_state == TRAY_CLOSE) {
if (millis() - brew_cycle_start >= BREW_CYCLE_TIME) {
tray_state = TRAY_OPENING;
Particle.publish("ambrose_cdtea_tray_opening");
}
} else {
brew_cycle_start = millis();
}
if (tray_state == TRAY_OPEN) {
tray_state = TRAY_CLOSING;
Particle.publish("ambrose_cdtea_tray_closing");
}
} else if (brew_state == BREW_STOPPING) {
if (tray_state == TRAY_CLOSE) {
Particle.publish("ambrose_cdtea_tray_opening");
tray_state = TRAY_OPENING;
}
if (button_state == BUTTON_PRESSING) {
button_state = BUTTON_PRESSED;
tray_state = TRAY_CLOSING;
brew_state = BREW_IDLE;
Particle.publish("ambrose_cdtea_idle");
}
}
if (brew_state != BREW_PRESOAK) {
brew_presoak_start = millis();
}
if (tray_state == TRAY_OPENING) {
digitalWrite(PIN_MUP, HIGH);
digitalWrite(PIN_MDOWN, LOW);
if (millis() - tray_start >= TRAY_OPEN_TIME) {
tray_state = TRAY_OPEN;
digitalWrite(PIN_MUP, LOW);
digitalWrite(PIN_MDOWN, LOW);
}
} else if (tray_state == TRAY_CLOSING) {
digitalWrite(PIN_MUP, LOW);
digitalWrite(PIN_MDOWN, HIGH);
if (millis() - tray_start >= TRAY_OPEN_TIME) {
tray_state = TRAY_CLOSE;
digitalWrite(PIN_MUP, LOW);
digitalWrite(PIN_MDOWN, LOW);
}
}
if (tray_state != TRAY_CLOSING && tray_state != TRAY_OPENING) {
tray_start = millis();
}
}
void event(const char *event, const char *data) {
if (data[0] == 's') {
brew_state = BREW_STARTING;
Particle.publish("ambrose_cdtea_starting");
} else if (data[0] == 'x') {
brew_state = BREW_STOPPING;
Particle.publish("ambrose_cdtea_stopping");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment