From ef396e545430c45bcb924242211f61cab4088439 Mon Sep 17 00:00:00 2001 From: Stefan Kalscheuer Date: Sat, 22 Nov 2014 15:57:15 +0000 Subject: [PATCH] Code reformatted Constants for pump times in main.h (more readable code, easier to adjust) --- main.c | 578 +++++++++++++++++++++++++++++++-------------------------- main.h | 159 ++++++++-------- 2 files changed, 394 insertions(+), 343 deletions(-) diff --git a/main.c b/main.c index 00b5581..09de323 100644 --- a/main.c +++ b/main.c @@ -1,16 +1,16 @@ /** SenseoControl 2.0 - * - * File: main.c - * Author: Stefan Kalscheuer - * Date: 22.04.2013 - * Comments: Main program - * Previous project by Paul Wilhelm (2009) - http://mosfetkiller.de/?s=kaffeecontroller - * - * Platform: ATtiny26 - * Internal RC-oscillator 8 MHz, CKDIV8 Enabled - * - * License: GNU GPL v3 (see License.txt) - */ + * + * File: main.c + * Author: Stefan Kalscheuer + * Date: 22.04.2013 + * Comments: Main program + * Previous project by Paul Wilhelm (2009) - http://mosfetkiller.de/?s=kaffeecontroller + * + * Platform: ATtiny26 + * Internal RC-oscillator 8 MHz, CKDIV8 Enabled + * + * License: GNU GPL v3 (see License.txt) + */ #define F_CPU 1000000UL @@ -21,349 +21,391 @@ #include #include "main.h" -// variables -volatile unsigned int time_counter, user_time_counter = 0, sec_counter = 0; // global and universal time counter (ms) and second-counter (for AutoOff) -volatile unsigned int button_1_cup_counter = 0, button_2_cup_counter = 0; // button counter + // variables: +volatile unsigned int time_counter, user_time_counter = 0, sec_counter = 0; // global and universal time counter (ms) and second-counter (for AutoOff) +volatile unsigned int button_1_cup_counter = 0, button_2_cup_counter = 0; // button counter volatile unsigned char button_power_counter = 0; -volatile unsigned char led = 0; // LED status flags -volatile bool water = false, temperature = false, make_clean = false; // water-, temperature-, clean-flags -volatile unsigned char make_coffee = 0, pump_time = 0; // pump time, clean mode flag +volatile unsigned char led = 0; // LED status flags +volatile bool water = false, temperature = false, make_clean = false; // water-, temperature-, clean-flags +volatile unsigned char make_coffee = 0, pump_time = 0; // pump time, clean mode flag -int main(void) +int main (void) { - init(); // initialization - power_off(); // power off after init sequece + init (); // initialization + power_off (); // power off after init sequece - while (1) // main loop - { - if (sec_counter >= AUTO_OFF_THRESHOLD) button_power_counter = BUTTON_THRESHOLD; // check for AutoOff Timer (generate OnOff-button push) + while (1) // main loop + { + if (sec_counter >= AUTO_OFF_THRESHOLD) + button_power_counter = BUTTON_THRESHOLD; // check for AutoOff Timer (generate OnOff-button push) - water = get_water(); // update water state - temperature = get_temperature(); // update temperature + water = get_water (); // update water state + temperature = get_temperature (); // update temperature - if (button_power_counter >= BUTTON_THRESHOLD) // button "OnOff" pushed: - { - set_bit(TRIAC_BOILER_w, TRIAC_BOILER_pin); // Boiler off - make_coffee = 0; // clear coffee flag + if (button_power_counter >= BUTTON_THRESHOLD) // button "OnOff" pushed: + { + set_bit(TRIAC_BOILER_w, TRIAC_BOILER_pin); // Boiler off + make_coffee = 0; // clear coffee flag - while (button_power_counter > 0); // wait until button is releasd (debounce) + while (button_power_counter > 0) + ; // wait until button is releasd (debounce) - power_off(); // call power off sequence + power_off (); // call power off sequence - button_power_counter = BUTTON_THRESHOLD; // debounce again after wake up - while (button_power_counter > 0); - } + button_power_counter = BUTTON_THRESHOLD; // debounce again after wake up + while (button_power_counter > 0) + ; + } + if (button_1_cup_counter >= BUTTON_CLEAN_THR + && button_2_cup_counter >= BUTTON_CLEAN_THR) // both coffee buttons pushed: clean mode: + { + make_clean = true; // clean flag true + led = 0b00010000; // set blue LED + while (button_1_cup_counter > 0 && button_2_cup_counter > 0) + ; // debounce buttons + } - if (button_1_cup_counter >= BUTTON_CLEAN_THR && button_2_cup_counter >= BUTTON_CLEAN_THR ) // both coffee buttons pushed: clean mode: - { - make_clean = true; // clean flag true - led = 0b00010000; // set blue LED - while (button_1_cup_counter > 0 && button_2_cup_counter > 0); // debounce buttons - } + else if (button_1_cup_counter >= BUTTON_THRESHOLD + && button_2_cup_counter < BUTTON_THRESHOLD) // left coffee button pushed: call espresso + { + sec_counter = 0; // reset AutoOff counter - else if (button_1_cup_counter >= BUTTON_THRESHOLD && button_2_cup_counter < BUTTON_THRESHOLD) // left coffee button pushed: call espresso - { - sec_counter = 0; // reset AutoOff counter + if (water && temperature) // machine ready: + { + while (button_1_cup_counter > 0) // check if button is pushed long time + { + if (button_1_cup_counter > BUTTON_LONG_THR) // button pushed for a long time: + { + make_coffee = 1; // set coffee flag to 1 (1 espresso) + button_1_cup_counter = 0; // clear button counter + } + } + if (make_coffee != 1) + make_coffee = 3; // set coffee flag to 3 (1 coffee) else + } + } - if (water && temperature) // machine ready: - { - while(button_1_cup_counter > 0) // check if button is pushed long time - { - if(button_1_cup_counter > BUTTON_LONG_THR) // button pushed for a long time: - { - make_coffee = 1; // set coffee flag to 1 (1 espresso) - button_1_cup_counter = 0; // clear button counter - } - } - if(make_coffee != 1) make_coffee = 3; // set coffee flag to 3 (1 coffee) else - } - } + else if (button_1_cup_counter < BUTTON_THRESHOLD + && button_2_cup_counter >= BUTTON_THRESHOLD) // right coffee button pushed: call coffee + { + sec_counter = 0; // reset AutoOff counter + if (water && temperature) // machine ready: + { + while (button_2_cup_counter > 0) // check if button is pushed long time + { + if (button_2_cup_counter > BUTTON_LONG_THR) // button pushed for a long time: + { + make_coffee = 2; // set coffee flag to 2 (2 espresso) + button_2_cup_counter = 0; // clear button counter + } + } + if (make_coffee != 2) + make_coffee = 4; // set coffee flag to 4 (2 coffee) else + } + } - else if (button_1_cup_counter < BUTTON_THRESHOLD && button_2_cup_counter >= BUTTON_THRESHOLD) // right coffee button pushed: call coffee - { - sec_counter = 0; // reset AutoOff counter + if (water) // water OK: + { + if (make_clean) // if clean-flag is set: + { + set_bit(TRIAC_BOILER_w, TRIAC_BOILER_pin); // boiler off + bool escape = false; // init escape-flag + while (water && !escape) + { // pump until water is empty or escape flag is set - if (water && temperature) // machine ready: - { - while(button_2_cup_counter > 0) // check if button is pushed long time - { - if(button_2_cup_counter > BUTTON_LONG_THR) // button pushed for a long time: - { - make_coffee = 2; // set coffee flag to 2 (2 espresso) - button_2_cup_counter = 0; // clear button counter - } - } - if(make_coffee != 2) make_coffee = 4; // set coffee flag to 4 (2 coffee) else - } - } + unsigned int sense = detect_zero_crossing (); // detect zero crossing + if (sense <= 100) + { + clear_bit(TRIAC_PUMP_w, TRIAC_PUMP_pin); // generate trigger impulse for pump triac + _delay_ms (3); + set_bit(TRIAC_PUMP_w, TRIAC_PUMP_pin); + } + water = get_water (); // update water state + if (button_power_counter > BUTTON_THRESHOLD) + escape = true; // check for power button counter and set escape flag + } + make_clean = false; // clear clean flag + } - if (water) // water OK: - { - if(make_clean) // if clean-flag is set: - { - set_bit(TRIAC_BOILER_w, TRIAC_BOILER_pin); // boiler off - bool escape = false; // init escape-flag - while (water && !escape) { // pump until water is empty or escape flag is set + else if (temperature) // temperature OK: + { + set_bit(TRIAC_BOILER_w, TRIAC_BOILER_pin); // boiler off - unsigned int sense = detect_zero_crossing(); // detect zero crossing - if (sense <= 100) { - clear_bit(TRIAC_PUMP_w, TRIAC_PUMP_pin); // generate trigger impulse for pump triac - _delay_ms(3); - set_bit(TRIAC_PUMP_w, TRIAC_PUMP_pin); - } - water = get_water(); // update water state + led = 0b00000100; // set green LED - if (button_power_counter > BUTTON_THRESHOLD) escape = true; // check for power button counter and set escape flag - } - make_clean = false; // clear clean flag - } + if (make_coffee > 0) // if coffee flag is set: + { + if (make_coffee < 3) + led = 0b00001010; // set orange LED blink + else + led = 0b00001000; // set green LED blink - else if (temperature) // temperature OK: - { - set_bit(TRIAC_BOILER_w, TRIAC_BOILER_pin); // boiler off + if (make_coffee == 1) + pump_time = TIME_1_ESPRESSO; // 1 cup of espresso (2s preinfusion included) + else if (make_coffee == 2) + pump_time = TIME_2_ESPRESSO; // 2 cups of espresso (2s preinfusion included) + else if (make_coffee == 3) + pump_time = TIME_1_COFFEE; // 1 cup of coffee + else if (make_coffee == 4) + pump_time = TIME_2_COFFEE; // 2 cups of coffee + else + make_coffee = 0; - led = 0b00000100; // set green LED + user_time_counter = 0; // reset user time counter + bool escape = false; // init escape flag + while (user_time_counter < (pump_time * 1000) && water && !escape) + { // loop until pump time is reached or water is empty + if (make_coffee > 2 + || (user_time_counter < 2000 || user_time_counter > 4000)) + { // check for preinfusion break + unsigned int sense = detect_zero_crossing (); // detect zero crossing + if (sense <= 100) + { + clear_bit(TRIAC_PUMP_w, TRIAC_PUMP_pin); // generate trigger impulse for pump triac + _delay_ms (3); + set_bit(TRIAC_PUMP_w, TRIAC_PUMP_pin); + } + } - if (make_coffee > 0) // if coffee flag is set: - { - if(make_coffee<3) led = 0b00001010; // set orange LED blink - else led = 0b00001000; // set green LED blink + water = get_water (); // update water state - if (make_coffee == 1) pump_time = 15; // 1 cup of espresso (2s preinfusion included) - else if (make_coffee == 2) pump_time = 28; // 2 cups of espresso (2s preinfusion included) - else if (make_coffee == 3) pump_time = 26; // 1 cup of coffee - else if (make_coffee == 4) pump_time = 52; // 2 cups of coffee - else make_coffee = 0; + if (button_power_counter > BUTTON_THRESHOLD) + escape = true; // check for power button counter and set escape flag + } - user_time_counter = 0; // reset user time counter - bool escape = false; // init escape flag - while (user_time_counter < (pump_time * 1000) && water && !escape) // loop until pump time is reached or water is empty - { - if(make_coffee > 2 || - (user_time_counter < 2000 || user_time_counter > 4000) ) { // check for preinfusion break - unsigned int sense = detect_zero_crossing(); // detect zero crossing - if (sense <= 100) - { - clear_bit(TRIAC_PUMP_w, TRIAC_PUMP_pin); // generate trigger impulse for pump triac - _delay_ms(3); - set_bit(TRIAC_PUMP_w, TRIAC_PUMP_pin); - } - } + set_bit(TRIAC_PUMP_w, TRIAC_PUMP_pin); // pump off - water = get_water(); // update water state + make_coffee = 0; // clear coffee flag - if (button_power_counter > BUTTON_THRESHOLD) escape = true; // check for power button counter and set escape flag - } + sec_counter = 0; // reset AutoOff timer + } + } + else // temperature too low: + { + clear_bit(TRIAC_BOILER_w, TRIAC_BOILER_pin); // boiler on + led = 0b00000010; // set red LED blink + } + } + else // water too low: + { + set_bit(TRIAC_BOILER_w, TRIAC_BOILER_pin); // boiler off + set_bit(TRIAC_PUMP_w, TRIAC_PUMP_pin); // pump off - set_bit(TRIAC_PUMP_w, TRIAC_PUMP_pin); // pump off + led = 0b00100000; // set blue LED blink + } - make_coffee = 0; // clear coffee flag - - sec_counter = 0; // reset AutoOff timer - } - } - else // temperature too low: - { - clear_bit(TRIAC_BOILER_w, TRIAC_BOILER_pin); // boiler on - led = 0b00000010; // set red LED blink - } - } - else // water too low: - { - set_bit(TRIAC_BOILER_w, TRIAC_BOILER_pin); // boiler off - set_bit(TRIAC_PUMP_w, TRIAC_PUMP_pin); // pump off - - led = 0b00100000; // set blue LED blink - } - - } + } } -/* function: init() - * return: void +/* function: init() + * return: void * * Initializes relevant bits, timer and ADC. */ -void init() +void init () { - clear_bit(ZERO_CROSSING_ddr, ZERO_CROSSING_pin); // zero crossing dection pins as input - clear_bit(ZERO_CROSSING_w, ZERO_CROSSING_pin); // no internal pull-up (for ADC) + clear_bit(ZERO_CROSSING_ddr, ZERO_CROSSING_pin); // zero crossing dection pins as input + clear_bit(ZERO_CROSSING_w, ZERO_CROSSING_pin); // no internal pull-up (for ADC) - clear_bit(BUTTON_1_CUP_ddr, BUTTON_1_CUP_pin); // button pins as input - set_bit(BUTTON_1_CUP_w, BUTTON_1_CUP_pin); // activate internal pull-ups - clear_bit(BUTTON_2_CUP_ddr, BUTTON_2_CUP_pin); - set_bit(BUTTON_2_CUP_w, BUTTON_2_CUP_pin); - clear_bit(BUTTON_POWER_ddr, BUTTON_POWER_pin); - set_bit(BUTTON_POWER_w, BUTTON_POWER_pin); + clear_bit(BUTTON_1_CUP_ddr, BUTTON_1_CUP_pin); // button pins as input + set_bit(BUTTON_1_CUP_w, BUTTON_1_CUP_pin); // activate internal pull-ups + clear_bit(BUTTON_2_CUP_ddr, BUTTON_2_CUP_pin); + set_bit(BUTTON_2_CUP_w, BUTTON_2_CUP_pin); + clear_bit(BUTTON_POWER_ddr, BUTTON_POWER_pin); + set_bit(BUTTON_POWER_w, BUTTON_POWER_pin); - set_bit(LED_RED_ddr, LED_RED_pin); // LED pins as output - clear_bit(LED_RED_w, LED_RED_pin); // clear outputs (LEDs off) - set_bit(LED_GREEN_ddr, LED_GREEN_pin); - clear_bit(LED_GREEN_w, LED_GREEN_pin); - set_bit(LED_BLUE_ddr, LED_BLUE_pin); - clear_bit(LED_BLUE_w, LED_BLUE_pin); + set_bit(LED_RED_ddr, LED_RED_pin); // LED pins as output + clear_bit(LED_RED_w, LED_RED_pin); // clear outputs (LEDs off) + set_bit(LED_GREEN_ddr, LED_GREEN_pin); + clear_bit(LED_GREEN_w, LED_GREEN_pin); + set_bit(LED_BLUE_ddr, LED_BLUE_pin); + clear_bit(LED_BLUE_w, LED_BLUE_pin); - clear_bit(SENSOR_MAGNET_ddr, SENSOR_MAGNET_pin); // sensor pins as input - clear_bit(SENSOR_MAGNET_w, SENSOR_MAGNET_pin); // no internal pull-up (for ADC) - clear_bit(SENSOR_TEMP_ddr, SENSOR_TEMP_pin); - clear_bit(SENSOR_TEMP_w, SENSOR_TEMP_pin); + clear_bit(SENSOR_MAGNET_ddr, SENSOR_MAGNET_pin); // sensor pins as input + clear_bit(SENSOR_MAGNET_w, SENSOR_MAGNET_pin); // no internal pull-up (for ADC) + clear_bit(SENSOR_TEMP_ddr, SENSOR_TEMP_pin); + clear_bit(SENSOR_TEMP_w, SENSOR_TEMP_pin); - set_bit(TRIAC_BOILER_ddr, TRIAC_BOILER_pin); // triac pins as output - set_bit(TRIAC_BOILER_w, TRIAC_BOILER_pin); // set outputs high (triac off) - set_bit(TRIAC_PUMP_ddr, TRIAC_PUMP_pin); - set_bit(TRIAC_PUMP_w, TRIAC_PUMP_pin); + set_bit(TRIAC_BOILER_ddr, TRIAC_BOILER_pin); // triac pins as output + set_bit(TRIAC_BOILER_w, TRIAC_BOILER_pin); // set outputs high (triac off) + set_bit(TRIAC_PUMP_ddr, TRIAC_PUMP_pin); + set_bit(TRIAC_PUMP_w, TRIAC_PUMP_pin); - ADCSR = (1 << ADEN) | (1 << ADPS1); // enable ADC, prescaler division factor 4 + ADCSR = (1 << ADEN) | (1 << ADPS1); // enable ADC, prescaler division factor 4 - // TIMER1 - set_bit(TCCR1B, CTC1); // set timer 1 to CTC-Mode - clear_bit(TCCR1B, CS11); // prescaler 8 - set_bit(TCCR1B, CS12); - clear_bit(TCCR1B, CS11); - clear_bit(TCCR1B, CS10); - OCR1C = 124; // period of 1 ms + // TIMER1 + set_bit(TCCR1B, CTC1); // set timer 1 to CTC-Mode + clear_bit(TCCR1B, CS11); // prescaler 8 + set_bit(TCCR1B, CS12); + clear_bit(TCCR1B, CS11); + clear_bit(TCCR1B, CS10); + OCR1C = 124; // period of 1 ms - cli(); // disable interrupts + cli (); // disable interrupts - clear_bit(GIMSK, INT0); // disable interrupt 0 + clear_bit(GIMSK, INT0); // disable interrupt 0 - set_bit(TIMSK, TOIE1); // activate timer 1 + set_bit(TIMSK, TOIE1); // activate timer 1 - sei(); // enable interrupts + sei (); // enable interrupts } -/* function: power_off() - * return: void +/* function: power_off() + * return: void * * Clear bits and set controller to sleep mode. */ -void power_off() +void power_off () { - cli(); // disable interrupts - set_bit(GIMSK, INT0); // activate interrupt 0 (for wake-up) - clear_bit(TIMSK, TOIE1); // deactivate timer 1 - sei(); // enable interrupts + cli (); // disable interrupts + set_bit(GIMSK, INT0); // activate interrupt 0 (for wake-up) + clear_bit(TIMSK, TOIE1); // deactivate timer 1 + sei (); // enable interrupts - clear_bit(LED_RED_w, LED_RED_pin); // clear LED outputs - clear_bit(LED_GREEN_w, LED_GREEN_pin); - clear_bit(LED_BLUE_w, LED_BLUE_pin); + clear_bit(LED_RED_w, LED_RED_pin); // clear LED outputs + clear_bit(LED_GREEN_w, LED_GREEN_pin); + clear_bit(LED_BLUE_w, LED_BLUE_pin); - set_bit(MCUCR, SM1); // activate power-down mode - clear_bit(MCUCR, SM0); - set_bit(MCUCR, SE); - asm volatile("sleep"::); + set_bit(MCUCR, SM1); // activate power-down mode + clear_bit(MCUCR, SM0); + set_bit(MCUCR, SE); + asm volatile("sleep"::); - // entrance after wake-up: - time_counter = 0; // reset counter - sec_counter = 0; - cli(); // disable interrupts - clear_bit(GIMSK, INT0); // disable interrupt 0 - set_bit(TIMSK, TOIE1); // enable timer 1 - sei(); // enable interrupts + // entrance after wake-up: + time_counter = 0; // reset counter + sec_counter = 0; + cli (); // disable interrupts + clear_bit(GIMSK, INT0); // disable interrupt 0 + set_bit(TIMSK, TOIE1); // enable timer 1 + sei (); // enable interrupts } - -/* function: get_water() - * return: true water OK - * false not enough water +/* function: get_water() + * return: true water OK + * false not enough water * * Checks hall sensor for water state. */ -bool get_water() +bool get_water () { - ADMUX = SENSOR_MAGNET_adc | (1 << ADLAR); // ADLAR - set_bit(ADCSR, ADSC); - loop_until_bit_is_clear(ADCSR, ADSC); - unsigned char sense = ADCH; - if ((water && sense > WATER_LOW) || (!water && sense >= WATER_OK)) return true; - return false; + ADMUX = SENSOR_MAGNET_adc | (1 << ADLAR); // ADLAR + set_bit(ADCSR, ADSC); + loop_until_bit_is_clear (ADCSR, ADSC); + unsigned char sense = ADCH; + if ((water && sense > WATER_LOW) || (!water && sense >= WATER_OK)) + return true; + return false; } -/* function: get_temperature() - * return: true temperature OK - * false temperature too low +/* function: get_temperature() + * return: true temperature OK + * false temperature too low * * Checks NTC sensor for temperature state. */ -bool get_temperature() +bool get_temperature () { - ADMUX = SENSOR_TEMP_adc | (1 << ADLAR); // ADLAR - set_bit(ADCSR, ADSC); - loop_until_bit_is_clear(ADCSR, ADSC); - unsigned char sense = ADCH; - if (sense >= OPERATING_TEMPERATURE) return true; - return false; + ADMUX = SENSOR_TEMP_adc | (1 << ADLAR); // ADLAR + set_bit(ADCSR, ADSC); + loop_until_bit_is_clear (ADCSR, ADSC); + unsigned char sense = ADCH; + if (sense >= OPERATING_TEMPERATURE) + return true; + return false; } -/* function: detect_zero_crossing() - * return: unsigned int ADC value +/* function: detect_zero_crossing() + * return: unsigned int ADC value * * Checks for zero crossing (with fixed offset) */ -unsigned int detect_zero_crossing() +unsigned int detect_zero_crossing () { - ADMUX = ZERO_CROSSING_adc; - set_bit(ADCSR, ADSC); - loop_until_bit_is_clear(ADCSR, ADSC); - unsigned char sense_L = ADCL; - unsigned char sense_H = ADCH; - return (sense_H << 8) | sense_L; + ADMUX = ZERO_CROSSING_adc; + set_bit(ADCSR, ADSC); + loop_until_bit_is_clear (ADCSR, ADSC); + unsigned char sense_L = ADCL; + unsigned char sense_H = ADCH; + return (sense_H << 8) | sense_L; } - - -/* interrupt function: INT0_vect +/* interrupt function: INT0_vect * * Dummy function for wake-up. */ -ISR(INT0_vect) +ISR ( INT0_vect) { } - -/* interrupt function: TIMER1_OVF1_vect +/* interrupt function: TIMER1_OVF1_vect * * Timer interrupt. Increments counters and controls LED. */ -// Millisekundenzähler, LED-Steuerung, Tastenzähler -ISR(TIMER1_OVF1_vect) +ISR ( TIMER1_OVF1_vect) { - if (time_counter < 1000) time_counter++; // blobal milliseconds counter und seconds counter (für AutoOff) - else { - time_counter = 0; - sec_counter++; - } - user_time_counter++; // universal counter (for pump time) + if (time_counter < 1000) + time_counter++; // global milliseconds counter and seconds counter (for AutoOff) + else + { + time_counter = 0; + sec_counter++; + } + user_time_counter++; // universal counter (for pump time) - bool leds_blink_on; // status flag for blinking LEDs with 1Hz - if (time_counter < 499) leds_blink_on = true; - else leds_blink_on = false; + bool leds_blink_on; // status flag for blinking LEDs with 1Hz + if (time_counter < 499) + leds_blink_on = true; + else + leds_blink_on = false; - if (led & ( 1 << LED_RED_ON ) || (led & ( 1 << LED_RED_BLINK ) && leds_blink_on)) set_bit(LED_RED_w, LED_RED_pin); - else clear_bit(LED_RED_w, LED_RED_pin); - if (led & ( 1 << LED_GREEN_ON ) || (led & ( 1 << LED_GREEN_BLINK ) && leds_blink_on)) set_bit(LED_GREEN_w, LED_GREEN_pin); - else clear_bit(LED_GREEN_w, LED_GREEN_pin); - if (led & ( 1 << LED_BLUE_ON ) || (led & ( 1 << LED_BLUE_BLINK ) && leds_blink_on)) set_bit(LED_BLUE_w, LED_BLUE_pin); - else clear_bit(LED_BLUE_w, LED_BLUE_pin); + if (led & (1 << LED_RED_ON) || (led & (1 << LED_RED_BLINK) && leds_blink_on)) + set_bit(LED_RED_w, LED_RED_pin); + else + clear_bit(LED_RED_w, LED_RED_pin); + if (led & (1 << LED_GREEN_ON) + || (led & (1 << LED_GREEN_BLINK) && leds_blink_on)) + set_bit(LED_GREEN_w, LED_GREEN_pin); + else + clear_bit(LED_GREEN_w, LED_GREEN_pin); + if (led & (1 << LED_BLUE_ON) + || (led & (1 << LED_BLUE_BLINK) && leds_blink_on)) + set_bit(LED_BLUE_w, LED_BLUE_pin); + else + clear_bit(LED_BLUE_w, LED_BLUE_pin); - if (bit_is_clear(BUTTON_1_CUP_r, BUTTON_1_CUP_pin)) { // left button counter - if (button_1_cup_counter < 65535) button_1_cup_counter++; - } else { - if (button_1_cup_counter > 0) button_1_cup_counter--; - } + if (bit_is_clear (BUTTON_1_CUP_r, BUTTON_1_CUP_pin)) + { // left button counter + if (button_1_cup_counter < 65535) + button_1_cup_counter++; + } + else + { + if (button_1_cup_counter > 0) + button_1_cup_counter--; + } - if (bit_is_clear(BUTTON_2_CUP_r, BUTTON_2_CUP_pin)) { // right button counter - if (button_2_cup_counter < 65535) button_2_cup_counter++; - } else { - if (button_2_cup_counter > 0) button_2_cup_counter--; - } + if (bit_is_clear (BUTTON_2_CUP_r, BUTTON_2_CUP_pin)) + { // right button counter + if (button_2_cup_counter < 65535) + button_2_cup_counter++; + } + else + { + if (button_2_cup_counter > 0) + button_2_cup_counter--; + } - if (bit_is_clear(BUTTON_POWER_r, BUTTON_POWER_pin)) { // power button counter - if (button_power_counter < 255) button_power_counter++; - } else { - if (button_power_counter > 0) button_power_counter--; - } + if (bit_is_clear (BUTTON_POWER_r, BUTTON_POWER_pin)) + { // power button counter + if (button_power_counter < 255) + button_power_counter++; + } + else + { + if (button_power_counter > 0) + button_power_counter--; + } } diff --git a/main.h b/main.h index 554fea1..f7b1ab6 100644 --- a/main.h +++ b/main.h @@ -1,94 +1,103 @@ /** SenseoControl 2.0 - * - * File: main.h - * Author: Stefan Kalscheuer - * Date: 22.04.2013 - * - * License: GNU GPL v3 (see License.txt) - */ + * + * File: main.h + * Author: Stefan Kalscheuer + * Date: 22.04.2013 + * + * License: GNU GPL v3 (see License.txt) + */ + +/******************* + * 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 +/* + ******************* + */ // functions 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 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_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_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 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_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_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 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 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 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 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 OPERATING_TEMPERATURE 115 // ADC threshold for water temperature +#define TRIAC_PUMP_w PORTA // pump triac +#define TRIAC_PUMP_r PINA +#define TRIAC_PUMP_pin 7 +#define TRIAC_PUMP_ddr DDRA -#define TRIAC_BOILER_w PORTA // boiler triac -#define TRIAC_BOILER_r PINA -#define TRIAC_BOILER_pin 6 -#define TRIAC_BOILER_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) -#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) - - // prototypes: -void init(); // initialization -void power_off(); // power off to sleep mode -bool get_water(); // update water state -bool get_temperature(); // update tehmerature state -unsigned int detect_zero_crossing(); // detect zero crossing + // prototypes: +void init (); // initialization +void power_off (); // power off to sleep mode +bool get_water (); // update water state +bool get_temperature (); // update tehmerature state +unsigned int detect_zero_crossing (); // detect zero crossing