comparison main.c @ 128:fbb076bf2a59

fix stupid bugs - lack of PSTR, MIN not MAX
author Matt Johnston <matt@ucc.asn.au>
date Thu, 11 Oct 2012 19:21:11 +0800
parents b32ddec655c5
children 66d5e15f40d0
comparison
equal deleted inserted replaced
127:b32ddec655c5 128:fbb076bf2a59
36 #define VALUE_BROKEN 0x07D1 // 125.0625 36 #define VALUE_BROKEN 0x07D1 // 125.0625
37 37
38 // ranges are in decicelcius 38 // ranges are in decicelcius
39 #define FRIDGE_AIR_MIN_RANGE 30 39 #define FRIDGE_AIR_MIN_RANGE 30
40 #define FRIDGE_AIR_MAX_RANGE 30 40 #define FRIDGE_AIR_MAX_RANGE 30
41 #define OVERSHOOT_SCALE 1 41 #define OVERSHOOT_SCALE 0.5
42 42
43 #define BAUD 19200 43 #define BAUD 19200
44 #define UBRR ((F_CPU)/8/(BAUD)-1) 44 #define UBRR ((F_CPU)/8/(BAUD)-1)
45 45
46 #define PORT_LED PORTC 46 #define PORT_LED PORTC
372 fprintf_P(crc_stdout, PSTR("wake=%hhu\n"), wake_secs); 372 fprintf_P(crc_stdout, PSTR("wake=%hhu\n"), wake_secs);
373 fprintf_P(crc_stdout, PSTR("fridge=%.1f\n"), fridge_setpoint/10.0); 373 fprintf_P(crc_stdout, PSTR("fridge=%.1f\n"), fridge_setpoint/10.0);
374 fprintf_P(crc_stdout, PSTR("fridge_diff=%.1f\n"), fridge_difference/10.0); 374 fprintf_P(crc_stdout, PSTR("fridge_diff=%.1f\n"), fridge_difference/10.0);
375 fprintf_P(crc_stdout, PSTR("fridge_delay=%hu\n"), fridge_delay); 375 fprintf_P(crc_stdout, PSTR("fridge_delay=%hu\n"), fridge_delay);
376 fprintf_P(crc_stdout, PSTR("fridge_status=%hhu\n"), is_fridge_on()); 376 fprintf_P(crc_stdout, PSTR("fridge_status=%hhu\n"), is_fridge_on());
377 fprintf_P(crc_stdout, PSTR("fridge_last_on=%lu\n"), fridge_on_clock.ticks);
378 fprintf_P(crc_stdout, PSTR("fridge_last_off=%lu\n"), fridge_off_clock.ticks);
379 fprintf_P(crc_stdout, PSTR("last_fridge=%hu\n"), last_fridge);
380 fprintf_P(crc_stdout, PSTR("last_wort=%hu\n"), last_wort);
377 fprintf_P(crc_stdout, PSTR("tick_secs=%d\n"), TICK); 381 fprintf_P(crc_stdout, PSTR("tick_secs=%d\n"), TICK);
378 fprintf_P(crc_stdout, PSTR("tick_wake=%d\n"), SLEEP_COMPARE); 382 fprintf_P(crc_stdout, PSTR("tick_wake=%d\n"), SLEEP_COMPARE);
379 fprintf_P(crc_stdout, PSTR("maxsens=%hhu\n"), MAX_SENSORS); 383 fprintf_P(crc_stdout, PSTR("maxsens=%hhu\n"), MAX_SENSORS);
380 fprintf_P(crc_stdout, PSTR("totalmeas=%hu\n"), TOTAL_MEASUREMENTS); 384 fprintf_P(crc_stdout, PSTR("totalmeas=%hu\n"), TOTAL_MEASUREMENTS);
381 fprintf_P(crc_stdout, PSTR("sensors=%hhu\n"), n_sensors); 385 fprintf_P(crc_stdout, PSTR("sensors=%hhu\n"), n_sensors);
840 // the fridge min only applies when the wort is in the desired range. 844 // the fridge min only applies when the wort is in the desired range.
841 int16_t fridge_min = fridge_setpoint - FRIDGE_AIR_MIN_RANGE; 845 int16_t fridge_min = fridge_setpoint - FRIDGE_AIR_MIN_RANGE;
842 int16_t fridge_max = fridge_setpoint + FRIDGE_AIR_MAX_RANGE; 846 int16_t fridge_max = fridge_setpoint + FRIDGE_AIR_MAX_RANGE;
843 847
844 uint8_t fridge_on = PORT_FRIDGE & _BV(PIN_FRIDGE); 848 uint8_t fridge_on = PORT_FRIDGE & _BV(PIN_FRIDGE);
845 printf_P(PSTR("last_wort %hd (%hd, %hd), last_fridge %hd (%hd, %hd), setpoint %hd, diff %hd, fridge_on %d\n"), 849 printf_P(PSTR("last_wort %hd (%hd, %hd), last_fridge %hd (%hd, %hd), setpoint %hd, diff %hd, fridge_on %hu\n"),
846 last_wort, wort_min, wort_max, 850 last_wort, wort_min, wort_max,
847 fridge_setpoint, fridge_min, fridge_max, 851 fridge_setpoint, fridge_min, fridge_max,
848 fridge_difference, fridge_on); 852 fridge_difference, fridge_on);
849 853
850 if (off_time < fridge_delay) 854 if (off_time < fridge_delay)
859 { 863 {
860 bool turn_off = false; 864 bool turn_off = false;
861 uint16_t on_time = now.ticks - fridge_on_clock.ticks; 865 uint16_t on_time = now.ticks - fridge_on_clock.ticks;
862 866
863 // *10 for decicelcius 867 // *10 for decicelcius
864 uint16_t overshoot = OVERSHOOT_SCALE * 10.0f * MAX(3600, on_time) / 3600.0; 868 uint16_t overshoot = OVERSHOOT_SCALE * 10.0f * MIN(3600, on_time) / 3600.0;
869
870 printf_P(PSTR("on_time %hu, overshoot %hu\n"), on_time, overshoot);
865 871
866 // wort has cooled enough. will probably cool a bit more by itself 872 // wort has cooled enough. will probably cool a bit more by itself
867 if (wort_valid && (last_wort-overshoot) <= fridge_setpoint) 873 if (wort_valid && (last_wort-overshoot) <= fridge_setpoint)
868 { 874 {
869 printf_P("wort has cooled enough, overshoot %hu\n", overshoot); 875 printf_P(PSTR("wort has cooled enough, overshoot %hu on_time %hu\n"), overshoot, on_time);
870 turn_off = true; 876 turn_off = true;
871 } 877 }
872 878
873 // fridge is much cooler than wort 879 // fridge is much cooler than wort
874 if ((last_wort < wort_max || !wort_valid) && 880 if ((last_wort < wort_max || !wort_valid) &&
875 fridge_valid && last_fridge < fridge_min) 881 fridge_valid && last_fridge < fridge_min)
876 { 882 {
877 printf_P("fridge is too cold\n"); 883 printf_P(PSTR("fridge is too cold\n"));
878 turn_off = true; 884 turn_off = true;
879 } 885 }
880 886
881 if (turn_off) 887 if (turn_off)
882 { 888 {
890 { 896 {
891 bool turn_on = false; 897 bool turn_on = false;
892 898
893 if (wort_valid && last_wort >= wort_max) 899 if (wort_valid && last_wort >= wort_max)
894 { 900 {
895 printf_P("wort is too hot\n"); 901 printf_P(PSTR("wort is too hot\n"));
896 turn_on = true; 902 turn_on = true;
897 } 903 }
898 904
899 if ((fridge_valid && last_fridge > fridge_max)) 905 if ((fridge_valid && last_fridge > fridge_max))
900 { 906 {
904 910
905 911
906 if ((last_wort > wort_min || !wort_valid) && 912 if ((last_wort > wort_min || !wort_valid) &&
907 (fridge_valid && last_fridge > fridge_setpoint)) 913 (fridge_valid && last_fridge > fridge_setpoint))
908 { 914 {
909 printf_P("fridge is too hot\n"); 915 printf_P(PSTR("fridge is too hot\n"));
910 turn_on = true; 916 turn_on = true;
911 } 917 }
912 918
913 if (turn_on) 919 if (turn_on)
914 { 920 {