diff --git a/Firmware/Makefile b/Firmware/Makefile index bdaa43f..32a56b1 100644 --- a/Firmware/Makefile +++ b/Firmware/Makefile @@ -36,7 +36,7 @@ AVRDUDE = avrdude REMOVE = rm -f # Some C flags -CFLAGS = -Wall -O3 +CFLAGS = -Wall -Os help: @echo diff --git a/Firmware/main.c b/Firmware/main.c index 0632e1b..5699aac 100644 --- a/Firmware/main.c +++ b/Firmware/main.c @@ -18,16 +18,16 @@ #include #include #include -#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 -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 + // variables: +volatile uint16_t ms_counter = 0; // global and universal time counter (ms) and second-counter (for AutoOff) +volatile uint8_t sec_counter = 0; +volatile uint16_t button_1_cup_counter = 0, button_2_cup_counter = 0; // button counter +volatile uint8_t button_power_counter = 0; +volatile uint8_t led = 0; // LED status flags +volatile uint8_t flags = 0; // Flags: * * * * esc clean temperature water +volatile uint8_t make_coffee = 0, pump_time = 0; // pump time, clean mode flag int main (void) { @@ -39,8 +39,8 @@ int main (void) 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 + get_water (); // update water state + get_temperature (); // update temperature if (button_power_counter >= BUTTON_THRESHOLD) // button "OnOff" pushed: { @@ -60,7 +60,7 @@ int main (void) 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 + set_bit(flags, FLAG_CLEAN); // clean flag true led = BLUE; // set blue LED while (button_1_cup_counter > 0 && button_2_cup_counter > 0) ; // debounce buttons @@ -71,7 +71,7 @@ int main (void) { sec_counter = 0; // reset AutoOff counter - if (water && temperature) // machine ready: + if ((flags & 0b00000011) == 3) // machine ready: { while (button_1_cup_counter > 0) // check if button is pushed long time { @@ -94,7 +94,7 @@ int main (void) { sec_counter = 0; // reset AutoOff counter - if (water && temperature) // machine ready: + if ((flags & 0b00000011) == 3) // machine ready: { while (button_2_cup_counter > 0) // check if button is pushed long time { @@ -112,15 +112,15 @@ int main (void) } } - if (water) // water OK: + if (bit_is_set(flags, FLAG_WATER)) // water OK: { - if (make_clean) // if clean-flag is set: + if (bit_is_set(flags, FLAG_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 + clear_bit(flags, FLAG_ESC); // clear escape flag + while (bit_is_set(flags, FLAG_WATER) && bit_is_clear(flags, FLAG_ESC)) + { // pump until water is empty or escape flag is set unsigned int sense = detect_zero_crossing (); // detect zero crossing if (sense <= 100) { @@ -128,18 +128,17 @@ int main (void) _delay_ms (3); set_bit(TRIAC_PUMP_w, TRIAC_PUMP_pin); } - water = get_water (); // update water state + get_water (); // update water state if (button_power_counter > BUTTON_THRESHOLD) - escape = true; // check for power button counter and set escape flag + set_bit(flags, FLAG_ESC); // check for power button counter and set escape flag } - make_clean = false; // clear clean flag + clear_bit(flags, FLAG_CLEAN); // clear clean flag } - else if (temperature) // temperature OK: + else if (bit_is_set(flags, FLAG_TEMPERATURE)) // temperature OK: { set_bit(TRIAC_BOILER_w, TRIAC_BOILER_pin); // boiler off - led = GREEN; // set green LED if (make_coffee > 0) // if coffee flag is set: @@ -160,12 +159,13 @@ int main (void) else make_coffee = 0; - user_time_counter = 0; // reset user time counter - bool escape = false; // init escape flag - while (user_time_counter < (pump_time * 1000) && water && !escape) + sec_counter = 0; // reset user time counter + clear_bit(flags, FLAG_ESC); // clear escape flag + + while (sec_counter < pump_time && bit_is_set(flags, FLAG_WATER) && bit_is_clear(flags, FLAG_ESC)) { // loop until pump time is reached or water is empty if (make_coffee > 2 - || (user_time_counter < 2000 || user_time_counter > 4000)) + || (sec_counter < 2 || sec_counter > 4)) { // check for preinfusion break unsigned int sense = detect_zero_crossing (); // detect zero crossing if (sense <= 100) @@ -176,16 +176,15 @@ int main (void) } } - water = get_water (); // update water state + get_water (); // update water state if (button_power_counter > BUTTON_THRESHOLD) - escape = true; // check for power button counter and set escape flag + set_bit(flags, FLAG_ESC); // check for power button counter and set escape flag } set_bit(TRIAC_PUMP_w, TRIAC_PUMP_pin); // pump off - + clear_bit(flags, FLAG_CLEAN); // clear clean flag make_coffee = 0; // clear coffee flag - sec_counter = 0; // reset AutoOff timer } } @@ -284,7 +283,7 @@ void power_off () asm volatile("sleep"::); // entrance after wake-up: - time_counter = 0; // reset counter + ms_counter = 0; // reset counter sec_counter = 0; cli (); // disable interrupts clear_bit(GIMSK, INT0); // disable interrupt 0 @@ -293,37 +292,35 @@ void power_off () } /* function: get_water() - * return: true water OK - * false not enough water * * Checks hall sensor for water state. */ -bool get_water () +void 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; + if ((bit_is_set(flags, FLAG_WATER) && sense > WATER_LOW) || (bit_is_clear(flags, FLAG_WATER) && sense >= WATER_OK)) + set_bit(flags, FLAG_WATER); + else + clear_bit(flags, FLAG_WATER); } /* function: get_temperature() - * return: true temperature OK - * false temperature too low * * Checks NTC sensor for temperature state. */ -bool get_temperature () +void 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; + set_bit(flags, FLAG_TEMPERATURE); + else + clear_bit(flags, FLAG_TEMPERATURE); } /* function: detect_zero_crossing() @@ -355,20 +352,15 @@ ISR ( INT0_vect) */ ISR ( TIMER1_OVF1_vect) { - if (time_counter < 1000) - time_counter++; // global milliseconds counter and seconds counter (for AutoOff) + if (ms_counter < 1000) + ms_counter++; // global milliseconds counter and seconds counter (for AutoOff) else { - time_counter = 0; + ms_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; + uint8_t leds_blink_on = (ms_counter < 500); // status flag for blinking LEDs with 1Hz if (led & (1 << LED_RED_ON) || (led & (1 << LED_RED_BLINK) && leds_blink_on)) set_bit(LED_RED_w, LED_RED_pin); diff --git a/Firmware/main.h b/Firmware/main.h index 0535ec3..3867462 100644 --- a/Firmware/main.h +++ b/Firmware/main.h @@ -95,6 +95,7 @@ #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 BUTTON_LIMIT 1600 #define RED 0b00000001 #define RED_BLINK 0b00000010 @@ -107,9 +108,14 @@ #define VIOLET 0b00010001 #define VIOLET_BLINK 0b00100010 +#define FLAG_WATER 0 +#define FLAG_TEMPERATURE 1 +#define FLAG_CLEAN 2 +#define FLAG_ESC 3 + // prototypes: void init (); // initialization void power_off (); // power off to sleep mode -bool get_water (); // update water state -bool get_temperature (); // update tehmerature state +void get_water (); // update water state +void get_temperature (); // update tehmerature state unsigned int detect_zero_crossing (); // detect zero crossing