57 extern const char *mashTypes[]; |
57 extern const char *mashTypes[]; |
58 |
58 |
59 static const char *TAG = "automation"; |
59 static const char *TAG = "automation"; |
60 |
60 |
61 |
61 |
|
62 void change_sp(bool up) |
|
63 { |
|
64 if (up) |
|
65 stageTemp += 0.25; |
|
66 else |
|
67 stageTemp -= 0.25; |
|
68 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
|
69 driver_state->mlt_sp = stageTemp; |
|
70 xSemaphoreGive(xSemaphoreDriver); |
|
71 } |
|
72 log_msg(TAG, "Changed sp to %.2f", stageTemp); |
|
73 } |
|
74 |
|
75 |
|
76 |
62 /* |
77 /* |
63 * Automation init function that only runs once when a |
78 * Automation init function that only runs once when a |
64 * new screen is entered. |
79 * new screen is entered. |
65 */ |
80 */ |
66 bool Automation_Init(void) |
81 bool Automation_Init(void) |
67 { |
82 { |
68 char msg[64]; |
83 char msg[64]; |
69 |
84 |
70 switch (Main_Screen) { |
85 switch (Main_Screen) { |
71 case MAIN_AUTO_INIT1: |
86 case MAIN_AUTO_INIT1: |
|
87 log_msg(TAG, "Automation startup"); |
72 #ifdef CONFIG_TEMP_SENSORS_SIMULATOR |
88 #ifdef CONFIG_TEMP_SENSORS_SIMULATOR |
73 Fake_MLT = recipe.MashStep[0].Temperature - 10; |
89 Fake_MLT = recipe.MashStep[0].Temperature - 10; |
74 Fake_HLT = recipe.SpargeTemp - 15; |
90 Fake_HLT = recipe.SpargeTemp - 15; |
75 if (xSemaphoreTake(xSemaphoreDS18B20, 10) == pdTRUE) { |
91 if (xSemaphoreTake(xSemaphoreDS18B20, 10) == pdTRUE) { |
76 ds18b20_state->mlt_temperature = ((int)(Fake_MLT * 16)) / 16.0; |
92 ds18b20_state->mlt_temperature = ((int)(Fake_MLT * 16)) / 16.0; |
80 #endif |
96 #endif |
81 for (int i = 0; i < 7; i++) { |
97 for (int i = 0; i < 7; i++) { |
82 if (recipe.MashStep[i].Resttime) |
98 if (recipe.MashStep[i].Resttime) |
83 LastMashStep = i; |
99 LastMashStep = i; |
84 } |
100 } |
85 ESP_LOGI(TAG, "Last mash step %d", LastMashStep); |
101 log_msg(TAG, "Last mash step %d", LastMashStep); |
86 |
102 |
87 // Check for a crashed session. |
103 // Check for a crashed session. |
88 if (runtime.AutoModeStarted) { |
104 if (runtime.AutoModeStarted) { |
89 TopMessage((char *)"Brouwen hervatten?"); |
105 TopMessage((char *)"Brouwen hervatten?"); |
90 Buttons_Add( 40, 100, 80, 40, (char *)"Ja", 0); |
106 Buttons_Add( 40, 100, 80, 40, (char *)"Ja", 0); |
109 driver_state->hlt_sp = recipe.SpargeTemp; |
125 driver_state->hlt_sp = recipe.SpargeTemp; |
110 driver_state->hlt_mode = HLT_MODE_BANG; |
126 driver_state->hlt_mode = HLT_MODE_BANG; |
111 } |
127 } |
112 xSemaphoreGive(xSemaphoreDriver); |
128 xSemaphoreGive(xSemaphoreDriver); |
113 } |
129 } |
114 ESP_LOGI(TAG, "Resume brew screen %d, time left %d", Main_Screen, TimeLeft); |
130 log_msg(TAG, "Resume brew screen %d, time left %d", Main_Screen, TimeLeft); |
115 log_begin((time_t)0); |
131 log_begin((time_t)0); |
116 update_json(); |
132 update_json(); |
117 log_annotation(ANNOTATION_SYSTEM, (char *)"Resume"); |
133 log_annotation(ANNOTATION_SYSTEM, (char *)"Resume"); |
118 return true; |
134 return true; |
119 break; |
135 break; |
230 TopMessage((char *)"Naar koken"); |
246 TopMessage((char *)"Naar koken"); |
231 MLT_info(71, 26, false); |
247 MLT_info(71, 26, false); |
232 Buttons_Add( 5, 30, 60, 40, (char *)"+sp", 0); |
248 Buttons_Add( 5, 30, 60, 40, (char *)"+sp", 0); |
233 Buttons_Add(255, 30, 60, 40, (char *)"-sp", 1); |
249 Buttons_Add(255, 30, 60, 40, (char *)"-sp", 1); |
234 Buttons_Show(); |
250 Buttons_Show(); |
235 ESP_LOGI(TAG, "Mash done, going to boil."); |
251 log_msg(TAG, "Mash done, going to boil."); |
236 Sub_Screen = 0; |
252 Sub_Screen = 0; |
237 break; |
253 break; |
238 |
254 |
239 case MAIN_AUTO_BOILING: |
255 case MAIN_AUTO_BOILING: |
240 if (Resume) { |
256 if (Resume) { |
260 Buttons_Add( 3, 30, 60, 40, (char *)"+sp", 0); |
276 Buttons_Add( 3, 30, 60, 40, (char *)"+sp", 0); |
261 Buttons_Add(257, 30, 60, 40, (char *)"-sp", 1); |
277 Buttons_Add(257, 30, 60, 40, (char *)"-sp", 1); |
262 Buttons_Add( 3, 190, 60, 40, (char *)"+1m", 2); |
278 Buttons_Add( 3, 190, 60, 40, (char *)"+1m", 2); |
263 Buttons_Add(257, 190, 60, 40, (char *)"-1m", 3); |
279 Buttons_Add(257, 190, 60, 40, (char *)"-1m", 3); |
264 Buttons_Show(); |
280 Buttons_Show(); |
265 ESP_LOGI(TAG, "Boil temperature reached, boil %d minutes", (TimeLeft / 60) -1); |
281 log_msg(TAG, "Boil temperature reached, boil %d minutes", (TimeLeft / 60) -1); |
266 log_annotation(ANNOTATION_STAGE, (char *)"Koken"); |
282 log_annotation(ANNOTATION_STAGE, (char *)"Koken"); |
267 Sub_Screen = 0; |
283 Sub_Screen = 0; |
268 break; |
284 break; |
269 |
285 |
270 case MAIN_AUTO_COOLING_H: |
286 case MAIN_AUTO_COOLING_H: |
343 } |
359 } |
344 _fg = TFT_YELLOW; |
360 _fg = TFT_YELLOW; |
345 TFT_setFont(DEJAVU24_FONT, NULL); |
361 TFT_setFont(DEJAVU24_FONT, NULL); |
346 if (Main_Screen == MAIN_AUTO_DONE) { |
362 if (Main_Screen == MAIN_AUTO_DONE) { |
347 TFT_print((char *)"Brouwen is gereed.", CENTER, CENTER); |
363 TFT_print((char *)"Brouwen is gereed.", CENTER, CENTER); |
348 ESP_LOGI(TAG, "Brew is done"); |
364 log_msg(TAG, "Brew is done"); |
349 SoundPlay(SOUND_End); |
365 SoundPlay(SOUND_End); |
350 } else { |
366 } else { |
351 TFT_print((char *)"Brouwen is afgebroken.", CENTER, CENTER); |
367 TFT_print((char *)"Brouwen is afgebroken.", CENTER, CENTER); |
352 ESP_LOGI(TAG, "Brew is aborted"); |
368 log_msg(TAG, "Brew is aborted"); |
353 SoundPlay(SOUND_Warn); |
369 SoundPlay(SOUND_Warn); |
354 } |
370 } |
355 log_close(); |
371 log_close(); |
356 runtime.Logfile[0] = '\0'; |
372 runtime.Logfile[0] = '\0'; |
357 runtime.BrewStart = (time_t)0; |
373 runtime.BrewStart = (time_t)0; |
474 Main_Screen = MAIN_AUTO_ABORT; |
490 Main_Screen = MAIN_AUTO_ABORT; |
475 break; |
491 break; |
476 |
492 |
477 case 1: loop = false; |
493 case 1: loop = false; |
478 Main_Screen = MAIN_AUTO_INIT2; |
494 Main_Screen = MAIN_AUTO_INIT2; |
|
495 log_msg(TAG, "Brew `%s' on `%s'", recipe.Name, equipment.Name); |
479 break; |
496 break; |
480 |
497 |
481 default: break; |
498 default: break; |
482 } |
499 } |
483 vTaskDelay(20 / portTICK_PERIOD_MS); |
500 vTaskDelay(20 / portTICK_PERIOD_MS); |
531 } |
548 } |
532 runtime.UseHLT = _UseHLT; |
549 runtime.UseHLT = _UseHLT; |
533 } else { |
550 } else { |
534 runtime.UseHLT = _UseHLT = false; |
551 runtime.UseHLT = _UseHLT = false; |
535 } |
552 } |
|
553 log_msg(TAG, "Use HLT %s", (_UseHLT)?"true":"false"); |
536 updateRuntime = true; |
554 updateRuntime = true; |
537 if (_UseHLT) { |
555 if (_UseHLT) { |
538 /* |
556 /* |
539 * Calculate HLT setpoint for pre-heat. Substract the |
557 * Calculate HLT setpoint for pre-heat. Substract the |
540 * available Mash rest times, asume 0.5 degrees/minute |
558 * available Mash rest times, asume 0.5 degrees/minute |
543 int AvailableTime = 0; |
561 int AvailableTime = 0; |
544 for (int i = 1; i < 6; i++) // Only normal Mash steps |
562 for (int i = 1; i < 6; i++) // Only normal Mash steps |
545 AvailableTime += recipe.MashStep[i].Resttime; |
563 AvailableTime += recipe.MashStep[i].Resttime; |
546 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
564 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
547 driver_state->hlt_sp = recipe.SpargeTemp - ((AvailableTime / 2) + 2); |
565 driver_state->hlt_sp = recipe.SpargeTemp - ((AvailableTime / 2) + 2); |
548 ESP_LOGI(TAG, "HLT preheat set to %4.1f", driver_state->hlt_sp); |
566 log_msg(TAG, "HLT preheat set to %4.2f", driver_state->hlt_sp); |
549 xSemaphoreGive(xSemaphoreDriver); |
567 xSemaphoreGive(xSemaphoreDriver); |
550 } |
568 } |
551 } |
569 } |
552 Buttons_Clear(); |
570 Buttons_Clear(); |
553 Main_Screen = MAIN_AUTO_DELAYSTART; |
571 Main_Screen = MAIN_AUTO_DELAYSTART; |
567 HLT_info(71,150, true, false); |
585 HLT_info(71,150, true, false); |
568 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
586 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
569 if (driver_state->hlt_pv >= driver_state->hlt_sp) { |
587 if (driver_state->hlt_pv >= driver_state->hlt_sp) { |
570 Main_Screen = MAIN_AUTO_MASH_IN; |
588 Main_Screen = MAIN_AUTO_MASH_IN; |
571 driver_state->hlt_sp = recipe.SpargeTemp; // Set final setpoint |
589 driver_state->hlt_sp = recipe.SpargeTemp; // Set final setpoint |
|
590 log_msg(TAG, "HLT preheat done"); |
572 } |
591 } |
573 xSemaphoreGive(xSemaphoreDriver); |
592 xSemaphoreGive(xSemaphoreDriver); |
574 } |
593 } |
575 break; |
594 break; |
576 |
595 |
614 xSemaphoreGive(xSemaphoreDriver); |
633 xSemaphoreGive(xSemaphoreDriver); |
615 } |
634 } |
616 MashState = Sub_Screen = MASH_WAITTEMP; |
635 MashState = Sub_Screen = MASH_WAITTEMP; |
617 snprintf(msg, 255, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen); |
636 snprintf(msg, 255, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen); |
618 ws_server_send_text_clients((char *)"/ws", msg, strlen(msg)); |
637 ws_server_send_text_clients((char *)"/ws", msg, strlen(msg)); |
619 ESP_LOGI(TAG, "Mash step %d type: %s time: %d temp: %4.1f min: %4.1f max: %4.1f", |
638 log_msg(TAG, "Mash step %d type: %s time: %d sp: %4.2f sv: %4.3f", |
620 Main_Screen - MAIN_AUTO_MASH_IN, mashTypes[recipe.MashStep[Main_Screen - MAIN_AUTO_MASH_IN].Type], |
639 Main_Screen - MAIN_AUTO_MASH_IN, mashTypes[recipe.MashStep[Main_Screen - MAIN_AUTO_MASH_IN].Type], |
621 stageTime, stageTemp, MinMash, MaxMash); |
640 stageTime, stageTemp, temp_MLT); |
622 |
641 |
623 if (Main_Screen > MAIN_AUTO_MASH_IN) { |
642 if (Main_Screen > MAIN_AUTO_MASH_IN) { |
624 // Do not annotate before the log is open. |
643 // Do not annotate before the log is open. |
625 if (Main_Screen == MAIN_AUTO_MASH_OUT) { |
644 if (Main_Screen == MAIN_AUTO_MASH_OUT) { |
626 log_annotation(ANNOTATION_STAGE, (char *)"Uitmaischen"); |
645 log_annotation(ANNOTATION_STAGE, (char *)"Uitmaischen"); |
656 // No heating during the infusion. |
675 // No heating during the infusion. |
657 driver_state->mlt_sp = stageTemp; |
676 driver_state->mlt_sp = stageTemp; |
658 driver_state->mlt_mode = MLT_MODE_OFF; |
677 driver_state->mlt_mode = MLT_MODE_OFF; |
659 xSemaphoreGive(xSemaphoreDriver); |
678 xSemaphoreGive(xSemaphoreDriver); |
660 } |
679 } |
661 ESP_LOGI(TAG, "Mash infusion prompt"); |
680 log_msg(TAG, "Mash infusion prompt"); |
662 } else { |
681 } else { |
663 Buttons_Add( 5, 30, 60, 40, (char *)"+sp", 0); |
682 Buttons_Add( 5, 30, 60, 40, (char *)"+sp", 0); |
664 Buttons_Add(255, 30, 60, 40, (char *)"-sp", 1); |
683 Buttons_Add(255, 30, 60, 40, (char *)"-sp", 1); |
665 Buttons_Show(); |
684 Buttons_Show(); |
666 } |
685 } |
685 TimerSet(stageTime * 60); |
704 TimerSet(stageTime * 60); |
686 } |
705 } |
687 Resume = false; |
706 Resume = false; |
688 runtime.StageTimeLeft = TimeLeft / 60; |
707 runtime.StageTimeLeft = TimeLeft / 60; |
689 updateRuntime = true; |
708 updateRuntime = true; |
690 ESP_LOGI(TAG, "Mash step %d temperature reached, rest time %d", Main_Screen - MAIN_AUTO_MASH_IN, TimeLeft / 60); |
709 log_msg(TAG, "Mash step %d temperature reached, rest time %d", Main_Screen - MAIN_AUTO_MASH_IN, TimeLeft / 60); |
691 Buttons_Clear(); |
710 Buttons_Clear(); |
692 Buttons_Add( 0, 120, 60, 40, (char *)"+1m", 0); |
711 Buttons_Add( 0, 120, 60, 40, (char *)"+1m", 0); |
693 Buttons_Add(260, 120, 60, 40, (char *)"-1m", 1); |
712 Buttons_Add(260, 120, 60, 40, (char *)"-1m", 1); |
694 Buttons_Show(); |
713 Buttons_Show(); |
695 } |
714 } |
696 switch (Buttons_Scan()) { |
715 switch (Buttons_Scan()) { |
697 case 0: if (stageTemp < MaxMash) { |
716 case 0: if (stageTemp < MaxMash) { |
698 stageTemp += 0.25; |
717 change_sp(true); |
699 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
|
700 driver_state->mlt_sp = stageTemp; |
|
701 xSemaphoreGive(xSemaphoreDriver); |
|
702 } |
|
703 } |
718 } |
704 break; |
719 break; |
705 |
720 |
706 case 1: if (stageTemp > MinMash) { |
721 case 1: if (stageTemp > MinMash) { |
707 stageTemp -= 0.25; |
722 change_sp(false); |
708 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
|
709 driver_state->mlt_sp = stageTemp; |
|
710 xSemaphoreGive(xSemaphoreDriver); |
|
711 } |
|
712 } |
723 } |
713 break; |
724 break; |
714 |
725 |
715 default: |
726 default: |
716 break; |
727 break; |
729 pumpTime = 0; |
740 pumpTime = 0; |
730 } |
741 } |
731 if (pumpTime >= equipment.PumpCycle) { |
742 if (pumpTime >= equipment.PumpCycle) { |
732 if (! pumpRest) { |
743 if (! pumpRest) { |
733 pumpRest = true; |
744 pumpRest = true; |
734 ESP_LOGI(TAG, "Pump rest"); |
745 log_msg(TAG, "Pump rest"); |
735 } |
746 } |
736 } else { |
747 } else { |
737 if (pumpRest) { |
748 if (pumpRest) { |
738 pumpRest = false; |
749 pumpRest = false; |
739 ESP_LOGI(TAG, "Pump start"); |
750 log_msg(TAG, "Pump start"); |
740 } |
751 } |
741 } |
752 } |
742 } |
753 } |
743 if (TimeLeft) { |
754 if (TimeLeft) { |
744 switch (Buttons_Scan()) { |
755 switch (Buttons_Scan()) { |
745 case 0: TimeLeft += 60; |
756 case 0: TimeLeft += 60; |
746 runtime.StageTimeLeft = TimeLeft / 60; |
757 runtime.StageTimeLeft = TimeLeft / 60; |
747 updateRuntime = true; |
758 updateRuntime = true; |
|
759 log_msg(TAG, "Changed resttime to %d", runtime.StageTimeLeft); |
748 break; |
760 break; |
749 |
761 |
750 case 1: if (TimeLeft < 60) |
762 case 1: if (TimeLeft < 60) |
751 TimeLeft = 0; |
763 TimeLeft = 0; |
752 else |
764 else |
753 TimeLeft -= 60; |
765 TimeLeft -= 60; |
754 runtime.StageTimeLeft = TimeLeft / 60; |
766 runtime.StageTimeLeft = TimeLeft / 60; |
755 updateRuntime = true; |
767 updateRuntime = true; |
|
768 log_msg(TAG, "Changed resttime to %d", runtime.StageTimeLeft); |
756 break; |
769 break; |
757 |
770 |
758 default: break; |
771 default: break; |
759 } |
772 } |
760 } |
773 } |
778 TFT_print((char *)"Mout storten?", CENTER, 135); |
791 TFT_print((char *)"Mout storten?", CENTER, 135); |
779 SoundPlay(SOUND_Prompt); |
792 SoundPlay(SOUND_Prompt); |
780 MashState = Sub_Screen = MASH_ADD; |
793 MashState = Sub_Screen = MASH_ADD; |
781 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"Mout storten?\"}", Main_Screen, Sub_Screen); |
794 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"Mout storten?\"}", Main_Screen, Sub_Screen); |
782 ws_server_send_text_clients((char *)"/ws", msg, strlen(msg)); |
795 ws_server_send_text_clients((char *)"/ws", msg, strlen(msg)); |
783 ESP_LOGI(TAG, "Mash add prompt"); |
796 log_msg(TAG, "Mash add prompt"); |
784 break; |
797 break; |
785 } |
798 } |
786 if (((Main_Screen - MAIN_AUTO_MASH_IN) == LastMashStep) && config.AskIodine) { |
799 if (((Main_Screen - MAIN_AUTO_MASH_IN) == LastMashStep) && config.AskIodine) { |
787 /* |
800 /* |
788 * Iodone test prompt. |
801 * Iodone test prompt. |
802 beeped = false; |
815 beeped = false; |
803 TimerSet(config.IodineTime * 60); |
816 TimerSet(config.IodineTime * 60); |
804 MashState = Sub_Screen = MASH_IODINE; |
817 MashState = Sub_Screen = MASH_IODINE; |
805 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"Jodium test?\"}", Main_Screen, Sub_Screen); |
818 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"Jodium test?\"}", Main_Screen, Sub_Screen); |
806 ws_server_send_text_clients((char *)"/ws", msg, strlen(msg)); |
819 ws_server_send_text_clients((char *)"/ws", msg, strlen(msg)); |
807 ESP_LOGI(TAG, "Mash iodine test prompt"); |
820 log_msg(TAG, "Mash iodine test prompt"); |
808 break; |
821 break; |
809 } |
822 } |
810 if ((Main_Screen == MAIN_AUTO_MASH_OUT) && config.AskRemove) { |
823 if ((Main_Screen == MAIN_AUTO_MASH_OUT) && config.AskRemove) { |
811 /* |
824 /* |
812 * Mash remove prompt. |
825 * Mash remove prompt. |
824 TFT_print((char *)"Mout verwijderen?", CENTER, 135); |
837 TFT_print((char *)"Mout verwijderen?", CENTER, 135); |
825 SoundPlay(SOUND_Prompt); |
838 SoundPlay(SOUND_Prompt); |
826 MashState = Sub_Screen = MASH_REMOVE; |
839 MashState = Sub_Screen = MASH_REMOVE; |
827 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"Mout verwijderen?\"}", Main_Screen, Sub_Screen); |
840 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"Mout verwijderen?\"}", Main_Screen, Sub_Screen); |
828 ws_server_send_text_clients((char *)"/ws", msg, strlen(msg)); |
841 ws_server_send_text_clients((char *)"/ws", msg, strlen(msg)); |
829 ESP_LOGI(TAG, "Mash remove prompt"); |
842 log_msg(TAG, "Mash remove prompt"); |
830 break; |
843 break; |
831 } |
844 } |
832 if (Main_Screen != MAIN_AUTO_ABORT) |
845 if (Main_Screen != MAIN_AUTO_ABORT) |
833 Main_Screen++; |
846 Main_Screen++; |
834 TempReached = false; |
847 TempReached = false; |
921 xSemaphoreGive(xSemaphoreDriver); |
934 xSemaphoreGive(xSemaphoreDriver); |
922 } |
935 } |
923 |
936 |
924 MLT_info(71, 26, true); |
937 MLT_info(71, 26, true); |
925 switch (Buttons_Scan()) { |
938 switch (Buttons_Scan()) { |
926 case 0: if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
939 case 0: if (stageTemp < 105) { |
927 driver_state->mlt_sp += 0.25; |
940 change_sp(true); |
928 xSemaphoreGive(xSemaphoreDriver); |
941 } |
929 } |
|
930 break; |
942 break; |
931 |
943 |
932 case 1: if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
944 case 1: if (stageTemp > 80) { |
933 driver_state->mlt_sp -= 0.25; |
945 change_sp(false); |
934 xSemaphoreGive(xSemaphoreDriver); |
946 } |
935 } |
|
936 break; |
947 break; |
937 |
948 |
938 default: break; |
949 default: break; |
939 } |
950 } |
940 if (Resume) |
951 if (Resume) |
944 case MAIN_AUTO_BOILING: |
955 case MAIN_AUTO_BOILING: |
945 if (Resume) |
956 if (Resume) |
946 Resume = false; |
957 Resume = false; |
947 if (NewMinute) { |
958 if (NewMinute) { |
948 if ((runtime.HopAddition < recipe.Additions) && (TimeLeft <= ((recipe.Addition[runtime.HopAddition].Time * 60) + 60))) { |
959 if ((runtime.HopAddition < recipe.Additions) && (TimeLeft <= ((recipe.Addition[runtime.HopAddition].Time * 60) + 60))) { |
949 ESP_LOGI(TAG, "Hop addition %d at %d minutes", runtime.HopAddition + 1, recipe.Addition[runtime.HopAddition].Time); |
960 log_msg(TAG, "Hop addition %d at %d minutes", runtime.HopAddition + 1, recipe.Addition[runtime.HopAddition].Time); |
950 TopMessage(recipe.Addition[runtime.HopAddition].Name); |
961 TopMessage(recipe.Addition[runtime.HopAddition].Name); |
951 log_annotation(ANNOTATION_EVENT, recipe.Addition[runtime.HopAddition].Name); |
962 log_annotation(ANNOTATION_EVENT, recipe.Addition[runtime.HopAddition].Name); |
952 SoundPlay(SOUND_AddHop); |
963 SoundPlay(SOUND_AddHop); |
953 runtime.HopAddition++; |
964 runtime.HopAddition++; |
954 } else { |
965 } else { |
958 updateRuntime = true; |
969 updateRuntime = true; |
959 } |
970 } |
960 if (TimeLeft < 60) { |
971 if (TimeLeft < 60) { |
961 if (Output) { |
972 if (Output) { |
962 log_annotation(ANNOTATION_STAGE, (char *)"Vlamuit"); |
973 log_annotation(ANNOTATION_STAGE, (char *)"Vlamuit"); |
|
974 log_msg(TAG, "Boil flame off"); |
963 } |
975 } |
964 // Flameout |
976 // Flameout |
965 Output = 0; |
977 Output = 0; |
966 } else if (driver_state->mlt_pv >= stageTemp) { |
978 } else if (driver_state->mlt_pv >= stageTemp) { |
967 Output = (int)((BoilPower * 255.0) / 100.0); |
979 Output = (int)((BoilPower * 255.0) / 100.0); |
982 |
994 |
983 MLT_info(71, 26, true); |
995 MLT_info(71, 26, true); |
984 TimerShow(TimeLeft, 65, 190); |
996 TimerShow(TimeLeft, 65, 190); |
985 |
997 |
986 switch (Buttons_Scan()) { |
998 switch (Buttons_Scan()) { |
987 case 0: if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
999 case 0: if (stageTemp < 105) { |
988 driver_state->mlt_sp += 0.25; |
1000 change_sp(true); |
989 xSemaphoreGive(xSemaphoreDriver); |
1001 } |
990 } |
|
991 break; |
1002 break; |
992 |
1003 |
993 case 1: if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
1004 case 1: if (stageTemp > 80) { |
994 driver_state->mlt_sp -= 0.25; |
1005 change_sp(false); |
995 xSemaphoreGive(xSemaphoreDriver); |
1006 } |
996 } |
|
997 break; |
1007 break; |
998 |
1008 |
999 case 2: TimeLeft += 60; |
1009 case 2: TimeLeft += 60; |
|
1010 log_msg(TAG, "Increase boiltime to %d minutes", TimeLeft / 60); |
1000 break; |
1011 break; |
1001 |
1012 |
1002 case 3: if (TimeLeft > 60) |
1013 case 3: if (TimeLeft > 60) |
1003 TimeLeft -= 60; |
1014 TimeLeft -= 60; |
1004 else |
1015 else |
1005 TimeLeft = 0; |
1016 TimeLeft = 0; |
|
1017 log_msg(TAG, "Decrease boiltime to %d minutes", TimeLeft / 60); |
1006 break; |
1018 break; |
1007 |
1019 |
1008 case 4: if (BoilPower < 100) |
1020 case 4: if (BoilPower < 100) |
1009 BoilPower++; |
1021 BoilPower++; |
|
1022 log_msg(TAG, "Increase boilpower to %d%%", BoilPower); |
1010 break; |
1023 break; |
1011 |
1024 |
1012 case 5: if (BoilPower > 0) |
1025 case 5: if (BoilPower > 0) |
1013 BoilPower--; |
1026 BoilPower--; |
|
1027 log_msg(TAG, "Decrease boilpower to %d%%", BoilPower); |
1014 break; |
1028 break; |
1015 |
1029 |
1016 default: break; |
1030 default: break; |
1017 } |
1031 } |
1018 |
1032 |
1019 if (TimeLeft == 0) { |
1033 if (TimeLeft == 0) { |
1020 Main_Screen = MAIN_AUTO_WHIRLPOOL9; |
1034 Main_Screen = MAIN_AUTO_WHIRLPOOL9; |
1021 ESP_LOGI(TAG, "Boil is ready"); |
1035 log_msg(TAG, "Boil is ready"); |
1022 } |
1036 } |
1023 break; |
1037 break; |
1024 |
1038 |
1025 case MAIN_AUTO_COOLING_H: |
1039 case MAIN_AUTO_COOLING_H: |
1026 case MAIN_AUTO_COOLING_M: |
1040 case MAIN_AUTO_COOLING_M: |
1056 stageTemp = recipe.CoolTemp; |
1070 stageTemp = recipe.CoolTemp; |
1057 } |
1071 } |
1058 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen); |
1072 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen); |
1059 ws_server_send_text_clients((char *)"/ws", msg, strlen(msg)); |
1073 ws_server_send_text_clients((char *)"/ws", msg, strlen(msg)); |
1060 CoolBeep = false; |
1074 CoolBeep = false; |
1061 ESP_LOGI(TAG, "Start cooling from %6.2f to %4.1f", ds18b20_state->mlt_temperature, stageTemp); |
1075 log_msg(TAG, "Start cooling from %6.2f to %4.1f", ds18b20_state->mlt_temperature, stageTemp); |
1062 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
1076 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
1063 driver_state->mlt_mode = MLT_MODE_OFF; |
1077 driver_state->mlt_mode = MLT_MODE_OFF; |
1064 driver_state->mlt_sp = stageTemp; |
1078 driver_state->mlt_sp = stageTemp; |
1065 xSemaphoreGive(xSemaphoreDriver); |
1079 xSemaphoreGive(xSemaphoreDriver); |
1066 } |
1080 } |
1119 if (driver_state->mlt_sp < 30.0) |
1133 if (driver_state->mlt_sp < 30.0) |
1120 driver_state->mlt_sp += 1.0; |
1134 driver_state->mlt_sp += 1.0; |
1121 } |
1135 } |
1122 xSemaphoreGive(xSemaphoreDriver); |
1136 xSemaphoreGive(xSemaphoreDriver); |
1123 } |
1137 } |
|
1138 log_msg(TAG, "Increase sp to %.2f", driver_state->mlt_sp); |
1124 break; |
1139 break; |
1125 |
1140 |
1126 case 0: Buttons_Add( 60, 150, 90, 40, (char *)"Stoppen", 4); |
1141 case 0: Buttons_Add( 60, 150, 90, 40, (char *)"Stoppen", 4); |
1127 Buttons[4].dark = true; |
1142 Buttons[4].dark = true; |
1128 Buttons_Add(170, 150, 90, 40, (char *)"Sorry", 5); |
1143 Buttons_Add(170, 150, 90, 40, (char *)"Sorry", 5); |
1140 if (driver_state->mlt_sp > 10.0) |
1155 if (driver_state->mlt_sp > 10.0) |
1141 driver_state->mlt_sp -= 1.0; |
1156 driver_state->mlt_sp -= 1.0; |
1142 } |
1157 } |
1143 xSemaphoreGive(xSemaphoreDriver); |
1158 xSemaphoreGive(xSemaphoreDriver); |
1144 } |
1159 } |
|
1160 log_msg(TAG, "Decrease sp to %.2f", driver_state->mlt_sp); |
1145 break; |
1161 break; |
1146 |
1162 |
1147 case 3: if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
1163 case 3: if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
1148 if (driver_state->mlt_pv < equipment.PumpMaxTemp) { |
1164 if (driver_state->mlt_pv < equipment.PumpMaxTemp) { |
1149 if (driver_state->pump_run) |
1165 if (driver_state->pump_run) |
1152 driver_state->pump_run = 1; |
1168 driver_state->pump_run = 1; |
1153 } else { |
1169 } else { |
1154 driver_state->pump_run = 0; |
1170 driver_state->pump_run = 0; |
1155 } |
1171 } |
1156 runtime.PumpCooling = driver_state->pump_run; |
1172 runtime.PumpCooling = driver_state->pump_run; |
|
1173 log_msg(TAG, "Pump turned %s", (driver_state->pump_run)?"on":"off"); |
1157 updateRuntime = true; |
1174 updateRuntime = true; |
1158 xSemaphoreGive(xSemaphoreDriver); |
1175 xSemaphoreGive(xSemaphoreDriver); |
1159 } |
1176 } |
1160 break; |
1177 break; |
1161 |
1178 |
1258 |
1275 |
1259 TimerSet(TimeWhirlPool * 60); |
1276 TimerSet(TimeWhirlPool * 60); |
1260 runtime.StageTimeLeft = TimeWhirlPool; |
1277 runtime.StageTimeLeft = TimeWhirlPool; |
1261 updateRuntime = true; |
1278 updateRuntime = true; |
1262 MLT_info(71, 26, false); |
1279 MLT_info(71, 26, false); |
1263 ESP_LOGI(TAG, "Whirlpool %d minutes, sp %4.1f", TimeWhirlPool, driver_state->mlt_sp); |
1280 log_msg(TAG, "Whirlpool %d minutes, sp %4.1f", TimeWhirlPool, driver_state->mlt_sp); |
1264 Buttons_Add(255, 120, 60, 40, (char *)"+1m", 0); |
1281 Buttons_Add(255, 120, 60, 40, (char *)"+1m", 0); |
1265 Buttons_Add( 5, 120, 60, 40, (char *)"-1m", 1); |
1282 Buttons_Add( 5, 120, 60, 40, (char *)"-1m", 1); |
1266 Buttons_Add(255, 200, 60, 40, (char *)"Pomp", 2); |
1283 Buttons_Add(255, 200, 60, 40, (char *)"Pomp", 2); |
1267 Buttons_Show(); |
1284 Buttons_Show(); |
1268 } |
1285 } |