main/automation.c

changeset 62
2e90ada37476
parent 56
756d1a63d129
child 64
326c38d3681b
equal deleted inserted replaced
61:c7b8a9931b59 62:2e90ada37476
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 }

mercurial