GSM устройство управления котлами Webasto и не только

MaksVV
Offline
Зарегистрирован: 06.08.2015

бери мой логгер w-bus и снифь девайс и котёл,  когда он выключен и ты посылаешь zapros. 

Dushman7776
Offline
Зарегистрирован: 13.01.2019

после работы попробю. Вчера залил скетч в нано , вечером буду пробовать снифить.

Dushman7776
Offline
Зарегистрирован: 13.01.2019

вот сделал лог  

     D6 01 02 92 01 02 2F 01 01     2E  From Heater to Device
09:47:53 281    Rx:       F4 04     44 20 00     94  From Device to Heater
09:47:53 281    Rx:       4F 03     C4 00     88  From Heater to Device
09:47:57 285    Rx:       F4 0A     50 30 0A 0C 0E 10 12 1E 32     B8  From Device to Heater
09:47:57 285    Rx:       4F 13     D0 30 0A 18 0C 78 0E 30 98 10 00 12 00 1E 00 00 32 00     52  From Heater to Device
09:48:01 289    Rx:       F4 03     56 01     A0  From Device to Heater
09:48:01 289    Rx:       4F 0A     D6 01 02 92 01 02 2F 01 01     2E  From Heater to Device
09:48:05 292    Rx:       F4 04     44 20 00     94  From Device to Heater
09:48:05 293    Rx:       4F 03     C4 00     88  From Heater to Device
09:48:09 296    Rx:       F4 0A     50 30 0A 0C 0E 10 12 1E 32     B8  From Device to Heater
09:48:09 297    Rx:       4F 13     D0 30 0A 18 0C 78 0E 30 98 10 00 12 00 1E 00 00 32 00     52  From Heater to Device
09:48:13 300    Rx:       F4 03     56 01     A0  From Device to Heater
09:48:13 300    Rx:       4F 0A     D6 01 02 92 01 02 2F 01 01     2E  From Heater to Device
09:48:17 304    Rx:       F4 04     44 20 00     94  From Device to Heater
09:48:17 304    Rx:       4F 03     C4 00     88  From Heater to Device
09:48:21 308    Rx:       F4 0A     50 30 0A 0C 0E 10 12 1E 32     B8  From Device to Heater
09:48:21 308    Rx:       4F 13     D0 30 0A 18 0C 78 0E 30 84 10 00 12 00 1E 00 00 32 00     4E  From Heater to Device
09:48:25 312    Rx:       F4 03     56 01     A0  From Device to Heater
09:48:25 312    Rx:       4F 0A     D6 01 02 92 01 02 2F 01 01     2E  From Heater to Device
09:48:29 316    Rx:       F4 04     44 20 00     94  From Device to Heater
09:48:29 316    Rx:       4F 03     C4 00     88  From Heater to Device
09:48:33 320    Rx:       F4 0A     50 30 0A 0C 0E 10 12 1E 32     B8  From Device to Heater
09:48:33 320    Rx:       4F 13     D0 30 0A 18 0C 77 0E 30 84 10 00 12 00 1E 00 00 32 00     41  From Heater to Device
09:48:37 324    Rx:       F4 03     56 01     A0  From Device to Heater
09:48:37 324    Rx:       4F 0A     D6 01 02 92 01 02 2F 01 01     2E  From Heater to Device
09:48:41 328    Rx:       F4 04     44 20 00     94  From Device to Heater
09:48:41 328    Rx:       4F 03     C4 00     88  From Heater to Device
09:48:45 332    Rx:       F4 02     10     E6  From Device to Heater
09:48:45 332    Rx:       4F 02     90     DD  From Heater to Device
09:48:45 332    Rx:       44 02     90     D6  From Heater to Heater
09:48:45 332    Rx:       44 02     90     D6  From Heater to Heater
09:48:45 333    Rx:       F4 02     10     E6  From Device to Heater
09:48:46 333    Rx:       4F 02     90     DD  From Heater to Device
09:48:46 333    Rx:       F4 02     10     E6  From Device to Heater
09:48:46 333    Rx:       4F 02     90     DD  From Heater to Device
09:48:47 334    Rx:       F4 02     10     E6  From Device to Heater
09:48:47 334    Rx:       4F 02     90     DD  From Heater to Device
09:52:06 532    Rx:       F4 03     20 3B     EC  From Device to Heater
09:52:06 532    Rx:       44 03     C4 00     83  From Heater to Heater
09:52:06 533    Rx:       44 03     C4 00     83  From Heater to Heater
09:52:06 533    Rx:       F4 03     20 3B     EC  Fr33    Rx:       4F 03     A0 3B     D7  From Heater to Device
09:52:06 533    Rx:       F4 03     20 3B     EC  From Device to Heater
09:52:07 533    Rx:       4F 03     A0 3B     D7  From Heater to Device
09:52:07 534    Rx:       F4 03     20 3B     EC  From Device to Heater
09:52:07 534    Rx:       F4 0A     50 30 0A 0C 0E 10 12 1E 32     B8  From Device to Heater
09:52:07 534    Rx:       4F 03     A0 3B     D7  From Heater to Device
09:52:11 538    Rx:       F4 03     56 01     A0  From Device to Heater
09:52:11 538    Rx:       4F 0A     D6 01 02 92 01 02 2F 01 01     2E  From Heater to Device
09:52:15 542    Rx:       F4 04     44 20 00     94  From Device to Heater
09:52:15 542    Rx:       4F 03     C4 00     88  From Heater to Device
09:52:19 546    Rx:       F4 0A     50 30 0A 0C 0E 10 12 1E 32     B8  From Device to Heater
09:52:20 546    Rx:       4F 13     D0 30 0A 1B 0C 72 0E 2E 22 10 00 12 00 1E 07 EA 32 00     12  From Heater to Device
09:52:23 550    Rx:       F4 03     56 01     A0  From Device to Heater
09:52:23 550    Rx:       4F 0A     D6 01 02 92 01 02 2F 01 01     2E  From Heater to Device
09:52:27 554    Rx:       F4 04     44 20 00     94  From Device to Heater
09:52:27 554    Rx:       4F 03     C4 00     88  From Heater to Device
09:52:31 558    Rx:       F4 0A     50 30 0A 0C 0E 10 12 1E 32     B8  From Device to Heater
09:52:32 558    Rx:       4F 13     D0 30 0A 19 0C 74 0E 2F D0 10 00 12 00 1E 1B 99 32 00     8A  From Heater to Device
09:52:35 562    Rx:       F4 03     56 01     A0  From Device to Heater
09:52:35 562    Rx:       4F 0A     D6 01 02 92 01 02 2F 01 01     2E  From Heater to Device
09:52:39 566    Rx:       F4 04     44 20 00     94  From Device to Heater
09:52:39 566    Rx:       4F 03     C4 00     88  From Heater to Device
09:52:43 570    Rx:       F4 0A     50 30 0A 0C 0E 10 12 1E 32     B8  From Device to Heater
09:52:44 570    Rx:       4F 13     D0 30 0A 19 0C 74 0E 2F D0 10 00 12 00 1E 1B B4 32 00     A7  From Heater to Device
09:52:47 574    Rx:       F4 03     56 01     A0  From Device to Heater
09:52:47 574    Rx:       4F 0A     D6 01 02 92 01 02 2F 01 01     2E  From Heater to Device
09:52:51 577    Rx:       F4 04     44 20 00     94  From Device to Heater
09:52:51 577    Rx:       4F 03     C4 00     88  From Heater to Device
09:52:53 579    Rx:       F4 02     10     E6  From Device to Heater
09:52:53 579    Rx:       4F 02     90     DD  From Heater to Device
09:52:53 580    Rx:       44 02     90     D6  From Heater to Heater
09:52:54 580    Rx:       44 02     90     D6  From Heater to Heater
09:52:54 580    Rx:       F4 02     10     E6  From Device to Heater
09:52:54 580    Rx:       4F 02     90     DD  From Heater to Device
09:52:55 581    Rx:       F4 02     10     E6  From Device to Heater
09:52:55 581    Rx:       4F 02     90     DD  From Heater to Device
09:52:56 582    Rx:       F4 02     10     E6  From Device to Heater
09:52:56 582    Rx:       4F 02     90     DD  From Heater to Device
09:58:43 909    Rx:       F4 03     56 03     A2  From Device to Heater
09:58:43 910    Rx:       44 03     C4 00     83  From Heater to Heater
09:58:43 910    Rx:       44 03     C4 00     83  From Heater to Heater
09:58:43 929    Rx:       F4 03     20 3B     EC  From Device to Heater
09:58:43 929    Rx:       4F 03     A0 3B     D7  From Heater to Device
09:58:44 930    Rx:       F4 03     20 3B     EC  From Device to Heater
09:58:44 930    Rx:       4F 03     A0 3B     D7  From Heater to Device
09:58:45 931    Rx:       F4 03     20 3B     EC  From Device to Heater
09:58:45 931    Rx:       4F 03     A0 3B     D7  From Heater to Device
09:58:45 931    Rx:       F4 03     20 3B     EC  From Device to Heater
09:58:46 931    Rx:       F4 0A     50 30 0A 0C 0E 10 12 1E 32     B8  From Device to Heater
09:58:46 932    Rx:       4F 03     A0 3B     D7  From Heater to Device
09:58:49 935    Rx:       F4 03     56 01     A0  From Device to Heater
09:58:50 935    Rx:       4F 0A     D6 01 02 92 01 02 2F 01 01     2E  From Heater to Device
09:58:53 939    Rx:       F4 04     44 20 00     94  From Device to Heater
09:58:54 939    Rx:       4F 03     C4 00     88  From Heater to Device
09:58:57 943    Rx:       F4 0A     50 30 0A 0C 0E 10 12 1E 32     B8  From Device to Heater
09:58:58 943    Rx:       4F 13     D0 30 0A 1B 0C 6C 0E 2D C8 10 00 12 00 1E 07 E8 32 00     E7  From Heater to Device
09:59:01 947    Rx:       F4 03     56 01     A0  From Device to Heater
09:59:02 947    Rx:       4F 0A     D6 01 02 92 01 02 2F 01 01     2E  From Heater to Device
09:59:02 947    Rx:       F4 03     56 03     A2  From Device to Heater
09:59:02 947    Rx:       4F 04     7F 56 22     40  From Heater to Device
09:59:05 951    Rx:       F4 04     44 20 00     94  From Device to Heater
09:59:06 951    Rx:       4F 03     C4 00     88  From Heater to Device
09:59:10 955    Rx:       F4 0A     50 30 0A 0C 0E 10 12 1E 32     B8  From Device to Heater
09:59:10 955    Rx:       4F 13     D0 30 0A 1F 0C 6F 0E 2D 5A 10 00 12 00 1E 1C 63 32 00     E2  From Heater to Device
09:59:14 959    Rx:       F4 03     56 01     A0  From Device to Heater
09:59:14 959    Rx:       4F 0A     D6 01 02 92 01 02 2F 01 01     2E  From Heater to Device
09:59:18 963    Rx:       F4 04     44 20 00     94  From Device to Heater
09:59:18 963    Rx:       4F 03     C4 00     88  From Heater to Device
09:59:22 967    Rx:       F4 0A     50 30 0A 0C 0E 10 12 1E 32     B8  From Device to Heater
09:59:22 967    Rx:       4F 13     D0 30 0A 1F 0C 70 0E 2D 82 10 00 12 00 1E 21 C0 32 00     BB  From Heater to Device
09:59:26 971    Rx:       F4 03     56 01     A0  From Device to Heater
09:59:26 971    Rx:       4F 0A     D6 01 02 92 01 02 2F 01 01     2E  From Heater to Device
09:59:30 975    Rx:       F4 04     44 20 00     94  From Device to Heater
09:59:30 975    Rx:       4F 03     C4 00     88  From Heater to Device
09:59:34 979    Rx:       F4 0A     50 30 0A 0C 0E 10 12 1E 32     B8  From Device to Heater
09:59:34 979    Rx:       4F 13     D0 30 0A 1F 0C 73 0E 2D 00 10 00 12 00 1E 22 F5 32 00     0C  From Heater to Device
09:59:36 981    Rx:       F4 03     56 03     A2  From Device to Heater
09:59:36 981    Rx:       4F 04     7F 56 22     40  From Heater to Device
09:59:38 983    Rx:       F4 03     56 01     A0  From Device to Heater
09:59:38 983    Rx:       4F 0A     D6 01 02 92 01 02 2F 01 01     2E  From Heater to Device
09:59:42 987    Rx:       F4 04     44 20 00     94  From Device to Heater
09:59:42 987    Rx:       4F 03     C4 00     88  From Heater to Device
09:59:46 991    Rx:       F4 0A     50 30 0A 0C 0E 10 12 1E 32     B8  From Device to Heater
09:59:46 991    Rx:       4F 13     D0 30 0A 1F 0C 76 0E 2C D8 10 00 12 00 1E 22 DB 32 00     FE  From Heater to Device
09:59:50 995    Rx:       F4 03     56 01     A0  From Device to Heater
09:59:50 995    Rx:       4F 0A     D6 01 02 92 01 02 2F 01 01     2E  From Heater to Device
09:59:54 999    Rx:       F4 04     44 20 00     94  From Device to Heater
09:59:54 999    Rx:       4F 03     C4 00     88  From Heater to Device
09:59:55 1000    Rx:       F4 02     10     E6  From Device to Heater
09:59:55 1000    Rx:       4F 02     90     DD  From Heater to Device
09:59:55 1000    Rx:       44 02     90     D6  From Heater to Heater
09:59:56 1000    Rx:       44 02     90     D6  From Heater to Heater
09:59:56 1000    Rx:       F4 02     10     E6  From Device to Heater
09:59:56 1000    Rx:       4F 02     90     DD  From Heater to Device
09:59:56 1001    Rx:       F4 02     10     E6  From Device to Heater
09:59:57 1001    Rx:       4F 02     90     DD  From Heater to Device
09:59:57 1002    Rx:       F4 02     10     E6  From Device to Heater
09:59:57 1002    Rx:       4F 02     90     DD  From Heater to Device
10:00:09 Disconnected from device

 

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Вот еще 

13:25:32 Connected to CH34x device
13:25:34 ^^f^F^F^X^X^X^F~^Fł^F~^@‘ff~~^FfSEC    Start Gebug W-bus: 
13:26:44 70    Rx:       F4 0A     50 30 0A 0C 0E 10 12 1E 32     B8  From Device to Heater
13:26:45 70    Rx:       44 03     C4 00     83  From Heater to Heater
13:26:45 71    Rx:       44 03     C4 00     83  From Heater to Heater
13:28:53 132    Rx:       F4 03     56 03     A2  From Device to Heater
13:28:53 132    Rx:       44 03     C4 00     83  From Heater to Heater
13:28:53 133    Rx:       44 03     C4 00     83  From Heater to Heater
13:28:53 198    Rx:       F4 03     56 03     A2  From Device to Heater
13:29:37 199    Rx:       44 03     C4 00     83  From Heater to Heater
13:29:37 199    Rx:       44 03     C4 00     83  From Heater to Heater
13:29:37 243    Rx:       F4 03     20 3B     EC  From Device to Heater
13:29:37 243    Rx:       4F 03     A0 3B     D7  From Heater to Device
13:29:38 243    Rx:       F4 03     20 3B     EC  From Device to Heater
13:29:38 243    Rx:       4F 03     A0 3B     D7  From Heater to Device
13:29:39 244    Rx:       F4 03     20 3B     EC  From Device to Heater
13:29:39 244    Rx:       4F 03     A0 3B     D7  From Heater to Device
13:29:39 245    Rx:       F4 03     20 3B     EC  From Device to Heater
13:29:40 245    Rx:       F4 0A     50 30 0A 0C 0E 10 12 1E 32     B8  From Device to Heater
13:29:40 245    Rx:       4F 03     A0 3B     D7  From Heater to Device
13:29:43 249    Rx:       F4 03     56 01     A0  From Device to Heater
13:29:44 249    Rx:       4F 0A     D6 01 02 92 01 02 2F 01 01     2E  From Heater to Device
13:29:47 253    Rx:       F4 04     44 20 00     94  From Device to Heater
13:29:48 253    Rx:       4F 03     C4 00     88  From Heater to Device
13:29:51 257    Rx:       F4 0A     50 30 0A 0C 0E 10 12 1E 32     B8  From Device to Heater
13:29:52 257    Rx:       4F 13     D0 30 0A 0B 0C 39 0E 2C BA 10 00 12 00 1E 07 E6 32 00     DF  From Heater to Device
13:29:55 261    Rx:       F4 03     56 01     A0  From Device to Heater
13:29:56 261    Rx:       4F 0A     D6 01 02 92 01 02 2F 01 01     2E  From Heater to Device
13:29:56 261    Rx:       F4 03     56 03     A2  From Device to Heater
13:29:56 261    Rx:       4F 04     7F 56 22     40  From Heater to Device
13:29:59 265    Rx:       F4 04     44 20 00     94  From Device to Heater
13:30:00 265    Rx:       4F 03     C4 00     88  From Heater to Device
13:30:04 269    Rx:       F4 0A     50 30 0A 0C 0E 10 12 1E 32     B8  From Device to Heater
13:30:04 269    Rx:       4F 13     D0 30 0A 0F 0C 3C 0E 2C 7E 10 00 12 00 1E 1B AD 32 00     4D  From Heater to Device
13:30:08 273    Rx:       F4 03     56 01     A0  From Device to Heater
13:30:08 273    Rx:       4F 0A     D6 01 02 92 01 02 2F 01 01     2E  From Heater to Device
13:30:12 277    Rx:       F4 04     44 20 00     94  From Device to Heater
13:30:12 277    Rx:       4F 03     C4 00     88  From Heater to Device
13:30:16 281    Rx:       F4 0A     50 30 0A 0C 0E 10 12 1E 32     B8  From Device to Heater
13:30:16 281    Rx:       4F 13     D0 30 0A 0F 0C 3D 0E 2C 6A 10 00 12 00 1E 1E 18 32 00     E8  From Heater to Device
13:30:20 285    Rx:       F4 03     56 01     A0  From Device to Heater
13:30:20 285    Rx:       4F 0A     D6 01 02 92 01 02 2F 01 01     2E  From Heater to Device
13:30:26 291    Rx:       F4 04     44 20 00     94  From Device to Heater
13:30:26 291    Rx:       4F 03     C4 00     88  From Heater to Device
13:30:30 295    Rx:       F4 0A     50 30 0A 0C 0E 10 12 1E 32     B8  From Device to Heater
13:30:30 295    Rx:       4F 13     D0 30 0A 0F 0C 43 0E 2C A6 10 00 12 00 1E 22 EB 32 00     95  From Heater to Device
13:30:34 298    Rx:       F4 03     56 01     A0  From Device to Heater
13:30:34 298    Rx:       4F 0A     D6 01 02 92 01 02 2F 01 01     2E  From Heater to Device
13:30:38 302    Rx:       F4 04     44 20 00     94  From Device to Heater
13:30:38 302    Rx:       4F 03     C4 00     88  From Heater to Device
13:30:42 306    Rx:       F4 0A     50 30 0A 0C 0E 10 12 1E 32     B8  From Device to Heater
13:30:42 306    Rx:       4F 13     D0 30 0A 0F 0C 48 0E 2C 6A 10 00 12 00 1E 23 16 32 00     AE  From Heater to Device
13:30:46 310    Rx:       F4 03     56 01     A0  From Device to Heater
13:30:46 310    Rx:       4F 0A     D6 01 02 92 01 02 2F 01 01     2E  From Heater to Device
13:30:49 314    Rx:       F4 02     10     E6  From Device to Heater
13:30:50 314    Rx:       4F 02     90     DD  From Heater to Device
13:30:50 314    Rx:       44 02     90     D6  From Heater to Heater
13:30:50 314    Rx:       44 02     90     D6  From Heater to Heater
13:30:50 314    Rx:       F4 02     10     E6  From Device to Heater
13:30:50 315    Rx:       4F 02     90     DD  From Heater to Device
13:30:51 315    Rx:       F4 02     10     E6  From Device to Heater
13:30:51 315    Rx:       4F 02     90     DD  From Heater to Device
13:30:52 316    Rx:       F4 02     10     E6  From Device to Heater
13:30:52 316    Rx:       4F 02     90     DD  From Heater to Device
13:31:30 354    Rx:       F4 03     56 03     A2  From Device to Heater
13:31:30 354    Rx:       4F 04     7F 56 22     40  From Heater to Device
13:33:22 Disconnected from device

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

судя по логам. Когда  мы сначала запускаем котёл, он далее отвечает нормально (кроме команды на стирание ошибок - её видимо нужно как раз отправлять когда котёл не работает).  

Но вот если на выключенном котле сразу отправляем запрос параметров или ошибок, ну или любые другие команды, то котёл отвечает очень странно: 44 03 C4 00 83 .     44 это типа сам себе.   Кстати похожий ответ C4 00 (а полное 4F 03 C4 00 88) котёл отвечает на запросы поддержания связи  F4 04 44 20 00 94 после запуска , только тут уже отвечает не сам себе 44, а как положено 4F - от котла на девайс. 

Возможно это происходит , потому что нет сообщений начала коммуникации от девайса. В скетче 3.62 я их сделал, дак опять ты говоришь чето с GSM там не то. Попробуй может джсм все таки заработает. и лог надо будет на  3.62 снять. 

что касается странности по сообщениям сам себе 44. То при выключении котла такое тоже происходит (44 02 90 D6) , но это нормально. Котёл таким же сообщением отвечает при остановке (помимо нормального ответа 4F 02 90 DD) и WTT и даже круглому таймеру 1533. 

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Пробовал я отправлять команду на стирание ошибок когда котел выключен, тоже пишет что нет овета от котла , единственный раз когда  у меня стерло ошибки с смс команды было когда котел уже выключился и шла продувка после , вроде как уже ппамя не горит но еще и не уснул . Когда WTT подключено к котлу но он не запущен , стирает же ошибки. Может нужно какую нибудь команду добавить не просто пробуждение перепадами уровня а как WTT делает. я в этом еще не очень разобрался, но типо повторить команды когда программа подключается к котлу и считывает первоначальные данные , в нашем же случае , когда данные с котла корректно читаюстя котел в  это время или греет или продувается , но программа же может читать данные и изменять их в режиме покоя . 

MaksVV
Offline
Зарегистрирован: 06.08.2015

MaksVV пишет:
Возможно это происходит , потому что нет сообщений начала коммуникации от девайса. В скетче 3.62 я их сделал, дак опять ты говоришь чето с GSM там не то. Попробуй может джсм все таки заработает. и лог надо будет на  3.62 снять.

Dushman7776
Offline
Зарегистрирован: 13.01.2019

вот еще логи но это уже wtt и котел , в первых двух просто подключение и ни каких действий , а в третьем стирание ошибок. И эти логи сняты без отключения девайса от шины , просто забыл отключить его от шины когда программу на ноуте подключил к котлу

Протоколирование включено: 01.03.19 16:55:32
Диагностирование включено: 01.03.19 16:59:10
W-шина
Активирование ...
Tx: F4 03 51 0A AC 
Rx: 4F 04 D1 0A 40 D0 
Tx: F4 03 51 31 97 
Rx: 4F 12 D1 31 01 0F 17 06 03 04 05 07 08 0B 0C 0D 0E 10 12 A9 
Tx: F4 12 51 30 01 0F 17 06 03 04 05 07 08 0B 0C 0D 0E 10 12 93 
Rx: 4F 86 D1 30 01 39 30 31 39 36 32 39 4A 31 33 00 00 00 00 00 00 00 00 00 00 00 0F 39 30 32 34 33 34 39 41 30 31 00 00 00 00 00 00 00 00 00 00 00 17 39 30 31 39 38 32 37 42 30 37 00 00 00 00 00 00 00 00 00 00 00 06 31 33 31 38 30 35 30 42 30 32 00 00 00 00 00 00 00 00 00 00 00 03 05 17 11 04 08 01 05 08 01 00 07 FF FF FF 08 25 10 13 0B 13 20 32 81 98 0C 43 42 0D 40 0E 54 54 45 56 4F 20 31 47 10 0B 12 7D C1 
Tx: F4 03 50 31 96 
Rx: 4F 44 D0 31 01 02 03 04 0A 0C 0E 10 12 13 14 15 16 19 1A 1D 1E 1F 20 21 22 23 24 25 28 2A 2B 2C 2F 32 33 34 50 51 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 97 
Tx: F4 03 51 0C AA 
Rx: 4F 0A D1 0C 79 7C E4 23 04 00 00 5E 
Tx: F4 02 38 CE 
Rx: 4F 0B B8 0B 00 00 02 AF 00 00 03 30 69 
Tx: F4 03 51 09 AF 
Rx: 4F 0A D1 09 13 20 32 81 98 43 42 84 
Tx: F4 03 53 02 A6 
Rx: 4F 11 D3 02 2A F8 00 00 FF FE 14 3E 80 00 00 FF FE 05 F2 
Tx: F4 03 57 01 A1 
Rx: 4F 06 D7 01 85 01 FF E4 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 45 0E 32 14 10 00 12 00 13 00 FE 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 4E 
Tx: F4 03 56 01 A0 
Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 45 0E 32 14 10 00 12 00 13 00 FE 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 4E 
Tx: F4 03 56 01 A0 
Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 45 0E 32 14 10 00 12 00 13 00 FE 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 4E 
Tx: F4 03 56 01 A0 
Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 45 0E 32 14 10 00 12 00 13 00 FF 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 4F 
Tx: F4 03 56 01 A0 
Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 45 0E 32 14 10 00 12 00 13 00 FF 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 4F 
Tx: F4 03 56 01 A0 
Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 45 0E 32 14 10 00 12 00 13 00 FF 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 4F 
Tx: F4 03 56 01 A0 
Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 45 0E 32 14 10 00 12 00 13 00 FF 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 4F 
Tx: F4 03 56 01 A0 
Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 45 0E 32 14 10 00 12 00 13 00 FF 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 4F 
Tx: F4 03 56 01 A0 
Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 45 0E 32 14 10 00 12 00 13 00 FF 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 4F 
Tx: F4 03 56 01 A0 
Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 45 0E 32 14 10 00 12 00 13 00 FF 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 4F 
Tx: F4 03 56 01 A0 
Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 45 0E 32 14 10 00 12 00 13 00 FF 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 4F 
Tx: F4 03 56 01 A0 
Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 45 0E 32 00 10 00 12 00 13 00 FF 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 5B 
Tx: F4 03 56 01 A0 
Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 45 0E 32 00 10 00 12 00 13 00 FF 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 5B 
Tx: F4 03 56 01 A0 
Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 45 0E 32 00 10 00 12 00 13 00 FF 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 5B 
Tx: F4 03 56 01 A0 
Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 45 0E 32 00 10 00 12 00 13 00 FF 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 5B 
Tx: F4 03 56 01 A0 
Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 44 0E 32 00 10 00 12 00 13 00 FF 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 5A 
Tx: F4 03 56 01 A0 
Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 44 0E 32 00 10 00 12 00 13 00 FF 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 5A 
Tx: F4 03 56 01 A0 
Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 44 0E 32 00 10 00 12 00 13 00 FF 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 5A 
Диагностирование окончено: 01.03.19 17:00:01
 

 

Dushman7776
Offline
Зарегистрирован: 13.01.2019
669.482 Диагностирование включено: 01.03.19 17:06:43
669.482 W-шина
669.735 Активирование ...
669.787 Tx: F4 03 51 0A AC 
670.141 Rx: 00 
670.143 Истечение времени ожидания!
670.155 Rx: 44 03 C4 00 83 
670.497 Rx: 44 03 C4 00 83 
671.080 Rx: 44 03 C4 
671.081 Истечение времени ожидания!
671.086 Tx: F4 03 51 0A AC 
671.149 Rx: 4F 04 D1 0A 40 D0 
671.218 Tx: F4 03 51 31 97 
671.345 Rx: 4F 12 D1 31 01 0F 17 06 03 04 05 07 08 0B 0C 0D 0E 10 12 A9 
671.414 Tx: F4 12 51 30 01 0F 17 06 03 04 05 07 08 0B 0C 0D 0E 10 12 93 
672.141 Rx: 4F 86 D1 30 01 39 30 31 39 36 32 39 4A 31 33 00 00 00 00 00 00 00 00 00 00 00 0F 39 30 32 34 33 34 39 41 30 31 00 00 00 00 00 00 00 00 00 00 00 17 39 30 31 39 38 32 37 42 30 37 00 00 00 00 00 00 00 00 00 00 00 06 31 33 31 38 30 35 30 42 30 32 00 00 00 00 00 00 00 00 00 00 00 03 05 17 11 04 08 01 05 08 01 00 07 FF FF FF 08 25 10 13 0B 13 20 32 81 98 0C 43 42 0D 40 0E 54 54 45 56 4F 20 31 47 10 0B 12 7D C1 
672.211 Tx: F4 03 50 31 96 
672.569 Rx: 4F 44 D0 31 01 02 03 04 0A 0C 0E 10 12 13 14 15 16 19 1A 1D 1E 1F 20 21 22 23 24 25 28 2A 2B 2C 2F 32 33 34 50 51 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 97 
672.638 Tx: F4 03 51 0C AA 
672.729 Rx: 4F 0A D1 0C 79 7C E4 23 04 00 00 5E 
672.798 Tx: F4 02 38 CE 
672.890 Rx: 4F 0B B8 0B 00 00 02 AF 00 00 03 30 69 
672.959 Tx: F4 03 51 09 AF 
673.051 Rx: 4F 0A D1 09 13 20 32 81 98 43 42 84 
673.120 Tx: F4 03 53 02 A6 
673.243 Rx: 4F 11 D3 02 2A F8 00 00 FF FE 14 3E 80 00 00 FF FE 05 F2 
673.312 Tx: F4 03 57 01 A1 
673.385 Rx: 4F 06 D7 01 85 01 FF E4 
674.419 Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
674.967 Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 41 0E 31 88 10 00 12 00 13 01 02 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 28 
675.970 Tx: F4 03 56 01 A0 
676.062 Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
677.086 Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
677.633 Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 41 0E 31 88 10 00 12 00 13 01 02 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 28 
678.638 Tx: F4 03 56 01 A0 
678.730 Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
679.767 Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
680.314 Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 41 0E 31 88 10 00 12 00 13 01 02 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 28 
681.323 Tx: F4 03 56 01 A0 
681.415 Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
682.438 Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
682.984 Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 41 0E 31 88 10 00 12 00 13 01 02 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 28 
683.989 Tx: F4 03 56 01 A0 
684.079 Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
685.104 Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
685.651 Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 41 0E 31 88 10 00 12 00 13 01 02 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 28 
686.664 Tx: F4 03 56 01 A0 
686.756 Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
687.779 Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
688.327 Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 41 0E 31 88 10 00 12 00 13 01 02 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 28 
689.336 Tx: F4 03 56 01 A0 
689.426 Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
690.449 Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
690.996 Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 41 0E 31 88 10 00 12 00 13 01 02 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 28 
691.999 Tx: F4 03 56 01 A0 
692.092 Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
693.115 Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
693.662 Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 41 0E 31 88 10 00 12 00 13 01 02 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 28 
694.666 Tx: F4 03 56 01 A0 
694.758 Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
695.547 Диагностирование окончено: 01.03.19 17:07:09
751.329 Диагностирование включено: 01.03.19 17:08:05
751.329 W-шина
751.582 Активирование ...
751.636 Tx: F4 03 51 0A AC 
751.699 Rx: 4F 04 D1 0A 40 D0 
751.769 Tx: F4 03 51 31 97 
751.897 Rx: 4F 12 D1 31 01 0F 17 06 03 04 05 07 08 0B 0C 0D 0E 10 12 A9 
751.967 Tx: F4 12 51 30 01 0F 17 06 03 04 05 07 08 0B 0C 0D 0E 10 12 93 
752.693 Rx: 4F 86 D1 30 01 39 30 31 39 36 32 39 4A 31 33 00 00 00 00 00 00 00 00 00 00 00 0F 39 30 32 34 33 34 39 41 30 31 00 00 00 00 00 00 00 00 00 00 00 17 39 30 31 39 38 32 37 42 30 37 00 00 00 00 00 00 00 00 00 00 00 06 31 33 31 38 30 35 30 42 30 32 00 00 00 00 00 00 00 00 00 00 00 03 05 17 11 04 08 01 05 08 01 00 07 FF FF FF 08 25 10 13 0B 13 20 32 81 98 0C 43 42 0D 40 0E 54 54 45 56 4F 20 31 47 10 0B 12 7D C1 
752.766 Tx: F4 03 50 31 96 
753.123 Rx: 4F 44 D0 31 01 02 03 04 0A 0C 0E 10 12 13 14 15 16 19 1A 1D 1E 1F 20 21 22 23 24 25 28 2A 2B 2C 2F 32 33 34 50 51 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 97 
753.193 Tx: F4 03 51 0C AA 
753.283 Rx: 4F 0A D1 0C 79 7C E4 23 04 00 00 5E 
753.353 Tx: F4 02 38 CE 
753.444 Rx: 4F 0B B8 0B 00 00 02 AF 00 00 03 30 69 
753.514 Tx: F4 03 51 09 AF 
753.605 Rx: 4F 0A D1 09 13 20 32 81 98 43 42 84 
753.677 Tx: F4 03 53 02 A6 
753.801 Rx: 4F 11 D3 02 2A F8 00 00 FF FE 14 3E 80 00 00 FF FE 05 F2 
753.871 Tx: F4 03 57 01 A1 
753.943 Rx: 4F 06 D7 01 85 01 FF E4 
754.986 Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
755.534 Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 41 0E 31 74 10 00 12 00 13 01 02 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 D4 
756.550 Tx: F4 03 56 01 A0 
756.642 Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
757.680 Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
758.227 Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 41 0E 31 74 10 00 12 00 13 01 02 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 D4 
759.231 Tx: F4 03 56 01 A0 
759.322 Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
760.357 Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
760.903 Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 41 0E 31 74 10 00 12 00 13 01 02 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 D4 
761.908 Tx: F4 03 56 01 A0 
761.999 Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
763.027 Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
763.574 Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 41 0E 31 74 10 00 12 00 13 01 02 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 D4 
764.579 Tx: F4 03 56 01 A0 
764.671 Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
765.728 Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
766.268 Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 41 0E 31 74 10 00 12 00 13 01 02 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 D4 
767.289 Tx: F4 03 56 01 A0 
767.380 Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
768.422 Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
768.969 Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 41 0E 31 74 10 00 12 00 13 01 02 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 D4 
769.973 Tx: F4 03 56 01 A0 
770.064 Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
771.090 Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
771.637 Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 41 0E 31 74 10 00 12 00 13 01 02 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 D4 
772.639 Tx: F4 03 56 01 A0 
772.731 Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
773.755 Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
774.302 Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 41 0E 31 74 10 00 12 00 13 01 02 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 D4 
775.306 Tx: F4 03 56 01 A0 
775.397 Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
776.466 Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
777.013 Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 41 0E 31 74 10 00 12 00 13 01 02 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 D4 
778.034 Tx: F4 03 56 01 A0 
778.126 Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
779.152 Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
779.699 Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 41 0E 31 74 10 00 12 00 13 01 02 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 D4 
780.702 Tx: F4 03 56 01 A0 
780.792 Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
781.816 Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
782.364 Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 41 0E 31 74 10 00 12 00 13 01 02 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 D4 
783.368 Tx: F4 03 56 01 A0 
783.459 Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
784.483 Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
785.030 Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 41 0E 31 74 10 00 12 00 13 01 02 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 D4 
786.033 Tx: F4 03 56 01 A0 
786.125 Rx: 4F 0A D6 01 02 92 01 02 2F 01 01 2E 
787.145 Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
787.693 Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 41 0E 31 74 10 00 12 00 13 01 02 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 D4 
787.766 Tx: F4 03 56 03 A2 
787.826 Rx: 4F 03 D6 03 99 
787.897 Tx: F4 03 56 01 A0 
787.961 Rx: 4F 04 D6 01 00 9C 
788.693 Tx: F4 03 56 01 A0 
788.758 Rx: 4F 04 D6 01 00 9C 
789.781 Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
790.328 Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 41 0E 31 74 10 00 12 00 13 01 02 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 D4 
791.346 Tx: F4 03 56 01 A0 
791.410 Rx: 4F 04 D6 01 00 9C 
792.435 Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
792.983 Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 41 0E 31 74 10 00 12 00 13 01 02 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 D4 
793.986 Tx: F4 03 56 01 A0 
794.051 Rx: 4F 04 D6 01 00 9C 
795.076 Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
795.623 Rx: 4F 50 D0 30 01 00 02 00 03 00 04 00 0A 00 0C 41 0E 31 74 10 00 12 00 13 01 02 1D 00 00 1E 00 00 1F 00 23 00 24 00 28 71 2A 00 2C 00 32 00 33 00 34 04 1A 51 00 00 00 58 00 96 16 59 00 00 00 5A 00 8A 01 5F 01 71 60 01 71 61 00 00 74 00 75 00 00 D4 
796.626 Tx: F4 03 56 01 A0 
796.691 Rx: 4F 04 D6 01 00 9C 
797.732 Tx: F4 21 50 30 01 02 03 04 0A 0C 0E 10 12 13 1D 1E 1F 23 24 28 2A 2C 32 33 34 51 58 59 5A 5F 60 61 74 75 FD 
798.080 Диагностирование окончено: 01.03.19 17:08:52

 

Dushman7776
Offline
Зарегистрирован: 13.01.2019

может сделать как WTT делает ну там Tx: F4 03 51 0A AC и несколько следующих команд, а потом уже 50 30 . А эта команда 44 03     C4 00     83  это вроде как  и в логе с WTT есть , а потом написано истечение времени ожидания. Типо затуп  у котла какой то.

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Вот лог с 3.62 скетча , но сделанный без твоего w-bus снифера на ардуино, и в начале не переключил на хекс режим показа , 

19:00:22 Connected to FTDI device
19:00:47 ^@^C ;^@D^C˜^@D^C˜^@^C ;O^C;^C ;O^C;^C ;^DD ^@O^C;
19:00:54 P0
19:00:54 ^L^N^P^R^^2‚O^S—0
19:00:54 ^K^LO^N-(^P^@^R^@^^^G2^@^P^CV^AO^D^A^@^DD ^@O^C˜^@
19:01:06 P0
19:01:06 ^L^N^P^R^^2‚O^S—0
19:01:06 ^K^Lb^N.6^P^@^R^@^^^G2^@;^CV^AO^D^A^@^DD ^@O^C˜^@ F4 0A
19:01:18 50 30 0A
19:01:18 0C 0E 10 12 1E 32 B8 4F 13 D0 30 0A
19:01:18 0F 0C 67 0E 2D 6E 10 00 12 00 1E 1C AE 32 00 03 F4 03 56 01 A0 4F 04 D6 01 00 9C F4 04 44 20 00 94 4F 03 C4 00 88 F4 0A
19:01:30 50 30 0A
19:01:30 0C 0E 10 12 1E 32 B8 4F 13 D0 30 0A
19:01:30 1F 0C 69 0E 2E 22 10 00 12 00 1E 22 E5 32 00 27 F4 03 56 01 A0 4F 04 D6 01 00 9C F4 04 44 20 00 94 4F 03 C4 00 88 F4 0A
19:01:42 50 30 0A
19:01:42 0C 0E 10 12 1E 32 B8 4F 13 D0 30 0A
19:01:42 1F 0C 6D 0E 2E 36 10 00 12 00 1E 22 EB 32 00 39 F4 03 56 01 A0 4F 04 D6 01 00 9C F4 04 44 20 00 94 4F 03 C4 00 88 F4 0A
19:01:54 50 30 0A
19:01:54 0C 0E 10 12 1E 32 B8 4F 13 D0 30 0A
19:01:54 1F 0C 70 0E 2D B4 10 00 12 00 1E 22 F5 32 00 BB F4 03 56 01 A0 4F 04 D6 01 00 9C F4 04 44 20 00 94 4F 03 C4 00 88 F4 0A
19:02:06 50 30 0A
19:02:06 0C 0E 10 12 1E 32 B8 4F 13 D0 30 0A
19:02:06 1D 0C 73 0E 2F 9E 10 00 12 00 1E 22 E5 32 00 82 F4 03 56 01 A0 4F 04 D6 01 00 9C F4 04 44 20 00 94 4F 03 C4 00 88 F4 0A
19:02:18 50 30 0A
19:02:18 0C 0E 10 12 1E 32 B8 4F 13 D0 30 0A
19:02:18 1D 0C 76 0E 2F BC 10 00 12 00 1E 22 F5 32 00 B5 F4 03 56 01 A0 4F 04 D6 01 00 9C F4 04 44 20 00 94 4F 03 C4 00 88 F4 0A
19:02:30 50 30 0A
19:02:30 0C 0E 10 12 1E 32 B8 4F 13 D0 30 0A
19:02:30 1D 0C 78 0E 2F BC 10 00 12 00 1E 23 05 32 00 4A F4 03 56 01 A0 4F 04 D6 01 00 9C F4 04 44 20 00 94 4F 03 C4 00 88 F4 0A
19:02:43 50 30 0A
19:02:43 0C 0E 10 12 1E 32 B8 4F 13 D0 30 0A
19:02:43 1D 0C 79 0E 2F B2 10 00 12 00 1E 22 F5 32 00 B4 F4 03 56 01 A0 4F 04 D6 01 00 9C F4 04 44 20 00 94 4F 03 C4 00 88 F4 0A
19:02:55 50 30 0A
19:02:55 0C 0E 10 12 1E 32 B8 4F 13 D0 30 0A
19:02:55 1D 0C 7A 0E 2F BC 10 01 12 C8 1E 22 AB 32 00 2E F4 03 56 01 A0 4F 04 D6 01 00 9C F4 04 44 20 00 94 4F 03 C4 00 88 F4 0A
19:03:07 50 30 0A
19:03:07 0C 0E 10 12 1E 32 B8 4F 13 D0 30 0A
19:03:07 1D 0C 7C 0E 2F B2 10 01 12 C8 1E 22 F5 32 00 78 F4 03 56 01 A0 4F 04 D6 01 00 9C F4 04 44 20 00 94 4F 03 C4 00 88 F4 0A
19:03:19 50 30 0A
19:03:19 0C 0E 10 12 1E 32 B8 4F 13 D0 30 0A
19:03:19 1D 0C 7D 0E 2F B2 10 01 12 C8 1E 22 F0 32 00 7C F4 03 56 01 A0 4F 04 D6 01 00 9C F4 04 44 20 00 94 4F 03 C4 00 88 F4 0A
19:03:31 50 30 0A
19:03:31 0C 0E 10 12 1E 32 B8 4F 13 D0 30 0A
19:03:31 1D 0C 7E 0E 2F B2 10 01 12 C8 1E 22 E5 32 00 6A F4 02 10 E6 4F 02 90 DD 44 02 90 D6 44 02 90 D6 F4 02 10 E6 4F 02 90 DD F4 02 10 E6 4F 02 90 DD F4 02 10 E6 4F 02 90 DD 00 F4 03 51 0A
19:04:18 AC 4F 04 D1 0A
19:04:18 40 D0 F4 0A
19:04:18 50 30 0A
19:04:18 0C 0E 10 12 1E 32 B8 4F 13 D0 30 0A
19:04:18 09 0C 78 0E 30 3E 10 00 12 00 1E 13 A1 32 00 57 F4 03 56 01 A0 4F 04 D6 01 00 9C 00 F4 03 51 0A
19:06:09 AC 00 44 03 C4 00 83 44 03 C4 00 83 00 F4 03 51 0A
19:07:05 AC 4F 04 D1 0A
19:07:05 40 D0 F4 0A
19:07:05 50 30 0A
19:07:05 0C 0E 10 12 1E 32 B8 4F 13 D0 30 0A
19:07:05 00 0C 72 0E 31 2E 10 00 12 00 1E 00 00 32 00 F7 F4 03 56 01 A0 4F 04 D6 01 00 9C

он заработал , но как то не сразу , может мой модем глючил , или сеть , я подключил девайс на авто, он у меня в родной разъем вставляется от таймера , отправил несколько смс , они были доствлены но ответа от котла или дивайса нет , котел не включился и ответных смс небыло, а потом я подключился через тройник для снифера , и  о чудо   все  заработало, но в выключенном состоянии девайс не видит данные о температуре и напряжении , значит не получилось , как то по другому надо этот запрос делать.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Dushman7776 пишет:

может сделать как WTT делает ну там Tx: F4 03 51 0A AC и несколько следующих команд, а потом уже 50 30 . А эта команда 44 03     C4 00     83  это вроде как  и в логе с WTT есть , а потом написано истечение времени ожидания. Типо затуп  у котла какой то.

дак я так и сделал в 3.62. смотри пост #761 строка 44 там в конце это сообщение посылается. Просто этот логер коряво режет сообщения, поэтому трудно ориентироваться. 

Самое интересное, что ведь заработало! - котел отвечает как положено. Просто я как то коряво видимо запарсил этот ответ, поэтому он пишет в смске что нет ответа. Посмотрю что да как, постараюсь исправить

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Тогда не забудь добавить в  еще функцию проверки уровня сигнала , очень понравилась, в гараже у меня всего 12 попугаев , а на работе 31 а это помоему максимум . И с ошибками т.е. их удалением надо что то делать. И еще я разобрался после какой команды настройки модема у меня перестает показывать регистрацию в сети , после набора AT+GSMBUSY=1 все сеть не видит модем а потом приходит смска что абонент доступен. хотя раньше было постоянно занято.

Dushman7776
Offline
Зарегистрирован: 13.01.2019

А что значит \r в конце команды  AT+GSMBUSY=1 из ранних скетчей ? В мануале по командам этого нет .

MaksVV
Offline
Зарегистрирован: 06.08.2015

Все команды должны заканчиваться новой строкой. '\r' это значит перевод строки. Если пишем SIM800.print,  то этот символ в конце нужен. Если пишем SIM800.println то можно без него. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

дак а чё #761 лог то по ходу в момент работы котла. В строке 44 выключается котёл , но т.к. там далее продувка ещё идёт наверное поэтому котёл правильно ещё отвечает. Почему не снял лог, когда котёл спит?

Хотя по логу начиная только со строки 51 это через 3 минуты после остановки котла. По идее должен уже затихнуть  и данные нормально считались.  И вот здесь то и должна была нормальная СМС ка с ответом на ZAPROS прийти. Т.к. я посмотрел парсинг ответа от котла - всё там нормально. 

Хотя глюк всё же был - в строке 50 опять котёл этой хренью ответил 44 03 C4 00 83  и это при том что до этого старт коммуникации F4 03 51 0A AС было отправлено 

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Эта хрень есть и в логе с wtt ,если ты заметил.

MaksVV
Offline
Зарегистрирован: 06.08.2015

да один раз она там была и wtt снова запустила сообщение старт коммуницации, мы также будем делать тогда. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

к версии 3.62 добавил запрос уровня сигнала и переинит при получении от котла 44 03 C4 00 83

получилcя скетч v3.63

char ver[] = "Firmware 3.63";    // версия прошивки



//----------------------------------название ячеек еепром----------------------------------------------------------------
#include <EEPROM.h>
enum Cells {
ResetNumber_cell,      //0
TimeWebasto_cell,      //1
ProtocolSTART_cell,    //2
StartByte_cell,        //3
ProtocolSTATUS_cell,   //4
Heater_cell,           //5
delta_cell,            //6
TelNumber1_cell =20,  //20
TelNumber2_cell =40   //40
};


//-------------------------------------для voltmetr-----------------------------------------------------------------------
                                   
float vout = 0.0;      // Напряжение на входе аналового входа
float Vpit = 0.0;      // Измеряемое напряжение на выходе ИБП
  int volt = 0;        // Напряжение на входе АЦП


//------------------- распиновка ног ардуино (плата весий 8.5-8.8)--------------------------------------------------------

#define OutWebasto_12V      2  // это +12В выход потенциала вкл/выкл вебасто (напрямую к котлу без таймера). 
#define Dallas_pin          3  // пин шины OneWire для датчиков даллас
#define DopOn               4  // сюда доп канал от сигналки на включение вебасто
#define DopOff              5  // сюда доп канал от сигналки на выключение вебасто
#define Ohrana              6  // Сюда состояние охраны сигналки
#define Trevoga             7  // Сюда состояние тревоги
#define IGN                 8  // Сюда состояние зажигания
#define Sost                9  // Сюда состояние вебасто (+12В когда работает)
#define ResetGSM           12  // пин ресета GSM подключен к реле, разрывающее питание модуля. 
#define Eng                14  // (А0) Сюда состояние работы ДВС
#define StatusWebastoLED   15  // (А1) пин LED  индикация включенности котла
#define StartButtonpin     16  // (А2) пин тактовой кнопки вкл/выкл котла 
#define DTR                17  // пин (А3), управляющий энергосберегающим режимом GSM модуля
#define StartEng           18  // (A4) это импульсный минусовой выход вкл/выкл ДВС. подключать на вход событий сиги.
#define OutWebasto_GndImp  19  // (A5) это импульсный минусовой выход вкл/выкл вебасто (к впайке к кнопке таймера).  
#define Voltmeter_pin      A7  // пин, которым измеряем напряжение питания
#define StartButton         0  // программный номер тактовой кнопки вкл/выкл котла 
const bool RelayON =        1; // логика управления реле ресета GSM, в данном случае включается высоким уровнем на пине
#define GSM_RX             10  // пин софт RX Arduino для соединения с TX модуля SIM800
#define GSM_TX             11  // пин софт TX Arduino для соединения с RX модуля SIM800

/*
//------------------- распиновка ног ардуино (плата весий 5)---------------------------------------------------------------

#define Dallas_pin          2  // пин шины OneWire для датчиков даллас
#define OutWebasto_12V      3  // это +12В выход потенциала вкл/выкл вебасто (напрямую к котлу без таймера). 
#define DopOn               4  // сюда доп канал от сигналки на включение вебасто
#define DopOff              5  // сюда доп канал от сигналки на выключение вебасто
#define Ohrana              6  // Сюда состояние охраны сигналки
#define Trevoga             7  // Сюда состояние тревоги
#define StartEng            8  // это импульсный минусовой выход вкл/выкл ДВС. подключать на вход событий сиги.
#define Sost                9  // Сюда состояние вебасто (+12В когда работает)
#define IGN                10  // Сюда состояние зажигания
#define Eng                11  // Сюда состояние работы ДВС
#define OutWebasto_GndImp  12  // это импульсный минусовой выход вкл/выкл вебасто (к впайке к кнопке таймера). 
#define StatusWebastoLED   13  // пин индикация включенности котла
#define ResetGSM           16  // пин ресета GSM (A2) подключен к реле, разрывающее питание модуля. 
#define StartButtonpin     17  // пин тактовой кнопки вкл/выкл котла 
#define DTR                19  // пин (А5), управляющий энергосберегающим режимом GSM модуля
#define StartButton         0  // программный номер тактовой кнопки вкл/выкл котла 
const bool RelayON =        0; // логика управления реле ресета GSM, в данном случае включается низким уровнем на пине
#define GSM_RX             14  // пин софт RX Arduino для соединения с TX модуля SIM800
#define GSM_TX             15  // пин софт TX Arduino для соединения с RX модуля SIM800

*/

//------------------------------------для GSM модуля----------------------------------------------------------------------

#include <SoftwareSerial.h>
      SoftwareSerial SIM800 (GSM_RX, GSM_TX);//Rx, Tx   //UART для соединения с GSM модулем

String currStr = "";
String TelNumber[] = {"", "000000000000", "000000000000", "000000000000"};
byte isStringMessage = 0; 
byte KTOreport = 1;     // флаг кто запросил отчет о запуске котла или ДВС
byte KTOzapros = 0;     // флаг кто запросил баланс или запрос параметров 

uint32_t  prevReset=0;           // для таймера периодичности проверки (командой "АТ")
byte  intervalReset = 15;         // каждые столько мин будет проверка жив ли GSM модуль 
uint32_t  timerWaitOK=0;         // для таймера ожидания ответа после посылки команды "АТ"
bool timerenabledWaitOK=false;   // для таймера ожидания ответа после посылки команды "АТ"
byte NoAnswersGSM=0;             // количество неответов  от GSM модуля
bool gsmOK = 1;                  // флаг есть связь с GSM модулем или нет
bool resettimer = 0;             // для таймера удерживания реле в режиме сброс питания
uint32_t  resetTimer=0;          // для таймера удерживания реле в режиме сброс питания
byte ResetNumber = 0;            // количество ресетов GSM модуля для статистики (хранится в еепром)




//------------------- для шины 1-wire и датчиков DS18B20---------------------------------------------------------------------

#include <OneWire.h>    // библиотека для DS18B20
OneWire ds(Dallas_pin); // датчики DS18B20 на нужный пин

enum TempC {VyhlopC, EngineC, UlicaC, SalonC, size_arrayTemp}; // перечисление нужных температур (в конце размер массива температур)

// ниже соответствие адресов датчиков различным температурам (изначально 0х14=20*С)
byte DS18B20 [size_arrayTemp][10] = {
{0x28, 0xFF, 0xB2, 0xB5, 0xC1, 0x17, 0x05, 0xD1, VyhlopC,  0x14}, 
{0x28, 0xFF, 0xD3, 0xE2, 0xC1, 0x17, 0x04, 0x0D, EngineC,  0x14}, 
{0x28, 0xFF, 0xF8, 0xBC, 0xC1, 0x17, 0x04, 0x48, UlicaC,   0x14},  
{0x28, 0xFF, 0x3F, 0xB7, 0xC1, 0x17, 0x05, 0xF1, SalonC,   0x14}
};
byte delta = 50;  // разница температур выхлопа и улицы, выше которой считается, что пламя в котле есть. 


//---------------------------для организации W-BUS и различные таймеры-----------------------------------------------------------

#include <Button.h>
Button test;

#define K_LINE Serial      //UART для соединения с шиной котла
#define TX 1    
#define NEED 1
#define READY 10

byte header = 0;           // состояние заголовка 
byte message_size = 0;     // размер тела принимаемого сообщения, кол-во байт

byte j = 2;                // инкремент
byte n = 2;
const byte bufsize = 140;  // размер буфера принятого сообщения
byte buf [bufsize] = {0};  // буфер принятого сообщения
byte checksum = 0;         // контрольная сумма входящего сообщения
uint32_t curmillis = 0;    // снимок системного времени
byte delaybyte_TX = 0 ;    // задержка между байтами отправляемого сообщения 
byte waitbyte_RX = 1;      // задержка, мс для успевания заполнения буфера RX (подрегулировать в зависимости от уровня жизнидеятельности на Марсе)
uint32_t timerdelay = 0;   // таймер ожидания байт (для успевания заполнения буфера УАРТ)
bool Delay = 0;            // таймер ожидания байт (для успевания заполнения буфера УАРТ)
#define TIMER_DELAY Delay = 0; timerdelay = curmillis  // включение этого таймера

uint32_t prevRESETheader=0; // таймер сброса заголовка если в момент приёма сообщения данные оборвались
bool RESETheader_timer = 0; // таймер сброса заголовка если в момент приёма сообщения данные оборвались

// команды для котлов ЭВО
byte StartByte = 0x20;
byte HEATER_BEGIN[]         {0x51, 0x0A};
byte HEATER_START[]         {StartByte, 0x3B};
byte HEATER_PRESENCE[]      {0x44, StartByte, 0x00};
byte HEATER_STOP[]          {0x10};
byte HEATER_STATUS_VEVO[]   {0x50, 0x05};
byte HEATER_STATUS_EVO[]    {0x50, 0x30, 0x0A, 0x0C, 0x0E, 0x10, 0x12, 0x1E, 0x32};
byte HEATER_DTC_REQUEST[]   {0x56, 0x01};
byte HEATER_DTC_ERASE[]     {0x56, 0x03};

// команды для котлов ТТС/TTE
byte START_SESSION[]        {0x81};
byte REQUEST_2A10101[]      {0x2A, 0x01, 0x01};
byte REQUEST_2A10102[]      {0x2A, 0x01, 0x02};
byte REQUEST_2A10105[]      {0x2A, 0x01, 0x05};
byte REQUEST_DTC[]          {0xA1};
byte START_TTC[]            {0x31, 0x22, 0xFF};
byte STOP_TTC[]             {0x31, 0x22, 0x00};


enum needAction_ {NO_ACTION, NEED_SMSZAPROS, NEED_SERVICEINFO, NEED_DTCCLEAR};// возможные действия, стоящие в очереди
byte needAction = NO_ACTION;                                                  // переменная действия, стоящего в очереди

enum ProtocolSTATUS_ {STATUSBUS, ANALOG};                   // возможные протоколы чтения статуса котла
enum ProtocolSTART_  {STARTBUS, IMPULSE, POTENCIAL};        // возможные протоколы запуска котла
enum Heater_         {TTC_E, VEVO, EVO, HYDRONIC};          // тип котла

byte  ProtocolSTATUS = STATUSBUS; 
byte  ProtocolSTART  = STARTBUS;
byte  Heater         = EVO;

bool noData  = 0;                               // флаг пришли ли данные от котла после запроса. 
byte w_bus_init = 0;                            //флаг проведена или нет инициализация шины w-bus (25мс LOW, 25мс HIGH для  ЭВО
                                                //                                            либо 300ms LOW, 50ms HIGH, 25ms LOW, 3025ms HIGH для TTC 
byte requiredmessage =  1;                      //флаг, что отправляем в данный момент поддержание старта, запрос параметров или запрос ошибок
byte StartMessageRepeat = 0;                    //количество отправленных сообщений на старт котла
byte StopMessageRepeat =  4;                    //количество отправленных сообщений на остановку котла

byte  TimeWebasto = 30;                         //время работы котла, = 30мин
uint32_t EndReportMillis = 0;                   //переменная для таймера отправки отчета об успешности запуска котла
uint32_t EndReportEngine = 0;                   //переменная для таймера отправки отчета об успешности запуска ДВС
uint32_t Prev_PeriodW_BusMessage = 0;           //переменная для таймера периодической отправки сообщений состояния котла в шину W-Bus 
uint32_t Prev_PeriodW_BusStartStop = 0;         //переменная для таймера периодической отправки сообщений старта/стопа котла в шину W-Bus 
uint32_t prevdelSMS = 0;                        //переменная для таймера периодического удаления СМС 
uint32_t prevVpit = 0;                          //переменная для таймера периодического измерения напряжения АКБ
uint32_t prevInitreset = 0;                     //переменная для таймера сброса инита шины
bool Initreset = 0;                             //переменная для таймера сброса инита шины
uint32_t timerInit = 0; bool timerInitflag = 0; //для таймера инита шины W-BUS
uint32_t prevNeedTimer = 0; bool NeedTimer = 0; //для таймера задержки функций SMSzapros() и ServiceINFO() на время обновления параметров по шине


uint32_t last_Flame = 0;                        //для таймера сброса флага пламени, если нет ответов от котла

//для таймера создания импульса GND - для протокола запуска котла импульсом GND 
uint32_t timer=0; bool timerenabled=false;
#define TIMEREXPIRED (curmillis-timer)>800

//для таймера  - старт двигателя - импульс +5В на транзистор, в итоге минусовой импульс 1.5 сек на вход событий сигналки для запуска ДВС)
uint32_t  timerStartEng=0; bool timerenabledStartEng=false;
#define TIMEREXPIRED_StartEng (millis()-timerStartEng)>1500

//для таймера  - старт котла по W-BUS )
uint32_t timerStart_W_BUS=0; bool timerenabledStart_W_BUS=false;
#define TIMEREXPIRED_Start_W_BUS (curmillis-timerStart_W_BUS)> (uint32_t)TimeWebasto * 60000UL



//---------------------------------Основные переменные--------------------------------------------------------------------------------  

bool webasto = 0;             // флаг команды на работу Webasto. 0 - котел выключен, 1 - котел включен
bool startWebasto_OK = 0;     // флаг успешного запуска котла
bool report = false;          // флаг нужности отправки отчета false - не нужно отправлять, true - нужно отправлять
bool reportEngine = false;    // флаг нужности отправки отчета false - не нужно отправлять, true - нужно отправлять
bool engine =0;               // флаг работает ли ДВС или нет
bool ignition=0;              // флаг включено ли зажигание или нет
bool ohrana=0;                // флаг включена ли охрана или нет
bool trevoga=0;               // флаг включена ли тревога или нет
bool alarmSMS = 0;            // флаг отправлена ли смс о тревоге или нет

bool waterpump = 0;           // флаг работы циркуляционного насоса
bool plug      = 0;           // флаг работы штифта накаливания
bool airfan    = 0;           // флаг работы нагнетателя воздуха
bool fuelpump  = 0;           // флаг работы топливного насоса
bool blowerfan = 0;           // флаг работы вентилятора печки автомобиля
byte DTC[7] ={0};             // коды неисправностей котла



//---------------------------СТАРТОВЫЙ ЦИКЛ--------------------------------------------------------------------------------------------

void setup() 
{


delay (3500);


test.NO(); 
test.pullUp();
test.duration_bounce       (  50);
test.duration_click_Db     ( 250);
test.duration_inactivity_Up(5000);
test.duration_inactivity_Dn(1000);
test.duration_press        ( 500);
test.button(StartButtonpin);            // в скобках пин тактовой кнопки вкл/выкл котла (программный номер у неё будет 0)
 
pinMode (DopOn,   INPUT_PULLUP); 
pinMode (DopOff,  INPUT_PULLUP); 
pinMode (Sost,    INPUT_PULLUP); 
pinMode (Ohrana,  INPUT_PULLUP); 
pinMode (Trevoga, INPUT_PULLUP); 
pinMode (IGN,     INPUT_PULLUP); 
pinMode (Eng,     INPUT_PULLUP); 
  
pinMode (OutWebasto_12V,     OUTPUT);  digitalWrite (OutWebasto_12V,      LOW);
pinMode (StartEng,           OUTPUT);  digitalWrite (StartEng,            LOW);
pinMode (13,                 OUTPUT);  digitalWrite (13,                  LOW);
pinMode (StatusWebastoLED,   OUTPUT);  digitalWrite (StatusWebastoLED,    LOW);
pinMode (OutWebasto_GndImp,  OUTPUT);  digitalWrite (OutWebasto_GndImp,   HIGH);
pinMode (DTR,                OUTPUT);  digitalWrite (DTR,                 HIGH);  // делаем высокий, а низкий уровень будет для пробуждения GSM из "спячки"
pinMode (ResetGSM,           OUTPUT);  digitalWrite (ResetGSM,        !RelayON);  // реле ресет на данный момент делаем "неактивно"


   SIM800.begin(19200);           // сериал соединение для gsm модуля
   delay(100);
   NastroykaGSM ();


TimeWebasto =    EEPROM.read(TimeWebasto_cell);
ProtocolSTART  = EEPROM.read(ProtocolSTART_cell);
ProtocolSTATUS = EEPROM.read(ProtocolSTATUS_cell);
ResetNumber =    EEPROM.read(ResetNumber_cell);
StartByte =      EEPROM.read(StartByte_cell);
Heater =         EEPROM.read(Heater_cell);
delta  =         EEPROM.read(delta_cell);
for (int i=0; i<12; i++) TelNumber[1][i] = EEPROM.read (i+TelNumber1_cell);
for (int i=0; i<12; i++) TelNumber[2][i] = EEPROM.read (i+TelNumber2_cell);


        if (Heater == EVO || Heater == VEVO) K_LINE.begin(2400, SERIAL_8E1);
   else if (Heater == TTC_E) K_LINE.begin(10400);


for (byte i=0; i<20; i++) {digitalWrite (13, !digitalRead(13)); delay (80);}
digitalWrite (13,0);
}



//------------------------------------------ЛУП-----------------------------------------------------------------------------------


void loop() {
curmillis = millis();
test.read();

digitalWrite (StatusWebastoLED, webasto);
//digitalWrite (13, startWebasto_OK);
//digitalWrite (13, webasto);


//если нажали тактовую кнопку меняем состояние котла на противоположное 
if (test.event_press_short (StartButton)) {
  if (!webasto) {StartWebasto(); report = false;}
  else StopWebasto();
    }

if (ProtocolSTATUS==ANALOG) {if (Temper(VyhlopC) - Temper(UlicaC) > delta) startWebasto_OK = 1;
                             else startWebasto_OK = 0;}

if (ProtocolSTART==IMPULSE) webasto = !digitalRead (Sost);

Heater_BUS();

//ниже для таймера старта котла по шине и аналогу 
 
  if (timerenabledStart_W_BUS && TIMEREXPIRED_Start_W_BUS) StopWebasto();

//ниже для таймера создания импульса на старт ДВС 

if (timerenabledStartEng && TIMEREXPIRED_StartEng) {digitalWrite (StartEng, LOW); timerenabledStartEng=false;}
    
 engine =  !digitalRead (Eng);
 ignition= !digitalRead (IGN); 
 ohrana=   !digitalRead (Ohrana);  
 trevoga=  !digitalRead (Trevoga);
  
if (webasto && report) timerReport ();
if (reportEngine) timerReportEngine ();
if (!ohrana) alarmSMS = false;


   if (trevoga && !alarmSMS) AlarmSMS ();
   if (gsmOK)readSMS();
   Reset_gsm();
   delSMS();


WebastoOprosImpulse ();
izmereniya();

}


//-----------------------------------------------------------конец луп-------------------------------------------------------------



void izmereniya() { 

if (millis()-prevVpit>7000){

//измерение напряжения борт сети
if (ProtocolSTATUS==ANALOG){
   volt = analogRead(Voltmeter_pin);                      
   vout = (volt * 4.13) / 1024;             
   Vpit = vout / (9700.0/(98930.0+9700.0));  // По формуле Vpit = vout / (R2/(R1+R2)) 
   if (Vpit<0.09)  Vpit=0.0;                  // Округление до нуля 
}  

// ниже измерение датчиков даллас
static bool n=0;        // флаг работы: запрос температуры или её чтение
n=!n;
if (n) {ds.reset();     // сброс шины
        ds.write(0xCC); // обращение ко всем датчикам
        ds.write(0x44); // начать преобразование (без паразитного питания)  
       }
else   {
  for (byte i=0; i<size_arrayTemp; i++){  
    int Temper_ = 20; byte buff[9];
    ds.reset();
    ds.select(DS18B20[i]);
    ds.write(0xBE); // чтение регистров датчиков
    for (byte j=0; j<9; j++) buff[j]=ds.read(); // читаем все 9 байт от датчика
    ds.reset();
    if (OneWire::crc8(buff, 8) == buff[8]){     // если контрольная сумма совпадает 
          if (DS18B20[i][8]==EngineC && ProtocolSTATUS==STATUSBUS){} // если данные берём по шине, то t двигла не мереем
          else {
          Temper_ = buff[0]|(buff[1]<<8);       // читаем температуру из первых двух байт (остальные были нужны только для проверки CRC)
          Temper_ = Temper_ / 16;
          if (Temper_<150 && Temper_>-55) DS18B20[i][9] = Temper_;}
}}}


prevVpit=millis();
}}



int8_t Temper (const byte &addressTemp) {for(byte j=0; j<size_arrayTemp; j++){if(DS18B20[j][8]==addressTemp)return(int8_t)DS18B20[j][9];} return-99;}



void WebastoOprosImpulse (){

// опрос допканалов от сигнализации включения/ выключение котла и таймер импульса старт/стоп котла 
  
  if (timerenabled) {if (TIMEREXPIRED) {digitalWrite (OutWebasto_GndImp, HIGH); timerenabled=false;}}
  else  {if (!digitalRead (DopOn)  && !webasto) {StartWebasto(); KTOreport = 1;}
         if (!digitalRead (DopOff) && webasto) StopWebasto();
         }}


// цикл таймера отправки отчета об успешности запуска котла (отчёт через 6 мин после старта)
void timerReport () {
   if(millis() - EndReportMillis > 360000UL) 
   {EndReportMillis = millis(); report = false; SMSzapros();  }} 

// цикл таймера отправки отчета об успешности запуска ДВС  (отчёт через 60сек после старта)                       
void timerReportEngine () {
   if(millis() - EndReportEngine > 90000ul) 
   {EndReportEngine = millis(); reportEngine = false; SMSzapros();}} 





   void NastroykaGSM () {
  digitalWrite (DTR, LOW);      // выводим из спячки GSM модуль
    delay (150);
  SIM800.println(F("AT"));                    //просто AT для разогреву
    delay(250);
  SIM800.println(F("AT+CMGF=1"));             //устанавливает текстовый режим смс-сообщения
    delay(250);
  SIM800.println(F("AT+IFC=0, 0"));           //отключает программный контроль потоком передачи данных
    delay(250);
  SIM800.println(F("AT+GSMBUSY=1"));          //запрет всех входящих звонков
    delay(250);
  SIM800.println(F("AT+CNMI=1,2,2,1,0"));     //включает оповещение о новых сообщениях
    delay(250);
  SIM800.println(F("AT+CMGDA=\"DEL ALL\""));  // удаляем все смс, ки
   delay(1500);
  SIM800.println(F("AT+CSCLK=1"));            //включает энергосберегающий режим 
  delay(150);
  digitalWrite (DTR, HIGH);     // вводим в спячку GSM модуль высоким уровнем на пине DTR
  
}

void startSMS(byte stat) //__________________Цикл подготовки модуля к отправке СМС-сообщений по первому номеру
{
    if (stat==0) stat = KTOreport;
     digitalWrite (DTR, LOW); // выводим из спячки GSM модуль
         delay (150);
     SIM800.print(F("AT+CMGF=1\r"));
         delay(200);
     SIM800.print(F("AT+CMGS=\"")); SIM800.print(TelNumber[stat]); SIM800.println("\""); 
         delay(200);
}



void EndSMS ()
{
   SIM800.println((char)26);                       // Команда отправки СМС
   delay(1500);
   digitalWrite (DTR, HIGH); // вводим в спячку SIM800 модуль 
   
}

void delSMS ()
{
if (millis() - prevdelSMS > 7200000ul){  //раз в 2 часа 
 digitalWrite (DTR, LOW); // выводим из спячки SIM800 модуль
    delay (150);
 SIM800.print(F("AT+CMGDA=\"DEL ALL\"\r")); // удаляем все смс, ки
   delay(1500);
 digitalWrite (DTR, HIGH); // вводим в спячку SIM800 модуль 
   delay (150);

  prevdelSMS = millis();}
}


void readSMS() //_____Цикл чтения входящих СМС-сообщений______________     
{
    if (!SIM800.available()) return;
    static bool SaveNumber2 = 0;      // флаг когда необходима запись номера#2, он true
    char currSymb = SIM800.read();

    if ('\r' == currSymb)
       {
         if (isStringMessage!=0&&isStringMessage!=3) //если текущая строка - SMS-сообщение, отреагируем на него соответствующим образом
                {
if      (!currStr.compareTo("ZAPROS"))       {if (webasto)SMSzapros(); else {NeedTimer = 1; prevNeedTimer = curmillis; needAction = NEED_SMSZAPROS; w_bus_init = 1;}}              // Передача параметров по СМС
else if (!currStr.compareTo("ZAPROSTEL"))    {SMSzaprosTEL();}           // Передача номеров телефонов пользователей по СМС
else if (!currStr.compareTo("Service-info")) {if (webasto) ServiceINFO(); else {NeedTimer = 1; prevNeedTimer = curmillis; needAction = NEED_SERVICEINFO;w_bus_init = 1;}}            // Передача сервисной информации  по СМС
else if (!currStr.compareTo("GSMResets-0"))  {ResetNumber=0; EEPROM.write (ResetNumber_cell, ResetNumber); ServiceINFO();}     //сброс счетчика ресетов GSM модуля
else if (!currStr.compareTo("Version"))      {startSMS(isStringMessage);  SIM800.println (ver); EndSMS ();}               //запрос версии ПО
else if (!currStr.compareTo("Erase DTC"))    {NeedTimer = 1; prevNeedTimer = curmillis; needAction = NEED_DTCCLEAR; if (w_bus_init == 0) w_bus_init = 1;}               //запрос на стриание ошибок

else if (!currStr.compareTo("Signal-level")) {digitalWrite (DTR, LOW);  delay (150); SIM800.println(F("AT+CSQ")); digitalWrite (DTR, HIGH);}                // запрос уровня сигнала GSM
              
else if (!currStr.compareTo("Webasto-ON"))  { startSMS(isStringMessage); SIM800.println(F("Webasto ")); 
  
           if (!webasto)  {StartWebasto (); KTOreport = isStringMessage;}
           else SIM800.println(F("uzhe ")); SIM800.println (F("vkluchena")); EndSMS();}

                                                            
else if (!currStr.compareTo("Webasto-OFF"))   {startSMS(isStringMessage); SIM800.println(F("Webasto "));  
           if (webasto)StopWebasto ();  // если получили команду на выключение и вебаста в настоящий момент включена - выключаем
           else SIM800.println(F("uzhe "));  SIM800.println(F("otkluchena"));EndSMS();}          

// если получили команду на включение ДВС и он в настоящий момент выключен - включаем
else if (!currStr.compareTo("Engine-ON"))  {startSMS(isStringMessage); SIM800.println(F("Dvigatel "));  
           if (!engine)  { digitalWrite (StartEng, HIGH);  timerStartEng=millis(); timerenabledStartEng=true; reportEngine = true; EndReportEngine = timerStartEng; KTOreport = isStringMessage;} 
           else SIM800.println(F("uzhe ")); SIM800.println(F("start")); EndSMS();}
                                                                                 
else if (!currStr.compareTo("Engine-OFF"))   {startSMS(isStringMessage); SIM800.println(F("Dvigatel "));  
           if (engine){ digitalWrite (StartEng, HIGH);  timerStartEng=millis(); timerenabledStartEng=true; reportEngine = false;} // если получили команду на выключение ДВС и он в настоящий момент работает - выключаем
           else SIM800.println(F("uzhe ")); SIM800.println(F("ostanovlen")); EndSMS();}          
              
else if (!currStr.compareTo("Impulse"))   {if (!webasto) {ProtocolSTART = IMPULSE;  EEPROM.write(ProtocolSTART_cell,ProtocolSTART);     
                                            startSMS(isStringMessage); SIM800.println(F("zapusk GND_impulse")); EndSMS();}}

else if (!currStr.compareTo("Startbus"))  {if (!webasto) {ProtocolSTART = STARTBUS; EEPROM.write(ProtocolSTART_cell,ProtocolSTART);  webasto = 0;  
                                            startSMS(isStringMessage); SIM800.println(F("zapusk BUS")); EndSMS();}}

else if (!currStr.compareTo("Potencial")) {if (!webasto) {ProtocolSTART = POTENCIAL; EEPROM.write(ProtocolSTART_cell,ProtocolSTART);   
                                            startSMS(isStringMessage); SIM800.println(F("zapusk +12V Potencial")); EndSMS();}}

else if (currStr.endsWith("Status"))   {if (!webasto) {byte st = currStr.toInt(); if (st >= STATUSBUS && st<=ANALOG )ProtocolSTATUS = st; EEPROM.write(ProtocolSTATUS_cell,ProtocolSTATUS);   
                                            startSMS(isStringMessage); SIM800.print (F("Status: "));
                                                                             if (ProtocolSTATUS == 0)SIM800.println(F("BUS")); 
                                                                        else if (ProtocolSTATUS == 1)SIM800.println(F("Analog"));
                                                                        EndSMS();}}    


else if (currStr.endsWith("HeaterType")) {if (!webasto) {byte st = currStr.toInt(); if (st >= TTC_E && st<=HYDRONIC) Heater = st; EEPROM.write(Heater_cell,Heater);   
                                            startSMS(isStringMessage); SIM800.print (F("Heater: "));
                                                                             if (Heater == 0)SIM800.println(F("TTC_E")), K_LINE.end(),  K_LINE.begin(10400);
                                                                        else if (Heater == 1)SIM800.println(F("VEVO")),  K_LINE.end(),  K_LINE.begin(2400, SERIAL_8E1);
                                                                        else if (Heater == 2)SIM800.println(F("EVO")),   K_LINE.end(),  K_LINE.begin(2400, SERIAL_8E1);
                                                                        else if (Heater == 3)SIM800.println(F("HYDRONIC"));
                                                                             
                                                                        EndSMS();}}      
                                                                                                                                              
else if (currStr.endsWith("Delta"))   {if (!webasto) {delta = currStr.toInt(); //
               EEPROM.write(delta_cell, delta);  startSMS(isStringMessage);
               SIM800.print(F("DeltaT: ")); SIM800.print(delta); SIM800.print(F("*C")); EndSMS();}}
                                                                                                                                            

               
else if (currStr.endsWith("min"))   {if (!webasto) {TimeWebasto = currStr.toInt(); // для задания время цикла работы отправить сообщение вида "25 min", где 25 время работы в мин
               if (TimeWebasto>59)  TimeWebasto = 59;
               if (TimeWebasto<=15) TimeWebasto = 15;
               EEPROM.write(TimeWebasto_cell,TimeWebasto);
               startSMS(isStringMessage); SIM800.print(F("Webasto time: ")); SIM800.print(TimeWebasto); SIM800.print(F("min")); EndSMS();}}
               
else if (currStr.endsWith("StartByte")) {byte Z =currStr.toInt(); if (Z>=0x14 && Z<=0x17) StartByte= Z+12;
               startSMS(isStringMessage); SIM800.print(F("StartByte: ")); SIM800.print(StartByte, HEX); SIM800.print(F("h")); EndSMS();}

else if (!currStr.compareTo("ResetNumbers"))   {if (isStringMessage == 1) {startSMS(isStringMessage); SIM800.println(F("Phone numbers are erased")); EndSMS(); 
                                                                     
             TelNumber[1] = "000000000000"; TelNumber[2] = "000000000000"; for (int i=0; i<12; i++) {EEPROM.write (i+TelNumber1_cell,  TelNumber[1][i]); EEPROM.write (i+TelNumber2_cell,  TelNumber[2][i]); }}}

else if (!currStr.compareTo("WriteNumber2")&& isStringMessage == 1)   { 
                SaveNumber2 = 1; startSMS(isStringMessage); SIM800.println(F("Otpravte lyuboye SMS s nomera#2 dlya sohraneniya nomera")); EndSMS();} 

                                                                        

                                                     
else if (!currStr.compareTo("Balance"))    SMSbalance();
            isStringMessage = 0;
                }
              
              
else if (isStringMessage==3){ if (!currStr.compareTo("WriteNumber1"))   { TelNumber[1] = TelNumber[3]; for (int i=0; i<12; i++) {EEPROM.write (i+TelNumber1_cell, TelNumber[3][i]);}
              startSMS(1); SIM800.println(F("Tel Number#1 is saving in memory"));  SIM800.print("Tel#1: ");  SIM800.println (TelNumber[1]); EndSMS();
              } 
                                             else if (!currStr.compareTo("ZAPROS"))   { SMSzapros();}   
                                             else if (!currStr.compareTo("ZAPROSTEL"))   { SMSzaprosTEL();}               // Передача номеров телефонов пользователей по СМС            
               isStringMessage = 0;
              
              }           



                
else if (isStringMessage==0) {  if (TelNumber[1]!="000000000000" && !SaveNumber2 && TelNumber[1]!="яяяяяяяяяяяя"){
         
                     if (currStr.startsWith("+CMT: \""+TelNumber[1])) { isStringMessage = 1; KTOzapros = 1; }   
                else if (currStr.startsWith("+CMT: \""+TelNumber[2])) { isStringMessage = 2; KTOzapros = 2; }   
                else if (currStr.startsWith("+CUSD: 0,"))  //если текущая строка начинается с "+CUSD",то следующая строка является запросом баланса
                  {
                  startSMS(KTOzapros);
                  SIM800.print (currStr);
                  EndSMS();
                  }

                else if (currStr.startsWith("+CSQ:")) //если текущая строка начинается с "+CSQ",то значит был запрос на уровень сигнала GSM, отправим ответ запрашивающему
                  {
                  startSMS(KTOzapros);
                  SIM800.print (currStr);
                  EndSMS();
                  }
                                                }

                else if    (currStr.startsWith("+CMT:") && !SaveNumber2) { isStringMessage = 3; for (int i =0; i<12; i++) {TelNumber[3][i]=currStr[i+7];}}
                else if    (currStr.startsWith("+CMT:") && SaveNumber2) { for (int i =0; i<12; i++) {TelNumber[3][i]=currStr[i+7];} TelNumber[2] = TelNumber[3]; for (int i=0; i<12; i++) {EEPROM.write (i+TelNumber2_cell, TelNumber[3][i]);}
              startSMS(2); SIM800.println(F("Vash nomer sochranyon kak Number#2 v pamyati!")); 
              SIM800.print(F("Tel#1: ")); SIM800.println(TelNumber[1]); SIM800.print(F("Tel#2: "));  SIM800.println (TelNumber[2]); EndSMS(); SaveNumber2 = 0; } 
              
              } 
               
        currStr = "";
      } 
 
    else if ('\n' != currSymb && currSymb!=0x13 && currSymb!=0x11)  currStr += String(currSymb);
}



void SMSzaprosTEL(){
  startSMS(isStringMessage);
  PrintNumbers (); 
  EndSMS();                                 
  }


void SMSbalance() {
digitalWrite (DTR, LOW); // выводим из спячки SIM800 модуль
      delay (150);
SIM800.print(F("AT+CMGF=1\r"));
      delay(200);
SIM800.println (F("AT+CUSD=1,\"#100#\""));    // команда на замену на транслит *111*6*2# у МТС 
      delay(1500);  
digitalWrite (DTR, HIGH); // вводим в спячку SIM800 модуль 
      delay (150);  
                             
     
}


void AlarmSMS() {for (byte i = 0; i<2; i++) {startSMS(i+1); SIM800.println (F("Vnimanie!!! Trevoga!!! Sirena Vkl!")); EndSMS();} alarmSMS = true;}
 


void PrintNumbers () {for (byte i=0; i<2; i++) {SIM800.print(F("Tel#")); SIM800.print (i+1); SIM800.print(F(" ")); SIM800.println(TelNumber[i+1]);}}

void SMSzapros()

{

  startSMS(isStringMessage);
  if (isStringMessage == 3){
 
 SIM800.println (F("Tel.number#1 not has been save in memory"));
 SIM800.println (F("For save Tel#1 send SMS command \"WriteNumber1\""));
 PrintNumbers ();
  }
  

  
  
  else {
  
SIM800.print (F("Webasto ")); on_off (webasto);
        if (webasto) { 
           SIM800.print (F("StartWebasto "));
           if (startWebasto_OK) SIM800.println (F("OK"));
           else SIM800.println (F("FAIL"));}
SIM800.print (F("Engine    "));  on_off (engine);
SIM800.print (F("IGN        ")); on_off (ignition);
SIM800.print (F("Ohrana  "));    on_off (ohrana);
     if (trevoga)  SIM800.println (F("Vnimanie!!! Trevoga!!! Sirena Vkl!"));
     
  SIM800.print(F("Battery: "));      if ((needAction>0 && !noData) || needAction == 0 || ProtocolSTATUS == ANALOG) {SIM800.print (Vpit,1); SIM800.println(F(" V"));}
                                else if (needAction>0 && noData && ProtocolSTATUS != ANALOG) SIM800.println(F(" No Data"));
  SIM800.print(F("Engine:  ")); if ((needAction>0 && !noData) || needAction == 0 || ProtocolSTATUS == ANALOG) {SIM800.print (Temper(EngineC));  grad ();}
                                else if (needAction>0 && noData && ProtocolSTATUS != ANALOG) SIM800.println(F(" No Data"));
 if (ProtocolSTATUS == ANALOG){ SIM800.print(F("Vyhlop:  ")); SIM800.print (Temper(VyhlopC));  grad ();}
  SIM800.print(F("Ulica:     ")); SIM800.print (Temper(UlicaC)); grad ();
  SIM800.print(F("Salon:    ")); SIM800.print (Temper(SalonC));  grad ();  

  if (ProtocolSTATUS == STATUSBUS){
  SIM800.print(F("Errors:   ")); if ((needAction>0 && !noData) || needAction == 0) SIM800.println (DTC[0]);
                                else if (needAction>0 && noData) SIM800.println(F(" No Data"));}
  
  
 
  }  
   EndSMS();    
                          
}

void on_off (const bool &stat) {if (stat) SIM800.println (F("ON")); else SIM800.println (F("OFF")); }
void grad () {SIM800.println (F("*C")); }





void ServiceINFO(){
  
       startSMS(isStringMessage);
  SIM800.print(F("Heater:  ")); 
       if (Heater==TTC_E)     SIM800.println(F("TTC/E"));
  else if (Heater==VEVO)      SIM800.println(F("VEVO"));
  else if (Heater==EVO)       SIM800.println(F("EVO"));
  else if (Heater==HYDRONIC)  SIM800.println(F("HYDRONIC"));
  SIM800.print(F("Start:    "));
       if (ProtocolSTART==IMPULSE)   SIM800.println(F("GND Imp"));
  else if (ProtocolSTART==STARTBUS)  {SIM800.print(F("BUS"));
             if (Heater== VEVO || Heater== EVO) {SIM800.print(F(" 0x")); SIM800.println (StartByte, HEX);}
             else SIM800.println();}
  else if (ProtocolSTART==POTENCIAL) SIM800.println(F("Potencial+12V"));
  
  SIM800.print(F("Status:  "));
       if (ProtocolSTATUS==ANALOG)    SIM800.println(F("ANALOG"));
  else if (ProtocolSTATUS==STATUSBUS) SIM800.println(F("BUS"));
  
   
  if (ProtocolSTART!=IMPULSE) {SIM800.print(F("Webasto Time: ")); SIM800.print (TimeWebasto); SIM800.println(F("min"));}
  SIM800.print(F("SIM800 Resets: ")); SIM800.println (ResetNumber); 

  if (ProtocolSTATUS==ANALOG) {SIM800.print(F("DeltaT:  ")); SIM800.print(delta);SIM800.println(F("*C"));}

  if (ProtocolSTATUS==STATUSBUS && !noData) {
    SIM800.print(F("   BurnFAN       ")); on_off (airfan);
    SIM800.print(F("   WaterPUMP ")); on_off (waterpump);
    SIM800.print(F("   PLUG            ")); on_off (plug);
    SIM800.print(F("   FuelPUMP    ")); on_off (fuelpump);
    SIM800.print(F("   Blower          ")); on_off (blowerfan);
    
   SIM800.print (F("Errors:  ")); SIM800.println (DTC[0]);
  if (DTC[0] >0) for (byte i=0; i<DTC[0]; i++) {
  if (DTC[i+1]<=0x0F) SIM800.print(F("0"));
     SIM800.print (DTC[i+1], HEX); 
     if (bitRead(DTC[6], i+1)) SIM800.println (F(" Active")); 
     else SIM800.println (F(" Passive"));      }
                             }
 else if (noData) SIM800.println(F("Heater not answer. No Data"));                                                                               
   EndSMS();    
  
  }

void StartWebasto()
{
 if (ProtocolSTART==IMPULSE){
  
  digitalWrite (OutWebasto_GndImp, LOW); 
  timer=curmillis; 
  timerenabled=true;}

 else {
  StartMessageRepeat = 0;
  webasto = 1; digitalWrite (OutWebasto_12V, HIGH);
  timerStart_W_BUS=millis();
  timerenabledStart_W_BUS = true;}

  report = true; EndReportMillis = millis();
  w_bus_init = NEED;
}

void StopWebasto()
{
 if (ProtocolSTART==IMPULSE){ digitalWrite (OutWebasto_GndImp, LOW); 
  timer=curmillis; 
  timerenabled=true;}

 else {
  StopMessageRepeat = 0;
  webasto = 0; digitalWrite (OutWebasto_12V, LOW);
  timerenabledStart_W_BUS = false;}
   report = false;
   
   
}



void Heater_BUS (){
  
if      (Heater == EVO || Heater == VEVO){
if (webasto) {
    if (StartMessageRepeat<4 && (millis()-Prev_PeriodW_BusStartStop>800) && w_bus_init >= 9){
  sendMessage (HEATER_START, sizeof(HEATER_START)); 
  StartMessageRepeat++; 
  Prev_PeriodW_BusStartStop = millis();
  
    }
  if (StartMessageRepeat>=4){ if (millis()-Prev_PeriodW_BusMessage>4000)  {
    
         if (requiredmessage==1) sendMessage (HEATER_PRESENCE, sizeof(HEATER_PRESENCE));  
    else if (requiredmessage==2) {if (Heater == EVO) sendMessage (HEATER_STATUS_EVO,  sizeof(HEATER_STATUS_EVO));
                                  if (Heater == VEVO)sendMessage (HEATER_STATUS_VEVO, sizeof(HEATER_STATUS_VEVO));}
    else if (requiredmessage==3) sendMessage (HEATER_DTC_REQUEST, sizeof(HEATER_DTC_REQUEST));  
requiredmessage++; if (requiredmessage > 3) requiredmessage = 1;
StopMessageRepeat = 0;
    
    Prev_PeriodW_BusMessage = millis();
    }}}





else if (StopMessageRepeat<4 && (millis()-Prev_PeriodW_BusStartStop>800)){
  sendMessage (HEATER_STOP, sizeof(HEATER_STOP));
StopMessageRepeat++; 
StartMessageRepeat = 0;
   Prev_PeriodW_BusStartStop = millis();
  
  
  }


if (!timerInitflag && w_bus_init==NEED) {K_LINE.end(); pinMode (TX, OUTPUT); digitalWrite(TX, 0); timerInit = millis(); timerInitflag = 1;}
if ( timerInitflag && (millis() - timerInit>24) && w_bus_init==NEED) {timerInit = millis(); digitalWrite(TX, 1); w_bus_init=2; }
if ( timerInitflag && (millis() - timerInit>24) && w_bus_init==2) {K_LINE.begin (2400,SERIAL_8E1 );timerInitflag = 0; w_bus_init=9; 
                                                                   if (needAction>0) sendMessage (HEATER_BEGIN, sizeof(HEATER_BEGIN));  }


if (K_LINE.available()){
    

 // первый старт байт
 if (header == 0 && Delay){TIMER_DELAY ; buf[0]=K_LINE.read();  
         if (buf[0]==0x4F || buf[0]==0x44){header = 1; RESETheader_timer=1; prevRESETheader = curmillis; }
         else {header = 0; RESETheader_timer=0;}
         }                  

 // длина сообщения
 if (header == 1 && Delay){TIMER_DELAY ; buf[1]=K_LINE.read(); message_size = buf[1]; if (message_size > bufsize) message_size = bufsize;  header = 4;j=2;n=2;checksum = 0;} 

 // пишем тело сообщения 
 if (header == 4 && Delay && j< message_size+n) {
 buf[j] = K_LINE.read();
 
 if (j<message_size+n-1) checksum^= buf[j]; // подсчёт КС
 
 if (j==message_size+n-1) header = 5; 
 TIMER_DELAY ; j++;} 

 } // end of K_LINE.available()

 // сообщение приняли, действуем
 if (header == 5) {TIMER_DELAY ;  
   
for(byte i = 0; i<n; i++) checksum^=buf[i]; // прибавляем к контрольной сумме старт байты

 // если контрольная сумма верна: 
if ( checksum == buf[message_size+n-1]) {
  
if (Heater == EVO){
    
     if (buf[2]==0xD0 && buf[3]==0x30)                          {    // если получили сообщение с текущими данными
               
                 if  (buf[4] ==0x0A) { 
                          airfan    = (bool)buf[5];                  // получаем флаг работы нагнетателя воздуха
                          plug      = (buf[5] & 0x02)>>1;            // получаем флаг работы штифта накаливания
                          fuelpump  = (buf[5] & 0x04)>>2;            // получаем флаг работы топливного насоса
                          waterpump = (buf[5] & 0x08)>>3;            // получаем флаг работы циркуляционного насоса
                          blowerfan = (buf[6] & 0x10)>>4;            // получаем флаг работы вентилятора печки автомобиля
                  
                                     }
                   
                 if  (buf[6] ==0x0C) {for (byte p=0; p<size_arrayTemp; p++ ) {if (DS18B20[p][8]==EngineC){DS18B20[p][9] = buf[7]-50; break;}    }} // получаем температуру антифриза
                 if  (buf[8]==0x0E) {Vpit = (float)(buf[9]<<8|buf[10])/1000.0;}                 // получаем напряжение борт сети
                 if  (buf[11]==0x10) {startWebasto_OK = (bool)buf[12]; last_Flame = curmillis;} // проверяем наличие пламени                                                
                 
                 if (needAction>0 && needAction<NEED_DTCCLEAR) {w_bus_init = 12; sendMessage (HEATER_DTC_REQUEST, sizeof(HEATER_DTC_REQUEST));}
                                                                }

     if (buf[0]==0x44 && buf[2]==0xC4 && buf[3]==0x00) {w_bus_init = 1; delay (500); K_LINE.flush();}             // если получили от котла сбой инита, делаем переинит 
     
     if (buf[2]==0xD6 && buf[3]==0x01) {if (needAction>0 && needAction<NEED_DTCCLEAR) w_bus_init = 13;
      for (byte h = 0; h< sizeof(DTC); h++) DTC[h]=0;
      DTC[0] = buf[4];
      for (byte h = 0; h< buf[4]; h++) {DTC[h+1]=buf[h*3+5]; bitWrite (DTC[6], h+1,  (buf[h*3+6] & 0x02)>>1);}
            }  

     if (buf[2]==0xD6 && buf[3]==0x03)  {startSMS (KTOzapros); SIM800.println (F("DTCs are erased!")); EndSMS(); needAction=0; w_bus_init = 9; NeedTimer = 0;  }                   
     
     if (buf[2]==0xD1 && buf[3]==0x0A)  {w_bus_init = 10;   }// если получили ответ на сообщение старта коммуникации                    
                                                                
                  }

if (Heater == VEVO){
     if (buf[2]==0xD0 && buf[3]==0x05) {startWebasto_OK = buf[7]; last_Flame = millis();}       // проверяем наличие пламени у VEVO 
                  }
  
  
                                        }   

// если контрольная сумма не совпала: 

//else K_LINE.println("CRC fail!!!" );
  
message_size = 0; header=0; RESETheader_timer=0; j=2; checksum = 0;
}




}// end EVO VEVO


else if (Heater == TTC_E){



  
if (!timerInitflag && w_bus_init==NEED) {K_LINE.end(); pinMode (TX, OUTPUT); digitalWrite(TX, 0); timerInit = millis(); timerInitflag = 1;}
if ( timerInitflag && (millis() - timerInit>299)  && w_bus_init==NEED) {timerInit = millis(); digitalWrite(TX, 1); w_bus_init=2; }
if ( timerInitflag && (millis() - timerInit>49)   && w_bus_init==2) {timerInit = millis(); digitalWrite(TX, 0); w_bus_init=3; }
if ( timerInitflag && (millis() - timerInit>24)   && w_bus_init==3) {timerInit = millis(); digitalWrite(TX, 1); w_bus_init=4; }
if ( timerInitflag && (millis() - timerInit>3024) && w_bus_init==4) {K_LINE.begin (10400); timerInitflag = 0; w_bus_init=9;  sendMessage (START_SESSION, sizeof(START_SESSION));}

if (K_LINE.available()){
    

 // первый старт байт
 if (header == 0 && Delay){TIMER_DELAY ; buf[0]=K_LINE.read();  
         if (!bitRead (buf[0],6) && bitRead (buf[0],7)){header = 1; RESETheader_timer=1; prevRESETheader = curmillis; }
         
         }                  

 // второй старт байт
 if (header == 1 && Delay){TIMER_DELAY ; buf[1]=K_LINE.read(); if (buf[1]==0xF1){ header = 2;} else {header = 0; RESETheader_timer=0;}} 

 // третий старт байт
 if (header == 2 && Delay){ 
  TIMER_DELAY ;
  buf[2]=K_LINE.read(); 
  if (buf[2]==0x51){ message_size = buf[0]; 
  if (buf[0] !=0x80) {header = 4;  message_size&=~0x80; j=3; n=3;}
  else {header = 3; j=4;n=4;}
  if (message_size > bufsize) message_size = bufsize;  checksum = 0;} else {header = 0; RESETheader_timer=0; }
  
                          }  
// если размер сообщения указан в дополнительном байте (нулевой байт 0x80) читаем этот дополнительный байт:
if (header == 3 && Delay){
  TIMER_DELAY ;
  buf[3]=K_LINE.read(); 
  message_size = buf[3]; 
  if (message_size > bufsize) message_size = bufsize;  
  checksum = 0; header = 4;  
                         }

  // пишем тело сообщения 
 if (header == 4 && Delay && j< message_size+n+1) {
 buf[j] = K_LINE.read(); 
 if (j<message_size+n) checksum+= buf[j]; // подсчёт КС
 
 if (j==message_size+n) header = 5; 
 TIMER_DELAY ; j++;} 

 } // end of K_LINE.available()

 // сообщение приняли, действуем
 if (header == 5) {TIMER_DELAY ;  

for(byte i = 0; i<n; i++) checksum+=buf[i]; // прибавляем к контрольной сумме старт байты

//for (byte i=0; i<message_size+n+1; i++) {Serial.print (buf[i], HEX); Serial.print(" ");}

 // если контрольная сумма верна: 
if (buf[message_size+n] == checksum) {
  
//  if (buf[n]== 0xC1) Serial.println ("StartSession OK!!!");
  
  
  
  
  }   

// если контрольная сумма не совпала: 
//else Serial.println("CRC fail!!!" );
message_size = 0; header=0; RESETheader_timer=0; j=3; checksum = 0;
}

} // end TTC_E

// таймер ожидания байт (для успевания появления данных в буфере UART)
if (!Delay && curmillis - timerdelay > waitbyte_RX) Delay = 1; 

// таймер сброса заголовка если данные оборвались во время приёма заголовка
if (RESETheader_timer && curmillis - prevRESETheader > 500) {RESETheader_timer = 0; header = 0;}   

if (curmillis - last_Flame>20000 && ProtocolSTATUS==STATUSBUS) {startWebasto_OK=0; last_Flame = curmillis;}  // делаем статус "нет пламени" через 20 сек, если не получаем сообщения от котла

if (Initreset && curmillis - prevInitreset>17000) {Initreset = 0; w_bus_init = 0;}  // сброс инита, если прошло более 17 сек после отправки последнего сообщения


if (needAction>0 && needAction < NEED_DTCCLEAR && w_bus_init==10) {if (Heater == EVO) sendMessage (HEATER_STATUS_EVO,  sizeof(HEATER_STATUS_EVO));
                                     if (Heater == VEVO)sendMessage (HEATER_STATUS_VEVO, sizeof(HEATER_STATUS_VEVO));
                                     w_bus_init=11;}
if ((NeedTimer && curmillis - prevNeedTimer>11000) || w_bus_init == 13)  {NeedTimer = 0; 
             if (curmillis - prevNeedTimer>11000) noData = 1; 
             if (needAction == NEED_SMSZAPROS)     SMSzapros();
        else if (needAction == NEED_SERVICEINFO) ServiceINFO();
        else if (needAction == NEED_DTCCLEAR) {startSMS(KTOzapros); SIM800.println (F("DTC not cleared. Heater no answer!")); EndSMS();}
        w_bus_init = 9; noData = 0; needAction = 0; 
        } 
        
 if (needAction==NEED_DTCCLEAR && w_bus_init==10) { sendMessage (HEATER_DTC_ERASE, sizeof(HEATER_DTC_ERASE)); w_bus_init = 20;  }

}


void Reset_gsm (){
  if (millis()-prevReset>(unsigned long)intervalReset*60000UL){
  
  digitalWrite (DTR, LOW); delay (150);
  SIM800.println (F("AT")); 
  timerenabledWaitOK = 1; timerWaitOK = millis();
  gsmOK = false;
  prevReset = millis(); }

 if (timerenabledWaitOK && millis()-timerWaitOK>6000) {
    timerenabledWaitOK = 0;
    if (!gsmOK) {
      SIM800.println (F("AT")); timerenabledWaitOK = 1; timerWaitOK = millis();
      NoAnswersGSM++; if (NoAnswersGSM>4) NoAnswersGSM = 4; 
      
      }
}

  
 if (!gsmOK)  { 
  if (SIM800.available()>0){                                   
    char currSymb = SIM800.read(); 

  

    if ('\r' == currSymb) {                                      
                                  
       if (!currStr.compareTo("OK")) {   gsmOK = true;  timerenabledWaitOK = 0; NoAnswersGSM=0; digitalWrite (DTR, HIGH);}
       currStr = "";                                           
    }
    
    else if ('\n' != currSymb && currSymb!=0x13 && currSymb!=0x11) {currStr += String(currSymb);}}}
    
    
    if (NoAnswersGSM>=4) Reset();
    
    }



 
 void Reset(){
     
      if (!resettimer) {digitalWrite (ResetGSM, RelayON); resettimer = 1; resetTimer = millis();} 
else if (millis()- resetTimer>6000 ) {
resettimer = 0; 
NoAnswersGSM=0; 
ResetNumber++; 
EEPROM.write (ResetNumber_cell, ResetNumber);
digitalWrite (ResetGSM, !RelayON); 
delay (3500); NastroykaGSM ();}
             }




void sendMessage(const byte *command, const size_t size){

 Initreset = 1;  prevInitreset = curmillis;  // включение таймера сброса инита
 
 if (Heater == TTC_E){
  const byte siZe = size+4;
  byte Mes[siZe];
  byte Checksum = 0;
  for(byte i=0; i<siZe; i++) {
    if (i==0) {Mes[i]=size; bitWrite(Mes[i], 7 , 1);}
    if (i==1) Mes[i] = 0x51;
    if (i==2) Mes[i] = 0xF1;    
    if (i==3) {for (byte t=0; t<size; t++ ) {Mes[i]=command[t]; Checksum+=Mes[i] ;K_LINE.write (Mes[i]);  i++;}}
    if (i!=siZe-1) Checksum+=Mes[i];
    else Mes[i] = Checksum;    
    K_LINE.write (Mes[i]); 
      }
  
 }
 else if (Heater == EVO || Heater == VEVO){
  const byte siZe = size+3;
  byte Mes[siZe];
  byte Checksum = 0;
  for(byte i=0; i<siZe; i++) {
    if (i==0) Mes[i] = 0xF4;
    if (i==1) Mes[i]=size+1; 
    if (i==2) {for (byte t=0; t<size; t++ ) {Mes[i]=command[t]; Checksum^=Mes[i] ;K_LINE.write (Mes[i]); i++;}}
    if (i!=siZe-1) Checksum^=Mes[i];
    else Mes[i] = Checksum;    
    K_LINE.write (Mes[i]); 
      }
  
  }
  }

 

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Ура товарисчи Ура , заработало   показывает напряжение и температуру  при выключенном котле , но возникла мысль что эта темпратура отражает скорее температуру котла. А он быстрее отсывает , когда выключен, может вернуть ненужный теперь датчик на выхлопе и перевесить его на движку,и смотреть по нему реальную температуру движки, а данные с w-bus  обозвать температурой котла, это нужно чтобы можно было понять  эфективность нагрева , а в режиме покоя эфективность утепления отсека двигателя.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Легко. Проверь как ошибки стирает

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Это просто праздник какой-то, и ошибки теперь стирает , всё работает .

vgk_com
Offline
Зарегистрирован: 02.03.2017

Добрый вечер!  Максим, а есть схема полная к последней версии платы 8.8.  Для себя хочу разобраться, чтоб не нужное исключить. Мне нужно только чтоб сим была и К-лайн шина для Вебасты. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

Мужики, че там исключать то? там рассыпухи максимум на 200 рублей. У меня нет пока времени схему рисовать, тем более что плата из китая мне ещё не пришла. вдруг найду косяки и опять схему перерисовывать. 

vgk_com
Offline
Зарегистрирован: 02.03.2017

Хорошо, просто на плате есть транзисторы не очень понятно что куда. Я тоже заказал платы из Китая на этой неделе, буду ждать.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Один транзистор рулит реле сброса питания джсм модуля в случае его зависания. Другой садит на массу вход сигнализации на 1 сек для инициирования запуска двс силами сигнализации.

Секешфехервар
Секешфехервар аватар
Offline
Зарегистрирован: 06.09.2018

День добрый вопрос по уровню сигнала сим 800, при каком минимальном уровне стабильно работает ?

Секешфехервар
Секешфехервар аватар
Offline
Зарегистрирован: 06.09.2018

--

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Непонятен вопрос , если смс доходят ,значит будет работать .

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Поправь пожалуста скетч , как я просил , если не сложно, а то уже охота смонтировать на постоянную , что бы провода не висели, у нас зима уже закончилась практически, ночью всего минус 5, не заметишь как плюс 40 будет. Тут уже пора озаботисья адаптивным охлажнением, что бы вентилятор охлаждения двигателя включался плавно и при достижении определенной температуры , и при выключении двигателя электропомпа работала еще несколько минут, как тебе идея , пока лето не наступило , через твой девайс можно же и помпу отдельно включать. без нагрева ?

MaksVV
Offline
Зарегистрирован: 06.08.2015

со скетчем чуть позже пока некогда.  Но есть хорошая новость. Пришли платы v8.8 из Китая. Блин качество и упаковки и плат вообще огонь! (по крайней мере на первый взгляд. надеюсь я с разводкой не накосячил и всё заработает). Платы пришли в вакуумном пакете с уловителем влаги внутри. Заказал 13 февраля , пришли 5 марта - норм срок для времени изготовления и дешёвой доставки. 5 плат вышло 750 руб. Т.е. 150р за одну плату. Цена тоже адекватная за такое качество. 

Боялся, что я мог накосячить с размером платы, т.к. мерил корпус (см. по ссылкам много выше) простой линейкой. Думал, может не влезет плата в корпус или, наоборот, болтаться будет. Но всё просто супер, плата с минимальным зазором вошла в корпус. Отверстия для крепления совпадают хорошо. 

Это моя первая заводская плата, заказанная в Китае. Я доволен. Впереди запаяка деталей, но ещё не все пришли. 

vgk_com
Offline
Зарегистрирован: 02.03.2017

MaksVV пишет:

со скетчем чуть позже пока некогда.  Но есть хорошая новость. Пришли платы v8.8 из Китая. Блин качество и упаковки и плат вообще огонь! (по крайней мере на первый взгляд. надеюсь я с разводкой не накосячил и всё заработает). Платы пришли в вакуумном пакете с уловителем влаги внутри. Заказал 13 февраля , пришли 5 марта - норм срок для времени изготовления и дешёвой доставки. 5 плат вышло 750 руб. Т.е. 150р за одну плату. Цена тоже адекватная за такое качество. 

Молодец, на фото платы классные, ждем результаты и фото сборки. Я тоже заказал с Китая, но 10 шт и цена 677 руб с оставкой. 

vgk_com
Offline
Зарегистрирован: 02.03.2017

MaksVV пишет:

со скетчем чуть позже пока некогда.  Но есть хорошая новость. Пришли платы v8.8 из Китая. Блин качество и упаковки и плат вообще огонь! (по крайней мере на первый взгляд. надеюсь я с разводкой не накосячил и всё заработает). Платы пришли в вакуумном пакете с уловителем влаги внутри. Заказал 13 февраля , пришли 5 марта - норм срок для времени изготовления и дешёвой доставки. 5 плат вышло 750 руб. Т.е. 150р за одну плату. Цена тоже адекватная за такое качество. 

Молодец, на фото платы классные, ждем результаты и фото сборки. Я тоже заказал с Китая, но 10 шт и цена 677 руб с оставкой. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

может я где-то лоханулся и если бы нажал 10 то цена была бы такая же. Но, помится, вроде ценник больше становился. 

И странно ,что у меня стоимость изготовления 350 руб. протива ваших 131р. а доставка даже дешевле - 409руб. Уж не знаю почему так. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

сейчас проверил у них на сайте тоже стало 131р. за 10 плат. Может они после НГ своего с похмелья меня так немного нагрели))

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Ну как там со временем ,не появилось ещё , или до следующей зимы все затухло?

MaksVV
Offline
Зарегистрирован: 06.08.2015

скетч v 3.64 . Добавлена переменная температуры котла, котора контролируется только по шине. Переменная температуры ДВС теперь управляется только датчиком DS18B20. Температуру выхлопа не трогал. Все осталось как раньше - при протоколе статусов по аналогу датчик выхлопа опрашивается, при протоколе по цифре - не опрашивается. 

char ver[] = "Firmware 3.64";    // версия прошивки



//----------------------------------название ячеек еепром----------------------------------------------------------------
#include <EEPROM.h>
enum Cells {
ResetNumber_cell,      //0
TimeWebasto_cell,      //1
ProtocolSTART_cell,    //2
StartByte_cell,        //3
ProtocolSTATUS_cell,   //4
Heater_cell,           //5
delta_cell,            //6
TelNumber1_cell =20,  //20
TelNumber2_cell =40   //40
};


//-------------------------------------для voltmetr-----------------------------------------------------------------------
                                   
float vout = 0.0;      // Напряжение на входе аналового входа
float Vpit = 0.0;      // Измеряемое напряжение на выходе ИБП
  int volt = 0;        // Напряжение на входе АЦП


//------------------- распиновка ног ардуино (плата весий 8.5-8.8)--------------------------------------------------------

#define OutWebasto_12V      2  // это +12В выход потенциала вкл/выкл вебасто (напрямую к котлу без таймера). 
#define Dallas_pin          3  // пин шины OneWire для датчиков даллас
#define DopOn               4  // сюда доп канал от сигналки на включение вебасто
#define DopOff              5  // сюда доп канал от сигналки на выключение вебасто
#define Ohrana              6  // Сюда состояние охраны сигналки
#define Trevoga             7  // Сюда состояние тревоги
#define IGN                 8  // Сюда состояние зажигания
#define Sost                9  // Сюда состояние вебасто (+12В когда работает)
#define ResetGSM           12  // пин ресета GSM подключен к реле, разрывающее питание модуля. 
#define Eng                14  // (А0) Сюда состояние работы ДВС
#define StatusWebastoLED   15  // (А1) пин LED  индикация включенности котла
#define StartButtonpin     16  // (А2) пин тактовой кнопки вкл/выкл котла 
#define DTR                17  // пин (А3), управляющий энергосберегающим режимом GSM модуля
#define StartEng           18  // (A4) это импульсный минусовой выход вкл/выкл ДВС. подключать на вход событий сиги.
#define OutWebasto_GndImp  19  // (A5) это импульсный минусовой выход вкл/выкл вебасто (к впайке к кнопке таймера).  
#define Voltmeter_pin      A7  // пин, которым измеряем напряжение питания
#define StartButton         0  // программный номер тактовой кнопки вкл/выкл котла 
const bool RelayON =        1; // логика управления реле ресета GSM, в данном случае включается высоким уровнем на пине
#define GSM_RX             10  // пин софт RX Arduino для соединения с TX модуля SIM800
#define GSM_TX             11  // пин софт TX Arduino для соединения с RX модуля SIM800

/*
//------------------- распиновка ног ардуино (плата весий 5)---------------------------------------------------------------

#define Dallas_pin          2  // пин шины OneWire для датчиков даллас
#define OutWebasto_12V      3  // это +12В выход потенциала вкл/выкл вебасто (напрямую к котлу без таймера). 
#define DopOn               4  // сюда доп канал от сигналки на включение вебасто
#define DopOff              5  // сюда доп канал от сигналки на выключение вебасто
#define Ohrana              6  // Сюда состояние охраны сигналки
#define Trevoga             7  // Сюда состояние тревоги
#define StartEng            8  // это импульсный минусовой выход вкл/выкл ДВС. подключать на вход событий сиги.
#define Sost                9  // Сюда состояние вебасто (+12В когда работает)
#define IGN                10  // Сюда состояние зажигания
#define Eng                11  // Сюда состояние работы ДВС
#define OutWebasto_GndImp  12  // это импульсный минусовой выход вкл/выкл вебасто (к впайке к кнопке таймера). 
#define StatusWebastoLED   13  // пин индикация включенности котла
#define ResetGSM           16  // пин ресета GSM (A2) подключен к реле, разрывающее питание модуля. 
#define StartButtonpin     17  // пин тактовой кнопки вкл/выкл котла 
#define DTR                19  // пин (А5), управляющий энергосберегающим режимом GSM модуля
#define StartButton         0  // программный номер тактовой кнопки вкл/выкл котла 
const bool RelayON =        0; // логика управления реле ресета GSM, в данном случае включается низким уровнем на пине
#define GSM_RX             14  // пин софт RX Arduino для соединения с TX модуля SIM800
#define GSM_TX             15  // пин софт TX Arduino для соединения с RX модуля SIM800

*/

//------------------------------------для GSM модуля----------------------------------------------------------------------

#include <SoftwareSerial.h>
      SoftwareSerial SIM800 (GSM_RX, GSM_TX);//Rx, Tx   //UART для соединения с GSM модулем

String currStr = "";
String TelNumber[] = {"", "000000000000", "000000000000", "000000000000"};
byte isStringMessage = 0; 
byte KTOreport = 1;     // флаг кто запросил отчет о запуске котла или ДВС
byte KTOzapros = 0;     // флаг кто запросил баланс или запрос параметров 

uint32_t  prevReset=0;           // для таймера периодичности проверки (командой "АТ")
byte  intervalReset = 15;         // каждые столько мин будет проверка жив ли GSM модуль 
uint32_t  timerWaitOK=0;         // для таймера ожидания ответа после посылки команды "АТ"
bool timerenabledWaitOK=false;   // для таймера ожидания ответа после посылки команды "АТ"
byte NoAnswersGSM=0;             // количество неответов  от GSM модуля
bool gsmOK = 1;                  // флаг есть связь с GSM модулем или нет
bool resettimer = 0;             // для таймера удерживания реле в режиме сброс питания
uint32_t  resetTimer=0;          // для таймера удерживания реле в режиме сброс питания
byte ResetNumber = 0;            // количество ресетов GSM модуля для статистики (хранится в еепром)




//------------------- для шины 1-wire и датчиков DS18B20---------------------------------------------------------------------

#include <OneWire.h>    // библиотека для DS18B20
OneWire ds(Dallas_pin); // датчики DS18B20 на нужный пин

enum TempC {VyhlopC, EngineC, UlicaC, SalonC, size_arrayTemp}; // перечисление нужных температур (в конце размер массива температур)

// ниже соответствие адресов датчиков различным температурам (изначально 0х14=20*С)
byte DS18B20 [size_arrayTemp][10] = {
{0x28, 0xFF, 0xB2, 0xB5, 0xC1, 0x17, 0x05, 0xD1, VyhlopC,  0x14}, 
{0x28, 0xFF, 0xD3, 0xE2, 0xC1, 0x17, 0x04, 0x0D, EngineC,  0x14}, 
{0x28, 0xFF, 0xF8, 0xBC, 0xC1, 0x17, 0x04, 0x48, UlicaC,   0x14},  
{0x28, 0xFF, 0x3F, 0xB7, 0xC1, 0x17, 0x05, 0xF1, SalonC,   0x14}
};
byte delta = 50;  // разница температур выхлопа и улицы, выше которой считается, что пламя в котле есть. 

int8_t HeaterC = -100;
//---------------------------для организации W-BUS и различные таймеры-----------------------------------------------------------

#include <Button.h>
Button test;

#define K_LINE Serial      //UART для соединения с шиной котла
#define TX 1    
#define NEED 1
#define READY 10

byte header = 0;           // состояние заголовка 
byte message_size = 0;     // размер тела принимаемого сообщения, кол-во байт

byte j = 2;                // инкремент
byte n = 2;
const byte bufsize = 140;  // размер буфера принятого сообщения
byte buf [bufsize] = {0};  // буфер принятого сообщения
byte checksum = 0;         // контрольная сумма входящего сообщения
uint32_t curmillis = 0;    // снимок системного времени
byte delaybyte_TX = 0 ;    // задержка между байтами отправляемого сообщения 
byte waitbyte_RX = 1;      // задержка, мс для успевания заполнения буфера RX (подрегулировать в зависимости от уровня жизнидеятельности на Марсе)
uint32_t timerdelay = 0;   // таймер ожидания байт (для успевания заполнения буфера УАРТ)
bool Delay = 0;            // таймер ожидания байт (для успевания заполнения буфера УАРТ)
#define TIMER_DELAY Delay = 0; timerdelay = curmillis  // включение этого таймера

uint32_t prevRESETheader=0; // таймер сброса заголовка если в момент приёма сообщения данные оборвались
bool RESETheader_timer = 0; // таймер сброса заголовка если в момент приёма сообщения данные оборвались

// команды для котлов ЭВО
byte StartByte = 0x20;
byte HEATER_BEGIN[]         {0x51, 0x0A};
byte HEATER_START[]         {StartByte, 0x3B};
byte HEATER_PRESENCE[]      {0x44, StartByte, 0x00};
byte HEATER_STOP[]          {0x10};
byte HEATER_STATUS_VEVO[]   {0x50, 0x05};
byte HEATER_STATUS_EVO[]    {0x50, 0x30, 0x0A, 0x0C, 0x0E, 0x10, 0x12, 0x1E, 0x32};
byte HEATER_DTC_REQUEST[]   {0x56, 0x01};
byte HEATER_DTC_ERASE[]     {0x56, 0x03};

// команды для котлов ТТС/TTE
byte START_SESSION[]        {0x81};
byte REQUEST_2A10101[]      {0x2A, 0x01, 0x01};
byte REQUEST_2A10102[]      {0x2A, 0x01, 0x02};
byte REQUEST_2A10105[]      {0x2A, 0x01, 0x05};
byte REQUEST_DTC[]          {0xA1};
byte START_TTC[]            {0x31, 0x22, 0xFF};
byte STOP_TTC[]             {0x31, 0x22, 0x00};


enum needAction_ {NO_ACTION, NEED_SMSZAPROS, NEED_SERVICEINFO, NEED_DTCCLEAR};// возможные действия, стоящие в очереди
byte needAction = NO_ACTION;                                                  // переменная действия, стоящего в очереди

enum ProtocolSTATUS_ {STATUSBUS, ANALOG};                   // возможные протоколы чтения статуса котла
enum ProtocolSTART_  {STARTBUS, IMPULSE, POTENCIAL};        // возможные протоколы запуска котла
enum Heater_         {TTC_E, VEVO, EVO, HYDRONIC};          // тип котла

byte  ProtocolSTATUS = STATUSBUS; 
byte  ProtocolSTART  = STARTBUS;
byte  Heater         = EVO;

bool noData  = 0;                               // флаг пришли ли данные от котла после запроса. 
byte w_bus_init = 0;                            //флаг проведена или нет инициализация шины w-bus (25мс LOW, 25мс HIGH для  ЭВО
                                                //                                            либо 300ms LOW, 50ms HIGH, 25ms LOW, 3025ms HIGH для TTC 
byte requiredmessage =  1;                      //флаг, что отправляем в данный момент поддержание старта, запрос параметров или запрос ошибок
byte StartMessageRepeat = 0;                    //количество отправленных сообщений на старт котла
byte StopMessageRepeat =  4;                    //количество отправленных сообщений на остановку котла

byte  TimeWebasto = 30;                         //время работы котла, = 30мин
uint32_t EndReportMillis = 0;                   //переменная для таймера отправки отчета об успешности запуска котла
uint32_t EndReportEngine = 0;                   //переменная для таймера отправки отчета об успешности запуска ДВС
uint32_t Prev_PeriodW_BusMessage = 0;           //переменная для таймера периодической отправки сообщений состояния котла в шину W-Bus 
uint32_t Prev_PeriodW_BusStartStop = 0;         //переменная для таймера периодической отправки сообщений старта/стопа котла в шину W-Bus 
uint32_t prevdelSMS = 0;                        //переменная для таймера периодического удаления СМС 
uint32_t prevVpit = 0;                          //переменная для таймера периодического измерения напряжения АКБ
uint32_t prevInitreset = 0;                     //переменная для таймера сброса инита шины
bool Initreset = 0;                             //переменная для таймера сброса инита шины
uint32_t timerInit = 0; bool timerInitflag = 0; //для таймера инита шины W-BUS
uint32_t prevNeedTimer = 0; bool NeedTimer = 0; //для таймера задержки функций SMSzapros() и ServiceINFO() на время обновления параметров по шине


uint32_t last_Flame = 0;                        //для таймера сброса флага пламени, если нет ответов от котла

//для таймера создания импульса GND - для протокола запуска котла импульсом GND 
uint32_t timer=0; bool timerenabled=false;
#define TIMEREXPIRED (curmillis-timer)>800

//для таймера  - старт двигателя - импульс +5В на транзистор, в итоге минусовой импульс 1.5 сек на вход событий сигналки для запуска ДВС)
uint32_t  timerStartEng=0; bool timerenabledStartEng=false;
#define TIMEREXPIRED_StartEng (millis()-timerStartEng)>1500

//для таймера  - старт котла по W-BUS )
uint32_t timerStart_W_BUS=0; bool timerenabledStart_W_BUS=false;
#define TIMEREXPIRED_Start_W_BUS (curmillis-timerStart_W_BUS)> (uint32_t)TimeWebasto * 60000UL



//---------------------------------Основные переменные--------------------------------------------------------------------------------  

bool webasto = 0;             // флаг команды на работу Webasto. 0 - котел выключен, 1 - котел включен
bool startWebasto_OK = 0;     // флаг успешного запуска котла
bool report = false;          // флаг нужности отправки отчета false - не нужно отправлять, true - нужно отправлять
bool reportEngine = false;    // флаг нужности отправки отчета false - не нужно отправлять, true - нужно отправлять
bool engine =0;               // флаг работает ли ДВС или нет
bool ignition=0;              // флаг включено ли зажигание или нет
bool ohrana=0;                // флаг включена ли охрана или нет
bool trevoga=0;               // флаг включена ли тревога или нет
bool alarmSMS = 0;            // флаг отправлена ли смс о тревоге или нет

bool waterpump = 0;           // флаг работы циркуляционного насоса
bool plug      = 0;           // флаг работы штифта накаливания
bool airfan    = 0;           // флаг работы нагнетателя воздуха
bool fuelpump  = 0;           // флаг работы топливного насоса
bool blowerfan = 0;           // флаг работы вентилятора печки автомобиля
byte DTC[7] ={0};             // коды неисправностей котла



//---------------------------СТАРТОВЫЙ ЦИКЛ--------------------------------------------------------------------------------------------

void setup() 
{


delay (3500);


test.NO(); 
test.pullUp();
test.duration_bounce       (  50);
test.duration_click_Db     ( 250);
test.duration_inactivity_Up(5000);
test.duration_inactivity_Dn(1000);
test.duration_press        ( 500);
test.button(StartButtonpin);            // в скобках пин тактовой кнопки вкл/выкл котла (программный номер у неё будет 0)
 
pinMode (DopOn,   INPUT_PULLUP); 
pinMode (DopOff,  INPUT_PULLUP); 
pinMode (Sost,    INPUT_PULLUP); 
pinMode (Ohrana,  INPUT_PULLUP); 
pinMode (Trevoga, INPUT_PULLUP); 
pinMode (IGN,     INPUT_PULLUP); 
pinMode (Eng,     INPUT_PULLUP); 
  
pinMode (OutWebasto_12V,     OUTPUT);  digitalWrite (OutWebasto_12V,      LOW);
pinMode (StartEng,           OUTPUT);  digitalWrite (StartEng,            LOW);
pinMode (13,                 OUTPUT);  digitalWrite (13,                  LOW);
pinMode (StatusWebastoLED,   OUTPUT);  digitalWrite (StatusWebastoLED,    LOW);
pinMode (OutWebasto_GndImp,  OUTPUT);  digitalWrite (OutWebasto_GndImp,   HIGH);
pinMode (DTR,                OUTPUT);  digitalWrite (DTR,                 HIGH);  // делаем высокий, а низкий уровень будет для пробуждения GSM из "спячки"
pinMode (ResetGSM,           OUTPUT);  digitalWrite (ResetGSM,        !RelayON);  // реле ресет на данный момент делаем "неактивно"


   SIM800.begin(19200);           // сериал соединение для gsm модуля
   delay(100);
   NastroykaGSM ();


TimeWebasto =    EEPROM.read(TimeWebasto_cell);
ProtocolSTART  = EEPROM.read(ProtocolSTART_cell);
ProtocolSTATUS = EEPROM.read(ProtocolSTATUS_cell);
ResetNumber =    EEPROM.read(ResetNumber_cell);
StartByte =      EEPROM.read(StartByte_cell);
Heater =         EEPROM.read(Heater_cell);
delta  =         EEPROM.read(delta_cell);
for (int i=0; i<12; i++) TelNumber[1][i] = EEPROM.read (i+TelNumber1_cell);
for (int i=0; i<12; i++) TelNumber[2][i] = EEPROM.read (i+TelNumber2_cell);


        if (Heater == EVO || Heater == VEVO) K_LINE.begin(2400, SERIAL_8E1);
   else if (Heater == TTC_E) K_LINE.begin(10400);


for (byte i=0; i<20; i++) {digitalWrite (13, !digitalRead(13)); delay (80);}
digitalWrite (13,0);
}



//------------------------------------------ЛУП-----------------------------------------------------------------------------------


void loop() {
curmillis = millis();
test.read();

digitalWrite (StatusWebastoLED, webasto);
//digitalWrite (13, startWebasto_OK);
//digitalWrite (13, webasto);


//если нажали тактовую кнопку меняем состояние котла на противоположное 
if (test.event_press_short (StartButton)) {
  if (!webasto) {StartWebasto(); report = false;}
  else StopWebasto();
    }

if (ProtocolSTATUS==ANALOG) {if (Temper(VyhlopC) - Temper(UlicaC) > delta) startWebasto_OK = 1;
                             else startWebasto_OK = 0;}

if (ProtocolSTART==IMPULSE) webasto = !digitalRead (Sost);

Heater_BUS();

//ниже для таймера старта котла по шине и аналогу 
 
  if (timerenabledStart_W_BUS && TIMEREXPIRED_Start_W_BUS) StopWebasto();

//ниже для таймера создания импульса на старт ДВС 

if (timerenabledStartEng && TIMEREXPIRED_StartEng) {digitalWrite (StartEng, LOW); timerenabledStartEng=false;}
    
 engine =  !digitalRead (Eng);
 ignition= !digitalRead (IGN); 
 ohrana=   !digitalRead (Ohrana);  
 trevoga=  !digitalRead (Trevoga);
  
if (webasto && report) timerReport ();
if (reportEngine) timerReportEngine ();
if (!ohrana) alarmSMS = false;


   if (trevoga && !alarmSMS) AlarmSMS ();
   if (gsmOK)readSMS();
   Reset_gsm();
   delSMS();


WebastoOprosImpulse ();
izmereniya();

}


//-----------------------------------------------------------конец луп-------------------------------------------------------------



void izmereniya() { 

if (millis()-prevVpit>7000){

//измерение напряжения борт сети
if (ProtocolSTATUS==ANALOG){
   volt = analogRead(Voltmeter_pin);                      
   vout = (volt * 4.13) / 1024;             
   Vpit = vout / (9700.0/(98930.0+9700.0));  // По формуле Vpit = vout / (R2/(R1+R2)) 
   if (Vpit<0.09)  Vpit=0.0;                  // Округление до нуля 
}  

// ниже измерение датчиков даллас
static bool n=0;        // флаг работы: запрос температуры или её чтение
n=!n;
if (n) {ds.reset();     // сброс шины
        ds.write(0xCC); // обращение ко всем датчикам
        ds.write(0x44); // начать преобразование (без паразитного питания)  
       }
else   {
  for (byte i=0; i<size_arrayTemp; i++){  
    int Temper_ = 20; byte buff[9];
    ds.reset();
    ds.select(DS18B20[i]);
    ds.write(0xBE); // чтение регистров датчиков
    for (byte j=0; j<9; j++) buff[j]=ds.read(); // читаем все 9 байт от датчика
    ds.reset();
    if (OneWire::crc8(buff, 8) == buff[8]){     // если контрольная сумма совпадает 
          Temper_ = buff[0]|(buff[1]<<8);       // читаем температуру из первых двух байт (остальные были нужны только для проверки CRC)
          Temper_ = Temper_ / 16;
          if (Temper_<150 && Temper_>-55) DS18B20[i][9] = Temper_;
}}}


prevVpit=millis();
}}



int8_t Temper (const byte &addressTemp) {for(byte j=0; j<size_arrayTemp; j++){if(DS18B20[j][8]==addressTemp)return(int8_t)DS18B20[j][9];} return-99;}



void WebastoOprosImpulse (){

// опрос допканалов от сигнализации включения/ выключение котла и таймер импульса старт/стоп котла 
  
  if (timerenabled) {if (TIMEREXPIRED) {digitalWrite (OutWebasto_GndImp, HIGH); timerenabled=false;}}
  else  {if (!digitalRead (DopOn)  && !webasto) {StartWebasto(); KTOreport = 1;}
         if (!digitalRead (DopOff) && webasto) StopWebasto();
         }}


// цикл таймера отправки отчета об успешности запуска котла (отчёт через 6 мин после старта)
void timerReport () {
   if(millis() - EndReportMillis > 360000UL) 
   {EndReportMillis = millis(); report = false; SMSzapros();  }} 

// цикл таймера отправки отчета об успешности запуска ДВС  (отчёт через 60сек после старта)                       
void timerReportEngine () {
   if(millis() - EndReportEngine > 90000ul) 
   {EndReportEngine = millis(); reportEngine = false; SMSzapros();}} 





   void NastroykaGSM () {
  digitalWrite (DTR, LOW);      // выводим из спячки GSM модуль
    delay (150);
  SIM800.println(F("AT"));                    //просто AT для разогреву
    delay(250);
  SIM800.println(F("AT+CMGF=1"));             //устанавливает текстовый режим смс-сообщения
    delay(250);
  SIM800.println(F("AT+IFC=0, 0"));           //отключает программный контроль потоком передачи данных
    delay(250);
  SIM800.println(F("AT+GSMBUSY=1"));          //запрет всех входящих звонков
    delay(250);
  SIM800.println(F("AT+CNMI=1,2,2,1,0"));     //включает оповещение о новых сообщениях
    delay(250);
  SIM800.println(F("AT+CMGDA=\"DEL ALL\""));  // удаляем все смс, ки
   delay(1500);
  SIM800.println(F("AT+CSCLK=1"));            //включает энергосберегающий режим 
  delay(150);
  digitalWrite (DTR, HIGH);     // вводим в спячку GSM модуль высоким уровнем на пине DTR
  
}

void startSMS(byte stat) //__________________Цикл подготовки модуля к отправке СМС-сообщений по первому номеру
{
    if (stat==0) stat = KTOreport;
     digitalWrite (DTR, LOW); // выводим из спячки GSM модуль
         delay (150);
     SIM800.print(F("AT+CMGF=1\r"));
         delay(200);
     SIM800.print(F("AT+CMGS=\"")); SIM800.print(TelNumber[stat]); SIM800.println("\""); 
         delay(200);
}



void EndSMS ()
{
   SIM800.println((char)26);                       // Команда отправки СМС
   delay(1500);
   digitalWrite (DTR, HIGH); // вводим в спячку SIM800 модуль 
   
}

void delSMS ()
{
if (millis() - prevdelSMS > 7200000ul){  //раз в 2 часа 
 digitalWrite (DTR, LOW); // выводим из спячки SIM800 модуль
    delay (150);
 SIM800.print(F("AT+CMGDA=\"DEL ALL\"\r")); // удаляем все смс, ки
   delay(1500);
 digitalWrite (DTR, HIGH); // вводим в спячку SIM800 модуль 
   delay (150);

  prevdelSMS = millis();}
}


void readSMS() //_____Цикл чтения входящих СМС-сообщений______________     
{
    if (!SIM800.available()) return;
    static bool SaveNumber2 = 0;      // флаг когда необходима запись номера#2, он true
    char currSymb = SIM800.read();

    if ('\r' == currSymb)
       {
         if (isStringMessage!=0&&isStringMessage!=3) //если текущая строка - SMS-сообщение, отреагируем на него соответствующим образом
                {
if      (!currStr.compareTo("ZAPROS"))       {if (webasto)SMSzapros(); else {NeedTimer = 1; prevNeedTimer = curmillis; needAction = NEED_SMSZAPROS; w_bus_init = 1;}}              // Передача параметров по СМС
else if (!currStr.compareTo("ZAPROSTEL"))    {SMSzaprosTEL();}           // Передача номеров телефонов пользователей по СМС
else if (!currStr.compareTo("Service-info")) {if (webasto) ServiceINFO(); else {NeedTimer = 1; prevNeedTimer = curmillis; needAction = NEED_SERVICEINFO;w_bus_init = 1;}}            // Передача сервисной информации  по СМС
else if (!currStr.compareTo("GSMResets-0"))  {ResetNumber=0; EEPROM.write (ResetNumber_cell, ResetNumber); ServiceINFO();}     //сброс счетчика ресетов GSM модуля
else if (!currStr.compareTo("Version"))      {startSMS(isStringMessage);  SIM800.println (ver); EndSMS ();}               //запрос версии ПО
else if (!currStr.compareTo("Erase DTC"))    {NeedTimer = 1; prevNeedTimer = curmillis; needAction = NEED_DTCCLEAR; if (w_bus_init == 0) w_bus_init = 1;}               //запрос на стриание ошибок

else if (!currStr.compareTo("Signal-level")) {digitalWrite (DTR, LOW);  delay (150); SIM800.println(F("AT+CSQ")); digitalWrite (DTR, HIGH);}                // запрос уровня сигнала GSM
              
else if (!currStr.compareTo("Webasto-ON"))  { startSMS(isStringMessage); SIM800.println(F("Webasto ")); 
  
           if (!webasto)  {StartWebasto (); KTOreport = isStringMessage;}
           else SIM800.println(F("uzhe ")); SIM800.println (F("vkluchena")); EndSMS();}

                                                            
else if (!currStr.compareTo("Webasto-OFF"))   {startSMS(isStringMessage); SIM800.println(F("Webasto "));  
           if (webasto)StopWebasto ();  // если получили команду на выключение и вебаста в настоящий момент включена - выключаем
           else SIM800.println(F("uzhe "));  SIM800.println(F("otkluchena"));EndSMS();}          

// если получили команду на включение ДВС и он в настоящий момент выключен - включаем
else if (!currStr.compareTo("Engine-ON"))  {startSMS(isStringMessage); SIM800.println(F("Dvigatel "));  
           if (!engine)  { digitalWrite (StartEng, HIGH);  timerStartEng=millis(); timerenabledStartEng=true; reportEngine = true; EndReportEngine = timerStartEng; KTOreport = isStringMessage;} 
           else SIM800.println(F("uzhe ")); SIM800.println(F("start")); EndSMS();}
                                                                                 
else if (!currStr.compareTo("Engine-OFF"))   {startSMS(isStringMessage); SIM800.println(F("Dvigatel "));  
           if (engine){ digitalWrite (StartEng, HIGH);  timerStartEng=millis(); timerenabledStartEng=true; reportEngine = false;} // если получили команду на выключение ДВС и он в настоящий момент работает - выключаем
           else SIM800.println(F("uzhe ")); SIM800.println(F("ostanovlen")); EndSMS();}          
              
else if (!currStr.compareTo("Impulse"))   {if (!webasto) {ProtocolSTART = IMPULSE;  EEPROM.write(ProtocolSTART_cell,ProtocolSTART);     
                                            startSMS(isStringMessage); SIM800.println(F("zapusk GND_impulse")); EndSMS();}}

else if (!currStr.compareTo("Startbus"))  {if (!webasto) {ProtocolSTART = STARTBUS; EEPROM.write(ProtocolSTART_cell,ProtocolSTART);  webasto = 0;  
                                            startSMS(isStringMessage); SIM800.println(F("zapusk BUS")); EndSMS();}}

else if (!currStr.compareTo("Potencial")) {if (!webasto) {ProtocolSTART = POTENCIAL; EEPROM.write(ProtocolSTART_cell,ProtocolSTART);   
                                            startSMS(isStringMessage); SIM800.println(F("zapusk +12V Potencial")); EndSMS();}}

else if (currStr.endsWith("Status"))   {if (!webasto) {byte st = currStr.toInt(); if (st >= STATUSBUS && st<=ANALOG )ProtocolSTATUS = st; EEPROM.write(ProtocolSTATUS_cell,ProtocolSTATUS);   
                                            startSMS(isStringMessage); SIM800.print (F("Status: "));
                                                                             if (ProtocolSTATUS == 0)SIM800.println(F("BUS")); 
                                                                        else if (ProtocolSTATUS == 1)SIM800.println(F("Analog"));
                                                                        EndSMS();}}    


else if (currStr.endsWith("HeaterType")) {if (!webasto) {byte st = currStr.toInt(); if (st >= TTC_E && st<=HYDRONIC) Heater = st; EEPROM.write(Heater_cell,Heater);   
                                            startSMS(isStringMessage); SIM800.print (F("Heater: "));
                                                                             if (Heater == 0)SIM800.println(F("TTC_E")), K_LINE.end(),  K_LINE.begin(10400);
                                                                        else if (Heater == 1)SIM800.println(F("VEVO")),  K_LINE.end(),  K_LINE.begin(2400, SERIAL_8E1);
                                                                        else if (Heater == 2)SIM800.println(F("EVO")),   K_LINE.end(),  K_LINE.begin(2400, SERIAL_8E1);
                                                                        else if (Heater == 3)SIM800.println(F("HYDRONIC"));
                                                                             
                                                                        EndSMS();}}      
                                                                                                                                              
else if (currStr.endsWith("Delta"))   {if (!webasto) {delta = currStr.toInt(); //
               EEPROM.write(delta_cell, delta);  startSMS(isStringMessage);
               SIM800.print(F("DeltaT: ")); SIM800.print(delta); SIM800.print(F("*C")); EndSMS();}}
                                                                                                                                            

               
else if (currStr.endsWith("min"))   {if (!webasto) {TimeWebasto = currStr.toInt(); // для задания время цикла работы отправить сообщение вида "25 min", где 25 время работы в мин
               if (TimeWebasto>59)  TimeWebasto = 59;
               if (TimeWebasto<=15) TimeWebasto = 15;
               EEPROM.write(TimeWebasto_cell,TimeWebasto);
               startSMS(isStringMessage); SIM800.print(F("Webasto time: ")); SIM800.print(TimeWebasto); SIM800.print(F("min")); EndSMS();}}
               
else if (currStr.endsWith("StartByte")) {byte Z =currStr.toInt(); if (Z>=0x14 && Z<=0x17) StartByte= Z+12;
               startSMS(isStringMessage); SIM800.print(F("StartByte: ")); SIM800.print(StartByte, HEX); SIM800.print(F("h")); EndSMS();}

else if (!currStr.compareTo("ResetNumbers"))   {if (isStringMessage == 1) {startSMS(isStringMessage); SIM800.println(F("Phone numbers are erased")); EndSMS(); 
                                                                     
             TelNumber[1] = "000000000000"; TelNumber[2] = "000000000000"; for (int i=0; i<12; i++) {EEPROM.write (i+TelNumber1_cell,  TelNumber[1][i]); EEPROM.write (i+TelNumber2_cell,  TelNumber[2][i]); }}}

else if (!currStr.compareTo("WriteNumber2")&& isStringMessage == 1)   { 
                SaveNumber2 = 1; startSMS(isStringMessage); SIM800.println(F("Otpravte lyuboye SMS s nomera#2 dlya sohraneniya nomera")); EndSMS();} 

                                                                        

                                                     
else if (!currStr.compareTo("Balance"))    SMSbalance();
            isStringMessage = 0;
                }
              
              
else if (isStringMessage==3){ if (!currStr.compareTo("WriteNumber1"))   { TelNumber[1] = TelNumber[3]; for (int i=0; i<12; i++) {EEPROM.write (i+TelNumber1_cell, TelNumber[3][i]);}
              startSMS(1); SIM800.println(F("Tel Number#1 is saving in memory"));  SIM800.print("Tel#1: ");  SIM800.println (TelNumber[1]); EndSMS();
              } 
                                             else if (!currStr.compareTo("ZAPROS"))   { SMSzapros();}   
                                             else if (!currStr.compareTo("ZAPROSTEL"))   { SMSzaprosTEL();}               // Передача номеров телефонов пользователей по СМС            
               isStringMessage = 0;
              
              }           



                
else if (isStringMessage==0) {  if (TelNumber[1]!="000000000000" && !SaveNumber2 && TelNumber[1]!="яяяяяяяяяяяя"){
         
                     if (currStr.startsWith("+CMT: \""+TelNumber[1])) { isStringMessage = 1; KTOzapros = 1; }   
                else if (currStr.startsWith("+CMT: \""+TelNumber[2])) { isStringMessage = 2; KTOzapros = 2; }   
                else if (currStr.startsWith("+CUSD: 0,"))  //если текущая строка начинается с "+CUSD",то следующая строка является запросом баланса
                  {
                  startSMS(KTOzapros);
                  SIM800.print (currStr);
                  EndSMS();
                  }

                else if (currStr.startsWith("+CSQ:")) //если текущая строка начинается с "+CSQ",то значит был запрос на уровень сигнала GSM, отправим ответ запрашивающему
                  {
                  startSMS(KTOzapros);
                  SIM800.print (currStr);
                  EndSMS();
                  }
                                                }

                else if    (currStr.startsWith("+CMT:") && !SaveNumber2) { isStringMessage = 3; for (int i =0; i<12; i++) {TelNumber[3][i]=currStr[i+7];}}
                else if    (currStr.startsWith("+CMT:") && SaveNumber2) { for (int i =0; i<12; i++) {TelNumber[3][i]=currStr[i+7];} TelNumber[2] = TelNumber[3]; for (int i=0; i<12; i++) {EEPROM.write (i+TelNumber2_cell, TelNumber[3][i]);}
              startSMS(2); SIM800.println(F("Vash nomer sochranyon kak Number#2 v pamyati!")); 
              SIM800.print(F("Tel#1: ")); SIM800.println(TelNumber[1]); SIM800.print(F("Tel#2: "));  SIM800.println (TelNumber[2]); EndSMS(); SaveNumber2 = 0; } 
              
              } 
               
        currStr = "";
      } 
 
    else if ('\n' != currSymb && currSymb!=0x13 && currSymb!=0x11)  currStr += String(currSymb);
}



void SMSzaprosTEL(){
  startSMS(isStringMessage);
  PrintNumbers (); 
  EndSMS();                                 
  }


void SMSbalance() {
digitalWrite (DTR, LOW); // выводим из спячки SIM800 модуль
      delay (150);
SIM800.print(F("AT+CMGF=1\r"));
      delay(200);
SIM800.println (F("AT+CUSD=1,\"#100#\""));    // команда на замену на транслит *111*6*2# у МТС 
      delay(1500);  
digitalWrite (DTR, HIGH); // вводим в спячку SIM800 модуль 
      delay (150);  
                             
     
}


void AlarmSMS() {for (byte i = 0; i<2; i++) {startSMS(i+1); SIM800.println (F("Vnimanie!!! Trevoga!!! Sirena Vkl!")); EndSMS();} alarmSMS = true;}
 


void PrintNumbers () {for (byte i=0; i<2; i++) {SIM800.print(F("Tel#")); SIM800.print (i+1); SIM800.print(F(" ")); SIM800.println(TelNumber[i+1]);}}

void SMSzapros()

{

  startSMS(isStringMessage);
  if (isStringMessage == 3){
 
 SIM800.println (F("Tel.number#1 not has been save in memory"));
 SIM800.println (F("For save Tel#1 send SMS command \"WriteNumber1\""));
 PrintNumbers ();
  }
  

  
  
  else {
  
SIM800.print (F("Webasto ")); on_off (webasto);
        if (webasto) { 
           SIM800.print (F("StartWebasto "));
           if (startWebasto_OK) SIM800.println (F("OK"));
           else SIM800.println (F("FAIL"));}
SIM800.print (F("Engine    "));  on_off (engine);
SIM800.print (F("IGN        ")); on_off (ignition);
SIM800.print (F("Ohrana  "));    on_off (ohrana);
     if (trevoga)  SIM800.println (F("Vnimanie!!! Trevoga!!! Sirena Vkl!"));
     
  SIM800.print(F("Battery: "));      if ((needAction>0 && !noData) || needAction == 0 || ProtocolSTATUS == ANALOG) {SIM800.print (Vpit,1); SIM800.println(F(" V"));}
                                else if (needAction>0 && noData && ProtocolSTATUS != ANALOG) SIM800.println(F(" No Data"));
  
  SIM800.println(F("Temperatures:"));
  if (ProtocolSTATUS != ANALOG){
  SIM800.print(F("Heater:  ")); if ((needAction>0 && !noData) || needAction == 0) {SIM800.print (HeaterC);  grad ();}
                                else if (needAction>0 && noData) SIM800.println(F(" No Data"));}
  else { SIM800.print(F("Vyhlop:  ")); SIM800.print (Temper(VyhlopC));  grad ();}
  SIM800.print(F("Engine:  ")); SIM800.print (Temper(EngineC));  grad ();  
  SIM800.print(F("Ulica:     ")); SIM800.print (Temper(UlicaC)); grad ();
  SIM800.print(F("Salon:    ")); SIM800.print (Temper(SalonC));  grad ();  
  

  if (ProtocolSTATUS == STATUSBUS){
  SIM800.print(F("Errors:   ")); if ((needAction>0 && !noData) || needAction == 0) SIM800.println (DTC[0]);
                                else if (needAction>0 && noData) SIM800.println(F(" No Data"));}
  
  
 
  }  
   EndSMS();    
                          
}

void on_off (const bool &stat) {if (stat) SIM800.println (F("ON")); else SIM800.println (F("OFF")); }
void grad () {SIM800.println (F("*C")); }





void ServiceINFO(){
  
       startSMS(isStringMessage);
  SIM800.print(F("Heater:  ")); 
       if (Heater==TTC_E)     SIM800.println(F("TTC/E"));
  else if (Heater==VEVO)      SIM800.println(F("VEVO"));
  else if (Heater==EVO)       SIM800.println(F("EVO"));
  else if (Heater==HYDRONIC)  SIM800.println(F("HYDRONIC"));
  SIM800.print(F("Start:    "));
       if (ProtocolSTART==IMPULSE)   SIM800.println(F("GND Imp"));
  else if (ProtocolSTART==STARTBUS)  {SIM800.print(F("BUS"));
             if (Heater== VEVO || Heater== EVO) {SIM800.print(F(" 0x")); SIM800.println (StartByte, HEX);}
             else SIM800.println();}
  else if (ProtocolSTART==POTENCIAL) SIM800.println(F("Potencial+12V"));
  
  SIM800.print(F("Status:  "));
       if (ProtocolSTATUS==ANALOG)    SIM800.println(F("ANALOG"));
  else if (ProtocolSTATUS==STATUSBUS) SIM800.println(F("BUS"));
  
   
  if (ProtocolSTART!=IMPULSE) {SIM800.print(F("Webasto Time: ")); SIM800.print (TimeWebasto); SIM800.println(F("min"));}
  SIM800.print(F("SIM800 Resets: ")); SIM800.println (ResetNumber); 

  if (ProtocolSTATUS==ANALOG) {SIM800.print(F("DeltaT:  ")); SIM800.print(delta);SIM800.println(F("*C"));}

  if (ProtocolSTATUS==STATUSBUS && !noData) {
    SIM800.print(F("   BurnFAN       ")); on_off (airfan);
    SIM800.print(F("   WaterPUMP ")); on_off (waterpump);
    SIM800.print(F("   PLUG            ")); on_off (plug);
    SIM800.print(F("   FuelPUMP    ")); on_off (fuelpump);
    SIM800.print(F("   Blower          ")); on_off (blowerfan);
    
   SIM800.print (F("Errors:  ")); SIM800.println (DTC[0]);
  if (DTC[0] >0) for (byte i=0; i<DTC[0]; i++) {
  if (DTC[i+1]<=0x0F) SIM800.print(F("0"));
     SIM800.print (DTC[i+1], HEX); 
     if (bitRead(DTC[6], i+1)) SIM800.println (F(" Active")); 
     else SIM800.println (F(" Passive"));      }
                             }
 else if (noData) SIM800.println(F("Heater not answer. No Data"));                                                                               
   EndSMS();    
  
  }

void StartWebasto()
{
 if (ProtocolSTART==IMPULSE){
  
  digitalWrite (OutWebasto_GndImp, LOW); 
  timer=curmillis; 
  timerenabled=true;}

 else {
  StartMessageRepeat = 0;
  webasto = 1; digitalWrite (OutWebasto_12V, HIGH);
  timerStart_W_BUS=millis();
  timerenabledStart_W_BUS = true;}

  report = true; EndReportMillis = millis();
  w_bus_init = NEED;
}

void StopWebasto()
{
 if (ProtocolSTART==IMPULSE){ digitalWrite (OutWebasto_GndImp, LOW); 
  timer=curmillis; 
  timerenabled=true;}

 else {
  StopMessageRepeat = 0;
  webasto = 0; digitalWrite (OutWebasto_12V, LOW);
  timerenabledStart_W_BUS = false;}
   report = false;
   
   
}



void Heater_BUS (){
  
if      (Heater == EVO || Heater == VEVO){
if (webasto) {
    if (StartMessageRepeat<4 && (millis()-Prev_PeriodW_BusStartStop>800) && w_bus_init >= 9){
  sendMessage (HEATER_START, sizeof(HEATER_START)); 
  StartMessageRepeat++; 
  Prev_PeriodW_BusStartStop = millis();
  
    }
  if (StartMessageRepeat>=4){ if (millis()-Prev_PeriodW_BusMessage>4000)  {
    
         if (requiredmessage==1) sendMessage (HEATER_PRESENCE, sizeof(HEATER_PRESENCE));  
    else if (requiredmessage==2) {if (Heater == EVO) sendMessage (HEATER_STATUS_EVO,  sizeof(HEATER_STATUS_EVO));
                                  if (Heater == VEVO)sendMessage (HEATER_STATUS_VEVO, sizeof(HEATER_STATUS_VEVO));}
    else if (requiredmessage==3) sendMessage (HEATER_DTC_REQUEST, sizeof(HEATER_DTC_REQUEST));  
requiredmessage++; if (requiredmessage > 3) requiredmessage = 1;
StopMessageRepeat = 0;
    
    Prev_PeriodW_BusMessage = millis();
    }}}





else if (StopMessageRepeat<4 && (millis()-Prev_PeriodW_BusStartStop>800)){
  sendMessage (HEATER_STOP, sizeof(HEATER_STOP));
StopMessageRepeat++; 
StartMessageRepeat = 0;
   Prev_PeriodW_BusStartStop = millis();
  
  
  }


if (!timerInitflag && w_bus_init==NEED) {K_LINE.end(); pinMode (TX, OUTPUT); digitalWrite(TX, 0); timerInit = millis(); timerInitflag = 1;}
if ( timerInitflag && (millis() - timerInit>24) && w_bus_init==NEED) {timerInit = millis(); digitalWrite(TX, 1); w_bus_init=2; }
if ( timerInitflag && (millis() - timerInit>24) && w_bus_init==2) {K_LINE.begin (2400,SERIAL_8E1 );timerInitflag = 0; w_bus_init=9; 
                                                                   if (needAction>0) sendMessage (HEATER_BEGIN, sizeof(HEATER_BEGIN));  }


if (K_LINE.available()){
    

 // первый старт байт
 if (header == 0 && Delay){TIMER_DELAY ; buf[0]=K_LINE.read();  
         if (buf[0]==0x4F || buf[0]==0x44){header = 1; RESETheader_timer=1; prevRESETheader = curmillis; }
         else {header = 0; RESETheader_timer=0;}
         }                  

 // длина сообщения
 if (header == 1 && Delay){TIMER_DELAY ; buf[1]=K_LINE.read(); message_size = buf[1]; if (message_size > bufsize) message_size = bufsize;  header = 4;j=2;n=2;checksum = 0;} 

 // пишем тело сообщения 
 if (header == 4 && Delay && j< message_size+n) {
 buf[j] = K_LINE.read();
 
 if (j<message_size+n-1) checksum^= buf[j]; // подсчёт КС
 
 if (j==message_size+n-1) header = 5; 
 TIMER_DELAY ; j++;} 

 } // end of K_LINE.available()

 // сообщение приняли, действуем
 if (header == 5) {TIMER_DELAY ;  
   
for(byte i = 0; i<n; i++) checksum^=buf[i]; // прибавляем к контрольной сумме старт байты

 // если контрольная сумма верна: 
if ( checksum == buf[message_size+n-1]) {
  
if (Heater == EVO){
    
     if (buf[2]==0xD0 && buf[3]==0x30)                          {    // если получили сообщение с текущими данными
               
                 if  (buf[4] ==0x0A) { 
                          airfan    = (bool)buf[5];                  // получаем флаг работы нагнетателя воздуха
                          plug      = (buf[5] & 0x02)>>1;            // получаем флаг работы штифта накаливания
                          fuelpump  = (buf[5] & 0x04)>>2;            // получаем флаг работы топливного насоса
                          waterpump = (buf[5] & 0x08)>>3;            // получаем флаг работы циркуляционного насоса
                          blowerfan = (buf[6] & 0x10)>>4;            // получаем флаг работы вентилятора печки автомобиля
                  
                                     }
                   
                 if  (buf[6] ==0x0C)  HeaterC = buf[7]-50;           // получаем температуру антифриза в котле 
                 if  (buf[8]==0x0E) {Vpit = (float)(buf[9]<<8|buf[10])/1000.0;}                 // получаем напряжение борт сети
                 if  (buf[11]==0x10) {startWebasto_OK = (bool)buf[12]; last_Flame = curmillis;} // проверяем наличие пламени                                                
                 
                 if (needAction>0 && needAction<NEED_DTCCLEAR) {w_bus_init = 12; sendMessage (HEATER_DTC_REQUEST, sizeof(HEATER_DTC_REQUEST));}
                                                                }

     if (buf[0]==0x44 && buf[2]==0xC4 && buf[3]==0x00) {w_bus_init = 1; delay (500); K_LINE.flush();}             // если получили от котла сбой инита, делаем переинит 
     
     if (buf[2]==0xD6 && buf[3]==0x01) {if (needAction>0 && needAction<NEED_DTCCLEAR) w_bus_init = 13;
      for (byte h = 0; h< sizeof(DTC); h++) DTC[h]=0;
      DTC[0] = buf[4];
      for (byte h = 0; h< buf[4]; h++) {DTC[h+1]=buf[h*3+5]; bitWrite (DTC[6], h+1,  (buf[h*3+6] & 0x02)>>1);}
            }  

     if (buf[2]==0xD6 && buf[3]==0x03)  {startSMS (KTOzapros); SIM800.println (F("DTCs are erased!")); EndSMS(); needAction=0; w_bus_init = 9; NeedTimer = 0;  }                   
     
     if (buf[2]==0xD1 && buf[3]==0x0A)  {w_bus_init = 10;   }// если получили ответ на сообщение старта коммуникации                    
                                                                
                  }

if (Heater == VEVO){
     if (buf[2]==0xD0 && buf[3]==0x05) {startWebasto_OK = buf[7]; last_Flame = millis();}       // проверяем наличие пламени у VEVO 
                  }
  
  
                                        }   

// если контрольная сумма не совпала: 

//else K_LINE.println("CRC fail!!!" );
  
message_size = 0; header=0; RESETheader_timer=0; j=2; checksum = 0;
}




}// end EVO VEVO


else if (Heater == TTC_E){



  
if (!timerInitflag && w_bus_init==NEED) {K_LINE.end(); pinMode (TX, OUTPUT); digitalWrite(TX, 0); timerInit = millis(); timerInitflag = 1;}
if ( timerInitflag && (millis() - timerInit>299)  && w_bus_init==NEED) {timerInit = millis(); digitalWrite(TX, 1); w_bus_init=2; }
if ( timerInitflag && (millis() - timerInit>49)   && w_bus_init==2) {timerInit = millis(); digitalWrite(TX, 0); w_bus_init=3; }
if ( timerInitflag && (millis() - timerInit>24)   && w_bus_init==3) {timerInit = millis(); digitalWrite(TX, 1); w_bus_init=4; }
if ( timerInitflag && (millis() - timerInit>3024) && w_bus_init==4) {K_LINE.begin (10400); timerInitflag = 0; w_bus_init=9;  sendMessage (START_SESSION, sizeof(START_SESSION));}

if (K_LINE.available()){
    

 // первый старт байт
 if (header == 0 && Delay){TIMER_DELAY ; buf[0]=K_LINE.read();  
         if (!bitRead (buf[0],6) && bitRead (buf[0],7)){header = 1; RESETheader_timer=1; prevRESETheader = curmillis; }
         
         }                  

 // второй старт байт
 if (header == 1 && Delay){TIMER_DELAY ; buf[1]=K_LINE.read(); if (buf[1]==0xF1){ header = 2;} else {header = 0; RESETheader_timer=0;}} 

 // третий старт байт
 if (header == 2 && Delay){ 
  TIMER_DELAY ;
  buf[2]=K_LINE.read(); 
  if (buf[2]==0x51){ message_size = buf[0]; 
  if (buf[0] !=0x80) {header = 4;  message_size&=~0x80; j=3; n=3;}
  else {header = 3; j=4;n=4;}
  if (message_size > bufsize) message_size = bufsize;  checksum = 0;} else {header = 0; RESETheader_timer=0; }
  
                          }  
// если размер сообщения указан в дополнительном байте (нулевой байт 0x80) читаем этот дополнительный байт:
if (header == 3 && Delay){
  TIMER_DELAY ;
  buf[3]=K_LINE.read(); 
  message_size = buf[3]; 
  if (message_size > bufsize) message_size = bufsize;  
  checksum = 0; header = 4;  
                         }

  // пишем тело сообщения 
 if (header == 4 && Delay && j< message_size+n+1) {
 buf[j] = K_LINE.read(); 
 if (j<message_size+n) checksum+= buf[j]; // подсчёт КС
 
 if (j==message_size+n) header = 5; 
 TIMER_DELAY ; j++;} 

 } // end of K_LINE.available()

 // сообщение приняли, действуем
 if (header == 5) {TIMER_DELAY ;  

for(byte i = 0; i<n; i++) checksum+=buf[i]; // прибавляем к контрольной сумме старт байты

//for (byte i=0; i<message_size+n+1; i++) {Serial.print (buf[i], HEX); Serial.print(" ");}

 // если контрольная сумма верна: 
if (buf[message_size+n] == checksum) {
  
//  if (buf[n]== 0xC1) Serial.println ("StartSession OK!!!");
  
  
  
  
  }   

// если контрольная сумма не совпала: 
//else Serial.println("CRC fail!!!" );
message_size = 0; header=0; RESETheader_timer=0; j=3; checksum = 0;
}

} // end TTC_E

// таймер ожидания байт (для успевания появления данных в буфере UART)
if (!Delay && curmillis - timerdelay > waitbyte_RX) Delay = 1; 

// таймер сброса заголовка если данные оборвались во время приёма заголовка
if (RESETheader_timer && curmillis - prevRESETheader > 500) {RESETheader_timer = 0; header = 0;}   

if (curmillis - last_Flame>20000 && ProtocolSTATUS==STATUSBUS) {startWebasto_OK=0; last_Flame = curmillis;}  // делаем статус "нет пламени" через 20 сек, если не получаем сообщения от котла

if (Initreset && curmillis - prevInitreset>17000) {Initreset = 0; w_bus_init = 0;}  // сброс инита, если прошло более 17 сек после отправки последнего сообщения


if (needAction>0 && needAction < NEED_DTCCLEAR && w_bus_init==10) {if (Heater == EVO) sendMessage (HEATER_STATUS_EVO,  sizeof(HEATER_STATUS_EVO));
                                     if (Heater == VEVO)sendMessage (HEATER_STATUS_VEVO, sizeof(HEATER_STATUS_VEVO));
                                     w_bus_init=11;}
if ((NeedTimer && curmillis - prevNeedTimer>11000) || w_bus_init == 13)  {NeedTimer = 0; 
             if (curmillis - prevNeedTimer>11000) noData = 1; 
             if (needAction == NEED_SMSZAPROS)     SMSzapros();
        else if (needAction == NEED_SERVICEINFO) ServiceINFO();
        else if (needAction == NEED_DTCCLEAR) {startSMS(KTOzapros); SIM800.println (F("DTC not cleared. Heater no answer!")); EndSMS();}
        w_bus_init = 9; noData = 0; needAction = 0; 
        } 
        
 if (needAction==NEED_DTCCLEAR && w_bus_init==10) { sendMessage (HEATER_DTC_ERASE, sizeof(HEATER_DTC_ERASE)); w_bus_init = 20;  }

}


void Reset_gsm (){
  if (millis()-prevReset>(unsigned long)intervalReset*60000UL){
  
  digitalWrite (DTR, LOW); delay (150);
  SIM800.println (F("AT")); 
  timerenabledWaitOK = 1; timerWaitOK = millis();
  gsmOK = false;
  prevReset = millis(); }

 if (timerenabledWaitOK && millis()-timerWaitOK>6000) {
    timerenabledWaitOK = 0;
    if (!gsmOK) {
      SIM800.println (F("AT")); timerenabledWaitOK = 1; timerWaitOK = millis();
      NoAnswersGSM++; if (NoAnswersGSM>4) NoAnswersGSM = 4; 
      
      }
}

  
 if (!gsmOK)  { 
  if (SIM800.available()>0){                                   
    char currSymb = SIM800.read(); 

  

    if ('\r' == currSymb) {                                      
                                  
       if (!currStr.compareTo("OK")) {   gsmOK = true;  timerenabledWaitOK = 0; NoAnswersGSM=0; digitalWrite (DTR, HIGH);}
       currStr = "";                                           
    }
    
    else if ('\n' != currSymb && currSymb!=0x13 && currSymb!=0x11) {currStr += String(currSymb);}}}
    
    
    if (NoAnswersGSM>=4) Reset();
    
    }



 
 void Reset(){
     
      if (!resettimer) {digitalWrite (ResetGSM, RelayON); resettimer = 1; resetTimer = millis();} 
else if (millis()- resetTimer>6000 ) {
resettimer = 0; 
NoAnswersGSM=0; 
ResetNumber++; 
EEPROM.write (ResetNumber_cell, ResetNumber);
digitalWrite (ResetGSM, !RelayON); 
delay (3500); NastroykaGSM ();}
             }




void sendMessage(const byte *command, const size_t size){

 Initreset = 1;  prevInitreset = curmillis;  // включение таймера сброса инита
 
 if (Heater == TTC_E){
  const byte siZe = size+4;
  byte Mes[siZe];
  byte Checksum = 0;
  for(byte i=0; i<siZe; i++) {
    if (i==0) {Mes[i]=size; bitWrite(Mes[i], 7 , 1);}
    if (i==1) Mes[i] = 0x51;
    if (i==2) Mes[i] = 0xF1;    
    if (i==3) {for (byte t=0; t<size; t++ ) {Mes[i]=command[t]; Checksum+=Mes[i] ;K_LINE.write (Mes[i]);  i++;}}
    if (i!=siZe-1) Checksum+=Mes[i];
    else Mes[i] = Checksum;    
    K_LINE.write (Mes[i]); 
      }
  
 }
 else if (Heater == EVO || Heater == VEVO){
  const byte siZe = size+3;
  byte Mes[siZe];
  byte Checksum = 0;
  for(byte i=0; i<siZe; i++) {
    if (i==0) Mes[i] = 0xF4;
    if (i==1) Mes[i]=size+1; 
    if (i==2) {for (byte t=0; t<size; t++ ) {Mes[i]=command[t]; Checksum^=Mes[i] ;K_LINE.write (Mes[i]); i++;}}
    if (i!=siZe-1) Checksum^=Mes[i];
    else Mes[i] = Checksum;    
    K_LINE.write (Mes[i]); 
      }
  
  }
  }

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

запаял быстренько все деталюхи на заводскую плату. Косяков пока не обнаружил. всё работает. Паять приятно такую плату, ну и само собой быстрее.  

vgk_com
Offline
Зарегистрирован: 02.03.2017

Вообще огонь, классно вышло, как заводская. Разъем, тип какой, напиши пожалуйста или ссылку кинь где заказать можно

MaksVV
Offline
Зарегистрирован: 06.08.2015
Секешфехервар
Секешфехервар аватар
Offline
Зарегистрирован: 06.09.2018

Доброго! подскажите пожалуйста или дайте ссылочку на файлик Button.h . Возможно искал невнимательно ну в общем не нашел , подскажите если не сложно .

vgk_com
Offline
Зарегистрирован: 02.03.2017

титановый вел button.h для кнопки от добрейшего дяди Клапы   Пост 563

Секешфехервар
Секешфехервар аватар
Offline
Зарегистрирован: 06.09.2018

vgk_com благодарю ! 

Maltsev.v.v
Offline
Зарегистрирован: 17.03.2017

Всем привет, может подскажите, как настрить CanHacker на скорость 200 кбит/с., а то или125 или 250, а 200 нету

 

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Залил скетч 3.64 все работает, правда заметил такую приколюху , после заливки нового сктеча проверил просто на блоке питания без подключения к авто, все работает, поставил в автомобиль, для проверки отправил в приложении команду на запрос состояния ,вроде смс ушло и отчет  о получении пришел  , но ответа нет, отправил еще одну , такая же х...ня , передернул питание и все заработало, не знаю что за прикол. но так же было после предидущих прошивок, я еще писал что они не заработали сразу , а потом обнаружилось что они работают, почему то первый запуск  после обновления скетча , так работает , не знаю почему , может глюк модема , хотя модем я поставил другой . пришла посылка с Китая на конец то. Странно это все.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Попробуй в строке 239 скетча 3.64 поставить задержку 4сек вместо 3.5

MaksVV
Offline
Зарегистрирован: 06.08.2015

Maltsev.v.v пишет:

Всем привет, может подскажите, как настрить CanHacker на скорость 200 кбит/с., а то или125 или 250, а 200 нету

 


Причем здесь канхакер в этой теме? Спрашивайте это у разработчика библиотеки канхакер на ситроен с4 клубе

MaksVV
Offline
Зарегистрирован: 06.08.2015

Dushman7776 пишет:

Залил скетч 3.64 все работает, правда заметил такую приколюху , после заливки нового сктеча проверил просто на блоке питания без подключения к авто, все работает, поставил в автомобиль, для проверки отправил в приложении команду на запрос состояния ,вроде смс ушло и отчет  о получении пришел  , но ответа нет, отправил еще одну , такая же х...ня , передернул питание и все заработало, не знаю что за прикол. но так же было после предидущих прошивок, я еще писал что они не заработали сразу , а потом обнаружилось что они работают, почему то первый запуск  после обновления скетча , так работает , не знаю почему , может глюк модема , хотя модем я поставил другой . пришла посылка с Китая на конец то. Странно это все.

сфоткай как собрано устройство. Может аппаратный косяк. У меня таких глюков не замечено. 

положил адреса датчиков даллас в еепром. Теперь они не жестко в скетче сидят и их можно прописывать при помощи смс (например при замене датчика, или если перепутал место установки).

изначальную запись адресов можно делать в скетче чистки еепром 

#include <EEPROM.h>


enum Cells {
ResetNumber_cell,      //0
TimeWebasto_cell,      //1
ProtocolSTART_cell,    //2
StartByte_cell,        //3
ProtocolSTATUS_cell,   //4
Heater_cell,           //5
delta_cell,            //6
sizeCells,
TelNumber1_cell =20,  //20
TelNumber2_cell =40,  //40
DallasAddr_cell =60   //60
};


// названия температур котла: 
enum TempC {VyhlopC, EngineC, UlicaC, SalonC, size_arrayTemp};

// возможные протоколы чтения статуса котла:

enum ProtocolSTATUS_ {
   STATUSBUS,                 // статусы котла читаются по цифровой шине
   ANALOG                     // статусы котла считываются силами ардуино - по датчикам 
};                   


// возможные протоколы запуска котла:

enum ProtocolSTART_  {
   STARTBUS,                  // запуск котла происходит по цифровой шине
   IMPULSE,                   // запуск котла происходит импульсом GND (для подпайки к кнопке пуск на таймере котла)
   POTENCIAL                  // запуск котла происходит подачей потенциала +12В (пока плюс висит - котёл работает)
};        

// возможные типы котла: 

enum Heater_  { TTC_E, VEVO, EVO, HYDRONIC};                 


//--------------------ниже здесь устанавливаем какие настройки у девайса будут по умолчанию

byte ProtocolSTATUS = STATUSBUS;  // в данном случае статусы читаются по цифровой шине                 
byte ProtocolSTART  = STARTBUS;   // в данном случае запуск котла происходит по цифровой шине                 
byte Heater         = EVO;        // в данном случае тип котла EVO
byte StartByte      = 0x20;       // в данном случае байт на старт котла 0x20 (для шины w-bus)
byte worktime       = 30;         // в данном случае время цикла работы котла 30 минут 
byte deltaT         = 45;         // разница температур улицы и выхлопа, выше которой считается, что котёл успешно стартанул

//сюда пишем адреса датчиков даллас (левые 8 байт): 

byte DS18B20 [size_arrayTemp][10] = {
{0x28, 0xFF, 0xB2, 0xB5, 0xC1, 0x17, 0x05, 0xD1,    VyhlopC,  -100}, 
{0x28, 0xFF, 0xD3, 0xE2, 0xC1, 0x17, 0x04, 0x0D,    EngineC,  -100}, 
{0x28, 0xFF, 0xF8, 0xBC, 0xC1, 0x17, 0x04, 0x48,    UlicaC,   -100},  
{0x28, 0xFF, 0x3F, 0xB7, 0xC1, 0x17, 0x05, 0xF1,    SalonC,   -100}
};

//----------------------


void setup() {
 
  pinMode(13, OUTPUT);
  digitalWrite(13, 0);
  EEPROM.write(TimeWebasto_cell, worktime); 
  EEPROM.write(ProtocolSTART_cell, ProtocolSTART);
  EEPROM.write(ProtocolSTATUS_cell, ProtocolSTATUS);
  EEPROM.write(Heater_cell, Heater);
  EEPROM.write(ResetNumber_cell, 0);
  EEPROM.write(StartByte_cell, StartByte);   
  EEPROM.write(delta_cell, deltaT);   
 
  
  for (int i = sizeCells ; i < DallasAddr_cell ; i++) EEPROM.write(i, '0');    // стираем ячейки под номера телефонов


// ниже записываем в еепром адреса датчиков даллас: 

for (byte i=0; i<sizeof(DS18B20)/10; i++) {
             for (byte k=0; k<10; k++) EEPROM.write (DallasAddr_cell+i*10+k, DS18B20 [i][k]);
                                          }


  
  digitalWrite(13, HIGH);
}

void loop() {}

не забываем после чистки еепром нужно свой тел.номер заново записать командой WriteNumber1

в связи с этими изменениями обновлённая инструкция пользователя 

сам скетч v3.65

char ver[] = "Firmware 3.65";    // версия прошивки



//----------------------------------название ячеек еепром----------------------------------------------------------------
#include <EEPROM.h>
enum Cells {
ResetNumber_cell,      //0
TimeWebasto_cell,      //1
ProtocolSTART_cell,    //2
StartByte_cell,        //3
ProtocolSTATUS_cell,   //4
Heater_cell,           //5
delta_cell,            //6
TelNumber1_cell =20,  //20
TelNumber2_cell =40,  //40
DallasAddr_cell =60   //60
};


//-------------------------------------для voltmetr-----------------------------------------------------------------------
                                   
float vout = 0.0;      // Напряжение на входе аналового входа
float Vpit = 0.0;      // Измеряемое напряжение на выходе ИБП
  int volt = 0;        // Напряжение на входе АЦП


//------------------- распиновка ног ардуино (плата весий 8.5-8.8)--------------------------------------------------------

#define OutWebasto_12V      2  // это +12В выход потенциала вкл/выкл вебасто (напрямую к котлу без таймера). 
#define Dallas_pin          3  // пин шины OneWire для датчиков даллас
#define DopOn               4  // сюда доп канал от сигналки на включение вебасто
#define DopOff              5  // сюда доп канал от сигналки на выключение вебасто
#define Ohrana              6  // Сюда состояние охраны сигналки
#define Trevoga             7  // Сюда состояние тревоги
#define IGN                 8  // Сюда состояние зажигания
#define Sost                9  // Сюда состояние вебасто (+12В когда работает)
#define ResetGSM           12  // пин ресета GSM подключен к реле, разрывающее питание модуля. 
#define Eng                14  // (А0) Сюда состояние работы ДВС
#define StatusWebastoLED   15  // (А1) пин LED  индикация включенности котла
#define StartButtonpin     16  // (А2) пин тактовой кнопки вкл/выкл котла 
#define DTR                17  // пин (А3), управляющий энергосберегающим режимом GSM модуля
#define StartEng           18  // (A4) это импульсный минусовой выход вкл/выкл ДВС. подключать на вход событий сиги.
#define OutWebasto_GndImp  19  // (A5) это импульсный минусовой выход вкл/выкл вебасто (к впайке к кнопке таймера).  
#define Voltmeter_pin      A7  // пин, которым измеряем напряжение питания
#define StartButton         0  // программный номер тактовой кнопки вкл/выкл котла 
const bool RelayON =        1; // логика управления реле ресета GSM, в данном случае включается высоким уровнем на пине
#define GSM_RX             10  // пин софт RX Arduino для соединения с TX модуля SIM800
#define GSM_TX             11  // пин софт TX Arduino для соединения с RX модуля SIM800

/*
//------------------- распиновка ног ардуино (плата весий 5)---------------------------------------------------------------

#define Dallas_pin          2  // пин шины OneWire для датчиков даллас
#define OutWebasto_12V      3  // это +12В выход потенциала вкл/выкл вебасто (напрямую к котлу без таймера). 
#define DopOn               4  // сюда доп канал от сигналки на включение вебасто
#define DopOff              5  // сюда доп канал от сигналки на выключение вебасто
#define Ohrana              6  // Сюда состояние охраны сигналки
#define Trevoga             7  // Сюда состояние тревоги
#define StartEng            8  // это импульсный минусовой выход вкл/выкл ДВС. подключать на вход событий сиги.
#define Sost                9  // Сюда состояние вебасто (+12В когда работает)
#define IGN                10  // Сюда состояние зажигания
#define Eng                11  // Сюда состояние работы ДВС
#define OutWebasto_GndImp  12  // это импульсный минусовой выход вкл/выкл вебасто (к впайке к кнопке таймера). 
#define StatusWebastoLED   13  // пин индикация включенности котла
#define ResetGSM           16  // пин ресета GSM (A2) подключен к реле, разрывающее питание модуля. 
#define StartButtonpin     17  // пин тактовой кнопки вкл/выкл котла 
#define DTR                19  // пин (А5), управляющий энергосберегающим режимом GSM модуля
#define StartButton         0  // программный номер тактовой кнопки вкл/выкл котла 
const bool RelayON =        0; // логика управления реле ресета GSM, в данном случае включается низким уровнем на пине
#define GSM_RX             14  // пин софт RX Arduino для соединения с TX модуля SIM800
#define GSM_TX             15  // пин софт TX Arduino для соединения с RX модуля SIM800

*/

//------------------------------------для GSM модуля----------------------------------------------------------------------

#include <SoftwareSerial.h>
      SoftwareSerial SIM800 (GSM_RX, GSM_TX);//Rx, Tx   //UART для соединения с GSM модулем

String currStr = "";
String TelNumber[] = {"", "000000000000", "000000000000", "000000000000"};
byte isStringMessage = 0; 
byte KTOreport = 1;     // флаг кто запросил отчет о запуске котла или ДВС
byte KTOzapros = 0;     // флаг кто запросил баланс или запрос параметров 

uint32_t  prevReset=0;           // для таймера периодичности проверки (командой "АТ")
byte  intervalReset = 15;         // каждые столько мин будет проверка жив ли GSM модуль 
uint32_t  timerWaitOK=0;         // для таймера ожидания ответа после посылки команды "АТ"
bool timerenabledWaitOK=false;   // для таймера ожидания ответа после посылки команды "АТ"
byte NoAnswersGSM=0;             // количество неответов  от GSM модуля
bool gsmOK = 1;                  // флаг есть связь с GSM модулем или нет
bool resettimer = 0;             // для таймера удерживания реле в режиме сброс питания
uint32_t  resetTimer=0;          // для таймера удерживания реле в режиме сброс питания
byte ResetNumber = 0;            // количество ресетов GSM модуля для статистики (хранится в еепром)




//------------------- для шины 1-wire и датчиков DS18B20---------------------------------------------------------------------

#include <OneWire.h>    // библиотека для DS18B20
OneWire ds(Dallas_pin); // датчики DS18B20 на нужный пин

enum TempC {VyhlopC, EngineC, UlicaC, SalonC, size_arrayTemp}; // перечисление нужных температур (в конце размер массива температур)

// ниже соответствие адресов датчиков различным температурам 
byte DS18B20 [size_arrayTemp][10] = {
{0x28, 0xFF, 0xB2, 0xB5, 0xC1, 0x17, 0x05, 0xD1, VyhlopC,  -100}, 
{0x28, 0xFF, 0xD3, 0xE2, 0xC1, 0x17, 0x04, 0x0D, EngineC,  -100}, 
{0x28, 0xFF, 0xF8, 0xBC, 0xC1, 0x17, 0x04, 0x48, UlicaC,   -100},  
{0x28, 0xFF, 0x3F, 0xB7, 0xC1, 0x17, 0x05, 0xF1, SalonC,   -100}
};
byte delta = 50;  // разница температур выхлопа и улицы, выше которой считается, что пламя в котле есть. 

int8_t HeaterC = -100;
//---------------------------для организации W-BUS и различные таймеры-----------------------------------------------------------

#include <Button.h>
Button test;

#define K_LINE Serial      //UART для соединения с шиной котла
#define TX 1    
#define NEED 1
#define READY 10

byte header = 0;           // состояние заголовка 
byte message_size = 0;     // размер тела принимаемого сообщения, кол-во байт

byte j = 2;                // инкремент
byte n = 2;
const byte bufsize = 140;  // размер буфера принятого сообщения
byte buf [bufsize] = {0};  // буфер принятого сообщения
byte checksum = 0;         // контрольная сумма входящего сообщения
uint32_t curmillis = 0;    // снимок системного времени
byte delaybyte_TX = 0 ;    // задержка между байтами отправляемого сообщения 
byte waitbyte_RX = 1;      // задержка, мс для успевания заполнения буфера RX (подрегулировать в зависимости от уровня жизнидеятельности на Марсе)
uint32_t timerdelay = 0;   // таймер ожидания байт (для успевания заполнения буфера УАРТ)
bool Delay = 0;            // таймер ожидания байт (для успевания заполнения буфера УАРТ)
#define TIMER_DELAY Delay = 0; timerdelay = curmillis  // включение этого таймера

uint32_t prevRESETheader=0; // таймер сброса заголовка если в момент приёма сообщения данные оборвались
bool RESETheader_timer = 0; // таймер сброса заголовка если в момент приёма сообщения данные оборвались

// команды для котлов ЭВО
byte StartByte = 0x20;
byte HEATER_BEGIN[]         {0x51, 0x0A};
byte HEATER_START[]         {StartByte, 0x3B};
byte HEATER_PRESENCE[]      {0x44, StartByte, 0x00};
byte HEATER_STOP[]          {0x10};
byte HEATER_STATUS_VEVO[]   {0x50, 0x05};
byte HEATER_STATUS_EVO[]    {0x50, 0x30, 0x0A, 0x0C, 0x0E, 0x10, 0x12, 0x1E, 0x32};
byte HEATER_DTC_REQUEST[]   {0x56, 0x01};
byte HEATER_DTC_ERASE[]     {0x56, 0x03};

// команды для котлов ТТС/TTE
byte START_SESSION[]        {0x81};
byte REQUEST_2A10101[]      {0x2A, 0x01, 0x01};
byte REQUEST_2A10102[]      {0x2A, 0x01, 0x02};
byte REQUEST_2A10105[]      {0x2A, 0x01, 0x05};
byte REQUEST_DTC[]          {0xA1};
byte START_TTC[]            {0x31, 0x22, 0xFF};
byte STOP_TTC[]             {0x31, 0x22, 0x00};


enum needAction_ {NO_ACTION, NEED_SMSZAPROS, NEED_SERVICEINFO, NEED_DTCCLEAR};// возможные действия, стоящие в очереди
byte needAction = NO_ACTION;                                                  // переменная действия, стоящего в очереди

enum ProtocolSTATUS_ {STATUSBUS, ANALOG};                   // возможные протоколы чтения статуса котла
enum ProtocolSTART_  {STARTBUS, IMPULSE, POTENCIAL};        // возможные протоколы запуска котла
enum Heater_         {TTC_E, VEVO, EVO, HYDRONIC};          // тип котла

byte  ProtocolSTATUS = STATUSBUS; 
byte  ProtocolSTART  = STARTBUS;
byte  Heater         = EVO;

bool noData  = 0;                               // флаг пришли ли данные от котла после запроса. 
byte w_bus_init = 0;                            //флаг проведена или нет инициализация шины w-bus (25мс LOW, 25мс HIGH для  ЭВО
                                                //                                            либо 300ms LOW, 50ms HIGH, 25ms LOW, 3025ms HIGH для TTC 
byte requiredmessage =  1;                      //флаг, что отправляем в данный момент поддержание старта, запрос параметров или запрос ошибок
byte StartMessageRepeat = 0;                    //количество отправленных сообщений на старт котла
byte StopMessageRepeat =  4;                    //количество отправленных сообщений на остановку котла

byte  TimeWebasto = 30;                         //время работы котла, = 30мин
uint32_t EndReportMillis = 0;                   //переменная для таймера отправки отчета об успешности запуска котла
uint32_t EndReportEngine = 0;                   //переменная для таймера отправки отчета об успешности запуска ДВС
uint32_t Prev_PeriodW_BusMessage = 0;           //переменная для таймера периодической отправки сообщений состояния котла в шину W-Bus 
uint32_t Prev_PeriodW_BusStartStop = 0;         //переменная для таймера периодической отправки сообщений старта/стопа котла в шину W-Bus 
uint32_t prevdelSMS = 0;                        //переменная для таймера периодического удаления СМС 
uint32_t prevVpit = 0;                          //переменная для таймера периодического измерения напряжения АКБ
uint32_t prevInitreset = 0;                     //переменная для таймера сброса инита шины
bool Initreset = 0;                             //переменная для таймера сброса инита шины
uint32_t timerInit = 0; bool timerInitflag = 0; //для таймера инита шины W-BUS
uint32_t prevNeedTimer = 0; bool NeedTimer = 0; //для таймера задержки функций SMSzapros() и ServiceINFO() на время обновления параметров по шине


uint32_t last_Flame = 0;                        //для таймера сброса флага пламени, если нет ответов от котла

//для таймера создания импульса GND - для протокола запуска котла импульсом GND 
uint32_t timer=0; bool timerenabled=false;
#define TIMEREXPIRED (curmillis-timer)>800

//для таймера  - старт двигателя - импульс +5В на транзистор, в итоге минусовой импульс 1.5 сек на вход событий сигналки для запуска ДВС)
uint32_t  timerStartEng=0; bool timerenabledStartEng=false;
#define TIMEREXPIRED_StartEng (millis()-timerStartEng)>1500

//для таймера  - старт котла по W-BUS )
uint32_t timerStart_W_BUS=0; bool timerenabledStart_W_BUS=false;
#define TIMEREXPIRED_Start_W_BUS (curmillis-timerStart_W_BUS)> (uint32_t)TimeWebasto * 60000UL



//---------------------------------Основные переменные--------------------------------------------------------------------------------  

bool webasto = 0;             // флаг команды на работу Webasto. 0 - котел выключен, 1 - котел включен
bool startWebasto_OK = 0;     // флаг успешного запуска котла
bool report = false;          // флаг нужности отправки отчета false - не нужно отправлять, true - нужно отправлять
bool reportEngine = false;    // флаг нужности отправки отчета false - не нужно отправлять, true - нужно отправлять
bool engine =0;               // флаг работает ли ДВС или нет
bool ignition=0;              // флаг включено ли зажигание или нет
bool ohrana=0;                // флаг включена ли охрана или нет
bool trevoga=0;               // флаг включена ли тревога или нет
bool alarmSMS = 0;            // флаг отправлена ли смс о тревоге или нет

bool waterpump = 0;           // флаг работы циркуляционного насоса
bool plug      = 0;           // флаг работы штифта накаливания
bool airfan    = 0;           // флаг работы нагнетателя воздуха
bool fuelpump  = 0;           // флаг работы топливного насоса
bool blowerfan = 0;           // флаг работы вентилятора печки автомобиля
byte DTC[7] ={0};             // коды неисправностей котла



//---------------------------СТАРТОВЫЙ ЦИКЛ--------------------------------------------------------------------------------------------

void setup() 
{


delay (3500);


test.NO(); 
test.pullUp();
test.duration_bounce       (  50);
test.duration_click_Db     ( 250);
test.duration_inactivity_Up(5000);
test.duration_inactivity_Dn(1000);
test.duration_press        ( 500);
test.button(StartButtonpin);            // в скобках пин тактовой кнопки вкл/выкл котла (программный номер у неё будет 0)
 
pinMode (DopOn,   INPUT_PULLUP); 
pinMode (DopOff,  INPUT_PULLUP); 
pinMode (Sost,    INPUT_PULLUP); 
pinMode (Ohrana,  INPUT_PULLUP); 
pinMode (Trevoga, INPUT_PULLUP); 
pinMode (IGN,     INPUT_PULLUP); 
pinMode (Eng,     INPUT_PULLUP); 
  
pinMode (OutWebasto_12V,     OUTPUT);  digitalWrite (OutWebasto_12V,      LOW);
pinMode (StartEng,           OUTPUT);  digitalWrite (StartEng,            LOW);
pinMode (13,                 OUTPUT);  digitalWrite (13,                  LOW);
pinMode (StatusWebastoLED,   OUTPUT);  digitalWrite (StatusWebastoLED,    LOW);
pinMode (OutWebasto_GndImp,  OUTPUT);  digitalWrite (OutWebasto_GndImp,   HIGH);
pinMode (DTR,                OUTPUT);  digitalWrite (DTR,                 HIGH);  // делаем высокий, а низкий уровень будет для пробуждения GSM из "спячки"
pinMode (ResetGSM,           OUTPUT);  digitalWrite (ResetGSM,        !RelayON);  // реле ресет на данный момент делаем "неактивно"


   SIM800.begin(19200);           // сериал соединение для gsm модуля
   delay(100);
   NastroykaGSM ();


TimeWebasto =    EEPROM.read(TimeWebasto_cell);
ProtocolSTART  = EEPROM.read(ProtocolSTART_cell);
ProtocolSTATUS = EEPROM.read(ProtocolSTATUS_cell);
ResetNumber =    EEPROM.read(ResetNumber_cell);
StartByte =      EEPROM.read(StartByte_cell);
Heater =         EEPROM.read(Heater_cell);
delta  =         EEPROM.read(delta_cell);
for (int i=0; i<12; i++) TelNumber[1][i] = EEPROM.read (i+TelNumber1_cell);
for (int i=0; i<12; i++) TelNumber[2][i] = EEPROM.read (i+TelNumber2_cell);

// ниже читаем из еепром адреса датчиков температуры даллас 
for (byte i = 0; i<size_arrayTemp; i++) {
    for (byte k=0; k<9; k++) DS18B20 [i][k] = EEPROM.read(DallasAddr_cell+i*10+k);
    }



        if (Heater == EVO || Heater == VEVO) K_LINE.begin(2400, SERIAL_8E1);
   else if (Heater == TTC_E) K_LINE.begin(10400);


for (byte i=0; i<20; i++) {digitalWrite (13, !digitalRead(13)); delay (80);}
digitalWrite (13,0);
}



//------------------------------------------ЛУП-----------------------------------------------------------------------------------


void loop() {
curmillis = millis();
test.read();

digitalWrite (StatusWebastoLED, webasto);
//digitalWrite (13, startWebasto_OK);
//digitalWrite (13, webasto);


//если нажали тактовую кнопку меняем состояние котла на противоположное 
if (test.event_press_short (StartButton)) {
  if (!webasto) {StartWebasto(); report = false;}
  else StopWebasto();
    }

if (ProtocolSTATUS==ANALOG) {if (Temper(VyhlopC) - Temper(UlicaC) > delta) startWebasto_OK = 1;
                             else startWebasto_OK = 0;}

if (ProtocolSTART==IMPULSE) webasto = !digitalRead (Sost);

Heater_BUS();

//ниже для таймера старта котла по шине и аналогу 
 
  if (timerenabledStart_W_BUS && TIMEREXPIRED_Start_W_BUS) StopWebasto();

//ниже для таймера создания импульса на старт ДВС 

if (timerenabledStartEng && TIMEREXPIRED_StartEng) {digitalWrite (StartEng, LOW); timerenabledStartEng=false;}
    
 engine =  !digitalRead (Eng);
 ignition= !digitalRead (IGN); 
 ohrana=   !digitalRead (Ohrana);  
 trevoga=  !digitalRead (Trevoga);
  
if (webasto && report) timerReport ();
if (reportEngine) timerReportEngine ();
if (!ohrana) alarmSMS = false;


   if (trevoga && !alarmSMS) AlarmSMS ();
   if (gsmOK)readSMS();
   Reset_gsm();
   delSMS();


WebastoOprosImpulse ();
izmereniya();

}


//-----------------------------------------------------------конец луп-------------------------------------------------------------



void izmereniya() { 

if (millis()-prevVpit>7000){

//измерение напряжения борт сети
if (ProtocolSTATUS==ANALOG){
   volt = analogRead(Voltmeter_pin);                      
   vout = (volt * 4.13) / 1024;             
   Vpit = vout / (9700.0/(98930.0+9700.0));  // По формуле Vpit = vout / (R2/(R1+R2)) 
   if (Vpit<0.09)  Vpit=0.0;                  // Округление до нуля 
}  

// ниже измерение датчиков даллас
static bool n=0;        // флаг работы: запрос температуры или её чтение
n=!n;
if (n) {ds.reset();     // сброс шины
        ds.write(0xCC); // обращение ко всем датчикам
        ds.write(0x44); // начать преобразование (без паразитного питания)  
       }
else   {
  for (byte i=0; i<size_arrayTemp; i++){  
    int Temper_ = 20; byte buff[9];
    ds.reset();
    ds.select(DS18B20[i]);
    ds.write(0xBE); // чтение регистров датчиков
    for (byte j=0; j<9; j++) buff[j]=ds.read(); // читаем все 9 байт от датчика
    ds.reset();
    if (OneWire::crc8(buff, 8) == buff[8]){     // если контрольная сумма совпадает 
          Temper_ = buff[0]|(buff[1]<<8);       // читаем температуру из первых двух байт (остальные были нужны только для проверки CRC)
          Temper_ = Temper_ / 16;
          if (Temper_<150 && Temper_>-55) DS18B20[i][9] = Temper_;
}
else DS18B20[i][9] = -101;                     // если контрольная сумма не совпала, пусть t будет -101 градус. 
}}


prevVpit=millis();
}}



int8_t Temper (const byte &addressTemp) {for(byte j=0; j<size_arrayTemp; j++){if(DS18B20[j][8]==addressTemp)return(int8_t)DS18B20[j][9];} return-99;}



void WebastoOprosImpulse (){

// опрос допканалов от сигнализации включения/ выключение котла и таймер импульса старт/стоп котла 
  
  if (timerenabled) {if (TIMEREXPIRED) {digitalWrite (OutWebasto_GndImp, HIGH); timerenabled=false;}}
  else  {if (!digitalRead (DopOn)  && !webasto) {StartWebasto(); KTOreport = 1;}
         if (!digitalRead (DopOff) && webasto) StopWebasto();
         }}


// цикл таймера отправки отчета об успешности запуска котла (отчёт через 6 мин после старта)
void timerReport () {
   if(millis() - EndReportMillis > 360000UL) 
   {EndReportMillis = millis(); report = false; SMSzapros();  }} 

// цикл таймера отправки отчета об успешности запуска ДВС  (отчёт через 60сек после старта)                       
void timerReportEngine () {
   if(millis() - EndReportEngine > 90000ul) 
   {EndReportEngine = millis(); reportEngine = false; SMSzapros_();}} 





   void NastroykaGSM () {
  digitalWrite (DTR, LOW);      // выводим из спячки GSM модуль
    delay (150);
  SIM800.println(F("AT"));                    //просто AT для разогреву
    delay(250);
  SIM800.println(F("AT+CMGF=1"));             //устанавливает текстовый режим смс-сообщения
    delay(250);
  SIM800.println(F("AT+IFC=0, 0"));           //отключает программный контроль потоком передачи данных
    delay(250);
  SIM800.println(F("AT+GSMBUSY=1"));          //запрет всех входящих звонков
    delay(250);
  SIM800.println(F("AT+CNMI=1,2,2,1,0"));     //включает оповещение о новых сообщениях
    delay(250);
  SIM800.println(F("AT+CMGDA=\"DEL ALL\""));  // удаляем все смс, ки
   delay(1500);
  SIM800.println(F("AT+CSCLK=1"));            //включает энергосберегающий режим 
  delay(150);
  digitalWrite (DTR, HIGH);     // вводим в спячку GSM модуль высоким уровнем на пине DTR
  
}

void startSMS(byte stat) //__________________Цикл подготовки модуля к отправке СМС-сообщений по первому номеру
{
    if (stat==0) stat = KTOreport;
     digitalWrite (DTR, LOW); // выводим из спячки GSM модуль
         delay (150);
     SIM800.print(F("AT+CMGF=1\r"));
         delay(200);
     SIM800.print(F("AT+CMGS=\"")); SIM800.print(TelNumber[stat]); SIM800.println("\""); 
         delay(200);
}



void EndSMS ()
{
   SIM800.println((char)26);                       // Команда отправки СМС
   delay(1500);
   digitalWrite (DTR, HIGH); // вводим в спячку SIM800 модуль 
   
}

void delSMS ()
{
if (millis() - prevdelSMS > 7200000ul){  //раз в 2 часа 
 digitalWrite (DTR, LOW); // выводим из спячки SIM800 модуль
    delay (150);
 SIM800.print(F("AT+CMGDA=\"DEL ALL\"\r")); // удаляем все смс, ки
   delay(1500);
 digitalWrite (DTR, HIGH); // вводим в спячку SIM800 модуль 
   delay (150);

  prevdelSMS = millis();}
}


void SMSzapros_ () {if (webasto)SMSzapros(); else {NeedTimer = 1; prevNeedTimer = curmillis; needAction = NEED_SMSZAPROS; w_bus_init = 1;}}

void readSMS() //_____Цикл чтения входящих СМС-сообщений______________     
{
    if (!SIM800.available()) return;
    static bool SaveNumber2 = 0;      // флаг когда необходима запись номера#2, он true
    char currSymb = SIM800.read();

    if ('\r' == currSymb)
       {
         if (isStringMessage!=0&&isStringMessage!=3) //если текущая строка - SMS-сообщение, отреагируем на него соответствующим образом
                {
if      (!currStr.compareTo("ZAPROS"))       {SMSzapros_();}             // Передача параметров по СМС
else if (!currStr.compareTo("ZAPROSTEL"))    {SMSzaprosTEL();}           // Передача номеров телефонов пользователей по СМС
else if (!currStr.compareTo("Service-info")) {if (webasto) ServiceINFO(); else {NeedTimer = 1; prevNeedTimer = curmillis; needAction = NEED_SERVICEINFO;w_bus_init = 1;}}            // Передача сервисной информации  по СМС
else if (!currStr.compareTo("GSMResets-0"))  {ResetNumber=0; EEPROM.write (ResetNumber_cell, ResetNumber); ServiceINFO();}     //сброс счетчика ресетов GSM модуля
else if (!currStr.compareTo("Version"))      {startSMS(isStringMessage);  SIM800.println (ver); EndSMS ();}               //запрос версии ПО
else if (!currStr.compareTo("Erase DTC"))    {NeedTimer = 1; prevNeedTimer = curmillis; needAction = NEED_DTCCLEAR; if (w_bus_init == 0) w_bus_init = 1;}               //запрос на стриание ошибок

else if (!currStr.compareTo("Signal-level")) {digitalWrite (DTR, LOW);  delay (150); SIM800.println(F("AT+CSQ")); digitalWrite (DTR, HIGH);}                // запрос уровня сигнала GSM
              
else if (!currStr.compareTo("Webasto-ON"))  { startSMS(isStringMessage); SIM800.println(F("Webasto ")); 
  
           if (!webasto)  {StartWebasto (); KTOreport = isStringMessage;}
           else SIM800.println(F("uzhe ")); SIM800.println (F("vkluchena")); EndSMS();}

                                                            
else if (!currStr.compareTo("Webasto-OFF"))   {startSMS(isStringMessage); SIM800.println(F("Webasto "));  
           if (webasto)StopWebasto ();  // если получили команду на выключение и вебаста в настоящий момент включена - выключаем
           else SIM800.println(F("uzhe "));  SIM800.println(F("otkluchena"));EndSMS();}          

// если получили команду на включение ДВС и он в настоящий момент выключен - включаем
else if (!currStr.compareTo("Engine-ON"))  {startSMS(isStringMessage); SIM800.println(F("Dvigatel "));  
           if (!engine)  { digitalWrite (StartEng, HIGH);  timerStartEng=millis(); timerenabledStartEng=true; reportEngine = true; EndReportEngine = timerStartEng; KTOreport = isStringMessage;} 
           else SIM800.println(F("uzhe ")); SIM800.println(F("start")); EndSMS();}
                                                                                 
else if (!currStr.compareTo("Engine-OFF"))   {startSMS(isStringMessage); SIM800.println(F("Dvigatel "));  
           if (engine){ digitalWrite (StartEng, HIGH);  timerStartEng=millis(); timerenabledStartEng=true; reportEngine = false;} // если получили команду на выключение ДВС и он в настоящий момент работает - выключаем
           else SIM800.println(F("uzhe ")); SIM800.println(F("ostanovlen")); EndSMS();}          
              
else if (!currStr.compareTo("Impulse"))   {if (!webasto) {ProtocolSTART = IMPULSE;  EEPROM.write(ProtocolSTART_cell,ProtocolSTART);     
                                            startSMS(isStringMessage); SIM800.println(F("zapusk GND_impulse")); EndSMS();}}

else if (!currStr.compareTo("Startbus"))  {if (!webasto) {ProtocolSTART = STARTBUS; EEPROM.write(ProtocolSTART_cell,ProtocolSTART);  webasto = 0;  
                                            startSMS(isStringMessage); SIM800.println(F("zapusk BUS")); EndSMS();}}

else if (!currStr.compareTo("Potencial")) {if (!webasto) {ProtocolSTART = POTENCIAL; EEPROM.write(ProtocolSTART_cell,ProtocolSTART);   
                                            startSMS(isStringMessage); SIM800.println(F("zapusk +12V Potencial")); EndSMS();}}

else if (!currStr.compareTo("DallasAddr")) {startSMS(isStringMessage); SMSDallasAddr(); EndSMS();}

else if (currStr.endsWith("Status"))   {if (!webasto) {byte st = currStr.toInt(); if (st >= STATUSBUS && st<=ANALOG )ProtocolSTATUS = st; EEPROM.write(ProtocolSTATUS_cell,ProtocolSTATUS);   
                                            startSMS(isStringMessage); SIM800.print (F("Status: "));
                                                                             if (ProtocolSTATUS == 0)SIM800.println(F("BUS")); 
                                                                        else if (ProtocolSTATUS == 1)SIM800.println(F("Analog"));
                                                                        EndSMS();}}    


else if (currStr.endsWith("HeaterType")) {if (!webasto) {byte st = currStr.toInt(); if (st >= TTC_E && st<=HYDRONIC) Heater = st; EEPROM.write(Heater_cell,Heater);   
                                            startSMS(isStringMessage); SIM800.print (F("Heater: "));
                                                                             if (Heater == 0)SIM800.println(F("TTC_E")), K_LINE.end(),  K_LINE.begin(10400);
                                                                        else if (Heater == 1)SIM800.println(F("VEVO")),  K_LINE.end(),  K_LINE.begin(2400, SERIAL_8E1);
                                                                        else if (Heater == 2)SIM800.println(F("EVO")),   K_LINE.end(),  K_LINE.begin(2400, SERIAL_8E1);
                                                                        else if (Heater == 3)SIM800.println(F("HYDRONIC"));
                                                                             
                                                                        EndSMS();}}      




else if (currStr.endsWith("ADDR")) {if (!webasto) { startSMS(isStringMessage); byte savadr = ConvertAddr(); 
                                                    if (savadr>=0 && savadr<=3) {SIM800.print(F("address ")); TempName(savadr); SIM800.println (F(" saved OK!")); 
                                                    SMSDallasAddr();
                                                                                } 
                                                    else SIM800.println(F("address is incorrect!"));
                                                    
                                                                          EndSMS(); }}      
                                                                                                                                                
                                                                                                                                              
else if (currStr.endsWith("Delta"))   {if (!webasto) {delta = currStr.toInt(); //
               EEPROM.write(delta_cell, delta);  startSMS(isStringMessage);
               SIM800.print(F("DeltaT: ")); SIM800.print(delta); SIM800.print(F("*C")); EndSMS();}}
                                                                                                                                            

               
else if (currStr.endsWith("min"))   {if (!webasto) {TimeWebasto = currStr.toInt(); // для задания время цикла работы отправить сообщение вида "25 min", где 25 время работы в мин
               if (TimeWebasto>59)  TimeWebasto = 59;
               if (TimeWebasto<=15) TimeWebasto = 15;
               EEPROM.write(TimeWebasto_cell,TimeWebasto);
               startSMS(isStringMessage); SIM800.print(F("Webasto time: ")); SIM800.print(TimeWebasto); SIM800.print(F("min")); EndSMS();}}
               
else if (currStr.endsWith("StartByte")) {byte Z =currStr.toInt(); if (Z>=0x14 && Z<=0x17) StartByte= Z+12;
               startSMS(isStringMessage); SIM800.print(F("StartByte: ")); SIM800.print(StartByte, HEX); SIM800.print(F("h")); EndSMS();}

else if (!currStr.compareTo("ResetNumbers"))   {if (isStringMessage == 1) {startSMS(isStringMessage); SIM800.println(F("Phone numbers are erased")); EndSMS(); 
                                                                     
             TelNumber[1] = "000000000000"; TelNumber[2] = "000000000000"; for (int i=0; i<12; i++) {EEPROM.write (i+TelNumber1_cell,  TelNumber[1][i]); EEPROM.write (i+TelNumber2_cell,  TelNumber[2][i]); }}}

else if (!currStr.compareTo("WriteNumber2")&& isStringMessage == 1)   { 
                SaveNumber2 = 1; startSMS(isStringMessage); SIM800.println(F("Otpravte lyuboye SMS s nomera#2 dlya sohraneniya nomera")); EndSMS();} 

                                                                        

                                                     
else if (!currStr.compareTo("Balance"))    SMSbalance();
            isStringMessage = 0;
                }
              
              
else if (isStringMessage==3){ if (!currStr.compareTo("WriteNumber1"))   { TelNumber[1] = TelNumber[3]; for (int i=0; i<12; i++) {EEPROM.write (i+TelNumber1_cell, TelNumber[3][i]);}
              startSMS(1); SIM800.println(F("Tel Number#1 is saving in memory"));  SIM800.print("Tel#1: ");  SIM800.println (TelNumber[1]); EndSMS();
              } 
                                             else if (!currStr.compareTo("ZAPROS"))   { SMSzapros();}   
                                             else if (!currStr.compareTo("ZAPROSTEL"))   { SMSzaprosTEL();}               // Передача номеров телефонов пользователей по СМС            
               isStringMessage = 0;
              
              }           



                
else if (isStringMessage==0) {  if (TelNumber[1]!="000000000000" && !SaveNumber2 && TelNumber[1]!="яяяяяяяяяяяя"){
         
                     if (currStr.startsWith("+CMT: \""+TelNumber[1])) { isStringMessage = 1; KTOzapros = 1; }   
                else if (currStr.startsWith("+CMT: \""+TelNumber[2])) { isStringMessage = 2; KTOzapros = 2; }   
                else if (currStr.startsWith("+CUSD: 0,"))  //если текущая строка начинается с "+CUSD",то следующая строка является запросом баланса
                  {
                  startSMS(KTOzapros);
                  SIM800.print (currStr);
                  EndSMS();
                  }

                else if (currStr.startsWith("+CSQ:")) //если текущая строка начинается с "+CSQ",то значит был запрос на уровень сигнала GSM, отправим ответ запрашивающему
                  {
                  startSMS(KTOzapros);
                  SIM800.print (currStr);
                  EndSMS();
                  }
                                                }

                else if    (currStr.startsWith("+CMT:") && !SaveNumber2) { isStringMessage = 3; for (int i =0; i<12; i++) {TelNumber[3][i]=currStr[i+7];}}
                else if    (currStr.startsWith("+CMT:") && SaveNumber2) { for (int i =0; i<12; i++) {TelNumber[3][i]=currStr[i+7];} TelNumber[2] = TelNumber[3]; for (int i=0; i<12; i++) {EEPROM.write (i+TelNumber2_cell, TelNumber[3][i]);}
              startSMS(2); SIM800.println(F("Vash nomer sochranyon kak Number#2 v pamyati!")); 
              SIM800.print(F("Tel#1: ")); SIM800.println(TelNumber[1]); SIM800.print(F("Tel#2: "));  SIM800.println (TelNumber[2]); EndSMS(); SaveNumber2 = 0; } 
              
              } 
               
        currStr = "";
      } 
 
    else if ('\n' != currSymb && currSymb!=0x13 && currSymb!=0x11)  currStr += String(currSymb);
}




byte ConvertAddr() {
  
  byte addrbuf[9];
byte Cs=0;
for (byte i = 0; i<9; i++) {
    char str[]="  ";
    for (byte k = 0; k<2; k++) str[k] = currStr[3*i+k];

 addrbuf[i] = strtol(str,NULL,HEX);
      if (i<7) Cs+= addrbuf[i] = strtol(str,NULL,HEX);
 
  }
if (OneWire::crc8(addrbuf, 7) == addrbuf[7] && addrbuf[8]>=0 && addrbuf[8]<=3) { 

for (byte i = 0; i<size_arrayTemp; i++) {
  if (addrbuf[8]==DS18B20[i][8]) {for (byte k=0; k<9; k++) DS18B20 [i][k] = addrbuf[k], EEPROM.write (DallasAddr_cell+addrbuf[8]*10+k, addrbuf[k]);}
                                        }

return addrbuf[8];
}
else return 20; 
  }

void SMSDallasAddr(){
 
SIM800.println (F("Dallas Addresses:"));

for (byte i = 0; i<size_arrayTemp; i++) {
   TempName(DS18B20[i][8]); SIM800.println(); 
   for (byte k = 0; k<8; k++) {if (DS18B20[i][k]<=0x0F)SIM800.print(F("0")); SIM800.print(DS18B20[i][k],HEX); SIM800.print(F(" "));}
  SIM800.println(); 
  }

   
                              
  }



void SMSzaprosTEL(){
  startSMS(isStringMessage);
  PrintNumbers (); 
  EndSMS();                                 
  }


void SMSbalance() {
digitalWrite (DTR, LOW); // выводим из спячки SIM800 модуль
      delay (150);
SIM800.print(F("AT+CMGF=1\r"));
      delay(200);
SIM800.println (F("AT+CUSD=1,\"#100#\""));    // команда на замену на транслит *111*6*2# у МТС 
      delay(1500);  
digitalWrite (DTR, HIGH); // вводим в спячку SIM800 модуль 
      delay (150);  
                             
     
}


void AlarmSMS() {for (byte i = 0; i<2; i++) {startSMS(i+1); SIM800.println (F("Vnimanie!!! Trevoga!!! Sirena Vkl!")); EndSMS();} alarmSMS = true;}
 


void PrintNumbers () {for (byte i=0; i<2; i++) {SIM800.print(F("Tel#")); SIM800.print (i+1); SIM800.print(F(" ")); SIM800.println(TelNumber[i+1]);}}




void TempName (const byte &_address_) {     if (_address_== VyhlopC) SIM800.print(F("Vyhlop:  "));
                                       else if (_address_== EngineC) SIM800.print(F("Engine:  "));
                                       else if (_address_== UlicaC)  SIM800.print(F("Ulica:     "));
                                       else if (_address_== SalonC)  SIM800.print(F("Salon:    "));
                                       }

void SMSzapros()

{

  startSMS(isStringMessage);
  if (isStringMessage == 3){
 
 SIM800.println (F("Tel.number#1 not has been save in memory"));
 SIM800.println (F("For save Tel#1 send SMS command \"WriteNumber1\""));
 PrintNumbers ();
  }
  

  
  
  else {
  
SIM800.print (F("Webasto ")); on_off (webasto);
        if (webasto) { 
           SIM800.print (F("StartWebasto "));
           if (startWebasto_OK) SIM800.println (F("OK"));
           else SIM800.println (F("FAIL"));}
SIM800.print (F("Engine    "));  on_off (engine);
SIM800.print (F("IGN        ")); on_off (ignition);
SIM800.print (F("Ohrana  "));    on_off (ohrana);
     if (trevoga)  SIM800.println (F("Vnimanie!!! Trevoga!!! Sirena Vkl!"));
     
  SIM800.print(F("Battery: "));      if ((needAction>0 && !noData) || needAction == 0 || ProtocolSTATUS == ANALOG) {SIM800.print (Vpit,1); SIM800.println(F(" V"));}
                                else if (needAction>0 && noData && ProtocolSTATUS != ANALOG) SIM800.println(F(" No Data"));
  
  SIM800.println(F("Temperatures:"));
  if (ProtocolSTATUS != ANALOG){
  SIM800.print(F("Heater:  ")); if ((needAction>0 && !noData) || needAction == 0) {SIM800.print (HeaterC);  grad ();}
                                else if (needAction>0 && noData) SIM800.println(F(" No Data"));}
 
 // ниже распечатаем все температуры   
    for (byte i = 0; i<size_arrayTemp; i++) {
      if (DS18B20[i][8]==VyhlopC && ProtocolSTATUS != ANALOG) {}
      else {TempName(DS18B20[i][8]); SIM800.print (Temper(DS18B20[i][8])); grad ();}}
  

  if (ProtocolSTATUS == STATUSBUS){
  SIM800.print(F("Errors:   ")); if ((needAction>0 && !noData) || needAction == 0) SIM800.println (DTC[0]);
                                else if (needAction>0 && noData) SIM800.println(F(" No Data"));}
  
  
 
  }  
   EndSMS();    
                          
}

void on_off (const bool &stat) {if (stat) SIM800.println (F("ON")); else SIM800.println (F("OFF")); }
void grad () {SIM800.println (F("*C")); }





void ServiceINFO(){
  
       startSMS(isStringMessage);
  SIM800.print(F("Heater:  ")); 
       if (Heater==TTC_E)     SIM800.println(F("TTC/E"));
  else if (Heater==VEVO)      SIM800.println(F("VEVO"));
  else if (Heater==EVO)       SIM800.println(F("EVO"));
  else if (Heater==HYDRONIC)  SIM800.println(F("HYDRONIC"));
  SIM800.print(F("Start:    "));
       if (ProtocolSTART==IMPULSE)   SIM800.println(F("GND Imp"));
  else if (ProtocolSTART==STARTBUS)  {SIM800.print(F("BUS"));
             if (Heater== VEVO || Heater== EVO) {SIM800.print(F(" 0x")); SIM800.println (StartByte, HEX);}
             else SIM800.println();}
  else if (ProtocolSTART==POTENCIAL) SIM800.println(F("Potencial+12V"));
  
  SIM800.print(F("Status:  "));
       if (ProtocolSTATUS==ANALOG)    SIM800.println(F("ANALOG"));
  else if (ProtocolSTATUS==STATUSBUS) SIM800.println(F("BUS"));
  
   
  if (ProtocolSTART!=IMPULSE) {SIM800.print(F("Webasto Time: ")); SIM800.print (TimeWebasto); SIM800.println(F("min"));}
  SIM800.print(F("SIM800 Resets: ")); SIM800.println (ResetNumber); 

  if (ProtocolSTATUS==ANALOG) {SIM800.print(F("DeltaT:  ")); SIM800.print(delta);SIM800.println(F("*C"));}

  if (ProtocolSTATUS==STATUSBUS){
    if (!noData) {
    SIM800.print(F("   BurnFAN       ")); on_off (airfan);
    SIM800.print(F("   WaterPUMP ")); on_off (waterpump);
    SIM800.print(F("   PLUG            ")); on_off (plug);
    SIM800.print(F("   FuelPUMP    ")); on_off (fuelpump);
    SIM800.print(F("   Blower          ")); on_off (blowerfan);
    
   SIM800.print (F("Errors:  ")); SIM800.println (DTC[0]);
  if (DTC[0] >0) for (byte i=0; i<DTC[0]; i++) {
  if (DTC[i+1]<=0x0F) SIM800.print(F("0"));
     SIM800.print (DTC[i+1], HEX); 
     if (bitRead(DTC[6], i+1)) SIM800.println (F(" Active")); 
     else SIM800.println (F(" Passive"));      }
                             }
 else SIM800.println(F("Heater not answer. No Data"));}
   EndSMS();    
  
  }

void StartWebasto()
{
 if (ProtocolSTART==IMPULSE){
  
  digitalWrite (OutWebasto_GndImp, LOW); 
  timer=curmillis; 
  timerenabled=true;}

 else {
  StartMessageRepeat = 0;
  webasto = 1; digitalWrite (OutWebasto_12V, HIGH);
  timerStart_W_BUS=millis();
  timerenabledStart_W_BUS = true;}

  report = true; EndReportMillis = millis();
  w_bus_init = NEED;
}

void StopWebasto()
{
 if (ProtocolSTART==IMPULSE){ digitalWrite (OutWebasto_GndImp, LOW); 
  timer=curmillis; 
  timerenabled=true;}

 else {
  StopMessageRepeat = 0;
  webasto = 0; digitalWrite (OutWebasto_12V, LOW);
  timerenabledStart_W_BUS = false;}
   report = false;
   
   
}



void Heater_BUS (){
  
if      (Heater == EVO || Heater == VEVO){
if (webasto) {
    if (StartMessageRepeat<4 && (millis()-Prev_PeriodW_BusStartStop>800) && w_bus_init >= 9){
  sendMessage (HEATER_START, sizeof(HEATER_START)); 
  StartMessageRepeat++; 
  Prev_PeriodW_BusStartStop = millis();
  
    }
  if (StartMessageRepeat>=4){ if (millis()-Prev_PeriodW_BusMessage>4000)  {
    
         if (requiredmessage==1) sendMessage (HEATER_PRESENCE, sizeof(HEATER_PRESENCE));  
    else if (requiredmessage==2) {if (Heater == EVO) sendMessage (HEATER_STATUS_EVO,  sizeof(HEATER_STATUS_EVO));
                                  if (Heater == VEVO)sendMessage (HEATER_STATUS_VEVO, sizeof(HEATER_STATUS_VEVO));}
    else if (requiredmessage==3) sendMessage (HEATER_DTC_REQUEST, sizeof(HEATER_DTC_REQUEST));  
requiredmessage++; if (requiredmessage > 3) requiredmessage = 1;
StopMessageRepeat = 0;
    
    Prev_PeriodW_BusMessage = millis();
    }}}





else if (StopMessageRepeat<4 && (millis()-Prev_PeriodW_BusStartStop>800)){
  sendMessage (HEATER_STOP, sizeof(HEATER_STOP));
StopMessageRepeat++; 
StartMessageRepeat = 0;
   Prev_PeriodW_BusStartStop = millis();
  
  
  }


if (!timerInitflag && w_bus_init==NEED) {K_LINE.end(); pinMode (TX, OUTPUT); digitalWrite(TX, 0); timerInit = millis(); timerInitflag = 1;}
if ( timerInitflag && (millis() - timerInit>24) && w_bus_init==NEED) {timerInit = millis(); digitalWrite(TX, 1); w_bus_init=2; }
if ( timerInitflag && (millis() - timerInit>24) && w_bus_init==2) {K_LINE.begin (2400,SERIAL_8E1 );timerInitflag = 0; w_bus_init=9; 
                                                                   if (needAction>0) sendMessage (HEATER_BEGIN, sizeof(HEATER_BEGIN));  }


if (K_LINE.available()){
    

 // первый старт байт
 if (header == 0 && Delay){TIMER_DELAY ; buf[0]=K_LINE.read();  
         if (buf[0]==0x4F || buf[0]==0x44){header = 1; RESETheader_timer=1; prevRESETheader = curmillis; }
         else {header = 0; RESETheader_timer=0;}
         }                  

 // длина сообщения
 if (header == 1 && Delay){TIMER_DELAY ; buf[1]=K_LINE.read(); message_size = buf[1]; if (message_size > bufsize) message_size = bufsize;  header = 4;j=2;n=2;checksum = 0;} 

 // пишем тело сообщения 
 if (header == 4 && Delay && j< message_size+n) {
 buf[j] = K_LINE.read();
 
 if (j<message_size+n-1) checksum^= buf[j]; // подсчёт КС
 
 if (j==message_size+n-1) header = 5; 
 TIMER_DELAY ; j++;} 

 } // end of K_LINE.available()

 // сообщение приняли, действуем
 if (header == 5) {TIMER_DELAY ;  
   
for(byte i = 0; i<n; i++) checksum^=buf[i]; // прибавляем к контрольной сумме старт байты

 // если контрольная сумма верна: 
if ( checksum == buf[message_size+n-1]) {
  
if (Heater == EVO){
    
     if (buf[2]==0xD0 && buf[3]==0x30)                          {    // если получили сообщение с текущими данными
               
                 if  (buf[4] ==0x0A) { 
                          airfan    = (bool)buf[5];                  // получаем флаг работы нагнетателя воздуха
                          plug      = (buf[5] & 0x02)>>1;            // получаем флаг работы штифта накаливания
                          fuelpump  = (buf[5] & 0x04)>>2;            // получаем флаг работы топливного насоса
                          waterpump = (buf[5] & 0x08)>>3;            // получаем флаг работы циркуляционного насоса
                          blowerfan = (buf[6] & 0x10)>>4;            // получаем флаг работы вентилятора печки автомобиля
                  
                                     }
                   
                 if  (buf[6] ==0x0C)  HeaterC = buf[7]-50;           // получаем температуру антифриза в котле 
                 if  (buf[8]==0x0E) {Vpit = (float)(buf[9]<<8|buf[10])/1000.0;}                 // получаем напряжение борт сети
                 if  (buf[11]==0x10) {startWebasto_OK = (bool)buf[12]; last_Flame = curmillis;} // проверяем наличие пламени                                                
                 
                 if (needAction>0 && needAction<NEED_DTCCLEAR) {w_bus_init = 12; sendMessage (HEATER_DTC_REQUEST, sizeof(HEATER_DTC_REQUEST));}
                                                                }

     if (buf[0]==0x44 && buf[2]==0xC4 && buf[3]==0x00) {w_bus_init = 1; delay (500); K_LINE.flush();}             // если получили от котла сбой инита, делаем переинит 
     
     if (buf[2]==0xD6 && buf[3]==0x01) {if (needAction>0 && needAction<NEED_DTCCLEAR) w_bus_init = 13;
      for (byte h = 0; h< sizeof(DTC); h++) DTC[h]=0;
      DTC[0] = buf[4];
      for (byte h = 0; h< buf[4]; h++) {DTC[h+1]=buf[h*3+5]; bitWrite (DTC[6], h+1,  (buf[h*3+6] & 0x02)>>1);}
            }  

     if (buf[2]==0xD6 && buf[3]==0x03)  {startSMS (KTOzapros); SIM800.println (F("DTCs are erased!")); EndSMS(); needAction=0; w_bus_init = 9; NeedTimer = 0;  }                   
     
     if (buf[2]==0xD1 && buf[3]==0x0A)  {w_bus_init = 10;   }// если получили ответ на сообщение старта коммуникации                    
                                                                
                  }

if (Heater == VEVO){
     if (buf[2]==0xD0 && buf[3]==0x05) {startWebasto_OK = buf[7]; last_Flame = millis();}       // проверяем наличие пламени у VEVO 
                  }
  
  
                                        }   

// если контрольная сумма не совпала: 

//else K_LINE.println("CRC fail!!!" );
  
message_size = 0; header=0; RESETheader_timer=0; j=2; checksum = 0;
}




}// end EVO VEVO


else if (Heater == TTC_E){



  
if (!timerInitflag && w_bus_init==NEED) {K_LINE.end(); pinMode (TX, OUTPUT); digitalWrite(TX, 0); timerInit = millis(); timerInitflag = 1;}
if ( timerInitflag && (millis() - timerInit>299)  && w_bus_init==NEED) {timerInit = millis(); digitalWrite(TX, 1); w_bus_init=2; }
if ( timerInitflag && (millis() - timerInit>49)   && w_bus_init==2) {timerInit = millis(); digitalWrite(TX, 0); w_bus_init=3; }
if ( timerInitflag && (millis() - timerInit>24)   && w_bus_init==3) {timerInit = millis(); digitalWrite(TX, 1); w_bus_init=4; }
if ( timerInitflag && (millis() - timerInit>3024) && w_bus_init==4) {K_LINE.begin (10400); timerInitflag = 0; w_bus_init=9;  sendMessage (START_SESSION, sizeof(START_SESSION));}

if (K_LINE.available()){
    

 // первый старт байт
 if (header == 0 && Delay){TIMER_DELAY ; buf[0]=K_LINE.read();  
         if (!bitRead (buf[0],6) && bitRead (buf[0],7)){header = 1; RESETheader_timer=1; prevRESETheader = curmillis; }
         
         }                  

 // второй старт байт
 if (header == 1 && Delay){TIMER_DELAY ; buf[1]=K_LINE.read(); if (buf[1]==0xF1){ header = 2;} else {header = 0; RESETheader_timer=0;}} 

 // третий старт байт
 if (header == 2 && Delay){ 
  TIMER_DELAY ;
  buf[2]=K_LINE.read(); 
  if (buf[2]==0x51){ message_size = buf[0]; 
  if (buf[0] !=0x80) {header = 4;  message_size&=~0x80; j=3; n=3;}
  else {header = 3; j=4;n=4;}
  if (message_size > bufsize) message_size = bufsize;  checksum = 0;} else {header = 0; RESETheader_timer=0; }
  
                          }  
// если размер сообщения указан в дополнительном байте (нулевой байт 0x80) читаем этот дополнительный байт:
if (header == 3 && Delay){
  TIMER_DELAY ;
  buf[3]=K_LINE.read(); 
  message_size = buf[3]; 
  if (message_size > bufsize) message_size = bufsize;  
  checksum = 0; header = 4;  
                         }

  // пишем тело сообщения 
 if (header == 4 && Delay && j< message_size+n+1) {
 buf[j] = K_LINE.read(); 
 if (j<message_size+n) checksum+= buf[j]; // подсчёт КС
 
 if (j==message_size+n) header = 5; 
 TIMER_DELAY ; j++;} 

 } // end of K_LINE.available()

 // сообщение приняли, действуем
 if (header == 5) {TIMER_DELAY ;  

for(byte i = 0; i<n; i++) checksum+=buf[i]; // прибавляем к контрольной сумме старт байты

//for (byte i=0; i<message_size+n+1; i++) {Serial.print (buf[i], HEX); Serial.print(" ");}

 // если контрольная сумма верна: 
if (buf[message_size+n] == checksum) {
  
//  if (buf[n]== 0xC1) Serial.println ("StartSession OK!!!");
  
  
  
  
  }   

// если контрольная сумма не совпала: 
//else Serial.println("CRC fail!!!" );
message_size = 0; header=0; RESETheader_timer=0; j=3; checksum = 0;
}

} // end TTC_E

// таймер ожидания байт (для успевания появления данных в буфере UART)
if (!Delay && curmillis - timerdelay > waitbyte_RX) Delay = 1; 

// таймер сброса заголовка если данные оборвались во время приёма заголовка
if (RESETheader_timer && curmillis - prevRESETheader > 500) {RESETheader_timer = 0; header = 0;}   

if (curmillis - last_Flame>20000 && ProtocolSTATUS==STATUSBUS) {startWebasto_OK=0; last_Flame = curmillis;}  // делаем статус "нет пламени" через 20 сек, если не получаем сообщения от котла

if (Initreset && curmillis - prevInitreset>17000) {Initreset = 0; w_bus_init = 0;}  // сброс инита, если прошло более 17 сек после отправки последнего сообщения


if (needAction>0 && needAction < NEED_DTCCLEAR && w_bus_init==10) {if (Heater == EVO) sendMessage (HEATER_STATUS_EVO,  sizeof(HEATER_STATUS_EVO));
                                     if (Heater == VEVO)sendMessage (HEATER_STATUS_VEVO, sizeof(HEATER_STATUS_VEVO));
                                     w_bus_init=11;}
if ((NeedTimer && curmillis - prevNeedTimer>11000) || w_bus_init == 13)  {NeedTimer = 0; 
             if (curmillis - prevNeedTimer>11000) noData = 1; 
             if (needAction == NEED_SMSZAPROS)     SMSzapros();
        else if (needAction == NEED_SERVICEINFO) ServiceINFO();
        else if (needAction == NEED_DTCCLEAR) {startSMS(KTOzapros); SIM800.println (F("DTC not cleared. Heater no answer!")); EndSMS();}
        w_bus_init = 9; noData = 0; needAction = 0; 
        } 
        
 if (needAction==NEED_DTCCLEAR && w_bus_init==10) { sendMessage (HEATER_DTC_ERASE, sizeof(HEATER_DTC_ERASE)); w_bus_init = 20;  }

}


void Reset_gsm (){
  if (millis()-prevReset>(unsigned long)intervalReset*60000UL){
  
  digitalWrite (DTR, LOW); delay (150);
  SIM800.println (F("AT")); 
  timerenabledWaitOK = 1; timerWaitOK = millis();
  gsmOK = false;
  prevReset = millis(); }

 if (timerenabledWaitOK && millis()-timerWaitOK>6000) {
    timerenabledWaitOK = 0;
    if (!gsmOK) {
      SIM800.println (F("AT")); timerenabledWaitOK = 1; timerWaitOK = millis();
      NoAnswersGSM++; if (NoAnswersGSM>4) NoAnswersGSM = 4; 
      
      }
}

  
 if (!gsmOK)  { 
  if (SIM800.available()>0){                                   
    char currSymb = SIM800.read(); 

  

    if ('\r' == currSymb) {                                      
                                  
       if (!currStr.compareTo("OK")) {   gsmOK = true;  timerenabledWaitOK = 0; NoAnswersGSM=0; digitalWrite (DTR, HIGH);}
       currStr = "";                                           
    }
    
    else if ('\n' != currSymb && currSymb!=0x13 && currSymb!=0x11) {currStr += String(currSymb);}}}
    
    
    if (NoAnswersGSM>=4) Reset();
    
    }



 
 void Reset(){
     
      if (!resettimer) {digitalWrite (ResetGSM, RelayON); resettimer = 1; resetTimer = millis();} 
else if (millis()- resetTimer>6000 ) {
resettimer = 0; 
NoAnswersGSM=0; 
ResetNumber++; 
EEPROM.write (ResetNumber_cell, ResetNumber);
digitalWrite (ResetGSM, !RelayON); 
delay (3500); NastroykaGSM ();}
             }




void sendMessage(const byte *command, const size_t size){

 Initreset = 1;  prevInitreset = curmillis;  // включение таймера сброса инита
 
 if (Heater == TTC_E){
  const byte siZe = size+4;
  byte Mes[siZe];
  byte Checksum = 0;
  for(byte i=0; i<siZe; i++) {
    if (i==0) {Mes[i]=size; bitWrite(Mes[i], 7 , 1);}
    if (i==1) Mes[i] = 0x51;
    if (i==2) Mes[i] = 0xF1;    
    if (i==3) {for (byte t=0; t<size; t++ ) {Mes[i]=command[t]; Checksum+=Mes[i] ;K_LINE.write (Mes[i]);  i++;}}
    if (i!=siZe-1) Checksum+=Mes[i];
    else Mes[i] = Checksum;    
    K_LINE.write (Mes[i]); 
      }
  
 }
 else if (Heater == EVO || Heater == VEVO){
  const byte siZe = size+3;
  byte Mes[siZe];
  byte Checksum = 0;
  for(byte i=0; i<siZe; i++) {
    if (i==0) Mes[i] = 0xF4;
    if (i==1) Mes[i]=size+1; 
    if (i==2) {for (byte t=0; t<size; t++ ) {Mes[i]=command[t]; Checksum^=Mes[i] ;K_LINE.write (Mes[i]); i++;}}
    if (i!=siZe-1) Checksum^=Mes[i];
    else Mes[i] = Checksum;    
    K_LINE.write (Mes[i]); 
      }
  
  }
  }

 

YuriL
Offline
Зарегистрирован: 21.01.2019

MaksVV пишет:

запаял быстренько все деталюхи на заводскую плату. Косяков пока не обнаружил. всё работает. Паять приятно такую плату, ну и само собой быстрее.  

А какой предохранитель ставил? Можно маркировку, размер?

Детальки едут, остальное надо докупать)

 

Dushman7776
Offline
Зарегистрирован: 13.01.2019

Сделал задержку 4 секунды вместо 3.5 , и глюк прошел вроде, глюк себя проявлял при снятии аккума или после подключения питания после прошивки, как будто синхронизация модема с друиной не происходила или может dc-dc медленно раскачивается.