/*
We need your help to stop forest fires and bake tasty cookies!
See `requirements.md` for how to help.
Then check `notes.md`.
*/
/*
Note: Ideal start: slide pot3 to middle and pot1 to extreme right and sw1 to left.
*/
#include "api.h"
uint16_t sensor_voltage; // temperature sensor value
uint16_t sensor_ref; // temperature sensor reference value
uint16_t req_sensor_read_max; // required sensor reading max (180deg)
uint16_t req_sensor_read_min; // required sensor reading min (150deg)
uint16_t door_voltage; // door sensor value
// The oven will maintain temp between 170deg and 180 deg, that is, once the oven turns off after
// reaching 180deg, it will turn on again at 170deg.
uint16_t req_temp = 180; // upper limit of the required range
uint16_t req_temp_min = 170; // lower limit of the required range
uint16_t max_temp = 300; // max temperature sensor reading
uint8_t state_oven = 0; // flag to control states of oven
uint32_t start_time; // start time of oven
void setup() {
Serial.begin(115200);
setup_api();
Serial.println("Elf oven 2000 starting up.");
serial_printf("Days without fire incident: %i\n", 0);
}
void loop() {
// Read from all sensors
SensorReadings();
// If door is closed (less than 10% of 5000) and temperature sensor reading is less than the lower limit of required range,
// set start_oven flag to 1
if(state_oven == 0 && door_voltage < 500 && sensor_voltage < req_sensor_read_max){
state_oven = 1;
}
// Start the oven if the flag is set to 1 and then change it to 2
if(state_oven == 1){
serial_printf("Start Oven\n");
serial_printf(" Gas Valve is ON\n");
serial_printf(" Igniter is ON\n");
set_output(GAS_VALVE, true);
set_output(IGNITER, true);
start_time = get_millis();
state_oven = 2;
}
// Turn off the igniter after 5 secs
if(state_oven == 2 && get_millis() - start_time >= 5000){
serial_printf("After 5 secs\n");
serial_printf(" Gas Valve is ON\n");
serial_printf(" Igniter is OFF\n");
set_output(IGNITER, false);
state_oven = 3;
}
// if the door is opened (more than 90% of 5000) or temeperature sensor reading is greater than the upper limit of the required range,
// close the Gas Valve ...
// (added after submission -> ) ... and igniter incase door is opened in the 5s duration of turning the oven on.
if(door_voltage > 4500 || sensor_voltage > req_sensor_read_max){
serial_printf("Gas Valve is OFF\n");
set_output(GAS_VALVE, false);
set_output(IGNITER, false); // added after submission
serial_printf(" Igniter is OFF\n"); // added after submission
state_oven = 0;
}
}
// This function takes readings from sensors and prints them every 10s
void SensorReadings(){
sensor_voltage = read_voltage(TEMPERATURE_SENSOR);
sensor_ref = read_voltage(TEMPERATURE_SENSOR_REFERENCE);
// Vref (5000) -> 300deg
// req_sensor_read_max <- 180deg (upper limit)
req_sensor_read_max = (sensor_ref/max_temp)*(req_temp);
// Vref (5000) -> 300deg
// req_sensor_read_max <- 170deg (lower limit)
req_sensor_read_min = (sensor_ref/max_temp)*(req_temp_min);
door_voltage = read_voltage(DOOR_SENSOR);
// Print every 10s
if(get_millis() % 10000 == 0){
serial_printf("sensor_voltage %i\n", sensor_voltage);
serial_printf("sensor_ref %i\n", sensor_ref);
serial_printf("oven temperature: %i\n", ((max_temp*sensor_voltage)/(sensor_ref)));
// serial_printf("req_sensor_read_max %i\n", req_sensor_read_max);
// serial_printf("req_sensor_read_min %i\n", req_sensor_read_min);
// serial_printf("door_voltage %i\n", door_voltage);
}
}