150 lines
5.4 KiB
C

/*****************************************************************************
* SenseoControl 2.0 *
* Copyright (C) 2013-2018 Stefan Kalscheuer *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation version 3. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <https://www.gnu.org/licenses/>. *
*****************************************************************************/
/**
* SenseoControl 2.0
*
* @file main.h
* @author Stefan Kalscheuer
* @date 2013-04-22
*/
/********************
* User settings:
*/
#define TIME_1_ESPRESSO 15 // Pump times in seconds.
#define TIME_2_ESPRESSO 28
#define TIME_1_COFFEE 26
#define TIME_2_COFFEE 52
#define OPERATING_TEMPERATURE 125 // ADC threshold for water temperature.
#define COFFEE_WISH 0 // Save coffee wish while heating up.
/*
********************/
// Function macros for setting and clearing bits.
#define set_bit(var, bit) ((var) |= (1 << (bit)))
#define clear_bit(var, bit) ((var) &= (unsigned)~(1 << (bit)))
#define ZERO_CROSSING_w PORTA // Zero crossing detection.
#define ZERO_CROSSING_r PINA
#define ZERO_CROSSING_pin 0
#define ZERO_CROSSING_ddr DDRA
#define ZERO_CROSSING_adc 0
#define BUTTON_1_CUP_w PORTB // Left button.
#define BUTTON_1_CUP_r PINB
#define BUTTON_1_CUP_pin 4
#define BUTTON_1_CUP_ddr DDRB
#define BUTTON_2_CUP_w PORTB // Right button.
#define BUTTON_2_CUP_r PINB
#define BUTTON_2_CUP_pin 5
#define BUTTON_2_CUP_ddr DDRB
#define BUTTON_POWER_w PORTB // Power button.
#define BUTTON_POWER_r PINB
#define BUTTON_POWER_pin 6
#define BUTTON_POWER_ddr DDRB
#define LED_RED_w PORTA // Red LED.
#define LED_RED_r PINA
#define LED_RED_pin 3
#define LED_RED_ddr DDRA
#define LED_RED_ON 0
#define LED_RED_BLINK 1
#define LED_GREEN_w PORTA // Green LED.
#define LED_GREEN_r PINA
#define LED_GREEN_pin 1
#define LED_GREEN_ddr DDRA
#define LED_GREEN_ON 2
#define LED_GREEN_BLINK 3
#define LED_BLUE_w PORTA // Blue LED.
#define LED_BLUE_r PINA
#define LED_BLUE_pin 2
#define LED_BLUE_ddr DDRA
#define LED_BLUE_ON 4
#define LED_BLUE_BLINK 5
#define SENSOR_MAGNET_w PORTA // Hall switch (water).
#define SENSOR_MAGNET_r PINA
#define SENSOR_MAGNET_pin 5
#define SENSOR_MAGNET_ddr DDRA
#define SENSOR_MAGNET_adc 4
#define WATER_LOW 30 // ADC threshold for low water.
#define WATER_OK 100 // ADC threshold for water OK.
#define SENSOR_TEMP_w PORTA // NTC (temperature)
#define SENSOR_TEMP_r PINA
#define SENSOR_TEMP_pin 4
#define SENSOR_TEMP_ddr DDRA
#define SENSOR_TEMP_adc 3
#define TRIAC_BOILER_w PORTA // Boiler triac.
#define TRIAC_BOILER_r PINA
#define TRIAC_BOILER_pin 6
#define TRIAC_BOILER_ddr DDRA
#define TRIAC_PUMP_w PORTA // Pump triac.
#define TRIAC_PUMP_r PINA
#define TRIAC_PUMP_pin 7
#define TRIAC_PUMP_ddr DDRA
#define AUTO_OFF_THRESHOLD 180 // AutoOff threshold (seconds).
#define BUTTON_CLEAN_THR 30 // Button threshold for cleaning mode (ms).
#define BUTTON_THRESHOLD 100 // Button threshold (ms).
#define BUTTON_LONG_THR 1500 // Button threshold for long time push (ms).
// Global state flags.
#define S_WATER 0
#define S_TEMP 1
#define S_CLEAN 2
#define S_ESC 3
// Coffee mode flags.
#define NO_COFFEE 0
#define ONE_ESPRESSO 1
#define TWO_ESPRESSO 2
#define ONE_COFFEE 3
#define TWO_COFFEE 4
#define IS_COFFEE(VAR) (VAR > 2)
#define IS_ESPRESSO(VAR) (VAR > 0 && VAR < 3)
// LED color flags.
#define RED 0b00000001
#define RED_BLINK 0b00000010
#define GREEN 0b00000100
#define GREEN_BLINK 0b00001000
#define BLUE 0b00010000
#define BLUE_BLINK 0b00100000
#define ORANGE 0b00000101
#define ORANGE_BLINK 0b00001010
#define VIOLET 0b00010001
#define VIOLET_BLINK 0b00100010
// Prototypes:
void init(void); // Initialization.
void power_off(void); // Power off to sleep mode.
void update_water(void); // Update water state.
void update_temperature(void); // Update temperature state.
unsigned int detect_zero_crossing(void); // Detect zero crossing.
static void process_buttons(void);
static void do_coffee(void);
static void do_clean(void);