Created
December 1, 2015 17:50
-
-
Save kopanitsa/e80d50e0b10ae7d943c5 to your computer and use it in GitHub Desktop.
arduino sample for toaster control
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <SPI.h> | |
#define PROMINI | |
#ifdef PROMINI | |
// pin number | |
#define VCC 8 | |
#define GND 9 | |
#define SLAVE 10 | |
#define RELAY 9 | |
#else | |
// pin number | |
#define VCC 8 | |
#define GND 9 | |
#define SLAVE 10 | |
#define RELAY 6 | |
#endif | |
// command | |
#define PRE_HEAT 1 | |
#define KEEP_60 2 | |
#define PRE_HEAT_160 3 | |
#define KEEP_160 4 | |
#define FINAL_HEAT 5 | |
#define FINISH 6 | |
// temperature keep condition | |
// 60C : 1min | |
// 160C : 3.5min | |
// 220C : done | |
#define KEEP_60_TIME_SEC (30) | |
#define KEEP_160_TIME_SEC (60 * 1 + 30) | |
#define KEEP_60_TEMPERATURE_MAX (59.5) | |
#define KEEP_60_TEMPERATURE_MIN (60.0) | |
#define KEEP_160_TEMPERATURE_MAX (159.5) | |
#define KEEP_160_TEMPERATURE_MIN (160.0) | |
#define FINAL_TEMPERATURE_MIN (220.0) | |
#define INVALID -1 | |
int state = PRE_HEAT; | |
unsigned long currentTime = 0; | |
unsigned long startTime = 0; | |
void setup() { | |
#ifdef GND | |
pinMode(GND, OUTPUT); | |
digitalWrite(GND, LOW); | |
#endif | |
#ifdef VCC | |
pinMode(VCC, OUTPUT); | |
digitalWrite(VCC, HIGH); | |
#endif | |
pinMode(SLAVE, OUTPUT); | |
digitalWrite(SLAVE, HIGH); | |
pinMode(RELAY, OUTPUT); | |
digitalWrite(RELAY, HIGH); | |
Serial.begin(9600); | |
SPI.begin(); | |
SPI.setBitOrder(MSBFIRST); | |
SPI.setClockDivider(SPI_CLOCK_DIV4); | |
SPI.setDataMode(SPI_MODE0); | |
} | |
void loop() { | |
int value; | |
float temp; | |
delay(1000); | |
digitalWrite(SLAVE, LOW); // Enable the chip | |
value = SPI.transfer(0x00) << 8; // Read high byte | |
value |= SPI.transfer(0x00); // Read low byte | |
digitalWrite(SLAVE, HIGH); // Disable the chip | |
if ((value & 0x0004) != 0){ | |
Serial.println("Error"); | |
temp = 1000; // fail safe | |
} else { | |
temp = ((value >> 3) * 0.25); | |
Serial.print(","); | |
Serial.println(temp); | |
} | |
// state machine | |
switch (state) { | |
case PRE_HEAT: | |
Serial.print("pre 1: "); | |
digitalWrite(RELAY, HIGH); | |
if (temp < KEEP_60_TEMPERATURE_MIN) { | |
/* do nothing; */ | |
} else { | |
// move to next state | |
state = KEEP_60; | |
currentTime = INVALID; | |
} | |
break; | |
case KEEP_60: | |
{ | |
Serial.print("keep 1: "); | |
if (temp < KEEP_60_TEMPERATURE_MIN) { | |
digitalWrite(RELAY, HIGH); | |
Serial.print(" (ON)"); | |
} else if (temp > KEEP_60_TEMPERATURE_MAX) { | |
digitalWrite(RELAY, LOW); | |
Serial.print(" (OFF)"); | |
} | |
if (currentTime == INVALID) { | |
startTime = millis(); | |
currentTime = millis(); | |
} | |
unsigned long diff = (currentTime-startTime) * 0.001; | |
if (diff < KEEP_60_TIME_SEC ) { | |
currentTime = millis(); | |
Serial.print(" time(" ); | |
Serial.print((currentTime-startTime) * 0.001); | |
Serial.print(") " ); | |
} else { | |
// move to next state | |
currentTime = INVALID; | |
state = PRE_HEAT_160; | |
} | |
} | |
break; | |
case PRE_HEAT_160: | |
Serial.print("pre heat: "); | |
digitalWrite(RELAY, HIGH); | |
if (temp < KEEP_160_TEMPERATURE_MIN) { | |
/* do nothing; */ | |
} else { | |
// move to next state | |
state = KEEP_160; | |
currentTime = INVALID; | |
} | |
break; | |
case KEEP_160: | |
{ | |
Serial.print("keep: "); | |
if (temp < KEEP_160_TEMPERATURE_MIN) { | |
digitalWrite(RELAY, HIGH); | |
Serial.print(" (ON)"); | |
} else if (temp > KEEP_160_TEMPERATURE_MAX) { | |
digitalWrite(RELAY, LOW); | |
Serial.print(" (OFF)"); | |
} | |
if (currentTime == INVALID) { | |
startTime = millis(); | |
currentTime = millis(); | |
} | |
unsigned long diff = (currentTime-startTime) * 0.001; | |
if (diff < KEEP_160_TIME_SEC ) { | |
currentTime = millis(); | |
Serial.print(" time(" ); | |
Serial.print((currentTime-startTime) * 0.001); | |
Serial.print(") " ); | |
} else { | |
// move to next state | |
currentTime = INVALID; | |
state = FINAL_HEAT; | |
} | |
} | |
break; | |
case FINAL_HEAT: | |
Serial.print("final heat: "); | |
digitalWrite(RELAY, HIGH); | |
if (temp < FINAL_TEMPERATURE_MIN) { | |
/* do nothing; */ | |
} else { | |
// move to next state | |
state = FINISH; | |
currentTime = INVALID; | |
} | |
break; | |
case FINISH: | |
Serial.print("finish: "); | |
digitalWrite(RELAY, LOW); | |
Serial.println(" **** OPEN THE DOOR ****"); | |
break; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment