Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@kopanitsa
Created December 1, 2015 17:50
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 kopanitsa/e80d50e0b10ae7d943c5 to your computer and use it in GitHub Desktop.
Save kopanitsa/e80d50e0b10ae7d943c5 to your computer and use it in GitHub Desktop.
arduino sample for toaster control
#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