Контроллер для пивоварни (моя версия)
- Войдите на сайт для отправки комментариев
Пт, 06/03/2015 - 15:27
Знакомый решил заняться пивоварением и попросил написать для него контроллер для нагревательного бака.
Далее фото и код.





001 | #include <Wire.h> |
002 | #include <PID_v1.h> |
003 | #include <TimeHelpers.h> |
004 | #include <OneWire.h> |
005 | #include <LiquidCrystal_I2C.h> |
006 | #include <DS1307.h> |
007 | #include <RTClib.h> |
008 | #include <EEPROM.h> |
009 |
010 | #define ONE_WIRE_BUS 10 // Шина датчика температуры |
011 | #define P_Temp 0 // Поле масива с данными температуры |
012 | #define P_Time 1 // Поле масива с данными времени |
013 | #define P_Alar 2 // Поле масива с данными сигнализации |
014 | #define TEN1 13 // Порт шины нагревательного элемента 1 |
015 | #define TEN2 6 // Порт шины нагревательного элемента 2 |
016 | #define BUTON_MENU 4 // Порт входа кнопки меню (притянут к +) |
017 | #define BUZZ 8 // Порт выхода на пьезоизлучатель |
018 | #define noTrem 150 // Задержка антидребезга |
019 |
020 | RTC_DS1307 rtc; // Инициализация Часов точного времени |
021 | OneWire ds(10); // Инициализация шины датчика измерения температуры |
022 | LiquidCrystal_I2C lcd(0x27, 20, 4); // Инициализация дисплея |
023 |
024 | double Setpoint = EEPROM.read(110); // Создание переменной устанавливаемой температуры (и передача данных из памяти) |
025 | double Input; // Создание переменной входящих данных в ПИД регулятор |
026 | double Output; // Создание переменной исходящих данных из ПИД регулятора |
027 | double consKp = 5, consKi = 50, consKd = 0.5; // Создание переменных констант ПИД регулятора (Обычный режим)(быстрый режим) |
028 | //double tochKp = 5, tochKi = 2, tochKd = 0.05; // Создание переменных констант ПИД регулятора (точный режим)(медленный режим) |
029 |
030 | PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, DIRECT); // Инициализация ПИД регулятора |
031 |
032 | DateTime now; // Создания объекта Часов точного времени |
033 |
034 | byte type_s; // Создание переменной типа датчика измерения температуры |
035 | byte data[12]; // Создание переменной данных датчика температуры |
036 | byte addr[8]; // Создание переменной адреса датчика температуры |
037 | float celsius; // Создание переменной значения измерений датчика температуры |
038 |
039 | int Moschnost; // Создание переменной мощности нагревательного элемента |
040 | int U_D = 5; // Создание переменной джойстика (движение вверх, вниз) |
041 | int L_R = 0; // Создание переменной джойстика (движение в лево, в право) |
042 | boolean Vhod_v_menu = 0; // Создание переменной флага входа в меню |
043 | int T_Upr = EEPROM.read(111); // Создание переменной указывающий тип управления (и передача данных из памяти) |
044 |
045 | int _HR = 0; // Создание переменной хранения значения часов |
046 | int _MI = 0; // Создание переменной хранения значения минут |
047 | int _SE = 0; // Создание переменной хранения значения секунд |
048 | int A_H = 0; // Создание переменной хранения значения часов при изменении времени |
049 | int A_M = 0; // Создание переменной хранения значения минут при изменении времени |
050 | boolean chg_Time = 0; // Создание переменной флага изменения значения времени |
051 |
052 | #define PunkMenu 20 // Указатель на количество пунктов меню |
053 | boolean Dreft0 = 0; // Создание переменной флага отрисовки 0 поля меню |
054 | boolean Dreft1 = 0; // Создание переменной флага отрисовки 1 поля меню |
055 | boolean Dreft2 = 0; // Создание переменной флага отрисовки 2 поля меню |
056 | boolean Dreft3 = 0; // Создание переменной флага отрисовки 3 поля меню |
057 | boolean Dreft4 = 0; // Создание переменной флага отрисовки 4 поля меню |
058 | boolean Dreft5 = 0; // Создание переменной флага отрисовки 5 поля меню |
059 | boolean Dreft_MAS_0 = 0; // Создание переменной флага отрисовки 6 поля меню |
060 | boolean Dreft_MAS_1 = 0; // Создание переменной флага отрисовки 7 поля меню |
061 | boolean Dreft_MAS_2 = 0; // Создание переменной флага отрисовки 8 поля меню |
062 | boolean Dreft_MAS_3 = 0; // Создание переменной флага отрисовки 9 поля меню |
063 | boolean Dreft_MAS_4 = 0; // Создание переменной флага отрисовки 10 поля меню |
064 |
065 | // Temperatura,Vremya,Alarm |
066 | int Pat[5][3] = {{26,1,0}, // Создание масива данных програмируемых периодов |
067 | {28,0,0}, // Создание масива данных програмируемых периодов |
068 | {30,0,0}, // Создание масива данных програмируемых периодов |
069 | {40,0,0}, // Создание масива данных програмируемых периодов |
070 | {50,0,0}}; // Создание масива данных програмируемых периодов |
071 | |
072 | int P_Numb = 0; // Создание переменной определения пункта масива програмируемых периодов (общего назначения) |
073 | int R_Numb = 0; // Создание переменной определения пункта масива програмируемых периодов (отрисовка меню) |
074 | long NeoTime = 0; // Создание переменной хранения значения unix времени конца выполнения программы |
075 | boolean rasTempBol = 0; // Создание переменной флага необходимости расчета времени |
076 | long unixt; // Создание переменной хранения текущего unix времени |
077 | long Sec; // Создание переменной временивыполнения программы |
078 | int cur = 1; // Создание переменной указателя элемента моссива (отрисовка меню) |
079 | boolean StartTime = 0; // Создание переменной начала работы по заданному переоду (Р1 - Р5) |
080 | boolean Rabota = 1; // Создание переменной дополнительная переменная управления переключением периодов (Р1 - Р5) |
081 | boolean Alarm = 0; // Создание переменной значения сигнализации |
082 | boolean chgTemp = 0; // Создание переменной флага изменения значения температуры |
083 | boolean flag = 0; // Создание переменной флага управления пьезо излучателем |
084 |
085 | void setup () |
086 | { |
087 | rtc.begin(); |
088 | lcd.init(); |
089 | lcd.backlight(); |
090 | pinMode(TEN1, OUTPUT); |
091 | pinMode(TEN2, OUTPUT); |
092 | pinMode(BUZZ, OUTPUT); |
093 | pinMode(BUTON_MENU, INPUT_PULLUP); |
094 |
095 | // DO_EVERY(250,{ }); |
096 |
097 | if ( !ds.search(addr)) { |
098 | ds.reset_search(); |
099 | delay(250); |
100 | return ; |
101 | } |
102 | |
103 | if (Setpoint > 90){Setpoint = 20;} // на случай если значение в памяти будет отсутствовать или быть неккоректным |
104 | if (T_Upr > 3 || T_Upr < 0){T_Upr = 0;} // на случай если значение в памяти будет отсутствовать или быть неккоректным |
105 | |
106 | myPID.SetMode(AUTOMATIC); |
107 | lcd.clear(); |
108 | tone(BUZZ, 3000, 500); // сигнал готовности устройства |
109 | } |
110 |
111 | void loop () |
112 | { |
113 | getTemp(); |
114 | Input = celsius; // глупо... но пусть будет. |
115 | now = rtc.now(); |
116 | Pause(); |
117 | podderzhTemp(); |
118 | Menu(); |
119 | /* |
120 | double gap = abs(Setpoint-Input); |
121 | if (gap <= 5){myPID.SetTunings(consKp, consKi, consKd);} |
122 | else {myPID.SetTunings(tochKp, tochKi, tochKd);} |
123 | */ |
124 | myPID.Compute(); |
125 | if (T_Upr == 0){analogWrite(TEN1, 0);analogWrite(TEN2, 0);} |
126 | if (T_Upr == 1){analogWrite(TEN1, 255);analogWrite(TEN2, 255);} |
127 | if (T_Upr == 2){analogWrite(TEN1, Output);analogWrite(TEN2, Output);} |
128 | if (T_Upr == 3){ |
129 | Setpoint = Pat[P_Numb][P_Temp]; |
130 | Alarm = Pat[P_Numb][P_Alar]; |
131 | int tempIN = abs(Input); |
132 | int SetpIN = abs(Setpoint); |
133 | if (SetpIN == tempIN) {StartTime = 1;} |
134 | analogWrite(TEN1, Output);analogWrite(TEN2, Output); |
135 | } |
136 | _HR = now.hour(); |
137 | _MI = now.minute(); |
138 | _SE = now.second(); |
139 | Moschnost = map(Output, 0, 255, 0, 100); |
140 | if (Vhod_v_menu == 0) { |
141 | lcd.setCursor(0, 0);lcd.print( "T.ustC " ); |
142 | lcd.print(Setpoint); |
143 | if (T_Upr == 3) {lcd.print( " PREF" );} |
144 | if (T_Upr == 2) {lcd.print( " AUTO" );} |
145 | if (T_Upr < 2) {lcd.print( " MANUAL" );} |
146 | lcd.setCursor(0, 1); |
147 | lcd.print( "T.zidC " ); |
148 | lcd.print(Input); |
149 | if (T_Upr == 3) { |
150 | lcd.setCursor(15, 1); |
151 | lcd.print( "PAT " ); |
152 | lcd.print(P_Numb + 1); |
153 | } else {lcd.setCursor(13, 1);lcd.print( "PAT OFF" );} |
154 | lcd.setCursor(0, 2);lcd.print( "P.ten% " ); |
155 | if (Moschnost <= 100) {lcd.setCursor(7, 2);lcd.print(Moschnost); lcd.print( " " );} |
156 | if (Moschnost < 10) {lcd.setCursor(7, 2);lcd.print(Moschnost); lcd.print( " " );} |
157 | if (Output <= 255) {lcd.setCursor(14, 2);lcd.print(Output); lcd.print( "" );} |
158 | if (Output < 100) {lcd.setCursor(14, 2);lcd.print(Output); lcd.print( " " );} |
159 | if (Output < 10) {lcd.setCursor(14, 2);lcd.print(Output); lcd.print( " " );} |
160 | lcd.setCursor(0, 3); |
161 | if (T_Upr != 3) {lcd.print( "Time: " );} |
162 | if (_HR < 10) {lcd.print( "0" );lcd.print(_HR);} else {lcd.print(_HR);}lcd.print( ":" ); |
163 | if (_MI < 10) {lcd.print( "0" );lcd.print(_MI);} else {lcd.print(_MI);}lcd.print( ":" ); |
164 | if (_SE < 10) {lcd.print( "0" );lcd.print(_SE);} else {lcd.print(_SE);} |
165 | if (T_Upr == 3) { |
166 | lcd.setCursor(10, 3);lcd.print( "Count:" ); |
167 | if (StartTime != 0) { |
168 | if (Rabota == 1){ |
169 | if (Sec < 10){ lcd.setCursor(16, 3); lcd.print( " " );lcd.print(Sec);} |
170 | if (Sec < 100 && Sec > 10){ lcd.setCursor(16, 3); lcd.print( " " ); lcd.print(Sec);} |
171 | if (Sec < 1000 && Sec > 100){ lcd.setCursor(16, 3); lcd.print( " " ); lcd.print(Sec);} |
172 | if (Sec < 10000 && Sec > 1000){lcd.setCursor(16, 3); lcd.print(Sec);} |
173 | } |
174 | } else { |
175 | if (Rabota == 1){ |
176 | long Pr = Pat[P_Numb][P_Time] * 60; |
177 | if (Pr < 10){ lcd.setCursor(16, 3); lcd.print( " " );lcd.print(Pr);} |
178 | if (Pr < 100 && Pr > 10){ lcd.setCursor(16, 3); lcd.print( " " ); lcd.print(Pr);} |
179 | if (Pr < 1000 && Pr > 100){ lcd.setCursor(16, 3); lcd.print( " " ); lcd.print(Pr);} |
180 | if (Pr < 10000 && Pr > 1000){lcd.setCursor(16, 3); lcd.print(Pr);} |
181 | } |
182 | } |
183 | } else {lcd.setCursor(15, 3);lcd.print( " " );} |
184 | } |
185 | } |
186 |
187 | void Pause(){ |
188 | getPressedButton(); |
189 | if (analogRead(0) > 1000) {Rabota = 1;Alarm = 0;} // Reset Pause |
190 | if (Rabota == 0) { |
191 | DO_EVERY(1000,{ |
192 | if (flag == 0) {lcd.setCursor(13, 1); lcd.print( "*" ); tone(BUZZ, 1000); flag = 1;} |
193 | else {lcd.setCursor(13, 1); lcd.print( " " ); noTone(BUZZ); flag = 0;} |
194 | }); |
195 | } else { if (T_Upr == 3){lcd.setCursor(13, 1); lcd.print( " " ); noTone(BUZZ); flag = 0;}} |
196 | } |
197 |
198 | void podderzhTemp(){ |
199 | if (StartTime == 1){ |
200 | rasTemp(); |
201 | unixt = now.unixtime(); |
202 | Sec = NeoTime - unixt; |
203 | if (Rabota = 1){ |
204 | if (Sec <= 0){ |
205 | if (Alarm == 1) { |
206 | Rabota = 0; |
207 | } else { |
208 | if (P_Numb <= 4){ |
209 | rasTempBol = 0; |
210 | StartTime = 0; |
211 | P_Numb++; |
212 | if (Pat[P_Numb][P_Time] == 0){StopRab();} |
213 | } else {StopRab();} |
214 | } |
215 | } |
216 | } |
217 | } |
218 | } |
219 |
220 | void StopRab(){ |
221 | Setpoint = 10; |
222 | T_Upr = 0; |
223 | P_Numb = 0; |
224 | StartTime = 0; |
225 | Rabota = 1; |
226 | Alarm = 0; |
227 | U_D = 5; |
228 | L_R = 0; |
229 | lcd.setCursor(15, 1);lcd.print( " STOP " ); |
230 | lcd.setCursor(13, 1);lcd.print( "PAT OFF" ); |
231 | tone(BUZZ, 400, 100); // сигнал завершения работы всех программ |
232 | tone(BUZZ, 500, 200); // сигнал завершения работы всех программ |
233 | tone(BUZZ, 700, 300); // сигнал завершения работы всех программ |
234 | tone(BUZZ, 1000, 200); // сигнал завершения работы всех программ |
235 | tone(BUZZ, 6000, 100); // сигнал завершения работы всех программ |
236 | } |
237 |
238 | void rasTemp(){ |
239 | if (rasTempBol == 0){NeoTime = (Pat[P_Numb][P_Time] * 60) + now.unixtime();rasTempBol = 1;} |
240 | } |
241 |
242 | void Menu() { |
243 | getPressedButton(); |
244 | if (Vhod_v_menu == 0) { // выключатель освещения :) |
245 | if (analogRead(1) < 100) {lcd.backlight();} |
246 | if (analogRead(1) > 1000) {lcd.noBacklight();} |
247 | } |
248 |
249 | if (digitalRead(BUTON_MENU) == 0) { |
250 | U_D = 5; |
251 | L_R = 0; |
252 | lcd.backlight(); |
253 | if (Vhod_v_menu == 0) { |
254 | Vhod_v_menu = 1; |
255 | ClearNol(); |
256 | lcd.print( "0. Setup" ); |
257 | lcd.setCursor(0, 1);lcd.print( " left or right" ); |
258 | Dreft0 = 1; |
259 | delay(100); |
260 | } else { |
261 | lcd.clear(); |
262 | lcd.setCursor(8, 1);lcd.print( "EXIT" ); |
263 | chg_Time = 0; |
264 | L_R = 0; |
265 | Vhod_v_menu = 0; |
266 | |
267 | if (EEPROM.read(110) != Setpoint) { // Сохранение значения температуры |
268 | if (T_Upr != 3 && chgTemp == 1){ |
269 | EEPROM.write(110, Setpoint); |
270 | lcd.setCursor(8, 1); |
271 | lcd.print( "SAVE" ); |
272 | } |
273 | } |
274 | if (EEPROM.read(111) != T_Upr) { // Сохранение значения режима работы |
275 | if (T_Upr != 3){ |
276 | EEPROM.write(111, T_Upr); |
277 | lcd.setCursor(8, 1); |
278 | lcd.print( "SAVE" ); |
279 | } |
280 | } |
281 | delay(1000); |
282 | lcd.clear(); |
283 | } |
284 | } |
285 | //---------------------------------------------------------------------------------- |
286 | if (Vhod_v_menu == 1) { |
287 | if (L_R == 0) { |
288 | if (Dreft0 == 0) { |
289 | ClearNol(); |
290 | lcd.print( "0. Setup" ); |
291 | lcd.setCursor(0, 1);lcd.print( " left or right" ); |
292 | Dreft0 = 1;}} else {Dreft0 = 0;} |
293 | //------------- |
294 | if (L_R == 1) { |
295 | if (Dreft1 == 0) { |
296 | chgTemp = 0; |
297 | ClearNol(); |
298 | lcd.print( "1. Setup Temp" ); |
299 | lcd.setCursor(0, 2);lcd.print(Setpoint); |
300 | Dreft1 = 1;}} else {Dreft1 = 0;} |
301 | //------------- |
302 | if (L_R == 2) { |
303 | if (Dreft2 == 0) { |
304 | ClearNol(); |
305 | lcd.print( "2. Setup Rele ON-OFF" ); |
306 | lcd.setCursor(0, 2); |
307 | if (T_Upr == 0) {lcd.print( "1-4 OFF " );} |
308 | if (T_Upr == 1) {lcd.print( "2-4 ON " );} |
309 | if (T_Upr == 2) {lcd.print( "3-4 AUTO " );} |
310 | if (T_Upr == 3) {lcd.print( "4-4 PREF " );} |
311 | Dreft2 = 1;}} else {Dreft2 = 0;} |
312 | //------------- |
313 | if (L_R == 3) { |
314 | if (Dreft3 == 0) { |
315 | A_H = now.hour(); |
316 | ClearNol(); |
317 | lcd.print( "3. Setup Time hour" ); |
318 | lcd.setCursor(0, 1); |
319 | now = rtc.now(); |
320 | lcd.print(now.hour()); |
321 | lcd.print( ":" ); |
322 | lcd.print(now.minute()); |
323 | lcd.print( ":" ); |
324 | lcd.print(now.second()); |
325 | lcd.setCursor(0, 2); |
326 | lcd.print(A_H); |
327 | lcd.print( " hour" ); |
328 | Dreft3 = 1;}} else {Dreft3 = 0;} |
329 | //------------- |
330 | if (L_R == 4) { |
331 | if (Dreft4 == 0) { |
332 | A_M = now.minute(); |
333 | ClearNol(); |
334 | lcd.print( "4. Setup Time minute" ); |
335 | lcd.setCursor(0, 1); |
336 | now = rtc.now(); |
337 | lcd.print(now.hour()); |
338 | lcd.print( ":" ); |
339 | lcd.print(now.minute()); |
340 | lcd.print( ":" ); |
341 | lcd.print(now.second()); |
342 | lcd.setCursor(0, 2); |
343 | lcd.print(A_M); |
344 | lcd.print( " minute" ); |
345 | Dreft4 = 1;}} else {Dreft4 = 0;} |
346 | //------------- |
347 | if (L_R == 5) { |
348 | if (Dreft5 == 0) { |
349 | ClearNol(); |
350 | lcd.print( "5. Setup SET Time" ); |
351 | lcd.setCursor(0, 1); |
352 | now = rtc.now(); |
353 | lcd.print(now.hour()); |
354 | lcd.print( ":" ); |
355 | lcd.print(now.minute()); |
356 | lcd.print( ":" ); |
357 | lcd.print(now.second()); |
358 | lcd.print( " - OLD" ); |
359 | lcd.setCursor(0, 2); |
360 | lcd.print(A_H); |
361 | lcd.print( ":" ); |
362 | lcd.print(A_M); |
363 | lcd.print( ":00" ); |
364 | lcd.print( " - NEW" ); |
365 | lcd.setCursor(0, 3); |
366 | if (chg_Time == 1){lcd.print( "Press UP to SET" );} else {lcd.print( "Time not changed" );} |
367 | Dreft5 = 1;}} else {Dreft5 = 0;} |
368 | //------------- |
369 | if (L_R == 6 || L_R == 11 || L_R == 16) { |
370 | if (Dreft_MAS_0 == 0) { |
371 | if (L_R == 6) {Print_Pat_Screan_Temp();} |
372 | if (L_R == 11) {Print_Pat_Screan_Time();} |
373 | if (L_R == 16) {Print_Pat_Screan_Alarm();} |
374 | lcd.setCursor(1, 3);lcd.print( "^^" ); |
375 | Dreft_MAS_0 = 1;}} else {Dreft_MAS_0 = 0;} |
376 | |
377 | if (L_R == 7 || L_R == 12 || L_R == 17) { |
378 | if (Dreft_MAS_1 == 0) { |
379 | if (L_R == 7) {Print_Pat_Screan_Temp();} |
380 | if (L_R == 12) {Print_Pat_Screan_Time();} |
381 | if (L_R == 17) {Print_Pat_Screan_Alarm();} |
382 | lcd.setCursor(5, 3);lcd.print( "^^" ); |
383 | Dreft_MAS_1 = 1;}} else {Dreft_MAS_1 = 0;} |
384 | |
385 | if (L_R == 8 || L_R == 13 || L_R == 18) { |
386 | if (Dreft_MAS_2 == 0) { |
387 | if (L_R == 8) {Print_Pat_Screan_Temp();} |
388 | if (L_R == 13) {Print_Pat_Screan_Time();} |
389 | if (L_R == 18) {Print_Pat_Screan_Alarm();} |
390 | lcd.setCursor(9, 3);lcd.print( "^^" ); |
391 | Dreft_MAS_2 = 1;}} else {Dreft_MAS_2 = 0;} |
392 | |
393 | if (L_R == 9 || L_R == 14 || L_R == 19) { |
394 | if (Dreft_MAS_3 == 0) { |
395 | if (L_R == 9) {Print_Pat_Screan_Temp();} |
396 | if (L_R == 14) {Print_Pat_Screan_Time();} |
397 | if (L_R == 19) {Print_Pat_Screan_Alarm();} |
398 | lcd.setCursor(13, 3);lcd.print( "^^" ); |
399 | Dreft_MAS_3 = 1;}} else {Dreft_MAS_3 = 0;} |
400 | |
401 | if (L_R == 10 || L_R == 15 || L_R == 20) { |
402 | if (Dreft_MAS_4 == 0) { |
403 | if (L_R == 10) {Print_Pat_Screan_Temp();} |
404 | if (L_R == 15) {Print_Pat_Screan_Time();} |
405 | if (L_R == 20) {Print_Pat_Screan_Alarm();} |
406 | lcd.setCursor(17, 3);lcd.print( "^^" ); |
407 | Dreft_MAS_4 = 1;}} else {Dreft_MAS_4 = 0;} |
408 | //################################################################## |
409 | |
410 | if (U_D > 5) { |
411 | //------------- |
412 | if (L_R == 1) { |
413 | Setpoint = Setpoint + 0.5; |
414 | chgTemp = 1; |
415 | lcd.setCursor(0, 2); |
416 | lcd.print(Setpoint); |
417 | U_D = 5; |
418 | } |
419 | //------------- |
420 | if (L_R == 2) { |
421 | if (T_Upr < 4) {T_Upr = T_Upr + 1;} |
422 | lcd.setCursor(0, 2); |
423 | if (T_Upr == 0) {lcd.print( "1-4 OFF " );} |
424 | if (T_Upr == 1) {lcd.print( "2-4 ON " );} |
425 | if (T_Upr == 2) {lcd.print( "3-4 AUTO " );} |
426 | if (T_Upr == 3) {lcd.print( "4-4 PREF " );} |
427 | U_D = 5; |
428 | } |
429 | //------------- |
430 | if (L_R == 3) { |
431 | A_H = A_H + 1; |
432 | chg_Time = 1; |
433 | if (A_H > 23) {A_H = 23;} |
434 | if (A_H < 0) {A_H = 0;} |
435 | lcd.setCursor(0, 2); |
436 | lcd.print(A_H); |
437 | lcd.print( " hour" ); |
438 | U_D = 5; |
439 | } |
440 | //------------- |
441 | if (L_R == 4) { |
442 | A_M = A_M + 1; |
443 | chg_Time = 1; |
444 | if (A_M > 59) {A_M = 59;} |
445 | if (A_M < 0) {A_M = 0;} |
446 | lcd.setCursor(0, 2); |
447 | lcd.print(A_M); |
448 | lcd.print( " minute" ); |
449 | U_D = 5; |
450 | } |
451 | //------------- |
452 | if (L_R == 5) { |
453 | if (chg_Time == 1){ |
454 | rtc.adjust(DateTime(2015, 2, 27, A_H, A_M, 0)); |
455 | chg_Time = 0; |
456 | lcd.setCursor(0, 0); |
457 | lcd.clear(); |
458 | lcd.print( "6. Setup SET Time" ); |
459 | lcd.setCursor(0, 1); |
460 | now = rtc.now(); |
461 | lcd.print(now.hour()); |
462 | lcd.print( ":" ); |
463 | lcd.print(now.minute()); |
464 | lcd.print( ":" ); |
465 | lcd.print(now.second()); |
466 | lcd.setCursor(0, 2); |
467 | lcd.print(A_H); |
468 | lcd.print( ":" ); |
469 | lcd.print(A_M); |
470 | lcd.print( ":00" ); |
471 | lcd.setCursor(0, 3); |
472 | lcd.print( "Save - ok" ); |
473 | } |
474 | U_D = 5; |
475 | } |
476 | //------------- |
477 | if (L_R == 6 || L_R == 11 || L_R == 16) { |
478 | if (L_R == 6) { |
479 | CHG_P_Temp(); |
480 | Print_Pat_Screan_Temp(); |
481 | } |
482 | if (L_R == 11) { |
483 | CHG_P_Time(); |
484 | Print_Pat_Screan_Time(); |
485 | } |
486 | if (L_R == 16) { |
487 | CHG_P_Alar(); |
488 | Print_Pat_Screan_Alarm(); |
489 | } |
490 | lcd.setCursor(1, 3);lcd.print( "^^" ); |
491 | U_D = 5; |
492 | } |
493 | if (L_R == 7 || L_R == 12 || L_R == 17) { |
494 | if (L_R == 7) { |
495 | CHG_P_Temp(); |
496 | Print_Pat_Screan_Temp(); |
497 | } |
498 | if (L_R == 12) { |
499 | CHG_P_Time(); |
500 | Print_Pat_Screan_Time(); |
501 | } |
502 | if (L_R == 17) { |
503 | CHG_P_Alar(); |
504 | Print_Pat_Screan_Alarm(); |
505 | } |
506 | lcd.setCursor(5, 3);lcd.print( "^^" ); |
507 | U_D = 5; |
508 | } |
509 | if (L_R == 8 || L_R == 13 || L_R == 18) { |
510 | if (L_R == 8) { |
511 | CHG_P_Temp(); |
512 | Print_Pat_Screan_Temp(); |
513 | } |
514 | if (L_R == 13) { |
515 | CHG_P_Time(); |
516 | Print_Pat_Screan_Time(); |
517 | } |
518 | if (L_R == 18) { |
519 | CHG_P_Alar(); |
520 | Print_Pat_Screan_Alarm(); |
521 | } |
522 | lcd.setCursor(9, 3);lcd.print( "^^" ); |
523 | U_D = 5; |
524 | } |
525 | if (L_R == 9 || L_R == 14 || L_R == 19) { |
526 | if (L_R == 9) { |
527 | CHG_P_Temp(); |
528 | Print_Pat_Screan_Temp(); |
529 | } |
530 | if (L_R == 14) { |
531 | CHG_P_Time(); |
532 | Print_Pat_Screan_Time(); |
533 | } |
534 | if (L_R == 19) { |
535 | CHG_P_Alar(); |
536 | Print_Pat_Screan_Alarm(); |
537 | } |
538 | lcd.setCursor(13, 3);lcd.print( "^^" ); |
539 | U_D = 5; |
540 | } |
541 | if (L_R == 10 || L_R == 15 || L_R == 20) { |
542 | if (L_R == 10) { |
543 | CHG_P_Temp(); |
544 | Print_Pat_Screan_Temp(); |
545 | } |
546 | if (L_R == 15) { |
547 | CHG_P_Time(); |
548 | Print_Pat_Screan_Time(); |
549 | } |
550 | if (L_R == 20) { |
551 | CHG_P_Alar(); |
552 | Print_Pat_Screan_Alarm(); |
553 | } |
554 | lcd.setCursor(17, 3);lcd.print( "^^" ); |
555 | U_D = 5; |
556 | } |
557 | //---------------------------------------------------------------------------------- |
558 | } else if (U_D < 5) { |
559 | if (L_R == 1) { |
560 | Setpoint = Setpoint - 0.5; |
561 | chgTemp = 1; |
562 | lcd.setCursor(0, 2); |
563 | lcd.print(Setpoint); |
564 | U_D = 5; |
565 | } |
566 | //------------- |
567 | if (L_R == 2) { |
568 | if (T_Upr > 0) {T_Upr = T_Upr - 1;} |
569 | lcd.setCursor(0, 2); |
570 | if (T_Upr == 0) {lcd.print( "1-4 OFF " );} |
571 | if (T_Upr == 1) {lcd.print( "2-4 ON " );} |
572 | if (T_Upr == 2) {lcd.print( "3-4 AUTO " );} |
573 | if (T_Upr == 3) {lcd.print( "4-4 PREF " );} |
574 | U_D = 5; |
575 | } |
576 | //------------- |
577 | if (L_R == 3) { |
578 | A_H = A_H - 1; |
579 | chg_Time = 1; |
580 | if (A_H > 23) {A_H = 23;} |
581 | if (A_H < 0) {A_H = 0;} |
582 | lcd.setCursor(0, 2); |
583 | lcd.print(A_H); |
584 | lcd.print( " hour" ); |
585 | U_D = 5; |
586 | } |
587 | //------------- |
588 | if (L_R == 4) { |
589 | A_M = A_M - 1; |
590 | chg_Time = 1; |
591 | if (A_M > 59) {A_M = 59;} |
592 | if (A_M < 0) {A_M = 0;} |
593 | lcd.setCursor(0, 2); |
594 | lcd.print(A_M); |
595 | lcd.print( " minute" ); |
596 | U_D = 5; |
597 | } |
598 | //------------- |
599 | if (L_R == 5) { |
600 | if (chg_Time == 1){ |
601 | A_H = now.hour(); |
602 | A_M = now.minute(); |
603 | chg_Time = 0; |
604 | lcd.setCursor(0, 0); |
605 | lcd.clear(); |
606 | lcd.print( "6. Setup SET Time" ); |
607 | lcd.setCursor(0, 1); |
608 | now = rtc.now(); |
609 | lcd.print(now.hour()); |
610 | lcd.print( ":" ); |
611 | lcd.print(now.minute()); |
612 | lcd.print( ":" ); |
613 | lcd.print(now.second()); |
614 | lcd.setCursor(0, 2); |
615 | lcd.print(A_H); |
616 | lcd.print( ":" ); |
617 | lcd.print(A_M); |
618 | lcd.print( ":00" ); |
619 | lcd.setCursor(0, 3); |
620 | lcd.print( "Changed - Cancel" ); |
621 | } |
622 | U_D = 5; |
623 | } |
624 |
625 | //------------- |
626 | if (L_R == 6 || L_R == 11 || L_R == 16) { |
627 | if (L_R == 6) { |
628 | CHG_P_Temp(); |
629 | Print_Pat_Screan_Temp(); |
630 | } |
631 | if (L_R == 11) { |
632 | CHG_P_Time(); |
633 | Print_Pat_Screan_Time(); |
634 | } |
635 | if (L_R == 16) { |
636 | CHG_P_Alar(); |
637 | Print_Pat_Screan_Alarm(); |
638 | } |
639 | lcd.setCursor(1, 3);lcd.print( "^^" ); |
640 | U_D = 5; |
641 | } |
642 | if (L_R == 7 || L_R == 12 || L_R == 17) { |
643 | if (L_R == 7) { |
644 | CHG_P_Temp(); |
645 | Print_Pat_Screan_Temp(); |
646 | } |
647 | if (L_R == 12) { |
648 | CHG_P_Time(); |
649 | Print_Pat_Screan_Time(); |
650 | } |
651 | if (L_R == 17) { |
652 | CHG_P_Alar(); |
653 | Print_Pat_Screan_Alarm(); |
654 | } |
655 | lcd.setCursor(5, 3);lcd.print( "^^" ); |
656 | U_D = 5; |
657 | } |
658 | if (L_R == 8 || L_R == 13 || L_R == 18) { |
659 | if (L_R == 8) { |
660 | CHG_P_Temp(); |
661 | Print_Pat_Screan_Temp(); |
662 | } |
663 | if (L_R == 13) { |
664 | CHG_P_Time(); |
665 | Print_Pat_Screan_Time(); |
666 | } |
667 | if (L_R == 18) { |
668 | CHG_P_Alar(); |
669 | Print_Pat_Screan_Alarm(); |
670 | } |
671 | lcd.setCursor(9, 3);lcd.print( "^^" ); |
672 | U_D = 5; |
673 | } |
674 | if (L_R == 9 || L_R == 14 || L_R == 19) { |
675 | if (L_R == 9) { |
676 | CHG_P_Temp(); |
677 | Print_Pat_Screan_Temp(); |
678 | } |
679 | if (L_R == 14) { |
680 | CHG_P_Time(); |
681 | Print_Pat_Screan_Time(); |
682 | } |
683 | if (L_R == 19) { |
684 | CHG_P_Alar(); |
685 | Print_Pat_Screan_Alarm(); |
686 | } |
687 | lcd.setCursor(13, 3);lcd.print( "^^" ); |
688 | U_D = 5; |
689 | } |
690 | if (L_R == 10 || L_R == 15 || L_R == 20) { |
691 | if (L_R == 10) { |
692 | CHG_P_Temp(); |
693 | Print_Pat_Screan_Temp(); |
694 | } |
695 | if (L_R == 15) { |
696 | CHG_P_Time(); |
697 | Print_Pat_Screan_Time(); |
698 | } |
699 | if (L_R == 20) { |
700 | CHG_P_Alar(); |
701 | Print_Pat_Screan_Alarm(); |
702 | } |
703 | lcd.setCursor(17, 3);lcd.print( "^^" ); |
704 | U_D = 5; |
705 | } |
706 | //------------- |
707 | } |
708 | } |
709 | } |
710 |
711 |
712 | void CHG_P_Temp(){ |
713 | if (U_D > 5) { |
714 | if (Dreft_MAS_0 == 1) { if (Pat[0][P_Temp] < 100) {Pat[0][P_Temp] += 1;}} |
715 | if (Dreft_MAS_1 == 1) { if (Pat[1][P_Temp] < 100) {Pat[1][P_Temp] += 1;}} |
716 | if (Dreft_MAS_2 == 1) { if (Pat[2][P_Temp] < 100) {Pat[2][P_Temp] += 1;}} |
717 | if (Dreft_MAS_3 == 1) { if (Pat[3][P_Temp] < 100) {Pat[3][P_Temp] += 1;}} |
718 | if (Dreft_MAS_4 == 1) { if (Pat[4][P_Temp] < 100) {Pat[4][P_Temp] += 1;}}} |
719 | else { |
720 | if (Dreft_MAS_0 == 1) { if (Pat[0][P_Temp] > 0) {Pat[0][P_Temp] -= 1;}} |
721 | if (Dreft_MAS_1 == 1) { if (Pat[1][P_Temp] > 0) {Pat[1][P_Temp] -= 1;}} |
722 | if (Dreft_MAS_2 == 1) { if (Pat[2][P_Temp] > 0) {Pat[2][P_Temp] -= 1;}} |
723 | if (Dreft_MAS_3 == 1) { if (Pat[3][P_Temp] > 0) {Pat[3][P_Temp] -= 1;}} |
724 | if (Dreft_MAS_4 == 1) { if (Pat[4][P_Temp] > 0) {Pat[4][P_Temp] -= 1;}}} |
725 | } |
726 |
727 | void CHG_P_Time(){ |
728 | if (U_D > 5) { |
729 | if (Dreft_MAS_0 == 1) { if (Pat[0][P_Time] < 32000) {Pat[0][P_Time] += 1;}} |
730 | if (Dreft_MAS_1 == 1) { if (Pat[1][P_Time] < 32000) {Pat[1][P_Time] += 1;}} |
731 | if (Dreft_MAS_2 == 1) { if (Pat[2][P_Time] < 32000) {Pat[2][P_Time] += 1;}} |
732 | if (Dreft_MAS_3 == 1) { if (Pat[3][P_Time] < 32000) {Pat[3][P_Time] += 1;}} |
733 | if (Dreft_MAS_4 == 1) { if (Pat[4][P_Time] < 32000) {Pat[4][P_Time] += 1;}}} |
734 | else { |
735 | if (Dreft_MAS_0 == 1) { if (Pat[0][P_Time] > 0) {Pat[0][P_Time] -= 1;}} |
736 | if (Dreft_MAS_1 == 1) { if (Pat[1][P_Time] > 0) {Pat[1][P_Time] -= 1;}} |
737 | if (Dreft_MAS_2 == 1) { if (Pat[2][P_Time] > 0) {Pat[2][P_Time] -= 1;}} |
738 | if (Dreft_MAS_3 == 1) { if (Pat[3][P_Time] > 0) {Pat[3][P_Time] -= 1;}} |
739 | if (Dreft_MAS_4 == 1) { if (Pat[4][P_Time] > 0) {Pat[4][P_Time] -= 1;}}} |
740 | } |
741 |
742 | void CHG_P_Alar(){ |
743 | if (U_D > 5) { |
744 | if (Dreft_MAS_0 == 1) {Pat[0][P_Alar] = 1;} |
745 | if (Dreft_MAS_1 == 1) {Pat[1][P_Alar] = 1;} |
746 | if (Dreft_MAS_2 == 1) {Pat[2][P_Alar] = 1;} |
747 | if (Dreft_MAS_3 == 1) {Pat[3][P_Alar] = 1;} |
748 | if (Dreft_MAS_4 == 1) {Pat[4][P_Alar] = 1;}} |
749 | else { |
750 | if (Dreft_MAS_0 == 1) {Pat[0][P_Alar] = 0;} |
751 | if (Dreft_MAS_1 == 1) {Pat[1][P_Alar] = 0;} |
752 | if (Dreft_MAS_2 == 1) {Pat[2][P_Alar] = 0;} |
753 | if (Dreft_MAS_3 == 1) {Pat[3][P_Alar] = 0;} |
754 | if (Dreft_MAS_4 == 1) {Pat[4][P_Alar] = 0;}} |
755 | } |
756 |
757 | void Print_Pat_Screan_Temp(){ |
758 | ClearNol(); |
759 | cur = 1; |
760 | lcd.print( "6. Setup PAT Temp" ); |
761 | for ( int i = 1; i <= 5; i++) { |
762 | if (cur == 1) {lcd.setCursor(cur, 1);lcd.print( "P" );lcd.print(i);} else {lcd.setCursor(cur, 1);lcd.print( "P" );lcd.print(i);} |
763 | cur += 4; |
764 | } |
765 | cur = 1; |
766 | for ( int i = 0; i < 5; i++) { |
767 | R_Numb = i; |
768 | if (cur == 1) {lcd.setCursor(cur, 2);} else {lcd.setCursor(cur, 2);} |
769 | cur += 4; |
770 | lcd.print(Pat[R_Numb][P_Temp]); |
771 | } |
772 | } |
773 | void Print_Pat_Screan_Time(){ |
774 | ClearNol(); |
775 | cur = 1; |
776 | lcd.print( "7. Setup PAT Time" ); |
777 | for ( int i = 1; i <= 5; i++) { |
778 | if (cur == 1) {lcd.setCursor(cur, 1);lcd.print( "P" );lcd.print(i);} else {lcd.setCursor(cur, 1);lcd.print( "P" );lcd.print(i);} |
779 | cur += 4; |
780 | } |
781 | cur = 1; |
782 | for ( int i = 0; i < 5; i++) { |
783 | R_Numb = i; |
784 | if (cur == 1) {lcd.setCursor(cur, 2);} else {lcd.setCursor(cur, 2);} |
785 | cur += 4; |
786 | if (Pat[R_Numb][P_Time] < 10){lcd.print(Pat[R_Numb][P_Time]);lcd.print( " " );} else {lcd.print(Pat[R_Numb][P_Time]);} |
787 | } |
788 | } |
789 | void Print_Pat_Screan_Alarm(){ |
790 | ClearNol(); |
791 | cur = 1; |
792 | lcd.print( "8. Setup PAT Alarm" ); |
793 | for ( int i = 1; i <= 5; i++) { |
794 | if (cur == 1) {lcd.setCursor(cur, 1);lcd.print( "P" );lcd.print(i);} else {lcd.setCursor(cur, 1);lcd.print( "P" );lcd.print(i);} |
795 | cur += 4; |
796 | } |
797 | cur = 1; |
798 | for ( int i = 0; i < 5; i++) { |
799 | R_Numb = i; |
800 | if (cur == 1) {lcd.setCursor(cur, 2);} else {lcd.setCursor(cur, 2);} |
801 | cur += 4; |
802 | if (Pat[R_Numb][P_Alar] == 0){lcd.print( "OF" );} else {lcd.print( "ON" );} |
803 | } |
804 | } |
805 |
806 | void ClearNol(){ |
807 | lcd.clear(); |
808 | lcd.setCursor(0, 0); |
809 | } |
810 |
811 | void getPressedButton() { |
812 | DO_EVERY(noTrem,{ if (analogRead(0) < 100) {L_R--;}}); |
813 | DO_EVERY(noTrem,{ if (analogRead(0) > 1000){L_R++;}}); |
814 | DO_EVERY(noTrem,{ if (analogRead(1) < 100) {U_D++;}}); |
815 | DO_EVERY(noTrem,{ if (analogRead(1) > 1000){U_D--;}}); |
816 | if (L_R < 0){L_R = PunkMenu;} |
817 | if (L_R > PunkMenu){L_R = 0;} |
818 | } |
819 |
820 | void getTemp() { |
821 | ds.reset(); |
822 | ds.select(addr); |
823 | ds.write(0x44, 1); |
824 | ds.reset(); |
825 | ds.select(addr); |
826 | ds.write(0xBE); |
827 | for ( int i = 0; i < 9; i++) { |
828 | data[i] = ds.read(); |
829 | } |
830 | int16_t raw = (data[1] << 8) | data[0]; |
831 | if (type_s) { |
832 | raw = raw << 3; |
833 | if (data[7] == 0x10) { |
834 | raw = (raw & 0xFFF0) + 12 - data[6]; |
835 | } |
836 | } else { |
837 | byte cfg = (data[4] & 0x60); |
838 | if (cfg == 0x00) raw = raw & ~7; |
839 | else if (cfg == 0x20) raw = raw & ~3; |
840 | else if (cfg == 0x40) raw = raw & ~1; |
841 | } |
842 |
843 | celsius = ( float )raw / 16.0; |
844 | return ; |
845 | } |
Следующяя более оптимизированная версия прошивки
переработанно меню, добавленно управление рециркуляционным насосом, добавленны дополнительные 5 программ (P1 - P9), добавленна возможность изменять интегральный коэфициент ПИД регулятора.
Система протестированна на чайнике, по результатам тестов был удален НЧ фильтр между SSR и UNL.
001
#include <Wire.h>
002
#include <PID_v1.h>
003
#include <TimeHelpers.h>
004
#include <OneWire.h>
005
#include <LiquidCrystal_I2C.h>
006
#include <DS1307.h>
007
#include <RTClib.h>
008
#include <EEPROM.h>
009
010
#define ONE_WIRE_BUS 10 // Шина датчика температуры
011
#define P_Temp 0 // Поле масива с данными температуры
012
#define P_Time 1 // Поле масива с данными времени
013
#define P_Alar 2 // Поле масива с данными сигнализации
014
#define TEN1 13 // Порт шины нагревательного элемента 1
015
#define TEN2 6 // Порт шины нагревательного элемента 2
016
#define NASOS 2 // Порт шины рециркуляционного насоса
017
#define BUTON_MENU 4 // Порт входа кнопки меню (притянут к +)
018
#define BUZZ 8 // Порт выхода на пьезоизлучатель
019
#define noTrem 150 // Задержка антидребезга
020
021
RTC_DS1307 rtc;
// Инициализация Часов точного времени
022
OneWire ds(10);
// Инициализация шины датчика измерения температуры
023
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Инициализация дисплея
024
025
double
Setpoint = EEPROM.read(110);
// Создание переменной устанавливаемой температуры (и передача данных из памяти)
026
double
Input;
// Создание переменной входящих данных в ПИД регулятор
027
double
Output;
// Создание переменной исходящих данных из ПИД регулятора
028
double
consKp = 5;
// Создание переменных констант ПИД регулятора (Обычный режим)(быстрый режим)
029
double
consKi = EEPROM.read(112);
// Создание переменных констант ПИД регулятора (Обычный режим)(быстрый режим)
030
double
consKd = 1;
// Создание переменных констант ПИД регулятора (Обычный режим)(быстрый режим)
031
double
KP = 0;
// Создание переменных констант ПИД регулятора
032
double
KI = 0;
// Создание переменных констант ПИД регулятора
033
double
KD = 0;
// Создание переменных констант ПИД регулятора
034
035
//double tochKp = 5, tochKi = 2, tochKd = 0.05; // Создание переменных констант ПИД регулятора (точный режим)(медленный режим)
036
037
PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, DIRECT);
// Инициализация ПИД регулятора
038
039
DateTime now;
// Создания объекта Часов точного времени
040
041
byte
type_s;
// Создание переменной типа датчика измерения температуры
042
byte
data[12];
// Создание переменной данных датчика температуры
043
byte
addr[8];
// Создание переменной адреса датчика температуры
044
float
celsius;
// Создание переменной значения измерений датчика температуры
045
046
int
Moschnost;
// Создание переменной мощности нагревательного элемента
047
int
U_D = 5;
// Создание переменной джойстика (движение вверх, вниз)
048
int
L_R = 0;
// Создание переменной джойстика (движение в лево, в право)
049
boolean Vhod_v_menu = 0;
// Создание переменной флага входа в меню
050
int
T_Upr = 0;
// EEPROM.read(111); // Создание переменной указывающий тип управления (и передача данных из памяти)
051
052
int
_HR = 0;
// Создание переменной хранения значения часов
053
int
_MI = 0;
// Создание переменной хранения значения минут
054
int
_SE = 0;
// Создание переменной хранения значения секунд
055
int
A_H = 0;
// Создание переменной хранения значения часов при изменении времени
056
int
A_M = 0;
// Создание переменной хранения значения минут при изменении времени
057
boolean chg_Time = 0;
// Создание переменной флага изменения значения времени
058
059
#define PunkMenu 35 // Указатель на количество пунктов меню
060
boolean Dreft0 = 0;
// Создание переменной флага отрисовки 0 поля меню
061
boolean Dreft1 = 0;
// Создание переменной флага отрисовки 1 поля меню
062
boolean Dreft2 = 0;
// Создание переменной флага отрисовки 2 поля меню
063
boolean Dreft3 = 0;
// Создание переменной флага отрисовки 3 поля меню
064
boolean Dreft4 = 0;
// Создание переменной флага отрисовки 4 поля меню
065
boolean Dreft5 = 0;
// Создание переменной флага отрисовки 5 поля меню
066
boolean Dreft_MAS_0 = 0;
// Создание переменной флага отрисовки 6 поля меню
067
boolean Dreft_MAS_1 = 0;
// Создание переменной флага отрисовки 7 поля меню
068
boolean Dreft_MAS_2 = 0;
// Создание переменной флага отрисовки 8 поля меню
069
boolean Dreft_MAS_3 = 0;
// Создание переменной флага отрисовки 9 поля меню
070
boolean Dreft_MAS_4 = 0;
// Создание переменной флага отрисовки 10 поля меню
071
boolean Dreft_MAS_5 = 0;
// Создание переменной флага отрисовки 11 поля меню
072
boolean Dreft_MAS_6 = 0;
// Создание переменной флага отрисовки 12 поля меню
073
boolean Dreft_MAS_7 = 0;
// Создание переменной флага отрисовки 13 поля меню
074
boolean Dreft_MAS_8 = 0;
// Создание переменной флага отрисовки 14 поля меню
075
boolean Dreft_MAS_9 = 0;
// Создание переменной флага отрисовки 15 поля меню
076
077
// Temperatura,Vremya,Alarm
078
int
Pat[10][3] = {{30,0,0},
// Создание масива данных програмируемых периодов 0
079
{40,0,0},
// Создание масива данных програмируемых периодов 1
080
{50,0,0},
// Создание масива данных програмируемых периодов 2
081
{60,0,0},
// Создание масива данных програмируемых периодов 3
082
{70,0,0},
// Создание масива данных програмируемых периодов 4
083
{95,0,0},
// Создание масива данных програмируемых периодов 5
084
{95,0,0},
// Создание масива данных програмируемых периодов 6
085
{95,0,0},
// Создание масива данных програмируемых периодов 7
086
{95,0,0},
// Создание масива данных програмируемых периодов 8
087
{95,0,0}};
// Создание масива данных програмируемых периодов 9
088
089
int
P_Numb = 0;
// Создание переменной определения пункта масива програмируемых периодов (общего назначения)
090
int
R_Numb = 0;
// Создание переменной определения пункта масива програмируемых периодов (отрисовка меню)
091
long
NeoTime = 0;
// Создание переменной хранения значения unix времени конца выполнения программы
092
boolean rasTempBol = 0;
// Создание переменной флага необходимости расчета времени
093
long
unixt;
// Создание переменной хранения текущего unix времени
094
long
Sec;
// Создание переменной временивыполнения программы
095
int
cur = 1;
// Создание переменной указателя элемента моссива (отрисовка меню)
096
boolean StartTime = 0;
// Создание переменной начала работы по заданному переоду (Р1 - Р5)
097
boolean Rabota = 1;
// Создание переменной дополнительная переменная управления переключением периодов (Р1 - Р5)
098
boolean Alarm = 0;
// Создание переменной значения сигнализации
099
boolean chgTemp = 0;
// Создание переменной флага изменения значения температуры
100
boolean flag = 0;
// Создание переменной флага управления пьезо излучателем
101
102
int
Povtor_Promyvka = 5;
// Колличество циклов
103
int
tekPovtor_Promyvka = 0;
// Текущее количество циклов проверки
104
int
EndOFNasos = 0;
// отключение насоса
105
106
byte
Gradus[8] =
// Создание значка градуса
107
{ B01000,
// Создание значка градуса
108
B10100,
// Создание значка градуса
109
B01000,
// Создание значка градуса
110
B00000,
// Создание значка градуса
111
B00000,
// Создание значка градуса
112
B00000,
// Создание значка градуса
113
B00000,
// Создание значка градуса
114
B00000};
// Создание значка градуса
115
116
void
setup
()
117
{
118
KP = myPID.GetKp();
119
KI = myPID.GetKi();
120
KD = myPID.GetKd();
121
lcd.createChar(0, Gradus);
122
rtc.begin();
123
lcd.init();
124
lcd.backlight();
125
pinMode(TEN1, OUTPUT);
126
pinMode(TEN2, OUTPUT);
127
pinMode(BUZZ, OUTPUT);
128
pinMode(NASOS, OUTPUT);
129
pinMode(BUTON_MENU, INPUT_PULLUP);
130
131
digitalWrite(NASOS, LOW);
132
analogWrite(TEN1, 0);
133
analogWrite(TEN2, 0);
134
135
// DO_EVERY(250,{ });
136
137
if
( !ds.search(addr)) {
138
ds.reset_search();
139
delay(250);
140
return
;
141
}
142
143
if
(Setpoint > 90){Setpoint = 20;}
// на случай если значение в памяти будет отсутствовать или быть неккоректным
144
if
(consKi < 1 || consKi > 100){consKi = 50;}
// на случай если значение в памяти будет отсутствовать или быть неккоректным
145
if
(T_Upr > 3 || T_Upr < 0){T_Upr = 0;}
// на случай если значение в памяти будет отсутствовать или быть неккоректным
146
147
myPID.SetMode(AUTOMATIC);
148
lcd.clear();
149
tone(BUZZ, 3000, 500);
// сигнал готовности устройства
150
}
151
152
void
loop
()
153
{
154
Prokachka();
155
getTemp();
156
Input = celsius;
// глупо... но пусть будет.
157
now = rtc.now();
158
Pause();
159
podderzhTemp();
160
Menu();
161
myPID.Compute();
162
if
(T_Upr == 0){analogWrite(TEN1, 0);analogWrite(TEN2, 0);}
163
if
(T_Upr == 1){analogWrite(TEN1, 255);analogWrite(TEN2, 255);}
164
if
(T_Upr == 2){analogWrite(TEN1, Output);analogWrite(TEN2, Output);}
165
if
(T_Upr == 3){
166
Setpoint = Pat[P_Numb][P_Temp];
167
Alarm = Pat[P_Numb][P_Alar];
168
int
tempIN = abs(Input);
169
int
SetpIN = abs(Setpoint);
170
if
(SetpIN == tempIN) {StartTime = 1;}
171
analogWrite(TEN1, Output);analogWrite(TEN2, Output);
172
}
173
_HR = now.hour();
174
_MI = now.minute();
175
_SE = now.second();
176
Moschnost = map(Output, 0, 255, 0, 100);
177
if
(Vhod_v_menu == 0) {
178
lcd.setCursor(0, 0);lcd.print(
"T.ust "
);
179
lcd.print(Setpoint); lcd.print(
'\0'
);
180
if
(T_Upr == 3) {lcd.print(
" PREF"
);}
181
if
(T_Upr == 2) {lcd.print(
" AUTO"
);}
182
if
(T_Upr < 2) {lcd.print(
" MANUAL"
);}
183
lcd.setCursor(0, 1);
184
lcd.print(
"T.zid "
);
185
lcd.print(Input); lcd.print(
'\0'
);
186
if
(T_Upr == 3) {
187
lcd.setCursor(15, 1);
188
lcd.print(
"PAT "
);
189
lcd.print(P_Numb);
190
}
else
{lcd.setCursor(13, 1);lcd.print(
"PAT OFF"
);}
191
lcd.setCursor(0, 2);lcd.print(
"P.ten "
);
192
if
(Moschnost <= 100) {lcd.setCursor(6, 2);lcd.print(Moschnost); lcd.print(
"% "
);}
193
if
(Moschnost < 10) {lcd.setCursor(6, 2);lcd.print(Moschnost); lcd.print(
"% "
);}
194
if
(Output <= 255) {lcd.setCursor(14, 2);lcd.print(Output); lcd.print(
""
);}
195
if
(Output < 100) {lcd.setCursor(14, 2);lcd.print(Output); lcd.print(
" "
);}
196
if
(Output < 10) {lcd.setCursor(14, 2);lcd.print(Output); lcd.print(
" "
);}
197
lcd.setCursor(0, 3);
198
if
(T_Upr != 3) {lcd.print(
"Time: "
);}
199
if
(_HR < 10) {lcd.print(
"0"
);lcd.print(_HR);}
else
{lcd.print(_HR);}lcd.print(
":"
);
200
if
(_MI < 10) {lcd.print(
"0"
);lcd.print(_MI);}
else
{lcd.print(_MI);}lcd.print(
":"
);
201
if
(_SE < 10) {lcd.print(
"0"
);lcd.print(_SE);}
else
{lcd.print(_SE);}
202
if
(T_Upr == 3) {
203
lcd.setCursor(10, 3);lcd.print(
"Count:"
);
204
if
(StartTime != 0) {
205
if
(Rabota == 1){
206
if
(Sec < 10){ lcd.setCursor(16, 3); lcd.print(
" "
);lcd.print(Sec);}
207
if
(Sec < 100 && Sec > 10){ lcd.setCursor(16, 3); lcd.print(
" "
); lcd.print(Sec);}
208
if
(Sec < 1000 && Sec > 100){ lcd.setCursor(16, 3); lcd.print(
" "
); lcd.print(Sec);}
209
if
(Sec < 10000 && Sec > 1000){lcd.setCursor(16, 3); lcd.print(Sec);}
210
}
211
}
else
{
212
if
(Rabota == 1){
213
long
Pr = Pat[P_Numb][P_Time] * 60;
214
if
(Pr < 10){ lcd.setCursor(16, 3); lcd.print(
" "
);lcd.print(Pr);}
215
if
(Pr < 100 && Pr > 10){ lcd.setCursor(16, 3); lcd.print(
" "
); lcd.print(Pr);}
216
if
(Pr < 1000 && Pr > 100){ lcd.setCursor(16, 3); lcd.print(
" "
); lcd.print(Pr);}
217
if
(Pr < 10000 && Pr > 1000){lcd.setCursor(16, 3); lcd.print(Pr);}
218
}
219
}
220
}
else
{lcd.setCursor(15, 3);lcd.print(
" "
);}
221
}
222
}
223
224
void
Pause(){
225
getPressedButton();
226
if
(analogRead(0) > 1000) {Rabota = 1;Alarm = 0;}
// Reset Pause
227
if
(Rabota == 0) {
228
DO_EVERY(1000,{
229
if
(flag == 0) {lcd.setCursor(13, 1); lcd.print(
"*"
); tone(BUZZ, 1500); flag = 1;}
230
else
{lcd.setCursor(13, 1); lcd.print(
" "
); noTone(BUZZ); flag = 0;}
231
});
232
}
else
{
if
(T_Upr == 3){lcd.setCursor(13, 1); lcd.print(
" "
); noTone(BUZZ); flag = 0;}}
233
}
234
235
void
podderzhTemp(){
236
if
(StartTime == 1){
237
rasTemp();
238
unixt = now.unixtime();
239
Sec = NeoTime - unixt;
240
if
(Rabota = 1){
241
if
(Sec <= 0){
242
if
(Alarm == 1) {
243
Rabota = 0;
244
}
else
{
245
if
(P_Numb <= 9){
246
rasTempBol = 0;
247
StartTime = 0;
248
P_Numb++;
249
if
(Pat[P_Numb][P_Time] == 0){StopRab();}
250
}
else
{StopRab();}
251
}
252
}
253
}
254
}
255
}
256
257
void
StopRab(){
258
Setpoint = 10;
259
T_Upr = 0;
260
P_Numb = 0;
261
StartTime = 0;
262
chg_Time = 0;
263
Rabota = 1;
264
Alarm = 0;
265
U_D = 5;
266
L_R = 0;
267
tekPovtor_Promyvka = 0;
268
lcd.setCursor(15, 1);lcd.print(
" STOP "
);
269
lcd.setCursor(13, 1);lcd.print(
"PAT OFF"
);
270
tone(BUZZ, 400, 5000);
// сигнал завершения работы всех программ
271
digitalWrite(NASOS,HIGH);
// Включение насоса на 5 минут после завершения программ
272
EndOFNasos = 1;
// Флаг включение насоса на 5 минут после завершения программ
273
}
274
275
void
rasTemp(){
276
if
(rasTempBol == 0){NeoTime = (Pat[P_Numb][P_Time] * 60) + now.unixtime();rasTempBol = 1;}
277
}
278
279
void
Menu() {
280
getPressedButton();
281
if
(Vhod_v_menu == 0) {
// выключатель освещения :)
282
if
(analogRead(1) < 100) {lcd.backlight();}
283
if
(analogRead(1) > 1000) {lcd.noBacklight();}
284
}
285
286
if
(digitalRead(BUTON_MENU) == 0) {
287
U_D = 5;
288
L_R = 0;
289
chg_Time = 0;
290
EndOFNasos = 0;
291
lcd.backlight();
292
if
(Vhod_v_menu == 0) {
293
Vhod_v_menu = 1;
294
ClearNol();
295
lcd.print(
" Setup"
);
296
lcd.setCursor(0, 1);lcd.print(
" left or right"
);
297
Dreft0 = 1;
298
delay(100);
299
}
else
{
300
lcd.clear();
301
lcd.setCursor(8, 1);lcd.print(
"EXIT"
);
302
chg_Time = 0;
303
L_R = 0;
304
Vhod_v_menu = 0;
305
306
if
(EEPROM.read(110) != Setpoint) {
// Сохранение значения температуры
307
if
(T_Upr == 2 && chgTemp == 1){
308
EEPROM.write(110, Setpoint);
309
lcd.setCursor(5, 1);
310
lcd.print(
"SAVE Temp"
);
311
delay(600);
312
}
313
}
314
if
(EEPROM.read(111) != T_Upr) {
// Сохранение значения режима работы
315
if
(T_Upr != 3){
316
EEPROM.write(111, T_Upr);
317
lcd.setCursor(5, 1);
318
lcd.print(
"SAVE Mode"
);
319
delay(600);
320
}
321
}
322
if
(EEPROM.read(112) != KI) {
// Сохранение значения режима KI PID регулятора
323
EEPROM.write(112, KI);
324
lcd.setCursor(5, 1);
325
lcd.print(
"SAVE PID "
);
326
myPID.SetTunings(consKp, KI, consKd);
327
delay(600);
328
}
329
lcd.clear();
330
}
331
}
332
//----------------------------------------------------------------------------------
333
if
(Vhod_v_menu == 1) {
334
if
(L_R == 0) {
335
if
(Dreft0 == 0) {
336
ClearNol();
337
lcd.print(
" Setup"
);
338
lcd.setCursor(0, 1);lcd.print(
" left or right"
);
339
Dreft0 = 1;}}
else
{Dreft0 = 0;}
340
//-------------
341
if
(L_R == 1) {
342
if
(Dreft1 == 0) {
343
ReleMode();
344
lcd.setCursor(0, 3);lcd.print(
" ^^^^ "
);
345
Dreft1 = 1;}}
else
{Dreft1 = 0;}
346
//-------------
347
if
(L_R == 2) {
348
if
(Dreft2 == 0) {
349
ReleMode();
350
lcd.setCursor(0, 3);lcd.print(
" ^^^^^"
);
351
Dreft2 = 1;}}
else
{Dreft2 = 0;}
352
//-------------
353
if
(L_R == 3) {
354
if
(Dreft3 == 0) {
355
A_H = now.hour();
356
A_M = now.minute();
357
ClearNol();
358
PrintTime();
359
lcd.setCursor(0, 3);lcd.print(
"^^"
);
360
Dreft3 = 1;}}
else
{Dreft3 = 0;
if
(chg_Time == 1){rtc.adjust(DateTime(2015, 2, 27, A_H, A_M, 0));}}
361
//-------------
362
if
(L_R == 4) {
363
if
(Dreft4 == 0) {
364
A_H = now.hour();
365
A_M = now.minute();
366
ClearNol();
367
PrintTime();
368
lcd.setCursor(0, 3);lcd.print(
" ^^"
);
369
Dreft4 = 1;}}
else
{Dreft4 = 0;
if
(chg_Time == 1){rtc.adjust(DateTime(2015, 2, 27, A_H, A_M, 0));}}
370
//-------------
371
if
(L_R == 5) {
372
if
(Dreft5 == 0) {
373
ClearNol();
374
KP = myPID.GetKp();
375
KI = myPID.GetKi();
376
KD = myPID.GetKd();
377
lcd.setCursor(0, 0);lcd.print(
"Setup PID controller"
);
378
lcd.setCursor(0, 1);lcd.print(
"Kp "
);
if
(KP < 10) {lcd.print(
"0"
);lcd.print(KP);}
else
{lcd.print(KP);}
379
lcd.setCursor(0, 2);lcd.print(
"Ki "
);
if
(KI < 10) {lcd.print(
"0"
);lcd.print(KI);}
else
{lcd.print(KI);} lcd.print(
" <=="
);
380
lcd.setCursor(0, 3);lcd.print(
"Kd "
);
if
(KD < 10) {lcd.print(
"0"
);lcd.print(KD);}
else
{lcd.print(KD);}
381
Dreft5 = 1;}}
else
{Dreft5 = 0;}
382
//-------------
383
if
(L_R == 6 || L_R == 11 || L_R == 16) {
384
if
(Dreft_MAS_0 == 0) {
385
if
(L_R == 6) {Print_Pat_Screan_Temp();}
386
if
(L_R == 11) {Print_Pat_Screan_Time();}
387
if
(L_R == 16) {Print_Pat_Screan_Alarm();}
388
lcd.setCursor(0, 3);lcd.print(
"^^^^"
);
389
Dreft_MAS_0 = 1;}}
else
{Dreft_MAS_0 = 0;}
390
if
(L_R == 7 || L_R == 12 || L_R == 17) {
391
if
(Dreft_MAS_1 == 0) {
392
if
(L_R == 7) {Print_Pat_Screan_Temp();}
393
if
(L_R == 12) {Print_Pat_Screan_Time();}
394
if
(L_R == 17) {Print_Pat_Screan_Alarm();}
395
lcd.setCursor(4, 3);lcd.print(
"^^^^"
);
396
Dreft_MAS_1 = 1;}}
else
{Dreft_MAS_1 = 0;}
397
if
(L_R == 8 || L_R == 13 || L_R == 18) {
398
if
(Dreft_MAS_2 == 0) {
399
if
(L_R == 8) {Print_Pat_Screan_Temp();}
400
if
(L_R == 13) {Print_Pat_Screan_Time();}
401
if
(L_R == 18) {Print_Pat_Screan_Alarm();}
402
lcd.setCursor(8, 3);lcd.print(
"^^^^"
);
403
Dreft_MAS_2 = 1;}}
else
{Dreft_MAS_2 = 0;}
404
if
(L_R == 9 || L_R == 14 || L_R == 19) {
405
if
(Dreft_MAS_3 == 0) {
406
if
(L_R == 9) {Print_Pat_Screan_Temp();}
407
if
(L_R == 14) {Print_Pat_Screan_Time();}
408
if
(L_R == 19) {Print_Pat_Screan_Alarm();}
409
lcd.setCursor(12, 3);lcd.print(
"^^^^"
);
410
Dreft_MAS_3 = 1;}}
else
{Dreft_MAS_3 = 0;}
411
if
(L_R == 10 || L_R == 15 || L_R == 20) {
412
if
(Dreft_MAS_4 == 0) {
413
if
(L_R == 10) {Print_Pat_Screan_Temp();}
414
if
(L_R == 15) {Print_Pat_Screan_Time();}
415
if
(L_R == 20) {Print_Pat_Screan_Alarm();}
416
lcd.setCursor(16, 3);lcd.print(
"^^^^"
);
417
Dreft_MAS_4 = 1;}}
else
{Dreft_MAS_4 = 0;}
418
419
if
(L_R == 21 || L_R == 26 || L_R == 31) {
420
if
(Dreft_MAS_5 == 0) {
421
if
(L_R == 21) {Print_Pat_Screan_Temp();}
422
if
(L_R == 26) {Print_Pat_Screan_Time();}
423
if
(L_R == 31) {Print_Pat_Screan_Alarm();}
424
lcd.setCursor(0, 3);lcd.print(
"^^^^"
);
425
Dreft_MAS_5 = 1;}}
else
{Dreft_MAS_5 = 0;}
426
if
(L_R == 22 || L_R == 27 || L_R == 32) {
427
if
(Dreft_MAS_6 == 0) {
428
if
(L_R == 22) {Print_Pat_Screan_Temp();}
429
if
(L_R == 27) {Print_Pat_Screan_Time();}
430
if
(L_R == 32) {Print_Pat_Screan_Alarm();}
431
lcd.setCursor(4, 3);lcd.print(
"^^^^"
);
432
Dreft_MAS_6 = 1;}}
else
{Dreft_MAS_6 = 0;}
433
if
(L_R == 23 || L_R == 28 || L_R == 33) {
434
if
(Dreft_MAS_7 == 0) {
435
if
(L_R == 23) {Print_Pat_Screan_Temp();}
436
if
(L_R == 28) {Print_Pat_Screan_Time();}
437
if
(L_R == 33) {Print_Pat_Screan_Alarm();}
438
lcd.setCursor(8, 3);lcd.print(
"^^^^"
);
439
Dreft_MAS_7 = 1;}}
else
{Dreft_MAS_7 = 0;}
440
if
(L_R == 24 || L_R == 29 || L_R == 34) {
441
if
(Dreft_MAS_8 == 0) {
442
if
(L_R == 24) {Print_Pat_Screan_Temp();}
443
if
(L_R == 29) {Print_Pat_Screan_Time();}
444
if
(L_R == 34) {Print_Pat_Screan_Alarm();}
445
lcd.setCursor(12, 3);lcd.print(
"^^^^"
);
446
Dreft_MAS_8 = 1;}}
else
{Dreft_MAS_8 = 0;}
447
if
(L_R == 25 || L_R == 30 || L_R == 35) {
448
if
(Dreft_MAS_9 == 0) {
449
if
(L_R == 25) {Print_Pat_Screan_Temp();}
450
if
(L_R == 30) {Print_Pat_Screan_Time();}
451
if
(L_R == 35) {Print_Pat_Screan_Alarm();}
452
lcd.setCursor(16, 3);lcd.print(
"^^^^"
);
453
Dreft_MAS_9 = 1;}}
else
{Dreft_MAS_9 = 0;}
454
//##################################################################
455
if
(U_D > 5) {
456
//-------------
457
if
(L_R == 1) {
458
if
(T_Upr < 3) {T_Upr += 1;}
459
lcd.setCursor(0, 1);
460
lcd.print(
" MODE TEMP"
);
461
lcd.setCursor(0, 2);
462
if
(T_Upr == 0) {lcd.print(
"1-4 OFF -----"
);}
463
if
(T_Upr == 1) {lcd.print(
"2-4 ON -----"
);}
464
if
(T_Upr == 2) {lcd.print(
"3-4 AUTO "
);lcd.print(Setpoint);lcd.print(
'\0'
);}
465
if
(T_Upr == 3) {lcd.print(
"4-4 PREF -----"
);}
466
lcd.setCursor(0, 3);lcd.print(
" ^^^^ "
);
467
U_D = 5;
468
}
469
//-------------
470
if
(L_R == 2) {
471
if
(T_Upr == 2) {
472
Setpoint += 1;
473
chgTemp = 1;
474
lcd.setCursor(0, 1);
475
lcd.print(
" MODE TEMP"
);
476
lcd.setCursor(0, 2);
477
lcd.print(
"3-4 AUTO "
);
478
lcd.print(Setpoint);lcd.print(
'\0'
);
479
lcd.setCursor(0, 3);lcd.print(
" ^^^^^"
);
480
}
481
U_D = 5;
482
}
483
//-------------
484
if
(L_R == 3) {
485
if
(A_H < 23) {A_H += 1;}
486
chg_Time = 1;
487
PrintTime();
488
lcd.setCursor(0, 3);lcd.print(
"^^"
);
489
U_D = 5;
490
}
491
//-------------
492
if
(L_R == 4) {
493
if
(A_M > 0) {A_M += 1;}
494
chg_Time = 1;
495
PrintTime();
496
lcd.setCursor(0, 3);lcd.print(
" ^^"
);
497
U_D = 5;
498
}
499
//-------------
500
if
(L_R == 5) {
501
if
(KI < 100) {KI += 1;}
else
{KI = 0;}
502
lcd.setCursor(0, 2);lcd.print(
"Ki "
);
if
(KI < 10) {lcd.print(
"0"
);lcd.print(KI);}
else
{lcd.print(KI);} lcd.print(
" <=="
);
503
U_D = 5;
504
}
505
//-------------
506
Upr_PAT();
507
//----------------------------------------------------------------------------------
508
}
else
if
(U_D < 5) {
509
if
(L_R == 1) {
510
if
(T_Upr > 0) {T_Upr -= 1;}
511
lcd.setCursor(0, 1);
512
lcd.print(
" MODE TEMP"
);
513
lcd.setCursor(0, 2);
514
if
(T_Upr == 0) {lcd.print(
"1-4 OFF -----"
);}
515
if
(T_Upr == 1) {lcd.print(
"2-4 ON -----"
);}
516
if
(T_Upr == 2) {lcd.print(
"3-4 AUTO "
);lcd.print(Setpoint);lcd.print(
'\0'
);}
517
if
(T_Upr == 3) {lcd.print(
"4-4 PREF -----"
);}
518
lcd.setCursor(0, 3);lcd.print(
" ^^^^ "
);
519
U_D = 5;
520
}
521
//-------------
522
if
(L_R == 2) {
523
if
(T_Upr == 2) {
524
Setpoint -= 1;
525
chgTemp = 1;
526
lcd.setCursor(0, 1);
527
lcd.print(
" MODE TEMP"
);
528
lcd.setCursor(0, 2);
529
lcd.print(
"3-4 AUTO "
);
530
lcd.print(Setpoint);lcd.print(
'\0'
);
531
lcd.setCursor(0, 3);lcd.print(
" ^^^^^"
);
532
}
533
U_D = 5;
534
}
535
//-------------
536
if
(L_R == 3) {
537
if
(A_H > 0) {A_H -= 1;}
538
chg_Time = 1;
539
PrintTime();
540
lcd.setCursor(0, 3);lcd.print(
"^^"
);
541
U_D = 5;
542
}
543
//-------------
544
if
(L_R == 4) {
545
if
(A_M > 0) {A_M -= 1;}
546
chg_Time = 1;
547
PrintTime();
548
lcd.setCursor(0, 3);lcd.print(
" ^^"
);
549
U_D = 5;
550
}
551
//-------------
552
if
(L_R == 5) {
553
if
(KI > 0) {KI -= 1;}
else
{KI = 100;}
554
lcd.setCursor(0, 2);lcd.print(
"Ki "
);
if
(KI < 10) {lcd.print(
"0"
);lcd.print(KI);}
else
{lcd.print(KI);} lcd.print(
" <=="
);
555
U_D = 5;
556
}
557
558
//-------------
559
Upr_PAT();
560
//-------------
561
}
562
}
563
}
564
565
void
Prokachka(){
566
int
TempINNasos = abs(Input);
567
568
if
(TempINNasos < 40) {
569
NasosPromyvka();
// 3 запуска длительностью в 1 секунду
570
}
571
else
if
(TempINNasos > 40) {
572
digitalWrite(NASOS, HIGH);
// постоянная работа
573
}
574
else
if
(TempINNasos > 70) {
575
digitalWrite(NASOS, LOW);
// отключение
576
}
577
else
if
(TempINNasos > 90) {
578
NasosKipyachenie();
// вклячатся на 1 минуту с интервалом 10 минут
579
}
580
if
(EndOFNasos == 1) {DO_EVERY(_MIN_(5),{digitalWrite(NASOS,LOW);});EndOFNasos = 0;}
// Включение насоса на 5 минут после завершения программ
581
}
582
583
void
NasosPromyvka(){
584
if
(tekPovtor_Promyvka < Povtor_Promyvka *2){
585
DO_EVERY(3000,{digitalWrite(NASOS,!digitalRead(NASOS)); tekPovtor_Promyvka += 1;});
586
}
else
{digitalWrite(NASOS,LOW);}
587
/*
588
DO_EVERY(_SEC_(20),{digitalWrite(NASOS,HIGH);});
589
DO_EVERY(_SEC_(5),{digitalWrite(NASOS,LOW);}); */
590
}
591
592
void
NasosKipyachenie(){
593
DO_EVERY(_MIN_(10),{digitalWrite(NASOS,HIGH);});
594
DO_EVERY(_MIN_(1),{digitalWrite(NASOS,LOW);});
595
}
596
597
void
PrintTime(){
598
lcd.setCursor(0, 0); lcd.print(
"Setup Time"
);
599
// lcd.setCursor(0, 1); lcd.print(now.hour()); lcd.print(":"); lcd.print(now.minute()); lcd.print(":"); lcd.print(now.second());
600
lcd.setCursor(0, 2);
if
(A_H < 10) {lcd.print(
"0"
);lcd.print(A_H);}
else
{lcd.print(A_H);} lcd.print(
":"
);
if
(A_M < 10) {lcd.print(
"0"
);lcd.print(A_M);}
else
{lcd.print(A_M);} lcd.print(
":00 - New Time"
);
601
}
602
603
void
ReleMode(){
604
ClearNol();
605
lcd.print(
"Setup Rele MODE"
);
606
lcd.setCursor(0, 1);
607
lcd.print(
" MODE TEMP"
);
608
lcd.setCursor(0, 2);
609
if
(T_Upr == 0) {lcd.print(
"1-4 OFF -----"
);}
610
if
(T_Upr == 1) {lcd.print(
"2-4 ON -----"
);}
611
if
(T_Upr == 2) {lcd.print(
"3-4 AUTO "
); Setpoint = EEPROM.read(110); lcd.print(Setpoint);lcd.print(
'\0'
);}
612
if
(T_Upr == 3) {lcd.print(
"4-4 PREF -----"
);}
613
}
614
615
void
Upr_PAT(){
616
if
(L_R == 6 || L_R == 11 || L_R == 16) {
617
if
(L_R == 6) {
618
CHG_P_Temp();
619
Print_Pat_Screan_Temp();
620
}
621
if
(L_R == 11) {
622
CHG_P_Time();
623
Print_Pat_Screan_Time();
624
}
625
if
(L_R == 16) {
626
CHG_P_Alar();
627
Print_Pat_Screan_Alarm();
628
}
629
lcd.setCursor(0, 3);lcd.print(
"^^^^"
);
630
U_D = 5;
631
}
632
if
(L_R == 7 || L_R == 12 || L_R == 17) {
633
if
(L_R == 7) {
634
CHG_P_Temp();
635
Print_Pat_Screan_Temp();
636
}
637
if
(L_R == 12) {
638
CHG_P_Time();
639
Print_Pat_Screan_Time();
640
}
641
if
(L_R == 17) {
642
CHG_P_Alar();
643
Print_Pat_Screan_Alarm();
644
}
645
lcd.setCursor(4, 3);lcd.print(
"^^^^"
);
646
U_D = 5;
647
}
648
if
(L_R == 8 || L_R == 13 || L_R == 18) {
649
if
(L_R == 8) {
650
CHG_P_Temp();
651
Print_Pat_Screan_Temp();
652
}
653
if
(L_R == 13) {
654
CHG_P_Time();
655
Print_Pat_Screan_Time();
656
}
657
if
(L_R == 18) {
658
CHG_P_Alar();
659
Print_Pat_Screan_Alarm();
660
}
661
lcd.setCursor(8, 3);lcd.print(
"^^^^"
);
662
U_D = 5;
663
}
664
if
(L_R == 9 || L_R == 14 || L_R == 19) {
665
if
(L_R == 9) {
666
CHG_P_Temp();
667
Print_Pat_Screan_Temp();
668
}
669
if
(L_R == 14) {
670
CHG_P_Time();
671
Print_Pat_Screan_Time();
672
}
673
if
(L_R == 19) {
674
CHG_P_Alar();
675
Print_Pat_Screan_Alarm();
676
}
677
lcd.setCursor(12, 3);lcd.print(
"^^^^"
);
678
U_D = 5;
679
}
680
if
(L_R == 10 || L_R == 15 || L_R == 20) {
681
if
(L_R == 10) {
682
CHG_P_Temp();
683
Print_Pat_Screan_Temp();
684
}
685
if
(L_R == 15) {
686
CHG_P_Time();
687
Print_Pat_Screan_Time();
688
}
689
if
(L_R == 20) {
690
CHG_P_Alar();
691
Print_Pat_Screan_Alarm();
692
}
693
lcd.setCursor(16, 3);lcd.print(
"^^^^"
);
694
U_D = 5;
695
}
696
if
(L_R == 21 || L_R == 26 || L_R == 31) {
697
if
(L_R == 21) {
698
CHG_P_Temp();
699
Print_Pat_Screan_Temp();
700
}
701
if
(L_R == 26) {
702
CHG_P_Time();
703
Print_Pat_Screan_Time();
704
}
705
if
(L_R == 31) {
706
CHG_P_Alar();
707
Print_Pat_Screan_Alarm();
708
}
709
lcd.setCursor(0, 3);lcd.print(
"^^^^"
);
710
U_D = 5;
711
}
712
if
(L_R == 22 || L_R == 27 || L_R == 32) {
713
if
(L_R == 22) {
714
CHG_P_Temp();
715
Print_Pat_Screan_Temp();
716
}
717
if
(L_R == 27) {
718
CHG_P_Time();
719
Print_Pat_Screan_Time();
720
}
721
if
(L_R == 32) {
722
CHG_P_Alar();
723
Print_Pat_Screan_Alarm();
724
}
725
lcd.setCursor(4, 3);lcd.print(
"^^^^"
);
726
U_D = 5;
727
}
728
if
(L_R == 23 || L_R == 28 || L_R == 33) {
729
if
(L_R == 23) {
730
CHG_P_Temp();
731
Print_Pat_Screan_Temp();
732
}
733
if
(L_R == 28) {
734
CHG_P_Time();
735
Print_Pat_Screan_Time();
736
}
737
if
(L_R == 33) {
738
CHG_P_Alar();
739
Print_Pat_Screan_Alarm();
740
}
741
lcd.setCursor(8, 3);lcd.print(
"^^^^"
);
742
U_D = 5;
743
}
744
if
(L_R == 24 || L_R == 29 || L_R == 34) {
745
if
(L_R == 24) {
746
CHG_P_Temp();
747
Print_Pat_Screan_Temp();
748
}
749
if
(L_R == 29) {
750
CHG_P_Time();
751
Print_Pat_Screan_Time();
752
}
753
if
(L_R == 34) {
754
CHG_P_Alar();
755
Print_Pat_Screan_Alarm();
756
}
757
lcd.setCursor(12, 3);lcd.print(
"^^^^"
);
758
U_D = 5;
759
}
760
if
(L_R == 25 || L_R == 30 || L_R == 35) {
761
if
(L_R == 25) {
762
CHG_P_Temp();
763
Print_Pat_Screan_Temp();
764
}
765
if
(L_R == 30) {
766
CHG_P_Time();
767
Print_Pat_Screan_Time();
768
}
769
if
(L_R == 35) {
770
CHG_P_Alar();
771
Print_Pat_Screan_Alarm();
772
}
773
lcd.setCursor(16, 3);lcd.print(
"^^^^"
);
774
U_D = 5;
775
}
776
}
777
778
779
780
void
CHG_P_Temp(){
781
if
(U_D > 5) {
782
if
(Dreft_MAS_0 == 1) {
if
(Pat[0][P_Temp] < 100) {Pat[0][P_Temp] += 1;}}
783
if
(Dreft_MAS_1 == 1) {
if
(Pat[1][P_Temp] < 100) {Pat[1][P_Temp] += 1;}}
784
if
(Dreft_MAS_2 == 1) {
if
(Pat[2][P_Temp] < 100) {Pat[2][P_Temp] += 1;}}
785
if
(Dreft_MAS_3 == 1) {
if
(Pat[3][P_Temp] < 100) {Pat[3][P_Temp] += 1;}}
786
if
(Dreft_MAS_4 == 1) {
if
(Pat[4][P_Temp] < 100) {Pat[4][P_Temp] += 1;}}
787
if
(Dreft_MAS_5 == 1) {
if
(Pat[5][P_Temp] < 100) {Pat[5][P_Temp] += 1;}}
788
if
(Dreft_MAS_6 == 1) {
if
(Pat[6][P_Temp] < 100) {Pat[6][P_Temp] += 1;}}
789
if
(Dreft_MAS_7 == 1) {
if
(Pat[7][P_Temp] < 100) {Pat[7][P_Temp] += 1;}}
790
if
(Dreft_MAS_8 == 1) {
if
(Pat[8][P_Temp] < 100) {Pat[8][P_Temp] += 1;}}
791
if
(Dreft_MAS_9 == 1) {
if
(Pat[9][P_Temp] < 100) {Pat[9][P_Temp] += 1;}}}
792
else
{
793
if
(Dreft_MAS_0 == 1) {
if
(Pat[0][P_Temp] > 0) {Pat[0][P_Temp] -= 1;}}
794
if
(Dreft_MAS_1 == 1) {
if
(Pat[1][P_Temp] > 0) {Pat[1][P_Temp] -= 1;}}
795
if
(Dreft_MAS_2 == 1) {
if
(Pat[2][P_Temp] > 0) {Pat[2][P_Temp] -= 1;}}
796
if
(Dreft_MAS_3 == 1) {
if
(Pat[3][P_Temp] > 0) {Pat[3][P_Temp] -= 1;}}
797
if
(Dreft_MAS_4 == 1) {
if
(Pat[4][P_Temp] > 0) {Pat[4][P_Temp] -= 1;}}
798
if
(Dreft_MAS_5 == 1) {
if
(Pat[5][P_Temp] > 0) {Pat[5][P_Temp] -= 1;}}
799
if
(Dreft_MAS_6 == 1) {
if
(Pat[6][P_Temp] > 0) {Pat[6][P_Temp] -= 1;}}
800
if
(Dreft_MAS_7 == 1) {
if
(Pat[7][P_Temp] > 0) {Pat[7][P_Temp] -= 1;}}
801
if
(Dreft_MAS_8 == 1) {
if
(Pat[8][P_Temp] > 0) {Pat[8][P_Temp] -= 1;}}
802
if
(Dreft_MAS_9 == 1) {
if
(Pat[9][P_Temp] > 0) {Pat[9][P_Temp] -= 1;}}}
803
}
804
void
CHG_P_Time(){
805
if
(U_D > 5) {
806
if
(Dreft_MAS_0 == 1) {
if
(Pat[0][P_Time] < 32000) {Pat[0][P_Time] += 1;}}
807
if
(Dreft_MAS_1 == 1) {
if
(Pat[1][P_Time] < 32000) {Pat[1][P_Time] += 1;}}
808
if
(Dreft_MAS_2 == 1) {
if
(Pat[2][P_Time] < 32000) {Pat[2][P_Time] += 1;}}
809
if
(Dreft_MAS_3 == 1) {
if
(Pat[3][P_Time] < 32000) {Pat[3][P_Time] += 1;}}
810
if
(Dreft_MAS_4 == 1) {
if
(Pat[4][P_Time] < 32000) {Pat[4][P_Time] += 1;}}
811
if
(Dreft_MAS_5 == 1) {
if
(Pat[5][P_Time] < 32000) {Pat[5][P_Time] += 1;}}
812
if
(Dreft_MAS_6 == 1) {
if
(Pat[6][P_Time] < 32000) {Pat[6][P_Time] += 1;}}
813
if
(Dreft_MAS_7 == 1) {
if
(Pat[7][P_Time] < 32000) {Pat[7][P_Time] += 1;}}
814
if
(Dreft_MAS_8 == 1) {
if
(Pat[8][P_Time] < 32000) {Pat[8][P_Time] += 1;}}
815
if
(Dreft_MAS_9 == 1) {
if
(Pat[9][P_Time] < 32000) {Pat[9][P_Time] += 1;}}}
816
else
{
817
if
(Dreft_MAS_0 == 1) {
if
(Pat[0][P_Time] > 0) {Pat[0][P_Time] -= 1;}}
818
if
(Dreft_MAS_1 == 1) {
if
(Pat[1][P_Time] > 0) {Pat[1][P_Time] -= 1;}}
819
if
(Dreft_MAS_2 == 1) {
if
(Pat[2][P_Time] > 0) {Pat[2][P_Time] -= 1;}}
820
if
(Dreft_MAS_3 == 1) {
if
(Pat[3][P_Time] > 0) {Pat[3][P_Time] -= 1;}}
821
if
(Dreft_MAS_4 == 1) {
if
(Pat[4][P_Time] > 0) {Pat[4][P_Time] -= 1;}}
822
if
(Dreft_MAS_5 == 1) {
if
(Pat[5][P_Time] > 0) {Pat[5][P_Time] -= 1;}}
823
if
(Dreft_MAS_6 == 1) {
if
(Pat[6][P_Time] > 0) {Pat[6][P_Time] -= 1;}}
824
if
(Dreft_MAS_7 == 1) {
if
(Pat[7][P_Time] > 0) {Pat[7][P_Time] -= 1;}}
825
if
(Dreft_MAS_8 == 1) {
if
(Pat[8][P_Time] > 0) {Pat[8][P_Time] -= 1;}}
826
if
(Dreft_MAS_9 == 1) {
if
(Pat[9][P_Time] > 0) {Pat[9][P_Time] -= 1;}}}
827
}
828
829
void
CHG_P_Alar(){
830
if
(U_D > 5) {
831
if
(Dreft_MAS_0 == 1) {Pat[0][P_Alar] = 1;}
832
if
(Dreft_MAS_1 == 1) {Pat[1][P_Alar] = 1;}
833
if
(Dreft_MAS_2 == 1) {Pat[2][P_Alar] = 1;}
834
if
(Dreft_MAS_3 == 1) {Pat[3][P_Alar] = 1;}
835
if
(Dreft_MAS_4 == 1) {Pat[4][P_Alar] = 1;}
836
if
(Dreft_MAS_5 == 1) {Pat[5][P_Alar] = 1;}
837
if
(Dreft_MAS_6 == 1) {Pat[6][P_Alar] = 1;}
838
if
(Dreft_MAS_7 == 1) {Pat[7][P_Alar] = 1;}
839
if
(Dreft_MAS_8 == 1) {Pat[8][P_Alar] = 1;}
840
if
(Dreft_MAS_9 == 1) {Pat[9][P_Alar] = 1;}}
841
else
{
842
if
(Dreft_MAS_0 == 1) {Pat[0][P_Alar] = 0;}
843
if
(Dreft_MAS_1 == 1) {Pat[1][P_Alar] = 0;}
844
if
(Dreft_MAS_2 == 1) {Pat[2][P_Alar] = 0;}
845
if
(Dreft_MAS_3 == 1) {Pat[3][P_Alar] = 0;}
846
if
(Dreft_MAS_4 == 1) {Pat[4][P_Alar] = 0;}
847
if
(Dreft_MAS_5 == 1) {Pat[5][P_Alar] = 0;}
848
if
(Dreft_MAS_6 == 1) {Pat[6][P_Alar] = 0;}
849
if
(Dreft_MAS_7 == 1) {Pat[7][P_Alar] = 0;}
850
if
(Dreft_MAS_8 == 1) {Pat[8][P_Alar] = 0;}
851
if
(Dreft_MAS_9 == 1) {Pat[9][P_Alar] = 0;}}
852
}
853
854
void
Print_Pat_Screan_Temp(){
855
ClearNol();
856
cur = 1;
857
if
(L_R <= 20){
858
lcd.print(
"Setup PAT Temp"
);
859
for
(
int
i = 0; i <= 4; i++) {
860
if
(cur == 1) {lcd.setCursor(cur, 1);lcd.print(
"P"
);lcd.print(i);}
else
{lcd.setCursor(cur, 1);lcd.print(
"P"
);lcd.print(i);}
861
cur += 4;
862
}
863
cur = 0;
864
for
(
int
i = 0; i < 5; i++) {
865
R_Numb = i;
866
if
(cur == 1) {lcd.setCursor(cur, 2);}
else
{lcd.setCursor(cur, 2);}
867
cur += 4;
868
lcd.print(Pat[R_Numb][P_Temp]);
869
}
870
}
else
{
871
lcd.print(
"Setup PAT Temp"
);
872
cur = 1;
873
for
(
int
i = 5; i <= 9; i++) {
874
if
(cur == 1) {lcd.setCursor(cur, 1);lcd.print(
"P"
);lcd.print(i);}
else
{lcd.setCursor(cur, 1);lcd.print(
"P"
);lcd.print(i);}
875
cur += 4;
876
}
877
cur = 0;
878
for
(
int
i = 5; i < 10; i++) {
879
R_Numb = i;
880
if
(cur == 1) {lcd.setCursor(cur, 2);}
else
{lcd.setCursor(cur, 2);}
881
cur += 4;
882
lcd.print(Pat[R_Numb][P_Temp]);
883
}
884
}
885
}
886
void
Print_Pat_Screan_Time(){
887
ClearNol();
888
cur = 1;
889
if
(L_R <= 20){
890
lcd.print(
"Setup PAT Time"
);
891
for
(
int
i = 0; i <= 4; i++) {
892
if
(cur == 1) {lcd.setCursor(cur, 1);lcd.print(
"P"
);lcd.print(i);}
else
{lcd.setCursor(cur, 1);lcd.print(
"P"
);lcd.print(i);}
893
cur += 4;
894
}
895
cur = 0;
896
for
(
int
i = 0; i < 5; i++) {
897
R_Numb = i;
898
if
(cur == 0) {lcd.setCursor(cur, 2);}
else
{lcd.setCursor(cur, 2);}
899
cur += 4;
900
if
(Pat[R_Numb][P_Time] < 10){lcd.print(Pat[R_Numb][P_Time]);lcd.print(
" "
);}
else
{lcd.print(Pat[R_Numb][P_Time]);}
901
}
902
}
else
{
903
cur = 1;
904
lcd.print(
"Setup PAT Time"
);
905
for
(
int
i = 5; i <= 9; i++) {
906
if
(cur == 1) {lcd.setCursor(cur, 1);lcd.print(
"P"
);lcd.print(i);}
else
{lcd.setCursor(cur, 1);lcd.print(
"P"
);lcd.print(i);}
907
cur += 4;
908
}
909
cur = 0;
910
for
(
int
i = 5; i < 10; i++) {
911
R_Numb = i;
912
if
(cur == 0) {lcd.setCursor(cur, 2);}
else
{lcd.setCursor(cur, 2);}
913
cur += 4;
914
if
(Pat[R_Numb][P_Time] < 10){lcd.print(Pat[R_Numb][P_Time]);lcd.print(
" "
);}
else
{lcd.print(Pat[R_Numb][P_Time]);}
915
}
916
}
917
}
918
void
Print_Pat_Screan_Alarm(){
919
ClearNol();
920
cur = 1;
921
if
(L_R <= 20){
922
lcd.print(
"Setup PAT Alarm"
);
923
for
(
int
i = 0; i <= 4; i++) {
924
if
(cur == 1) {lcd.setCursor(cur, 1);lcd.print(
"P"
);lcd.print(i);}
else
{lcd.setCursor(cur, 1);lcd.print(
"P"
);lcd.print(i);}
925
cur += 4;
926
}
927
cur = 0;
928
for
(
int
i = 0; i < 5; i++) {
929
R_Numb = i;
930
if
(cur == 0) {lcd.setCursor(cur, 2);}
else
{lcd.setCursor(cur, 2);}
931
cur += 4;
932
if
(Pat[R_Numb][P_Alar] == 0){lcd.print(
"OFF"
);}
else
{lcd.print(
"ON"
);}
933
}
934
}
else
{
935
cur = 1;
936
lcd.print(
"Setup PAT Alarm"
);
937
for
(
int
i = 5; i <= 9; i++) {
938
if
(cur == 1) {lcd.setCursor(cur, 1);lcd.print(
"P"
);lcd.print(i);}
else
{lcd.setCursor(cur, 1);lcd.print(
"P"
);lcd.print(i);}
939
cur += 4;
940
}
941
cur = 0;
942
for
(
int
i = 5; i < 10; i++) {
943
R_Numb = i;
944
if
(cur == 0) {lcd.setCursor(cur, 2);}
else
{lcd.setCursor(cur, 2);}
945
cur += 4;
946
if
(Pat[R_Numb][P_Alar] == 0){lcd.print(
"OFF"
);}
else
{lcd.print(
"ON"
);}
947
}
948
}
949
}
950
951
void
ClearNol(){
952
lcd.clear();
953
lcd.setCursor(0, 0);
954
}
955
956
void
getPressedButton() {
957
DO_EVERY(noTrem,{
if
(analogRead(0) < 100) {L_R--;}});
958
DO_EVERY(noTrem,{
if
(analogRead(0) > 1000){L_R++;}});
959
DO_EVERY(noTrem,{
if
(analogRead(1) < 100) {U_D++;}});
960
DO_EVERY(noTrem,{
if
(analogRead(1) > 1000){U_D--;}});
961
if
(L_R < 0){L_R = PunkMenu;}
962
if
(L_R > PunkMenu){L_R = 0;}
963
}
964
965
void
getTemp() {
966
ds.reset();
967
ds.select(addr);
968
ds.write(0x44, 1);
969
ds.reset();
970
ds.select(addr);
971
ds.write(0xBE);
972
for
(
int
i = 0; i < 9; i++) {
973
data[i] = ds.read();
974
}
975
int16_t raw = (data[1] << 8) | data[0];
976
if
(type_s) {
977
raw = raw << 3;
978
if
(data[7] == 0x10) {
979
raw = (raw & 0xFFF0) + 12 - data[6];
980
}
981
}
else
{
982
byte
cfg = (data[4] & 0x60);
983
if
(cfg == 0x00) raw = raw & ~7;
984
else
if
(cfg == 0x20) raw = raw & ~3;
985
else
if
(cfg == 0x40) raw = raw & ~1;
986
}
987
988
celsius = (
float
)raw / 16.0;
989
return
;
990
}
Добрый день. Проконсультируйте будет ваша прошивка работать на Мега 2560 и экран
TFT 320QUT и что для этого надо.
Прошивка работать будет, но для использования указанной вами модели экрана необходимо использоваь другую библиотеку (я использую LiquidCrystal_I2C.h вам она не подайдет), и соответственно поменять больше половины кода отрисовывания менюшек. Одним словом вам будет проще написать с вой код.
Предварительный монтаж. В дальнейшем всё будет собранно на одной плате.
Также снгодня будут купленны разьемы на корпус для подключения тена, насоса, 220 вольт, и датчика температуры.
Датчик температуры будет запаян Оловянно-медным припоем в отверстие 6,5 высверленное в болте. Пустота между датчиком и болтом будет заполнена теплопроводящим клей-герметиком.
Купленны разьемы для подключения внешних устройств (тен, насос, датчик ds18b20) кнопка ресет, и клавишный общий выключатель.
Да, было бы не плохо научиться писать код.
Пока нравиться! Смущает только здоровый радиатор у пластика, но это все суеверия. Ждем фото общего готовго проджекта!
Почти готовый коньтроллер.
Почти готовый БАК.
Тестовый запуск всей конструкции.
Работа Бака
https://youtu.be/vtRUYCUEHXE
Работа контроллера
https://youtu.be/e4MfLSn30cs
Прект входит в заключительную стадию отладки и тестирования.
Испытание чиллира.
Итак первая партия домашнего пива прошла 50% отстаивания в бутылках (на следующие выходные буду пробовать)
Ссылки с рецептами.
http://rossibeer.ru/recepty-piva
http://www.castlemalting.com/CastleMaltingBeerRecipes.asp?Language=Russian
Котел 5091 http://www.klenmarket.ru/shop/inventory/kitchen-equipment/boilers/boiler-50-l-professional-luxstahl-101307/
Внутренний бак 6950 http://hbpro.ru/showcase/zheleznyj-kit-30l.7/
Насос 4750 http://вортекс-центр.рф/shop/n-gvs/bw152r12ot.html
ТЭН 2100 http://hbpro.ru/showcase/tehn-dlja-klona-20l.18/
Кран шаровой ½ дюйма, ножки для бака, фитинг для насоса (врезка в бак ½ дюйма, переходник американка вн-внеш резьба ½ дюйма, уголок внутр-внеш резьба ½ дюйма), прокладки ~ 1500-2000
Болт+гайки из нержи для датчика ~ 200 рублей
Чиллер 3500 http://hbpro.ru/showcase/chiller-dlja-klona-20l.24/
Из инструмента пришлось купить тиски, сверла кобальтовые (по нерже) разного диаметра, припой безсвинцовый, термоклей. На это еще где-то 3500 вышло.
Итого средняя стоимость проекта 31650 в среднем.
Пока нравиться! Смущает только здоровый радиатор у пластика, но это все суеверия. Ждем фото общего готовго проджекта!
Данный радиатор больше для перестраховки, в проццесе работы он немного тепленький. в следующей версии прошивки, я буду использовать немного другой алгоритм управления ТЕНом, поэтому от такого радиатора можно будет отказатся.
Процесс варки пивного сусла.
https://youtu.be/vjlG784vqak
Первая партия готова!
И как это на вкус?
И как это на вкус?
Ну мой комментарий вкуса будет предвзят априори, Но друзья которые пробовали говорят что не уступает магазинному разливному а то и превосходит его.
Вкус мягкий, насыщенный, в меру алкогольный (приблизительно 5,5 - 6 градусов).
Хороший вкус у пива -- это когда его хочется выпить много, за исключением случаев, когда хочется выпить все равно чего. :)
Круто! Реально круто! позже детальней рассмотрю, логика особенно интересна для пивоварения. А насчет сэма, пока меня трудно переубедить, хочу свою теорию реализовать в практику.
Переосмыслев всю логику и ошибки предыдущего контроллера начал разрабатывать новую версию с более одекватным меню, улучшенной производительностью и логикой, а также энкодером и SD кртой для загрузки файлов с рецептами.
готовый на 70% код (профильный режим в проццесе написания)
для простоты проект разбит на 8 файлов (но это не обязательно можно весь код сохранить в один файл)
001
// Last Relise - 05/08/2015 Alpha //
002
// Last Relise - 21/08/2015 Betha //
003
// Last Relise - 00/00/0000 Relise //
004
/////////////////////////////////////
005
006
007
008
#include <SD.h>
009
#include <SPI.h>
010
#include <Wire.h>
011
#include <EEPROM.h>
012
#include <Encoder.h>
013
#include <OneWire.h>
014
#include <LiquidCrystal_I2C.h>
015
#include <DS1307.h>
016
#include <RTClib.h>
017
#include <PID_v1.h>
018
#include <IniFile.h>
019
#include <TimeHelpers.h>
020
021
#define DEBUG
022
// #define ENCODER_DO_NOT_USE_INTERRUPTS
023
024
#define ONE_WIRE_BUS 7 // Порт шина датчика температуры
025
#define SD_SELECT 4 // Порт шина CS SD карты
026
#define ButtonEnc 8 // Порт кнопка энкодора
027
#define TEN1 13 // Порт шины нагревательного элемента 1
028
#define TEN2 6 // Порт шины нагревательного элемента 2
029
#define NASOS 9 // Порт шины рециркуляционного насоса
030
#define BUZZ 5 // Порт выхода на пьезоизлучатель
031
//
032
#define P_Temp 0 // Поле масива с данными температуры
033
#define P_Time 1 // Поле масива с данными времени
034
#define P_Alar 2 // Поле масива с данными сигнализации
035
#define BobleOff_tim 3000 // Время продувки насоса
036
037
//``````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````
038
byte
type_s;
// Создание переменной типа датчика измерения температуры
039
byte
data[12];
// Создание переменной данных датчика температуры
040
byte
addr[8];
// Создание переменной адреса датчика температуры
041
//
042
long
Pos;
// Создание переменной нового положения энкодера
043
long
position;
// Создание переменной текущего положения энкодера
044
long
NeoTime = 0;
// Создание переменной хранения значения unix времени конца выполнения программы
045
//
046
const
size_t bufferLen = 30;
// Создания константы размера буфера строк читаемых из ini файла
047
//
048
char
buffer[bufferLen];
// Создания буфера строк читаемых из ini файла
049
//
050
double
Setpoint;
// Создание переменной устанавливаемой температуры (и передача данных из памяти)
051
double
Input;
// Создание переменной входящих данных в ПИД регулятор
052
double
Output;
// Создание переменной исходящих данных из ПИД регулятора
053
double
consKp = 5;
// Создание переменных констант ПИД регулятора
054
double
consKi = 75;
// Создание переменных констант ПИД регулятора
055
double
consKd = 1;
// Создание переменных констант ПИД регулятора
056
//
057
String FileiniNAMEAn;
058
String FileiniNAME;
059
// 0 1 2 3 4 5 6 7 8 9
060
const
String Prog[10] = {
"PROG_1"
,
"PROG_2"
,
"PROG_3"
,
"PROG_4"
,
"PROG_5"
,
"PROG_6"
,
"PROG_7"
,
"PROG_8"
,
"PROG_9"
,
"PROG_10"
};
061
int
Pat[10][3] = {{20,0,0}, {20,0,0}, {20,0,0}, {20,0,0}, {20,0,0}, {20,0,0}, {20,0,0}, {20,0,0}, {20,0,0}, {20,0,0} };
062
int
prog = 0;
063
int
mem1 = 0;
064
int
mem2 = 0;
065
int
mem3 = 0;
066
int
Nasos_Start = 30;
067
int
Nasos_Stop = 80;
068
int
PID_SPEED = 3;
069
int
UPGRADE = 1000;
// Частота обновления главного экрана в милисикундах
070
int
_HR = 0;
// Создание переменной хранения значения часов
071
int
_MI = 0;
// Создание переменной хранения значения минут
072
int
_SE = 0;
// Создание переменной хранения значения секунд
073
int
A_H = 0;
// Создание переменной хранения значения часов при изменении времени
074
int
A_M = 0;
// Создание переменной хранения значения минут при изменении времени
075
int
maxMenu = 40;
// Отсчет от 0 (количество пунктов -1).
076
int
curMenu = 0;
// Значение текущего пункта меню.
077
int
Moschnost;
// Создание переменной мощности нагревательного элемента
078
int
T_Upr = 0;
// Режим работы.
079
int
P_Numb = 0;
// Создание переменной определения пункта масива програмируемых периодов (общего назначения)
080
int
BobleOff_tec1 = 0;
// Создание переменной хранения времени прошедшего с начала промывки насоса
081
int
BobleOff_tec2 = 0;
// Создание переменной хранения времени прошедшего с начала промывки насоса
082
int
vinti = 0;
// Создание переменной винтика :)
083
int
cardti = 0;
// Создание переменной карточки :)
084
//
085
long
unixt;
// Создание переменной хранения текущего unix времени
086
long
Sec;
// Создание переменной временивыполнения программы
087
//
088
float
Mic1 = 0;
// Переменные измерения производительности
089
float
Mic2 = 0;
// Переменные измерения производительности
090
float
celsius;
// Создание переменной значения измерений датчика температуры
091
//
092
boolean StartTime =
false
;
// Создание переменной начала работы по заданному переоду (Р1 - Р9)
093
boolean Rabota =
true
;
// Создание переменной дополнительная переменная управления переключением периодов (Р1 - Р9)
094
boolean Alarm =
false
;
// Создание переменной значения сигнализации
095
boolean Pause =
false
;
// Создание переменной паузы в варке
096
boolean BobleOff =
true
;
// Создание переменной продувки насоса
097
boolean BobleOffst =
true
;
// Создание переменной продувки насоса
098
boolean rasTempBol =
false
;
// Создание переменной флага необходимости расчета времени
099
boolean tr_menu =
false
;
// Признак входа в меню настройки.
100
boolean dir =
false
;
// Признак переключения между вводом данных и листанием меню.
101
boolean keyPres =
false
;
// Признак исплнния клика по кнопке.
102
boolean STATUS =
false
;
// Состояние предохранителя (программа включена/выключенна)
103
boolean Udate =
true
;
// Обновление основного экрана
104
boolean SD_stat =
false
;
// Определяет наличие или отсутствие SD карты.
105
//``````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````
106
107
uint8_t vint1[8] = {B00000, B00111, B00101, B11111, B00100, B00100, B00000, B00000,};
108
uint8_t vint2[8] = {B00000, B00100, B00100, B11111, B00101, B00111, B00000, B00000,};
109
uint8_t vint3[8] = {B00000, B00100, B00100, B11111, B10100, B11100, B00000, B00000,};
110
uint8_t vint4[8] = {B00000, B11100, B10100, B11111, B00100, B00100, B00000, B00000,};
111
uint8_t gradus[8] = {B01000, B10100, B10100, B01000, B00000, B00000, B00000, B00000,};
112
uint8_t card[8] = {B00000, B00000, B01111, B10101, B10001, B11111, B11111, B11111,};
113
uint8_t curs[8] = {B11000, B11100, B11110, B11111, B11110, B11100, B11000, B00000,};
114
115
RTC_DS1307 rtc;
// Инициализация Часов точного времени
116
OneWire ds(ONE_WIRE_BUS);
// Инициализация шины датчика измерения температуры
117
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Инициализация дисплея
118
DateTime now;
// Создания объекта Часов точного времени
119
PID myPID(&Input, &Output, &Setpoint, consKp, consKi, consKd, DIRECT);
// Инициализация ПИД регулятора
120
Encoder myEnc(2, 3);
// инициализация энкодера
121
File root;
122
File entry;
123
124
125
class
BUTTON {
126
public
:
127
//================================================================
128
static
const
byte
bounce_ = 50;
// длительность отслеживания дребезга.
129
static
const
byte
doubleclick_ = 200;
// длительность отслеживания двойного клика.
130
static
const
unsigned
int
retention_ = 2000;
// длительность отслеживания нажатия и удержания.
131
static
const
unsigned
long
timer_ = 60000;
// длительность отслеживания неактивности.
132
//================================================================
133
boolean click_down;
134
boolean click_up;
135
boolean doubleclick;
136
boolean timer;
137
boolean retention;
138
//=================================
139
unsigned
long
m;
140
boolean p;
141
boolean b;
142
boolean dc;
143
byte
c;
144
boolean t;
145
boolean r;
146
//=================================
147
byte
_pb;
148
//=================================
149
BUTTON(
byte
pb) {
150
_pb = pb;
151
pinMode(_pb, INPUT);
152
digitalWrite(_pb, 1);
153
//====
154
click_down = 0;
155
click_up = 0;
156
doubleclick = 0;
157
timer = 0;
158
retention = 0;
159
//====
160
m = millis();
161
p = digitalRead(_pb);
162
b = 0;
163
dc = 0;
164
c = 0;
165
t = 0;
166
r = 0;
167
//====
168
}
169
170
void
read() {
171
//=======================================================
172
unsigned
long
nm = millis();
173
boolean np = digitalRead(_pb);
174
//=================
175
boolean nb = 0;
176
boolean ndc = 0;
177
boolean nt = 0;
178
boolean nr = 0;
179
//================
180
click_down = 0;
181
click_up = 0;
182
doubleclick = 0;
183
timer = 0;
184
retention = 0;
185
//=================
186
if
(np != p) {p = np; m = nm; }
187
//=======================================================
188
if
(nm - m > bounce_) {nb = 1;}
189
if
(nm - m > doubleclick_) {ndc = 1;}
190
if
(ndc != dc) {dc = ndc;
if
(dc == 1) {c = 0;}}
191
if
(nb != b) {b = nb;
192
if
(p == 0 && b == 0) {click_down = 1;
193
++c;
if
(c == 2) {c = 0; doubleclick = 1;}
194
}
195
if
(p == 1 && b == 1) {click_up = 1;}
196
}
197
//=======================================================
198
if
(nm - m > timer_) {nt = 1;}
199
if
(nt != t) {t = nt;
if
(p == 1 && t == 1) {timer = 1;}}
200
//=======================================================
201
if
(nm - m > retention_) {nr = 1;}
202
if
(nr != r) {r = nr;
if
(p == 0 && r == 1) {retention = 1;}}
203
//=======================================================
204
}};
205
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
206
207
BUTTON BUTTON_01(ButtonEnc);
208
209
/////////////////////////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
210
void
clearLine(
int
line){
if
(line <= 3 && line >= 0){lcd.setCursor(0, line); lcd.print(
" "
); lcd.setCursor(0, line);}
else
{lcd.clear();}}
211
void
Enc_Zero(
int
ps = 0){
if
(ps == 0) {myEnc.write(0);}
else
{ps = ps*4; myEnc.write(ps);} position = Pos;}
212
void
EnterCHG(){
if
(tr_menu ==
true
) {
if
(dir ==
true
) {Enc_Zero(curMenu); menu(curMenu);}
else
{lcd.setCursor(13, 0); lcd.print(
"Chenge"
); Enc_Zero(0); ChgData();} dir = !dir;}}
213
void
Heat(boolean het =
false
){
if
(het){analogWrite(TEN1, Output); analogWrite(TEN2, Output);}
else
{analogWrite(TEN1, 0); analogWrite(TEN2, 0);}}
214
/////////////////////////////////////////////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
215
216
void
setup
()
217
{
218
#ifdef DEBUG
219
Serial
.begin(115200);
220
#endif
221
222
// SavePAT();
223
LoadPAT();
224
rtc.begin();
225
lcd.init(); lcd.backlight();
226
227
lcd.createChar(1, vint1);
228
lcd.createChar(2, vint2);
229
lcd.createChar(3, vint3);
230
lcd.createChar(4, vint4);
231
lcd.createChar(5, gradus);
232
lcd.createChar(6, card);
233
lcd.createChar(7, curs);
234
235
pinMode(TEN1, OUTPUT); pinMode(TEN2, OUTPUT);
236
pinMode(BUZZ, OUTPUT); pinMode(NASOS, OUTPUT);
237
pinMode(ButtonEnc, INPUT); digitalWrite(ButtonEnc, HIGH);
238
239
myPID.SetMode(AUTOMATIC);
240
lcd.setCursor(0, 0); lcd.print(__DATE__);
241
lcd.setCursor(0, 1); lcd.print(__TIME__);
242
delay(2000);
243
lcd.clear();
244
if
(!SD.begin(SD_SELECT)) {lcd.setCursor(0, 0); lcd.print(
"SD init - failed!"
);}
// Тестирование SD карты (карта отсутствует)
245
else
{lcd.setCursor(0, 0); lcd.print(
"SD init - ok"
); root = SD.open(
"/"
); root.rewindDirectory(); SD_stat =
true
;}
// Тестирование SD карты (карта на месте, исправна)
246
delay(500); lcd.setCursor(0, 1); lcd.print(
"CPU init - ok"
);
// Приятный красивый мультик (несёт только эстетический хорактер)
247
delay(500); lcd.setCursor(0, 2); lcd.print(
"SYS init - ok"
);
// Приятный красивый мультик (несёт только эстетический хорактер)
248
delay(500); lcd.setCursor(0, 3); lcd.print(
"PID init - ok"
);
// Приятный красивый мультик (несёт только эстетический хорактер)
249
delay(100);
250
lcd.clear();
251
252
if
( !ds.search(addr)) {
253
ds.reset_search();
254
delay(250);
255
return
;
256
}
257
}
258
259
void
loop
(){
260
Mic1 = millis();
261
now = rtc.now(); _HR = now.hour(); _MI = now.minute(); _SE = now.second();
262
getTemp(); Input = celsius;
// Конвертация типов переменных на вход ПИД регулятора.
263
DO_EVERY(PID_SPEED,{ myPID.Compute(); });
264
Pos = myEnc.read() / 4;
265
Moschnost = map(Output, 0, 255, 0, 100);
266
267
if
(STATUS) {
268
Prokachka();
269
if
(!Pause){
270
UPGRADE = 500;
271
if
(T_Upr == 0) {analogWrite(TEN1, 255); analogWrite(TEN2, 255); Moschnost = 100;}
272
if
(T_Upr == 1) {
if
(Input < Setpoint) {Heat(
true
);}
else
{Heat(
false
); Moschnost = 0;}}
273
if
(T_Upr == 2) {Heater();
if
(Input < Setpoint) {Heat(
true
);}
else
{Heat(
false
); Moschnost = 0;}}
274
}
else
{Heat(
false
); UPGRADE = 1000;}
275
}
else
{Heat(
false
); digitalWrite(NASOS, LOW); Moschnost = 0; UPGRADE = 1000;}
276
277
//--------------------------------------------------------
278
BUTTON_01.read();
279
if
(BUTTON_01.timer) {lcd.noBacklight(); tr_menu =
false
; lcd.noBlink(); lcd.clear(); Enc_Zero(0); keyPres =
false
;}
280
if
(BUTTON_01.click_down) {keyPres =
true
; lcd.backlight();}
281
if
(BUTTON_01.retention) {lcd.backlight(); tr_menu = !tr_menu;
if
(tr_menu ==
true
) {Enc_Zero(0); menu(0); lcd.blink();}
else
{lcd.noBlink(); lcd.clear(); Enc_Zero(0); SavePAT();} keyPres =
false
;}
282
if
(BUTTON_01.doubleclick) {
if
(!tr_menu && position == 1 && !STATUS){STATUS =
true
; vinti = 0; BobleOff =
true
; Enc_Zero(0);}
else
if
(!tr_menu && position == 0 && STATUS) {STATUS =
false
;}
else
if
(tr_menu ==
false
&& position == 2 && STATUS) {Pause = !Pause;} Udate =
true
;}
283
if
(BUTTON_01.click_up) {
if
(keyPres ==
true
) {EnterCHG();} keyPres =
false
;}
284
//--------------------------------------------------------
285
286
if
(tr_menu ==
false
){ DO_EVERY(UPGRADE,{Udate =
true
;}); menu(99); }
287
288
if
(Pos != position) {position = Pos; lcd.backlight();
289
if
(tr_menu ==
false
) {
if
(position > 2) {Enc_Zero(0);}
else
if
(position < 0) {Enc_Zero(2); } Print_ctrl_main();}
290
if
(tr_menu ==
true
&& dir ==
false
) {
if
(position > maxMenu) {Enc_Zero(0);}
else
if
(position < 0) {Enc_Zero(maxMenu);} menu(position);}
291
if
(tr_menu ==
true
&& dir ==
true
) {ChgData();}
292
}
293
294
//``````````````````````````````````````````
295
#ifdef DEBUG
296
Mic2 = 1000 / (millis() - Mic1);
// Вычисление количества операций(циклов) в секунду
297
// Переменные и флаги
298
Serial
.print(
" Status-"
);
Serial
.print(STATUS);
299
Serial
.print(
" Pause-"
);
Serial
.print(Pause);
300
// Значения и параметры
301
Serial
.print(
" Output-"
);
Serial
.print(Output);
302
Serial
.print(
" Input-"
);
Serial
.print(Input);
303
Serial
.print(
" celsius-"
);
Serial
.print(celsius);
304
Serial
.print(
" Setpoint-"
);
Serial
.print(Setpoint);
305
Serial
.print(
" Nasos_Start-"
);
Serial
.print(Nasos_Start);
306
Serial
.print(
" Nasos_Stop-"
);
Serial
.print(Nasos_Stop);
307
// Производительность
308
Serial
.print(
" CPU-"
);
Serial
.print(Mic2);
Serial
.print(
"Lps"
);
309
// Конец тестовой информации
310
Serial
.println(
" |"
);
311
#endif
312
//``````````````````````````````````````````
313
}
// end Loop
01
void
ChgData(){
02
if
(curMenu == 0) {
if
(position >= 0 && position <= 2) {T_Upr = position; lcd.setCursor(12, 1);
switch
(T_Upr){
case
0:lcd.print(
"MAN "
);
break
;
case
1:lcd.print(
"AUTO"
);
break
;
case
2:lcd.print(
"PAT "
);
break
;}}
else
{Enc_Zero(0);} lcd.setCursor(0, 1); lcd.blink();}
03
if
(curMenu == 1) {
if
(position >= 25 && position <= 90) {Nasos_Start = position; lcd.setCursor(12, 2); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(25);} lcd.setCursor(0, 2); lcd.blink();}
04
if
(curMenu == 2) {
if
(position >= 25 && position <= 90) {Nasos_Stop = position; lcd.setCursor(12, 3); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(25);} lcd.setCursor(0, 3); lcd.blink();}
05
if
(curMenu == 3) {lcd.setCursor(6, 1); lcd.print(
" "
); CHGFile(); lcd.setCursor(6, 1); lcd.print(FileiniNAME); lcd.setCursor(0, 1); lcd.blink();}
06
if
(curMenu == 4) {ReadINI(); lcd.setCursor(8, 3);
if
(!SD_stat) {lcd.print(
"fail"
);}
else
{lcd.print(
"ok"
);} lcd.setCursor(0, 3); lcd.blink();}
07
if
(curMenu == 5) {
if
(position >= 1 && position <= 100) {PID_SPEED = position; lcd.setCursor(12, 1); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 1); lcd.blink();}
08
if
(curMenu == 6) {
if
(position >= 0 && position <= 100) {consKi = position; lcd.setCursor(12, 2); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 2); lcd.blink();}
09
if
(curMenu == 7) {
if
(position >= 0 && position <= 100) {Setpoint = position; lcd.setCursor(12, 3); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 3); lcd.blink();}
10
if
(curMenu == 8) {
if
(position >= 0 && position <= 24) {A_H = position; lcd.setCursor(12, 1); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 1); lcd.blink();}
11
if
(curMenu == 9) {
if
(position >= 0 && position <= 59) {A_M = position; lcd.setCursor(12, 2); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 2); lcd.blink();}
12
if
(curMenu == 10){rtc.adjust(DateTime(2015, 8, 20, A_H, A_M, 0)); lcd.setCursor(12, 3); lcd.print(
"ok"
); lcd.setCursor(0, 3); lcd.blink();}
13
14
if
(curMenu == 11) {
if
(position >= 0 && position <= 100) {Pat[0][0] = position; lcd.setCursor(12, 1); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 1); lcd.blink();}
15
if
(curMenu == 12) {
if
(position >= 0 && position <= 32000) {Pat[0][1] = position; lcd.setCursor(12, 2); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 2); lcd.blink();}
16
if
(curMenu == 13) {
if
(position >= 0 && position <= 1) {Pat[0][2] = position; lcd.setCursor(12, 3); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 3); lcd.blink();}
17
if
(curMenu == 14) {
if
(position >= 0 && position <= 100) {Pat[1][0] = position; lcd.setCursor(12, 1); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 1); lcd.blink();}
18
if
(curMenu == 15) {
if
(position >= 0 && position <= 32000) {Pat[1][1] = position; lcd.setCursor(12, 2); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 2); lcd.blink();}
19
if
(curMenu == 16) {
if
(position >= 0 && position <= 1) {Pat[1][2] = position; lcd.setCursor(12, 3); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 3); lcd.blink();}
20
if
(curMenu == 17) {
if
(position >= 0 && position <= 100) {Pat[2][0] = position; lcd.setCursor(12, 1); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 1); lcd.blink();}
21
if
(curMenu == 18) {
if
(position >= 0 && position <= 32000) {Pat[2][1] = position; lcd.setCursor(12, 2); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 2); lcd.blink();}
22
if
(curMenu == 19) {
if
(position >= 0 && position <= 1) {Pat[2][2] = position; lcd.setCursor(12, 3); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 3); lcd.blink();}
23
if
(curMenu == 20) {
if
(position >= 0 && position <= 100) {Pat[3][0] = position; lcd.setCursor(12, 1); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 1); lcd.blink();}
24
if
(curMenu == 21) {
if
(position >= 0 && position <= 32000) {Pat[3][1] = position; lcd.setCursor(12, 2); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 2); lcd.blink();}
25
if
(curMenu == 22) {
if
(position >= 0 && position <= 1) {Pat[3][2] = position; lcd.setCursor(12, 3); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 3); lcd.blink();}
26
if
(curMenu == 23) {
if
(position >= 0 && position <= 100) {Pat[4][0] = position; lcd.setCursor(12, 1); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 1); lcd.blink();}
27
if
(curMenu == 24) {
if
(position >= 0 && position <= 32000) {Pat[4][1] = position; lcd.setCursor(12, 2); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 2); lcd.blink();}
28
if
(curMenu == 25) {
if
(position >= 0 && position <= 1) {Pat[4][2] = position; lcd.setCursor(12, 3); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 3); lcd.blink();}
29
if
(curMenu == 26) {
if
(position >= 0 && position <= 100) {Pat[5][0] = position; lcd.setCursor(12, 1); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 1); lcd.blink();}
30
if
(curMenu == 27) {
if
(position >= 0 && position <= 32000) {Pat[5][1] = position; lcd.setCursor(12, 2); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 2); lcd.blink();}
31
if
(curMenu == 28) {
if
(position >= 0 && position <= 1) {Pat[5][2] = position; lcd.setCursor(12, 3); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 3); lcd.blink();}
32
if
(curMenu == 29) {
if
(position >= 0 && position <= 100) {Pat[6][0] = position; lcd.setCursor(12, 1); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 1); lcd.blink();}
33
if
(curMenu == 30) {
if
(position >= 0 && position <= 32000) {Pat[6][1] = position; lcd.setCursor(12, 2); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 2); lcd.blink();}
34
if
(curMenu == 31) {
if
(position >= 0 && position <= 1) {Pat[6][2] = position; lcd.setCursor(12, 3); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 3); lcd.blink();}
35
if
(curMenu == 32) {
if
(position >= 0 && position <= 100) {Pat[7][0] = position; lcd.setCursor(12, 1); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 1); lcd.blink();}
36
if
(curMenu == 33) {
if
(position >= 0 && position <= 32000) {Pat[7][1] = position; lcd.setCursor(12, 2); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 2); lcd.blink();}
37
if
(curMenu == 34) {
if
(position >= 0 && position <= 1) {Pat[7][2] = position; lcd.setCursor(12, 3); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 3); lcd.blink();}
38
if
(curMenu == 35) {
if
(position >= 0 && position <= 100) {Pat[8][0] = position; lcd.setCursor(12, 1); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 1); lcd.blink();}
39
if
(curMenu == 36) {
if
(position >= 0 && position <= 32000) {Pat[8][1] = position; lcd.setCursor(12, 2); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 2); lcd.blink();}
40
if
(curMenu == 37) {
if
(position >= 0 && position <= 1) {Pat[8][2] = position; lcd.setCursor(12, 3); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 3); lcd.blink();}
41
if
(curMenu == 38) {
if
(position >= 0 && position <= 100) {Pat[9][0] = position; lcd.setCursor(12, 1); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 1); lcd.blink();}
42
if
(curMenu == 39) {
if
(position >= 0 && position <= 32000) {Pat[9][1] = position; lcd.setCursor(12, 2); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 2); lcd.blink();}
43
if
(curMenu == 40) {
if
(position >= 0 && position <= 1) {Pat[9][2] = position; lcd.setCursor(12, 3); lcd.print(position); lcd.print(
" "
);}
else
{Enc_Zero(0);} lcd.setCursor(0, 3); lcd.blink();}
44
}
1
void
Heater(){
2
3
4
5
}
01
void
Prokachka(){
02
03
if
(BobleOff){
04
if
(Input <= Nasos_Stop){
05
BobleOff_tec1 = millis();
06
if
(BobleOffst){BobleOff_tec2 = BobleOff_tec1 + BobleOff_tim; BobleOffst =
false
;}
07
if
(BobleOff_tec1 <= BobleOff_tec2) {digitalWrite(NASOS, HIGH); Pause =
true
;
08
}
else
{digitalWrite(NASOS, LOW); Pause =
false
; BobleOff =
false
; BobleOffst =
true
; BobleOff_tec1 = 0;}
09
}
else
{BobleOff =
false
;}
10
}
11
12
if
(!Pause){
if
(Input >= Nasos_Start && Input <= Nasos_Stop) {digitalWrite(NASOS, HIGH);}
else
{digitalWrite(NASOS, LOW);}}
else
{
if
(!BobleOff) {digitalWrite(NASOS, LOW);}}
13
}
01
void
CHGFile(){
02
entry = root.openNextFile();
if
(!entry) { root.rewindDirectory(); }
03
FileiniNAMEAn = entry.name();
04
if
(FileiniNAMEAn ==
""
or FileiniNAMEAn ==
"SYSTEM~1"
) {entry = root.openNextFile();}
05
else
{FileiniNAME = entry.name();}}
06
07
void
ReadINI(){
08
if
(SD_stat){
09
char
Str2[FileiniNAME.length()+1]; FileiniNAME.toCharArray(Str2, FileiniNAME.length()+1);
10
IniFile ini(Str2);
11
12
if
(!ini.open()) {clearLine(0); lcd.print(
"Ini file does not exist"
);
while
(1);}
13
if
(!ini.validate(buffer, bufferLen)) {clearLine(0); lcd.print(
"ini file "
); lcd.print(ini.getFilename()); lcd.print(
" not valid"
);
while
(1);}
14
//--------------------------------------------------------------------
15
if
(ini.open()) {
/* clearLine(0); lcd.print("Load: "); lcd.print(ini.getFilename()); */
}
16
if
(ini.getValue(
"NAME"
,
"NAME"
, buffer, bufferLen)) {
if
(curMenu == 4) {clearLine(2); lcd.setCursor(1, 2); lcd.print(buffer);}}
//else {clearLine(0); lcd.print("Default Error file");}
17
if
(ini.getValue(
"PID"
,
"consKp"
, buffer, bufferLen)) {consKp = String(buffer).toInt();}
18
if
(ini.getValue(
"PID"
,
"consKi"
, buffer, bufferLen)) {consKi = String(buffer).toInt();}
19
if
(ini.getValue(
"PID"
,
"consKd"
, buffer, bufferLen)) {consKd = String(buffer).toInt();}
20
if
(ini.getValue(
"PID"
,
"PID_SPEED"
, buffer, bufferLen)) {PID_SPEED = String(buffer).toInt();}
21
if
(ini.getValue(
"NASOS"
,
"start"
, buffer, bufferLen)) {Nasos_Start = String(buffer).toInt();}
22
if
(ini.getValue(
"NASOS"
,
"stop"
, buffer, bufferLen)) {Nasos_Stop = String(buffer).toInt();}
23
24
for
(
int
mesMas=0; mesMas <= 9; mesMas++){
25
char
Str1[Prog[mesMas].length()+1]; Prog[mesMas].toCharArray(Str1, Prog[mesMas].length()+1);
26
if
(ini.getValue(Str1,
"P_Temp"
, buffer, bufferLen)) {Pat[mesMas][0] = String(buffer).toInt();}
27
if
(ini.getValue(Str1,
"P_Time"
, buffer, bufferLen)) {Pat[mesMas][1] = String(buffer).toInt();}
28
if
(ini.getValue(Str1,
"P_Alar"
, buffer, bufferLen)) {Pat[mesMas][2] = String(buffer).toInt();}
29
}
30
ini.close();
31
entry.close();
32
//--------------------------------------------------------------------
33
}}
01
void
LoadPAT(){
02
INI_pat_mem();
03
for
(
int
pr=50; pr <= 59; pr++){
04
prog = pr - 50;
05
mem1 = pr;
06
mem2 = pr + 10;
07
mem3 = pr + 20;
08
Pat[prog][0] = EEPROM.read(mem1); Pat[prog][1] = EEPROM.read(mem2); Pat[prog][2] = EEPROM.read(mem3);
09
}
10
T_Upr = EEPROM.read(111);
11
consKi = EEPROM.read(112);
12
PID_SPEED = EEPROM.read(113);
13
Nasos_Start = EEPROM.read(114);
14
Nasos_Stop = EEPROM.read(115);
15
Setpoint = EEPROM.read(116);
16
myPID.SetTunings(consKp, consKi, consKd);
17
}
18
19
void
SavePAT(){
20
INI_pat_mem();
21
for
(
int
pr=50; pr <= 59; pr++){
22
prog = pr - 50;
23
mem1 = pr;
24
mem2 = pr + 10;
25
mem3 = pr + 20;
26
if
(EEPROM.read(mem1) != Pat[prog][0]) {EEPROM.write(mem1, Pat[prog][0]);}
27
if
(EEPROM.read(mem2) != Pat[prog][1]) {EEPROM.write(mem2, Pat[prog][1]);}
28
if
(EEPROM.read(mem3) != Pat[prog][2]) {EEPROM.write(mem3, Pat[prog][2]);}
29
}
30
if
(EEPROM.read(111) != T_Upr) {EEPROM.write(111, T_Upr); }
// Сохранение значения режима работы
31
if
(EEPROM.read(112) != consKi) {EEPROM.write(112, consKi); myPID.SetTunings(consKp, consKi, consKd); }
// Сохранение значения режима consKi PID регулятора
32
if
(EEPROM.read(113) != PID_SPEED) {EEPROM.write(113, PID_SPEED); }
// Сохранение значения режима SPEED PID регулятора
33
if
(EEPROM.read(114) != Nasos_Start) {EEPROM.write(114, Nasos_Start); }
// Сохранение значения режима запуска насоса
34
if
(EEPROM.read(115) != Nasos_Stop) {EEPROM.write(115, Nasos_Stop); }
// Сохранение значения режима отключения насоса
35
if
(EEPROM.read(116) != Setpoint) {EEPROM.write(116, Setpoint); }
// Сохранение значения установленной температуры
36
}
37
38
void
INI_pat_mem(){
39
prog = 0; mem1 = 0; mem2 = 0; mem3 = 0;
40
}
01
void
getTemp() {
02
ds.reset();
03
ds.select(addr);
04
ds.write(0x44, 1);
05
ds.reset();
06
ds.select(addr);
07
ds.write(0xBE);
08
for
(
int
i = 0; i < 9; i++) {data[i] = ds.read();}
09
int16_t raw = (data[1] << 8) | data[0];
10
if
(type_s) {
11
raw = raw << 3;
12
if
(data[7] == 0x10) {raw = (raw & 0xFFF0) + 12 - data[6];}
13
}
else
{
14
byte
cfg = (data[4] & 0x60);
15
if
(cfg == 0x00) raw = raw & ~7;
16
else
if
(cfg == 0x20) raw = raw & ~3;
17
else
if
(cfg == 0x40) raw = raw & ~1;
18
}
19
celsius = (
float
)raw / 16.0;
20
return
;
21
}
001
void
menu(
int
lvl){
002
if
(lvl == 0 || lvl == 1 || lvl == 2){ lcd.clear(); curMenu = lvl;
003
clearLine(0);
004
lcd.setCursor(0, 0); lcd.print(
" MENU - 0"
);
005
lcd.setCursor(0, 1); lcd.print(
" Mode:"
); lcd.setCursor(12, 1);
switch
(T_Upr){
case
0:lcd.print(
"MAN "
);
break
;
case
1:lcd.print(
"AUTO"
);
break
;
case
2:lcd.print(
"PAT "
);
break
;}
006
lcd.setCursor(0, 2); lcd.print(
" Nasos run:"
); lcd.setCursor(12, 2); lcd.print(Nasos_Start);
007
lcd.setCursor(0, 3); lcd.print(
" Nasos stop:"
); lcd.setCursor(12, 3); lcd.print(Nasos_Stop);
008
switch
(lvl){
case
0:lcd.setCursor(0, 1); lcd.blink();
break
;
009
case
1:lcd.setCursor(0, 2); lcd.blink();
break
;
010
case
2:lcd.setCursor(0, 3); lcd.blink();
break
;}
011
}
012
if
(lvl == 3 || lvl == 4){ lcd.clear(); curMenu = lvl;
013
clearLine(0);
014
lcd.setCursor(0, 0); lcd.print(
" MENU - 1"
);
015
lcd.setCursor(0, 1); lcd.print(
" File:"
); lcd.print(FileiniNAME);
016
if
(!SD_stat) {lcd.setCursor(0, 2); lcd.print(
" SD init - failed!"
);}
017
lcd.setCursor(0, 3); lcd.print(
" Load"
);
018
switch
(lvl){
case
3:lcd.setCursor(0, 1); lcd.blink();
break
;
019
case
4:lcd.setCursor(0, 3); lcd.blink();
break
;}
020
}
021
if
(lvl == 5 || lvl == 6 || lvl == 7 ){ lcd.clear(); curMenu = lvl;
022
clearLine(0);
023
lcd.setCursor(0, 0); lcd.print(
" MENU - 2"
);
024
lcd.setCursor(0, 1); lcd.print(
" PID_SPEED"
); lcd.setCursor(12, 1); lcd.print(PID_SPEED);
025
lcd.setCursor(0, 2); lcd.print(
" consKi"
); lcd.setCursor(12, 2); lcd.print(consKi);
026
lcd.setCursor(0, 3); lcd.print(
" Setpoint"
); lcd.setCursor(12, 3); lcd.print(Setpoint);
027
switch
(lvl){
case
5:lcd.setCursor(0, 1); lcd.blink();
break
;
028
case
6:lcd.setCursor(0, 2); lcd.blink();
break
;
029
case
7:lcd.setCursor(0, 3); lcd.blink();
break
;}
030
}
031
if
(lvl == 8 || lvl == 9 || lvl == 10 ){ lcd.clear(); curMenu = lvl;
032
clearLine(0);
033
lcd.setCursor(0, 0); lcd.print(
" MENU - 3"
);
034
lcd.setCursor(0, 1); lcd.print(
" hour"
); lcd.setCursor(12, 1); lcd.print(A_H);
035
lcd.setCursor(0, 2); lcd.print(
" minute"
); lcd.setCursor(12, 2); lcd.print(A_M);
036
lcd.setCursor(0, 3); lcd.print(
" set clock"
);
037
switch
(lvl){
case
8: lcd.setCursor(0, 1); lcd.blink();
break
;
038
case
9: lcd.setCursor(0, 2); lcd.blink();
break
;
039
case
10:lcd.setCursor(0, 3); lcd.blink();
break
;}
040
}
041
//```````````````````````````````````````````````````````````````````````````````````````````
042
if
(lvl == 11 || lvl == 12 || lvl == 13){ lcd.clear(); curMenu = lvl;
043
clearLine(0);
044
lcd.setCursor(0, 0); lcd.print(
" MENU - 4.0"
);
045
lcd.setCursor(0, 1); lcd.print(
" P_Temp "
); lcd.setCursor(12, 1); lcd.print(Pat[0][0]);
046
lcd.setCursor(0, 2); lcd.print(
" P_Time "
); lcd.setCursor(12, 2); lcd.print(Pat[0][1]);
047
lcd.setCursor(0, 3); lcd.print(
" P_Alar "
); lcd.setCursor(12, 3); lcd.print(Pat[0][2]);
048
switch
(lvl){
case
11:lcd.setCursor(0, 1); lcd.blink();
break
;
049
case
12:lcd.setCursor(0, 2); lcd.blink();
break
;
050
case
13:lcd.setCursor(0, 3); lcd.blink();
break
;}
051
}
052
if
(lvl == 14 || lvl == 15 || lvl == 16){ lcd.clear(); curMenu = lvl;
053
clearLine(0);
054
lcd.setCursor(0, 0); lcd.print(
" MENU - 4.1"
);
055
lcd.setCursor(0, 1); lcd.print(
" P_Temp "
); lcd.setCursor(12, 1); lcd.print(Pat[1][0]);
056
lcd.setCursor(0, 2); lcd.print(
" P_Time "
); lcd.setCursor(12, 2); lcd.print(Pat[1][1]);
057
lcd.setCursor(0, 3); lcd.print(
" P_Alar "
); lcd.setCursor(12, 3); lcd.print(Pat[1][2]);
058
switch
(lvl){
case
14:lcd.setCursor(0, 1); lcd.blink();
break
;
059
case
15:lcd.setCursor(0, 2); lcd.blink();
break
;
060
case
16:lcd.setCursor(0, 3); lcd.blink();
break
;}
061
}
062
if
(lvl == 17 || lvl == 18 || lvl == 19){ lcd.clear(); curMenu = lvl;
063
clearLine(0);
064
lcd.setCursor(0, 0); lcd.print(
" MENU - 4.2"
);
065
lcd.setCursor(0, 1); lcd.print(
" P_Temp "
); lcd.setCursor(12, 1); lcd.print(Pat[2][0]);
066
lcd.setCursor(0, 2); lcd.print(
" P_Time "
); lcd.setCursor(12, 2); lcd.print(Pat[2][1]);
067
lcd.setCursor(0, 3); lcd.print(
" P_Alar "
); lcd.setCursor(12, 3); lcd.print(Pat[2][2]);
068
switch
(lvl){
case
17:lcd.setCursor(0, 1); lcd.blink();
break
;
069
case
18:lcd.setCursor(0, 2); lcd.blink();
break
;
070
case
19:lcd.setCursor(0, 3); lcd.blink();
break
;}
071
}
072
if
(lvl == 20 || lvl == 21 || lvl == 22){ lcd.clear(); curMenu = lvl;
073
clearLine(0);
074
lcd.setCursor(0, 0); lcd.print(
" MENU - 4.3"
);
075
lcd.setCursor(0, 1); lcd.print(
" P_Temp "
); lcd.setCursor(12, 1); lcd.print(Pat[3][0]);
076
lcd.setCursor(0, 2); lcd.print(
" P_Time "
); lcd.setCursor(12, 2); lcd.print(Pat[3][1]);
077
lcd.setCursor(0, 3); lcd.print(
" P_Alar "
); lcd.setCursor(12, 3); lcd.print(Pat[3][2]);
078
switch
(lvl){
case
20:lcd.setCursor(0, 1); lcd.blink();
break
;
079
case
21:lcd.setCursor(0, 2); lcd.blink();
break
;
080
case
22:lcd.setCursor(0, 3); lcd.blink();
break
;}
081
}
082
if
(lvl == 23 || lvl == 24 || lvl == 25){ lcd.clear(); curMenu = lvl;
083
clearLine(0);
084
lcd.setCursor(0, 0); lcd.print(
" MENU - 4.4"
);
085
lcd.setCursor(0, 1); lcd.print(
" P_Temp "
); lcd.setCursor(12, 1); lcd.print(Pat[4][0]);
086
lcd.setCursor(0, 2); lcd.print(
" P_Time "
); lcd.setCursor(12, 2); lcd.print(Pat[4][1]);
087
lcd.setCursor(0, 3); lcd.print(
" P_Alar "
); lcd.setCursor(12, 3); lcd.print(Pat[4][2]);
088
switch
(lvl){
case
23:lcd.setCursor(0, 1); lcd.blink();
break
;
089
case
24:lcd.setCursor(0, 2); lcd.blink();
break
;
090
case
25:lcd.setCursor(0, 3); lcd.blink();
break
;}
091
}
092
if
(lvl == 26 || lvl == 27 || lvl == 28){ lcd.clear(); curMenu = lvl;
093
clearLine(0);
094
lcd.setCursor(0, 0); lcd.print(
" MENU - 4.5"
);
095
lcd.setCursor(0, 1); lcd.print(
" P_Temp "
); lcd.setCursor(12, 1); lcd.print(Pat[5][0]);
096
lcd.setCursor(0, 2); lcd.print(
" P_Time "
); lcd.setCursor(12, 2); lcd.print(Pat[5][1]);
097
lcd.setCursor(0, 3); lcd.print(
" P_Alar "
); lcd.setCursor(12, 3); lcd.print(Pat[5][2]);
098
switch
(lvl){
case
26:lcd.setCursor(0, 1); lcd.blink();
break
;
099
case
27:lcd.setCursor(0, 2); lcd.blink();
break
;
100
case
28:lcd.setCursor(0, 3); lcd.blink();
break
;}
101
}
102
if
(lvl == 29 || lvl == 30 || lvl == 31){ lcd.clear(); curMenu = lvl;
103
clearLine(0);
104
lcd.setCursor(0, 0); lcd.print(
" MENU - 4.6"
);
105
lcd.setCursor(0, 1); lcd.print(
" P_Temp "
); lcd.setCursor(12, 1); lcd.print(Pat[6][0]);
106
lcd.setCursor(0, 2); lcd.print(
" P_Time "
); lcd.setCursor(12, 2); lcd.print(Pat[6][1]);
107
lcd.setCursor(0, 3); lcd.print(
" P_Alar "
); lcd.setCursor(12, 3); lcd.print(Pat[6][2]);
108
switch
(lvl){
case
29:lcd.setCursor(0, 1); lcd.blink();
break
;
109
case
30:lcd.setCursor(0, 2); lcd.blink();
break
;
110
case
31:lcd.setCursor(0, 3); lcd.blink();
break
;}
111
}
112
if
(lvl == 32 || lvl == 33 || lvl == 34){ lcd.clear(); curMenu = lvl;
113
clearLine(0);
114
lcd.setCursor(0, 0); lcd.print(
" MENU - 4.7"
);
115
lcd.setCursor(0, 1); lcd.print(
" P_Temp "
); lcd.setCursor(12, 1); lcd.print(Pat[7][0]);
116
lcd.setCursor(0, 2); lcd.print(
" P_Time "
); lcd.setCursor(12, 2); lcd.print(Pat[7][1]);
117
lcd.setCursor(0, 3); lcd.print(
" P_Alar "
); lcd.setCursor(12, 3); lcd.print(Pat[7][2]);
118
switch
(lvl){
case
32:lcd.setCursor(0, 1); lcd.blink();
break
;
119
case
33:lcd.setCursor(0, 2); lcd.blink();
break
;
120
case
34:lcd.setCursor(0, 3); lcd.blink();
break
;}
121
}
122
if
(lvl == 35 || lvl == 36 || lvl == 37){ lcd.clear(); curMenu = lvl;
123
clearLine(0);
124
lcd.setCursor(0, 0); lcd.print(
" MENU - 4.8"
);
125
lcd.setCursor(0, 1); lcd.print(
" P_Temp "
); lcd.setCursor(12, 1); lcd.print(Pat[8][0]);
126
lcd.setCursor(0, 2); lcd.print(
" P_Time "
); lcd.setCursor(12, 2); lcd.print(Pat[8][1]);
127
lcd.setCursor(0, 3); lcd.print(
" P_Alar "
); lcd.setCursor(12, 3); lcd.print(Pat[8][2]);
128
switch
(lvl){
case
35:lcd.setCursor(0, 1); lcd.blink();
break
;
129
case
36:lcd.setCursor(0, 2); lcd.blink();
break
;
130
case
37:lcd.setCursor(0, 3); lcd.blink();
break
;}
131
}
132
if
(lvl == 38 || lvl == 39 || lvl == 40){ lcd.clear(); curMenu = lvl;
133
clearLine(0);
134
lcd.setCursor(0, 0); lcd.print(
" MENU - 4.9"
);
135
lcd.setCursor(0, 1); lcd.print(
" P_Temp "
); lcd.setCursor(12, 1); lcd.print(Pat[9][0]);
136
lcd.setCursor(0, 2); lcd.print(
" P_Time "
); lcd.setCursor(12, 2); lcd.print(Pat[9][1]);
137
lcd.setCursor(0, 3); lcd.print(
" P_Alar "
); lcd.setCursor(12, 3); lcd.print(Pat[9][2]);
138
switch
(lvl){
case
38:lcd.setCursor(0, 1); lcd.blink();
break
;
139
case
39:lcd.setCursor(0, 2); lcd.blink();
break
;
140
case
40:lcd.setCursor(0, 3); lcd.blink();
break
;}
141
}
142
143
//```````````````````````````````````````````````````````````````````````````````````````````
144
if
(lvl == 99){
145
146
if
(Udate){ Udate =
false
;
147
lcd.setCursor(0, 0); lcd.print(
"T.ust "
); lcd.print(Setpoint); lcd.print(
"\5"
); Card();
if
(STATUS) {Vintik(); lcd.setCursor(17, 0); lcd.print(
"RUN"
);}
else
{lcd.setCursor(15, 0); lcd.print(
"+ OFF"
);}
148
lcd.setCursor(0, 1); lcd.print(
"T.zid "
); lcd.print(Input); lcd.print(
"\5"
); lcd.setCursor(13, 1);
switch
(T_Upr){
case
0:lcd.print(
"M"
);
break
;
case
1:lcd.print(
"A"
);
break
;
case
2:lcd.print(
"P"
);
break
;}
149
lcd.setCursor(0, 2); lcd.print(
"P.ten "
); lcd.setCursor(13, 2);
if
(T_Upr == 2) {lcd.print(P_Numb);}
else
{lcd.print(
"-"
);}
150
151
if
(Moschnost <= 100) {lcd.setCursor(6, 2);lcd.print(Moschnost); lcd.print(
"% "
);}
152
if
(Moschnost < 10) {lcd.setCursor(6, 2);lcd.print(Moschnost); lcd.print(
"% "
);}
153
154
Print_ctrl_main();
155
156
lcd.setCursor(0, 3);
if
(_HR < 10) {lcd.print(
"0"
); lcd.print(_HR);}
else
{lcd.print(_HR);} lcd.print(
":"
);
157
if
(_MI < 10) {lcd.print(
"0"
); lcd.print(_MI);}
else
{lcd.print(_MI);} lcd.print(
":"
);
158
if
(_SE < 10) {lcd.print(
"0"
); lcd.print(_SE);}
else
{lcd.print(_SE);}
159
160
lcd.setCursor(13, 3);
if
(digitalRead(NASOS)) {
if
(BobleOff) {lcd.print(
"B"
);}
else
{lcd.print(
"N"
);}}
else
{lcd.print(
"-"
);}
161
}
162
}
163
}
164
165
void
Print_ctrl_main(){
166
if
(tr_menu ==
false
&& position == 0) {lcd.setCursor(15, 1); lcd.print(
"\7STOP"
);
167
lcd.setCursor(15, 2); lcd.print(
" WORK"
);
168
lcd.setCursor(15, 3);
if
(Pause) {lcd.print(
" NEXT"
);}
else
{lcd.print(
" PAUS"
);}}
169
170
if
(tr_menu ==
false
&& position == 1) {lcd.setCursor(15, 1); lcd.print(
" STOP"
);
171
lcd.setCursor(15, 2); lcd.print(
"\7WORK"
);
172
lcd.setCursor(15, 3);
if
(Pause) {lcd.print(
" NEXT"
);}
else
{lcd.print(
" PAUS"
);}}
173
174
if
(tr_menu ==
false
&& position == 2) {lcd.setCursor(15, 1); lcd.print(
" STOP"
);
175
lcd.setCursor(15, 2); lcd.print(
" WORK"
);
176
lcd.setCursor(15, 3);
if
(Pause) {lcd.print(
"\7NEXT"
);}
else
{lcd.print(
"\7PAUS"
);}}
177
}
178
void
Vintik(){
179
lcd.setCursor(15, 0);
180
if
(!Pause){
181
vinti = vinti + 1;
182
switch
(vinti){
case
1:lcd.print(
"\1"
);
break
;
183
case
2:lcd.print(
"\2"
);
break
;
184
case
3:lcd.print(
"\3"
);
break
;
185
case
4:lcd.print(
"\4"
); vinti = 0;
break
;}
186
}
187
}
188
189
void
Card(){
190
lcd.setCursor(13, 0);
191
if
(!SD_stat){
192
cardti = cardti + 1;
193
switch
(cardti){
case
1:lcd.print(
"\6"
);
break
;
194
case
2:lcd.print(
" "
); cardti = 0;
break
;}
195
}
else
{lcd.print(
"\6"
);}
196
}
Работа с меню осуществляется с помощью энкодера и его кнопки. Находясь на домашнем экране поворот энкодера переключает отдин из 3х пунктов меню (см. скриншот выше). При двойном клике (два key_up до 200ms) активируется соответствующий выбранный пунк. Длительное (2000ms) нажатие переводит в меню настроек (скриншоты в проццесе), далее вращение энкодера переключает по пунктам меню. короткий клик на выбраном пункте меню вводит в состояние настройки параметра, второй короткий клик в меню применяет заданные параметры. Длительный клик находясь в меню запускает процедуру сохранения !только измененых параметров! и выводит на домашний экран.
Отдельное спасибо Клапауций 999 за класс для кнопки, и leshak за <TimeHelpers.h>
Формат ini файла с рецептом
01
[NAME]
02
# Имя не должно содержать больше 19 символов.
03
# Исключительно информационное поле на работу контроллера не влияет.
04
name = Irlandskoe_temnoe
05
06
[PID]
07
# Обязательные параметры PID регулятора
08
consKp = 5
09
consKi = 75
10
consKd = 1
11
PID_SPEED = 3
12
13
[NASOS]
14
# Температура запуска и остановки насоса.
15
start = 20
16
stop = 85
17
18
[PROG_1]
19
# Первая программа
20
# P_Temp - температура. Значения исчисляются в Градусах цельсия от 0 до 99.
21
# P_Time - Время поддержания заданной температуры. Значение исчисляются в минутах. Если значение времени равно 0 то выполнение данной программы и всех дальнейших останавливается.
22
# P_Alar - необходимость паузы после выполнения данной программы. Может принимать только 0 и 1.
23
P_Temp = 38;
24
P_Time = 20
25
P_Alar = 0
26
27
[PROG_2]
28
# Настройки аналогичны первой программе.
29
P_Temp = 81
30
P_Time = 20
31
P_Alar = 0
32
33
[PROG_3]
34
# Настройки аналогичны первой программе.
35
P_Temp = 64
36
P_Time = 20
37
P_Alar = 0
38
39
[PROG_4]
40
# Настройки аналогичны первой программе.
41
P_Temp = 28
42
P_Time = 20
43
P_Alar = 0
44
45
[PROG_5]
46
# Настройки аналогичны первой программе.
47
P_Temp = 50
48
P_Time = 0
49
P_Alar = 0
50
51
[PROG_6]
52
# Настройки аналогичны первой программе.
53
P_Temp = 46
54
P_Time = 20
55
P_Alar = 0
56
57
[PROG_7]
58
# Настройки аналогичны первой программе.
59
P_Temp = 37
60
P_Time = 20
61
P_Alar = 0
62
63
[PROG_8]
64
# Настройки аналогичны первой программе.
65
P_Temp = 11
66
P_Time = 20
67
P_Alar = 0
68
69
[PROG_9]
70
# Настройки аналогичны первой программе.
71
P_Temp = 44
72
P_Time = 20
73
P_Alar = 0
74
75
[PROG_10]
76
# Настройки аналогичны первой программе.
77
P_Temp = 76
78
P_Time = 20
79
P_Alar = 0
Отдельное спасибо Клапауций 999 за класс для кнопки
ок - рад, что не мне одному показалось это нужным.
Максим! как успехи с новой версией проекта? добил его
Переосмыслев всю логику и ошибки предыдущего контроллера начал разрабатывать новую версию с более одекватным меню, улучшенной производительностью и логикой, а также энкодером и SD кртой для загрузки файлов с рецептами.
Аналогично. Пересмотрев существующие решения и желания пивоваров, начали разработку новой автоматики с touch LCD и WiFi.
Небольшой демо-ролик
За подробностями можно следить тут http://hbpro.ru/threads/wi-fi-kontroller-na-esp8266.233/
Здравствуйте! maxi_10, продолжение будет?)) очень ждем) или, если может где-нибудь на другом ресурсе описывали, можно ссылочку?
Здраствуйте уважаемый maxi_10! Заинтересовал ваш проект. Какова судьба и как с продолжением?
Здравствуйте, я собрал автоматику на LCD 3.2 на Mega кому интерестно https://youtu.be/BvQUjaGohdY
День добрый! не могу найти библиотеку <TimeHelpers.h>.
Привет всем!!! а я с компа варю) https://youtu.be/Ua9WxJoCwpc