0@0
LibraryRoot
LibraryGroup-Базовые элементы
LibraryGroup-Переключатель
0@0
409
0@-3440
145
250
0@-105
Groupinput
GroupglobalVariable
2
UserBlockLibraryRootNode
LibraryGroup-PID
0@0
7
200@70
220@70 corner: 342.0d@90
200@70 corner: 362.0d@90
224@85.0d
60@10
80@10 corner: 161.0d@150
60@10 corner: 181.0d@150
85.0d@24.5d
control
33.0d
161.0d@40
181.0d@40
RT.Диспетчер
uart
c6dc98fc-9703-43cc-8c4a-2487a1d84a78
df33d449-e44d-4240-ad80-08ba9b33fda3
c7300995-ce24-481b-9c8c-5536c400fd4e
168bedd0-e985-41ce-aa37-b180bcdbcf4f
quick
9422d83d-8171-44e2-bff3-b55c42d94719
8a884944-e63a-40bc-a567-3777f259315c
fast
dd571a9c-c671-4753-83c1-a872487de4fe
627d2840-166b-4fd4-b2fa-d0cc67864d16
slow
0fe2fcd6-bff9-4527-8594-c7dada842a34
fd05407b-d461-4768-9f4f-e54d0e0f9787
back
089ca824-182a-47a9-b732-2fb613fea029
27b2c581-9a95-41b7-b5b1-f4fe49ca3104
frdm
cd8f08f8-92ef-4c5c-b182-93380642f799
4fd2d748-be54-4c9b-ad44-61c59fa06a68
71e4be07-8ef9-4c4c-9e19-f3ee7c695727
RT.Диспетчер
head
68fd8407-4102-4a11-b295-2ccc29d06708
ffbbae92-335a-4455-bde2-cae2cbd10788
813be28b-8d1c-443f-8c39-892d8f48824a
4
200@50
220@50 corner: 364.0d@70
200@50 corner: 384.0d@70
224@65.0d
200@60
364.0d@60
384.0d@60
1
10.0d
136.0d
Номер оперативной задачи
3
c4e0251e-b2d9-402f-9eb0-78f6e76946a7
220@60
181.0d@60 corner: 181.0d@60
26.0d
161.0d@60
181.0d@60
181.0d@80
5
200@90
220@90 corner: 355.0d@110
200@90 corner: 375.0d@110
224@105.0d
200@100
355.0d@100
375.0d@100
10.0d
127.0d
Номер медленной задачи
7b45fe5e-0fca-4555-b283-74f280d2fe8b
220@100
181.0d@100 corner: 181.0d@100
23.0d
161.0d@100
181.0d@100
6
200@110
220@110 corner: 344.0d@130
200@110 corner: 364.0d@130
224@125.0d
200@120
344.0d@120
364.0d@120
10.0d
116.0d
Номер фоновой задачи
220@120
181.0d@120 corner: 181.0d@120
23.0d
161.0d@120
181.0d@120
200@130
220@130 corner: 353.0d@150
200@130 corner: 373.0d@150
224@145.0d
200@140
353.0d@140
373.0d@140
10.0d
125.0d
Номер свободной задачи
1dd7993b-b62d-4f64-9f58-d803f38445c1
220@140
181.0d@140 corner: 181.0d@140
23.0d
161.0d@140
181.0d@140
RT.Диспетчер
7b1ffb11-7fd4-4f52-a5a3-ec1513229dcd
1.RT.Диспетчер: Планирование вызова задач
Блок диспетчера задач.
1. Запускает планировщик событий и задач (диспетчер).
1.1.Блок имеет выходы номеров задач, номера задач сменяются с заданной периодичностью:
quick – номера оперативных задач (по умолчанию 5 задач, период смены задачи 10 мс);
fast – номера быстрых задач (по умолчанию 4 задач, период смены задачи 25 мс);
slow – номера медленных задач (по умолчанию 4 задачи, период смены задачи 250 мс);
back – номера фоновых задач (по умолчанию 5 задач, период смены задачи 100 мс);
frdm - номера свободных задач (без периода) (по умолчанию 25 задач) номера последовательно изменяются
в циклах, когда номера предыдущих задач равны 0);
1.2.Кол-во задач могут быть изменены внешним блоком, который должен запускаться 1 раз перед первым вызовом диспетчера:
RT_HW_Base.shed.quick.qnt, RT_HW_Base.shed.fast.qnt, RT_HW_Base.shed.slow.qnt, RT_HW_Base.shed.back.qntж
1.3.Номера задач изменяются циклически. Например для quick ->1,2,3,4,5,1,2,3,4,5 и т.д.)
1.4.В каждом цикле только одна задача может быть отлична от нуля.
1.5.При одновременной готовности к вызову нескольких типов (quick, fast и т.д.) задач, они вызываетсяпо приоритету quick,fast,slow,back,frdm.
1.6.Номера задач quick,fast,slow,back устанавливаются на один цикл, затем они сбрасывается в 0 до установки по времени
следующего номера задач.
2.Блок запускает инициализацию консоли, на которую могут выдаваться отладочные сообщения.
3.В каждом цикле на выходе control изменяется значение (0/1). Это выход предусмотрен для наблюдения логическим анализатором.
1554
//-----Управление задачами-------------------------------------------------------------
RT_HW_Base.sheduler(); //--Вызов диспетчера задач;
control=bitRead(RT_HW_Base.shed.blink,0);
quick=RT_HW_Base.shed.quick.num;
fast =RT_HW_Base.shed.fast.num;
slow =RT_HW_Base.shed.slow.num;
back=RT_HW_Base.shed.back.num;
frdm= RT_HW_Base.shed.frdm.num;
//--------------------------------------------------------------------------------------------------------
460
#include
"RT_HW_BASE.h"
81.0d
19.0d
161.0d@80
181.0d@80 corner: 181.0d@80
200@80
220@80
342.0d@80
362.0d@80
10.0d
114.0d
Номер быстрой задачи
500@60
500@60 corner: 780.0d@136.0d
left
Оперативная задача: период= 10ms; кол-во задач=5;
Быстрая задача: период= 50ms; кол-во задач=4;
Медленная задача: период=250ms; кол-во задач=4;
Фоновая задача: период=100ms; кол-во задач=5;
Свободная задача: период=loop(); кол-во задач=25;
Оперативная задача: период= 10ms; кол-во задач=5;
269.0d
3@12.0d
9.0d
Быстрая задача: период= 50ms; кол-во задач=4;
267.0d
3@26.0d
9.0d
Медленная задача: период=250ms; кол-во задач=4;
269.0d
3@40.0d
9.0d
Фоновая задача: период=100ms; кол-во задач=5;
269.0d
3@54.0d
9.0d
Свободная задача: период=loop(); кол-во задач=25;
274.0d
3@68.0d
9.0d
231.0d
Формирование параметров из меню
==
830@290
850@290 corner: 930@450
830@290 corner: 950@450
876.0d@303.5d
En
830@320
844@320
830@310 corner: 844@330
34
710@290
730@290 corner: 770@350
710@290 corner: 790@350
741.5d@303.5d
0@280
20@280 corner: 80.0d@300
0@280 corner: 100.0d@300
24@294.5d
86.0d@280 corner: 100.0d@300
100.0d@290
9.0d
52.0d
Fiz_1_Key
c234f455-0053-440e-ace2-6c86d92b7475
13
0
miso
12
SPI
D6
digital
0.0d
86.0d@290
440@670
460@670 corner: 520@710
440@670 corner: 540@710
478.5d@683.5d
440@700
14
550@670
570@670 corner: 610@730
550@670 corner: 630@730
582.0d@683.5d
550@690 corner: 570@710
R
550@720
564@720
550@710 corner: 564@730
15
670@650
690@650 corner: 730@690
670@650 corner: 750@690
696.5d@664.5d
670@670 corner: 690@690
18
860@680
880@680 corner: 920@720
860@680 corner: 940@720
892.5d@693.5d
860@710
23
990@640
1010@640 corner: 1070@720
990@640 corner: 1090@720
1024.0d@653.5d
0
990@670
1010@670
966.0d@673.5d
990@660 corner: 1010@680
1
990@690
1010@690
970.0d@693.5d
990@680 corner: 1010@700
990@700 corner: 1010@720
1160@700
1180@700 corner: 1228.0d@720
1160@700 corner: 1248.0d@720
1190@713.5d
1160@710
7.0d
28.0d
Menu
440@610
460@610 corner: 513.0d@710
440@610 corner: 533.0d@710
465.0d@623.5d
3 строка
26@-24.473684329405d
45.0d
3@12.0d
9.0d
466@585.52631567059d corner: 517.0d@605.52631567059d
lcd.Float
Lcd.blink
code
57b8bf84-311c-4ac8-a587-cc7fdec0f275
6b1518e6-bd9e-47f3-b8f9-3be9310fb7b9
ba0bdb57-b657-44b0-82d0-b1955a0fcf0b
2.Lcd.blink
if(!id.custom) {RT_HW_Lcd_hd44780.setID_direct(id, code , 1,1, 10);};
RT_HW_Lcd_hd44780.printFlicker(id, '*',' ');
116
#include
"RT_HW_LCD_HD44780.h"
id
;
RT_HW_LCD_HD44780_DIRECT
lcd
EN
1ce04d93-22ea-47d2-89a2-555d16f077e5
f5164d6c-d525-4577-b54f-6c91e36b313a
blink
d5bf41d5-b485-4808-8ec3-8c53a7a653de
c331f923-1947-4758-bbc6-9b26b5fe1340
Lcd.txt
num
51133d12-c35a-4d71-a3e5-e1642c411f84
79c65bd2-f870-43ec-a3d7-e748ce0728c1
7d28d418-7439-4c6f-acf4-7b1fd5a9ba34
6.Lcd.txt:Вывод текста
НОМЕР КОЛОНКИ
2097887e-8128-42ff-ade0-7f38ab92793c
ed92af3d-3319-4624-992b-918934ff6bc5
НОМЕР СТРОКИ
22ddc91f-b97a-4252-aefe-b6fb3f377668
3af5262b-864b-448a-8b4d-fae6ccc07f18
ПЕРИОД В ТИКАХ (50мс)
10
7ade0029-3ba9-46a7-933a-938809a86f79
4e10b5e8-1f74-4fad-8a15-f555b0216449
ДЛИНА ПОЛЯ
53892936-94cf-4040-ae32-cea853797b18
8eb4eb42-ea8b-4771-bc0b-fb838e6f38b7
ФОРМАТ ВЫРАВНИВАНИЯ ПОЛЯ
d81326c3-dddc-4c2e-a456-f27919c10884
L
C
b6c0accb-58ce-496d-988d-6138ad7052bc
ТЕКСТ 1
FLProg
6a9c5c00-fd4e-4745-9231-c62c50fc952e
A1=
c36defd9-eff0-4a78-87d7-bfb25f338e26
ТЕКСТ 2
KaScada
2188d0c0-e18b-45e0-81c3-ee4e70063a0d
f64cd377-9e4a-4029-b8e0-72effe07a4af
ТЕКСТ 3
EIS
d6139517-53ef-4353-846f-690a9cdb19fa
dc954097-5eae-417e-9bdd-5eb561f74f03
TEKCT 4
ESP32
6f446c38-0d4c-465d-b55f-0a18b9899cf3
fd2bca23-3d0b-454d-bdce-72834f82beb3
ТЕКСТ 5
STM32
f2b6f62c-4272-4196-bf77-4695fe0d048d
aee4cec2-88fe-490f-b7d6-e06251cc9747
//---Вывод переменной int-----------------------------------------------------------
if(!id.custom) { RT_HW_Lcd_hd44780.setID_direct(id, lcd , НОМЕР КОЛОНКИ , НОМЕР СТРОКИ , ПЕРИОД В ТИКАХ (50мс) );} id.modeBlink=0;
if(ago!=num) {ago=num; if (ago!=0) id.run;
switch(ago){default :break;
case 1: text= ТЕКСТ 1 ; break;
case 2: text= ТЕКСТ 2 ; break;
case 3: text= ТЕКСТ 3 ; break;
case 4: text= ТЕКСТ 4 ; break;
case 5: text= ТЕКСТ 5 ; break;
}
}
RT_HW_Lcd_hd44780.printString(id, ago, val, ДЛИНА ПОЛЯ , ФОРМАТ ВЫРАВНИВАНИЯ ПОЛЯ , '@', text );
//--------------------------------------------------------------------------------------------------
660
#include
"RT_HW_LCD_HD44780.h"
id
;
RT_HW_LCD_HD44780_DIRECT
text
;
String
ago
;
int8_t
val
f5a98435-2010-4d72-827a-ff98506c4301
5.lcd.Float:вывод переменной
НОМЕР_КОЛОНКИ
НОМЕР_СТРОКИ
ДЛИНА_ПОЛЯ
ЗАГОЛОВОК
v=
H=
СУФФИКС
Если '~', то суффикс не выводится
3354e4eb-00a6-46e3-a737-ca6f81a182fc
%
~
dc8a87a0-8178-4815-9fa9-e807760f2583
ВЫРАВНИВАНИЕ
N,L,C,R
L
L
КОЛ_ВО_ЗНАКОВ_ПОСЛЕ_ЗАПЯТОЙ
0,1,2,3
531b0b9e-6d14-4323-afc0-df337416f517
1
2
1d8d66bd-7659-48c0-bca0-bec3305abd70
ПЕРИОД_В_ТИКАХ
//--Вывод в lcd переменной float----------------------------------------------------
if(!id.custom) { RT_HW_Lcd_hd44780.setIdVal(id, lcd , НОМЕР_КОЛОНКИ , НОМЕР_СТРОКИ , ДЛИНА_ПОЛЯ , ПЕРИОД_В_ТИКАХ ); }
if(id.dir==1) {RT_HW_Lcd_hd44780.device.ibuff32 =RT_HW_Lcd_hd44780.floatToInt32( val ,RT_HW_Lcd_hd44780.getPointFromChar( КОЛ_ВО_ЗНАКОВ_ПОСЛЕ_ЗАПЯТОЙ ) );
if (buff != RT_HW_Lcd_hd44780.device.ibuff32) {buff = RT_HW_Lcd_hd44780.device.ibuff32; id.event.fresh = 1;}}
RT_HW_Lcd_hd44780.printIdVal(id,EN,blink, ВЫРАВНИВАНИЕ ,КОЛ_ВО_ЗНАКОВ_ПОСЛЕ_ЗАПЯТОЙ,buff, СУФФИКС ,text_PGM);
599
id.custom=0;
#include
"RT_HW_LCD_HD44780.h"
id
;
RT_HW_LCD_HD44780_PARAM_VAL_ID
text_PGM
[] PROGMEM = ЗАГОЛОВОК;
const char
buff
;
int32_t
point
;
uint8_t
~
L
1
50@0
70@0 corner: 118.0d@40
50@0 corner: 138.0d@40
77.5d@13.5d
addr
39
50@30
70@30
36.0d@33.5d
lcd.direct
adr
b4afbec1-1803-4d65-863b-50dc2f7dbbd2
3dff5b22-132f-4ba1-a411-938c3d3e0e7b
cols
858693d7-0001-42d6-a565-e3ad18f9ddfb
20532aa5-a093-40db-bf6a-9247519a8c87
rows
dc056cbc-a65c-42ad-9e6e-da9f3f578658
f2132599-5eaa-45ee-baa0-2c8dd66e4bf5
code
d5e3dabf-0ef0-4d2f-8fbc-d9b9b9d6c1ee
c4a3c368-fae1-4a00-ab32-aced3633fb6e
blink500
08c79160-0239-4d2a-b7ed-0a10002ec8df
7ea771a1-d442-4c75-b7b3-285a6433d0ef
da9d5f0b-d337-4fe0-a64a-dfed3d62feff
1.lcd.direct:Управление дисплеем
//--Управление LCD HD44780------------------------------------------------------------
if(!z.ok.custom) {RT_HW_Lcd_hd44780.setID_i2c(z, adr , cols , rows );}
//z.cmndReboot=z.
RT_HW_Lcd_hd44780.direct(z);
code=z.num; blink500=z.blink500;
241
#include
"RT_HW_LCD_HD44780.h"
z
;
RT_HW_LCD_HD44780_DEVICE
50@20 corner: 70@40
118.0d@20 corner: 138.0d@40
138.0d@30
lcd.i2c
lcd
d8d70436-9a85-48e1-b2ea-40449a7c2edf
1.lcd.i2c:Управление через i2c
КОЛ_ВО_КОЛОНОК
16
62eb48e3-675b-4121-9c08-f0a6022ddbc4
20
41472ede-68c3-40f5-9123-afe46e8ff0cc
КОЛ_ВО_СТРОК
57f3c11c-0dde-4bb1-aba2-090f0a3b50d6
f201b6ad-83e1-4bff-9e8f-c0c9c53ee2a5
ПЕРИОД_ПЕРЕЗАГРУЗКИ_В_ТИКАХ
120
1 тик=50мс; если =0, то перезагрузка отключена;
42dce9da-48c4-40b0-ab18-f2f608d97b2e
711fa1c6-938b-4183-991b-944ce7d91eff
//--Управление LCD HD44780 через i2c----------------------------------------------
if(lcd==15){lcd=RT_HW_Lcd_hd44780.setDevice(lcd,'I', addr , КОЛ_ВО_КОЛОНОК , КОЛ_ВО_СТРОК , ПЕРИОД_ПЕРЕЗАГРУЗКИ_В_ТИКАХ );} RT_HW_Lcd_hd44780.directDevice(lcd);
//------------------------------------------------------------------------------------------------------
350
lcd=15;
#include
"RT_HW_LCD_HD44780.h"
48.0d
15.0d
118.0d@30
200@0
220@0 corner: 271.0d@40
200@0 corner: 291.0d@40
225.0d@13.5d
200@20 corner: 220@40
200@30
lcd.blink
Lcd.blink
code
57b8bf84-311c-4ac8-a587-cc7fdec0f275
6b1518e6-bd9e-47f3-b8f9-3be9310fb7b9
ba0bdb57-b657-44b0-82d0-b1955a0fcf0b
2.Lcd.blink
if(!id.custom) {RT_HW_Lcd_hd44780.setID_direct(id, code , 1,1, 10);};
RT_HW_Lcd_hd44780.printFlicker(id, '*',' ');
#include
"RT_HW_LCD_HD44780.h"
id
;
RT_HW_LCD_HD44780_DIRECT
lcd
0208d30e-e072-45eb-aeaf-4784163f47c3
1.lcd.blink:вывод blink
НОМЕР_КОЛОНКИ
2097887e-8128-42ff-ade0-7f38ab92793c
ed92af3d-3319-4624-992b-918934ff6bc5
НОМЕР_СТРОКИ
22ddc91f-b97a-4252-aefe-b6fb3f377668
3af5262b-864b-448a-8b4d-fae6ccc07f18
ПЕРИОД_В_ТИКАХ
7ade0029-3ba9-46a7-933a-938809a86f79
4e10b5e8-1f74-4fad-8a15-f555b0216449
СИМВОЛ_0
4e34d413-5969-474b-aeb3-d5f6c41ef6c8
e47a54f1-c7b8-480b-80ed-909f7e65626f
СИМВОЛ_1
c2843ae9-5fb2-4133-8682-20ed3d8161d7
*
*
a1809005-fedf-4911-875e-1ec853434672
//--Мерцание в позиции -------------------------------------------------------------------------
if(!id.custom) {RT_HW_Lcd_hd44780.setIdChar(id, lcd , НОМЕР_КОЛОНКИ , НОМЕР_СТРОКИ ,'F', ПЕРИОД_В_ТИКАХ);} RT_HW_Lcd_hd44780.printIdChar(id,1,0, СИМВОЛ_0 , СИМВОЛ_1 );
270
id.custom=0;
#include
"RT_HW_LCD_HD44780.h"
id
;
RT_HW_LCD_HD44780_PARAM_CHAR_ID
51.0d
220@30
790@130
810@130 corner: 852.0d@230
790@130 corner: 872.0d@230
815.0d@143.5d
790@160
EN
790@180
810@180
lcd.Str
Lcd.blink
code
57b8bf84-311c-4ac8-a587-cc7fdec0f275
6b1518e6-bd9e-47f3-b8f9-3be9310fb7b9
ba0bdb57-b657-44b0-82d0-b1955a0fcf0b
2.Lcd.blink
if(!id.custom) {RT_HW_Lcd_hd44780.setID_direct(id, code , 1,1, 10);};
RT_HW_Lcd_hd44780.printFlicker(id, '*',' ');
#include
"RT_HW_LCD_HD44780.h"
id
;
RT_HW_LCD_HD44780_DIRECT
lcd
b1cef113-794d-4ef6-afab-2aa12e4faa0b
18d8b4a3-7fd7-4f0e-9b3d-8e915753351e
blink
ed5589ac-4359-4aec-9c3b-823b0ff7b309
d7afd5b1-9c9c-419f-801b-c93762bb6bc2
Lcd.txt
num
51133d12-c35a-4d71-a3e5-e1642c411f84
79c65bd2-f870-43ec-a3d7-e748ce0728c1
7d28d418-7439-4c6f-acf4-7b1fd5a9ba34
6.Lcd.txt:Вывод текста
НОМЕР КОЛОНКИ
2097887e-8128-42ff-ade0-7f38ab92793c
ed92af3d-3319-4624-992b-918934ff6bc5
НОМЕР СТРОКИ
22ddc91f-b97a-4252-aefe-b6fb3f377668
3af5262b-864b-448a-8b4d-fae6ccc07f18
ПЕРИОД В ТИКАХ (50мс)
7ade0029-3ba9-46a7-933a-938809a86f79
4e10b5e8-1f74-4fad-8a15-f555b0216449
ДЛИНА ПОЛЯ
53892936-94cf-4040-ae32-cea853797b18
8eb4eb42-ea8b-4771-bc0b-fb838e6f38b7
ФОРМАТ ВЫРАВНИВАНИЯ ПОЛЯ
d81326c3-dddc-4c2e-a456-f27919c10884
L
C
b6c0accb-58ce-496d-988d-6138ad7052bc
ТЕКСТ 1
FLProg
6a9c5c00-fd4e-4745-9231-c62c50fc952e
A1=
c36defd9-eff0-4a78-87d7-bfb25f338e26
ТЕКСТ 2
KaScada
2188d0c0-e18b-45e0-81c3-ee4e70063a0d
f64cd377-9e4a-4029-b8e0-72effe07a4af
ТЕКСТ 3
EIS
d6139517-53ef-4353-846f-690a9cdb19fa
dc954097-5eae-417e-9bdd-5eb561f74f03
TEKCT 4
ESP32
6f446c38-0d4c-465d-b55f-0a18b9899cf3
fd2bca23-3d0b-454d-bdce-72834f82beb3
ТЕКСТ 5
STM32
f2b6f62c-4272-4196-bf77-4695fe0d048d
aee4cec2-88fe-490f-b7d6-e06251cc9747
//---Вывод переменной int-----------------------------------------------------------
if(!id.custom) { RT_HW_Lcd_hd44780.setID_direct(id, lcd , НОМЕР КОЛОНКИ , НОМЕР СТРОКИ , ПЕРИОД В ТИКАХ (50мс) );} id.modeBlink=0;
if(ago!=num) {ago=num; if (ago!=0) id.run;
switch(ago){default :break;
case 1: text= ТЕКСТ 1 ; break;
case 2: text= ТЕКСТ 2 ; break;
case 3: text= ТЕКСТ 3 ; break;
case 4: text= ТЕКСТ 4 ; break;
case 5: text= ТЕКСТ 5 ; break;
}
}
RT_HW_Lcd_hd44780.printString(id, ago, val, ДЛИНА ПОЛЯ , ФОРМАТ ВЫРАВНИВАНИЯ ПОЛЯ , '@', text );
//--------------------------------------------------------------------------------------------------
#include
"RT_HW_LCD_HD44780.h"
id
;
RT_HW_LCD_HD44780_DIRECT
text
;
String
ago
;
int8_t
val
e0f585d0-09e3-4e54-8769-b4cec086b812
6.lcd.Str:вывод строковой переменной
НОМЕР_КОЛОНКИ
НОМЕР_СТРОКИ
ПЕРИОД_В_ТИКАХ
ДЛИНА_ПОЛЯ
ВЫРАВНИВАНИЕ
C
//--Вывод строковой переменной --------------------------------------------------------------------
if(!id.custom) {RT_HW_Lcd_hd44780.setIdText(id, lcd , НОМЕР_КОЛОНКИ , НОМЕР_СТРОКИ , ДЛИНА_ПОЛЯ , ПЕРИОД_В_ТИКАХ ); }
if (id.dir == 1) {if(ago!=val) {ago=val; id.event.fresh = 1;}}
RT_HW_Lcd_hd44780.printTextSTR(id, EN, blink, ВЫРАВНИВАНИЕ , ago);
351
id.custom=0;
#include
"RT_HW_LCD_HD44780.h"
id
;
RT_HW_LCD_HD44780_PARAM_TEXT_ID
ago
;
String
630@170
650@170 corner: 710@210
630@170 corner: 730@210
666.0d@183.5d
EN
630@200
650@200
630@190 corner: 650@210
710@190 corner: 730@210
730@200
asimetricMulti
1000
500
Q
9.0d
710@200
730@200 corner: 730@200
790@200
810@200
440@150
460@150 corner: 520@230
440@150 corner: 540@230
474.0d@163.5d
440@180
460@180
440@170 corner: 460@190
1350@430
1370@430 corner: 1453.0d@450
1350@430 corner: 1473.0d@450
1380@443.5d
1140@370
1160@370 corner: 1220@450
1140@370 corner: 1240@450
1174.0d@383.5d
0
<<***>>
1140@400
1160@400
1103.0d@403.0d
ValStr
32.0d
930@420
950@420
950@420 corner: 950@420
1
1140@420
1160@420
AG
17.0d
930@440
950@440
950@440 corner: 950@440
S
1140@440
1154@440
1240@440
Q
9.0d
1220@440
1240@440 corner: 1240@440
1350@440
1370@440
7.0d
63.0d
Меню.ValStr
440@200
460@200
440@190 corner: 460@210
S
440@220
460@220
440@210 corner: 460@230
520@210 corner: 540@230
540@220
9.0d
520@220
540@220 corner: 540@220
790@220
810@220
C
42.0d
810@160
680@20
700@20 corner: 742.0d@120
680@20 corner: 762.0d@120
705.0d@33.5d
680@50
680@70
700@70
680@90
700@90
550@40
570@40 corner: 630@120
550@40 corner: 650@120
584.0d@53.5d
550@70
570@70
970@390
990@390 corner: 1071.0d@410
970@390 corner: 1091.0d@410
1000@403.5d
Name
29.0d
930@400
950@400
950@400 corner: 950@400
970@400
990@400
970@390 corner: 990@410
7.0d
61.0d
Меню.Name
550@90
570@90
550@110
570@110
650@110
9.0d
630@110
650@110 corner: 650@110
680@110
700@110
C
700@50
8
260@630
280@630 corner: 330.00000050193d@710
260@630 corner: 350.00000050193d@710
284.00000025097d@643.5d
3 строка
25@-24.473684329405d
45.0d
3@12.0d
9.0d
285@605.52631567059d corner: 336.0d@625.52631567059d
lcd.Txt*1
Lcd.blink
code
57b8bf84-311c-4ac8-a587-cc7fdec0f275
6b1518e6-bd9e-47f3-b8f9-3be9310fb7b9
ba0bdb57-b657-44b0-82d0-b1955a0fcf0b
2.Lcd.blink
if(!id.custom) {RT_HW_Lcd_hd44780.setID_direct(id, code , 1,1, 10);};
RT_HW_Lcd_hd44780.printFlicker(id, '*',' ');
#include
"RT_HW_LCD_HD44780.h"
id
;
RT_HW_LCD_HD44780_DIRECT
lcd
EN
c28d4071-556d-4511-8586-5c21d5738182
111f8b53-5aeb-4ed5-a868-15b3ad6262dc
blink
e7061d2d-c8b7-4d3b-b474-6f8b1eeddd04
6e022e27-8738-4bf2-9309-9bea2ede1d0b
03425715-b0aa-4196-9d6a-3c42bbfc41b3
8.lcd.Txt*1:Вывод одной строки
НОМЕР_КОЛОНКИ
2097887e-8128-42ff-ade0-7f38ab92793c
ed92af3d-3319-4624-992b-918934ff6bc5
НОМЕР_СТРОКИ
22ddc91f-b97a-4252-aefe-b6fb3f377668
3af5262b-864b-448a-8b4d-fae6ccc07f18
ДЛИНА_ПОЛЯ
53892936-94cf-4040-ae32-cea853797b18
8eb4eb42-ea8b-4771-bc0b-fb838e6f38b7
ВЫРАВНИВАНИЕ
d81326c3-dddc-4c2e-a456-f27919c10884
L
C
b6c0accb-58ce-496d-988d-6138ad7052bc
TEKCT_0
~
afc2fa4d-6c89-417c-b84c-c1f697e75510
dht:
74f7ac3c-8b5e-4a24-b0ba-90aeb5de80e4
ПЕРИОД_В_ТИКАХ
7ade0029-3ba9-46a7-933a-938809a86f79
4e10b5e8-1f74-4fad-8a15-f555b0216449
//----Однократный вывод текста----------------------------------------------------
if (!id.custom) {RT_HW_Lcd_hd44780.setIdText(id,lcd, НОМЕР_КОЛОНКИ , НОМЕР_СТРОКИ , ДЛИНА_ПОЛЯ , ПЕРИОД_В_ТИКАХ );}
//if(id.dir==1) {id.event.fresh=1;}
RT_HW_Lcd_hd44780.printTextPGM(id, EN, blink, ВЫРАВНИВАНИЕ , textN);
306
id.custom=0;
#include
"RT_HW_LCD_HD44780.h"
id
;
RT_HW_LCD_HD44780_PARAM_TEXT_ID
text0
[] PROGMEM= TEKCT_0 ;
const char
textN
=text0;
const char*
ago
;
uint8_t
C
tO>
260@680
274@680
260@700
280@700
50.000000501934d
260@660
280@660
230@760
250@760 corner: 291.57894776468d@860
230@760 corner: 311.57894776469d@860
253.78947388234d@773.5d
230@790
EN
230@810
244@810
lcd.Val
Lcd.blink
code
57b8bf84-311c-4ac8-a587-cc7fdec0f275
6b1518e6-bd9e-47f3-b8f9-3be9310fb7b9
ba0bdb57-b657-44b0-82d0-b1955a0fcf0b
2.Lcd.blink
if(!id.custom) {RT_HW_Lcd_hd44780.setID_direct(id, code , 1,1, 10);};
RT_HW_Lcd_hd44780.printFlicker(id, '*',' ');
#include
"RT_HW_LCD_HD44780.h"
id
;
RT_HW_LCD_HD44780_DIRECT
lcd
032db346-dd60-4a07-ba84-26700083cfae
f9550fd8-aaf3-49b4-8d32-62385b02d95d
blink
53a3c1bf-712b-4041-9197-c9a203a9b092
02180623-0037-45a1-a2b7-e02797bb3392
Lcd.txt
num
51133d12-c35a-4d71-a3e5-e1642c411f84
79c65bd2-f870-43ec-a3d7-e748ce0728c1
7d28d418-7439-4c6f-acf4-7b1fd5a9ba34
6.Lcd.txt:Вывод текста
НОМЕР КОЛОНКИ
2097887e-8128-42ff-ade0-7f38ab92793c
ed92af3d-3319-4624-992b-918934ff6bc5
НОМЕР СТРОКИ
22ddc91f-b97a-4252-aefe-b6fb3f377668
3af5262b-864b-448a-8b4d-fae6ccc07f18
ПЕРИОД В ТИКАХ (50мс)
7ade0029-3ba9-46a7-933a-938809a86f79
4e10b5e8-1f74-4fad-8a15-f555b0216449
ДЛИНА ПОЛЯ
53892936-94cf-4040-ae32-cea853797b18
8eb4eb42-ea8b-4771-bc0b-fb838e6f38b7
ФОРМАТ ВЫРАВНИВАНИЯ ПОЛЯ
d81326c3-dddc-4c2e-a456-f27919c10884
L
C
b6c0accb-58ce-496d-988d-6138ad7052bc
ТЕКСТ 1
FLProg
6a9c5c00-fd4e-4745-9231-c62c50fc952e
A1=
c36defd9-eff0-4a78-87d7-bfb25f338e26
ТЕКСТ 2
KaScada
2188d0c0-e18b-45e0-81c3-ee4e70063a0d
f64cd377-9e4a-4029-b8e0-72effe07a4af
ТЕКСТ 3
EIS
d6139517-53ef-4353-846f-690a9cdb19fa
dc954097-5eae-417e-9bdd-5eb561f74f03
TEKCT 4
ESP32
6f446c38-0d4c-465d-b55f-0a18b9899cf3
fd2bca23-3d0b-454d-bdce-72834f82beb3
ТЕКСТ 5
STM32
f2b6f62c-4272-4196-bf77-4695fe0d048d
aee4cec2-88fe-490f-b7d6-e06251cc9747
//---Вывод переменной int-----------------------------------------------------------
if(!id.custom) { RT_HW_Lcd_hd44780.setID_direct(id, lcd , НОМЕР КОЛОНКИ , НОМЕР СТРОКИ , ПЕРИОД В ТИКАХ (50мс) );} id.modeBlink=0;
if(ago!=num) {ago=num; if (ago!=0) id.run;
switch(ago){default :break;
case 1: text= ТЕКСТ 1 ; break;
case 2: text= ТЕКСТ 2 ; break;
case 3: text= ТЕКСТ 3 ; break;
case 4: text= ТЕКСТ 4 ; break;
case 5: text= ТЕКСТ 5 ; break;
}
}
RT_HW_Lcd_hd44780.printString(id, ago, val, ДЛИНА ПОЛЯ , ФОРМАТ ВЫРАВНИВАНИЯ ПОЛЯ , '@', text );
//--------------------------------------------------------------------------------------------------
#include
"RT_HW_LCD_HD44780.h"
id
;
RT_HW_LCD_HD44780_DIRECT
text
;
String
ago
;
int8_t
val
60488ee1-b546-4138-b4b5-9747fff366fd
4.lcd.Val:Вывод переменной полный
НОМЕР_КОЛОНКИ
НОМЕР_СТРОКИ
ДЛИНА_ПОЛЯ
ЗАГОЛОВОК
v=
a=
СУФФИКС
Если '~', то суффикс не выводится
3354e4eb-00a6-46e3-a737-ca6f81a182fc
;
~
dc8a87a0-8178-4815-9fa9-e807760f2583
ВЫРАВНИВАНИЕ
N,L,C,R
L
L
ТИП_ПЕРЕМЕННОЙ
D,0,1,2,3,H,h,B,b,T
630c2144-74f7-404b-bcfb-e09294102ad2
D
D
D,T,H,h,B,b
3c934441-495e-46d6-bbce-3817b8fe392f
ПЕРИОД_В_ТИКАХ
//---Вывод переменной (D,0,1,2,3,H,h,B,b,T)---------------------------------------
if (!id.custom) {RT_HW_Lcd_hd44780.setIdVal(id, lcd , НОМЕР_КОЛОНКИ , НОМЕР_СТРОКИ , ДЛИНА_ПОЛЯ , ПЕРИОД_В_ТИКАХ );}
if ( id.dir == 1) {if (ago !=val) {ago = val; id.event.fresh = 1;}} RT_HW_Lcd_hd44780.printIdVal(id,EN, blink, ВЫРАВНИВАНИЕ , ТИП_ПЕРЕМЕННОЙ ,ago, СУФФИКС ,text_PGM);
372
id.custom=0;
#include
"RT_HW_LCD_HD44780.h"
id
;
RT_HW_LCD_HD44780_PARAM_VAL_ID
ago
;
int16_t
text_PGM
[] PROGMEM = ЗАГОЛОВОК ;
const char
230@830
250@830
820@70
690@50
710@50 corner: 790@130
690@50 corner: 810@130
810@80
820@90
820@100
9.0d
82.0d
Минута Ds18b20
440@760
460@760 corner: 501.57894776468d@860
440@760 corner: 521.57894776468d@860
463.78947388234d@773.5d
440@790
460@790
440@810
454@810
440@830
460@830
440@850
4 строка
20@-24.473684329405d
45.0d
3@12.0d
9.0d
460@735.52631567059d corner: 511.0d@755.52631567059d
~
L
D
41.578947764685d
460@850
810@100 corner: 810@100
Min
790@100
810@100
820@110
820@120
Секунда Ds18b20
11
820@160
840@160 corner: 920@200
820@160 corner: 940@200
820@190
940@180
940@190
Генератор секунда
940@190 corner: 940@190
Q
920@190
940@190
Value
810@120 corner: 810@190
Sec
790@120
810@120
D
D
scl
D1
sda
D2
DS3231
H
790@80
810@80 corner: 810@80
820@80
8.0d
64.0d
Час Ds18b20
230@850
250@850
45.0d
3@12.0d
9.0d
250@735.52631567059d corner: 301.0d@755.52631567059d
~
L
D
250@790
340@760
360@760 corner: 408.94736890978d@840
340@760 corner: 428.94736890978d@840
363.47368445489d@773.5d
340@790
EN
340@810
354@810
lcd.txt
0facf1ca-da5d-4666-b8fd-4a7e2b4a1a29
650f6e20-2c47-438e-932b-e9d38a4a0779
blink
eb841c97-865a-42de-a7f9-164b51bcea51
5e40c259-0826-40cf-b7ee-001251e51e5d
Lcd.blink
code
57b8bf84-311c-4ac8-a587-cc7fdec0f275
6b1518e6-bd9e-47f3-b8f9-3be9310fb7b9
ba0bdb57-b657-44b0-82d0-b1955a0fcf0b
2.Lcd.blink
if(!id.custom) {RT_HW_Lcd_hd44780.setID_direct(id, code , 1,1, 10);};
RT_HW_Lcd_hd44780.printFlicker(id, '*',' ');
#include
"RT_HW_LCD_HD44780.h"
id
;
RT_HW_LCD_HD44780_DIRECT
lcd
Lcd.txt
num
51133d12-c35a-4d71-a3e5-e1642c411f84
79c65bd2-f870-43ec-a3d7-e748ce0728c1
7d28d418-7439-4c6f-acf4-7b1fd5a9ba34
6.Lcd.txt:Вывод текста
НОМЕР КОЛОНКИ
2097887e-8128-42ff-ade0-7f38ab92793c
ed92af3d-3319-4624-992b-918934ff6bc5
НОМЕР СТРОКИ
22ddc91f-b97a-4252-aefe-b6fb3f377668
3af5262b-864b-448a-8b4d-fae6ccc07f18
ПЕРИОД В ТИКАХ (50мс)
7ade0029-3ba9-46a7-933a-938809a86f79
4e10b5e8-1f74-4fad-8a15-f555b0216449
ДЛИНА ПОЛЯ
53892936-94cf-4040-ae32-cea853797b18
8eb4eb42-ea8b-4771-bc0b-fb838e6f38b7
ФОРМАТ ВЫРАВНИВАНИЯ ПОЛЯ
d81326c3-dddc-4c2e-a456-f27919c10884
L
C
b6c0accb-58ce-496d-988d-6138ad7052bc
ТЕКСТ 1
FLProg
6a9c5c00-fd4e-4745-9231-c62c50fc952e
A1=
c36defd9-eff0-4a78-87d7-bfb25f338e26
ТЕКСТ 2
KaScada
2188d0c0-e18b-45e0-81c3-ee4e70063a0d
f64cd377-9e4a-4029-b8e0-72effe07a4af
ТЕКСТ 3
EIS
d6139517-53ef-4353-846f-690a9cdb19fa
dc954097-5eae-417e-9bdd-5eb561f74f03
TEKCT 4
ESP32
6f446c38-0d4c-465d-b55f-0a18b9899cf3
fd2bca23-3d0b-454d-bdce-72834f82beb3
ТЕКСТ 5
STM32
f2b6f62c-4272-4196-bf77-4695fe0d048d
aee4cec2-88fe-490f-b7d6-e06251cc9747
//---Вывод переменной int-----------------------------------------------------------
if(!id.custom) { RT_HW_Lcd_hd44780.setID_direct(id, lcd , НОМЕР КОЛОНКИ , НОМЕР СТРОКИ , ПЕРИОД В ТИКАХ (50мс) );} id.modeBlink=0;
if(ago!=num) {ago=num; if (ago!=0) id.run;
switch(ago){default :break;
case 1: text= ТЕКСТ 1 ; break;
case 2: text= ТЕКСТ 2 ; break;
case 3: text= ТЕКСТ 3 ; break;
case 4: text= ТЕКСТ 4 ; break;
case 5: text= ТЕКСТ 5 ; break;
}
}
RT_HW_Lcd_hd44780.printString(id, ago, val, ДЛИНА ПОЛЯ , ФОРМАТ ВЫРАВНИВАНИЯ ПОЛЯ , '@', text );
//--------------------------------------------------------------------------------------------------
#include
"RT_HW_LCD_HD44780.h"
id
;
RT_HW_LCD_HD44780_DIRECT
text
;
String
ago
;
int8_t
5f224125-5151-4fca-9d40-eb16f2ea8970
7.lcd.txt:Вывод текста,полный
9
C
//---Вывод переменной int-----------------------------------------------------------
if(!id.custom) { RT_HW_Lcd_hd44780.setID_direct(id, lcd , НОМЕР КОЛОНКИ , НОМЕР СТРОКИ , ПЕРИОД В ТИКАХ (50мс) );} id.EN=EN; id.modeBlink= blink;
//if(!id.run) {
if(ago!=num) {ago=num; if (ago!=0) id.run=true;
switch(ago){default :
case 1: text= String(F("ТЕКСТ 1")) ; break;
case 2: text= String(F("ТЕКСТ 2")) ; break;
case 3: text= String(F("ТЕКСТ 3")) ; break;
case 4: text= String(F("TEKCT 4")) ; break;
case 5: text= String(F("ТЕКСТ 5")) ; break; } }
//}
RT_HW_Lcd_hd44780.printText(id, text , ДЛИНА ПОЛЯ , ФОРМАТ ВЫРАВНИВАНИЯ ПОЛЯ );
//--------------------------------------------------------------------------------------------------
743
#include
"RT_HW_LCD_HD44780.h"
id
;
RT_HW_LCD_HD44780_DIRECT
text
;
String
ago
;
int8_t
Blink
340@830
360@830
lcd.Blink
9e8f210f-5d5a-4cb2-b7f6-85e515abb27a
f94887d0-aeb9-49a2-990d-28a8797cff8b
ed66f776-702c-40d6-b611-5c26b057d34b
1.lcd.Blink:вывод blink
НОМЕР_КОЛОНКИ
НОМЕР_СТРОКИ
ПЕРИОД_В_ТИКАХ
СИМВОЛ_0
4e34d413-5969-474b-aeb3-d5f6c41ef6c8
e47a54f1-c7b8-480b-80ed-909f7e65626f
СИМВОЛ_1
c2843ae9-5fb2-4133-8682-20ed3d8161d7
*
a1809005-fedf-4911-875e-1ec853434672
//--Мерцание в позиции -------------------------------------------------------------------------
if(!id.custom) {RT_HW_Lcd_hd44780.setIdChar(id, lcd , НОМЕР_КОЛОНКИ , НОМЕР_СТРОКИ ,'F', ПЕРИОД_В_ТИКАХ);} RT_HW_Lcd_hd44780.printIdChar(id, EN , Blink , СИМВОЛ_0 , СИМВОЛ_1 );
279
id.dir=0;
#include
"RT_HW_LCD_HD44780.h"
id
;
RT_HW_LCD_HD44780_DIRECT
4d1552df-0bcb-4ef7-a228-6dc6c59b6f4f
:
id.custom=0;
#include
"RT_HW_LCD_HD44780.h"
id
;
RT_HW_LCD_HD44780_PARAM_CHAR_ID
48.947368909778d
360@790
440@330
460@330 corner: 513.0d@430
440@330 corner: 533.0d@430
465.0d@343.5d
440@350 corner: 460@370
440@380
454@380
440@370 corner: 454@390
440@400
460@400
440@390 corner: 460@410
520@400
540@400 corner: 600@480
520@400 corner: 620@480
554.0d@413.5d
520@420 corner: 540@440
440@700
460@700
570@130
590@130 corner: 694.0d@150
570@130 corner: 714.0d@150
600@145.0d
460@90
480@90 corner: 540@150
460@90 corner: 560@150
494.5d@104.0d
200@70
220@70 corner: 265.0d@130
200@70 corner: 285.0d@130
225.0d@83.5d
EN
200@100
214@100
ds1820_new
32bd8af4-f64d-479e-9a35-f8d9a15feaca
e8462a12-4eb1-4232-a20a-658c4a65e030
pin
a730f3a4-eb0c-4255-8ac1-84f4061c8526
0a64618a-9537-45fd-afa6-749141a6eff5
t
c7ee3e87-5efe-474f-b3dd-e2fa7bbb858c
732232cf-57ff-426b-bfeb-7db2a6c47fbd
d4c9c2ba-6e41-4b5c-9676-1665a9fc889d
5.ds1820_new
if(dir==0) {ds.begin(pin); dir=1;}
if(dir==1) {if ( !ds.search(addr)) {ds.reset_search(); timeStart=millis(); dir=2; }
else {if (OneWire::crc8(addr, 7) != addr[7]) {timeStart=millis(); dir=2; } else {dir=3;} }}
if(dir==2) {if ((millis()-timeStart)>250) dir=1;}
283
#include
<OneWire.h>
ds
;
OneWire
dir
=0;
uint8_t
i
;
byte
present
= 0;
byte
type_s
;
byte
data
[12];
byte
addr
[8];
byte
timeStart
;
uint32_t
T
7d58ae04-72de-4653-b2b6-0e71ac0abdb2
ПЕРИОД_ОПРОСА_МС
Период опроса
a35a1f85-a7fc-4341-a0d4-e0a17bf5ba09
4c94a1b9-9695-4c77-adfe-b8e7ef39b1ae
meter();
#include
"OneWire.h"
--Создание объекта для ds1820
ds
;
OneWire
--Тип датчика - новый/старый (0/1)
mode
;
uint8_t
--Период опроса сенсора
period
;
int
--Номер шага
step
=0;
uint8_t
--Буфер для данных
data
[10];
uint8_t
--Результат
raw
;
int16_t
--Буфер
timeStart
;
uint32_t
timeDelay
;
uint32_t
crc
;
uint8_t
cntErr
;
uint8_t
if(step==0) {if((int8_t)pin<0) {return;} period=ПЕРИОД_ОПРОСА_МС; if(period<1000) {period=1000;} ds.begin(pin); T=0.1; step++;}
if(step==1) {if(EN) {timeStart=millis(); ds.reset(); step++; return;} }
if(step==2) {ds.write(0xCC); ds.write(0x44,1); timeDelay=millis(); step++; return;} //----Запуск преобразования с учетом сенсоров с "паразитным питанием"
if(step==3) {if( (millis() - timeDelay)<800) {return;}; step++;} //----Пауза для преобразования сенсором;
if(step==4) {ds.reset(); step++; return;} //----Сброс шины;
if(step==5) {if( ds.write(0xCC); ds.write(0xBE,mode); step++; return;} //----Запрос на чтение параметров;
if(step==6) {ds.read_bytes(data, 9); crc=OneWire::crc8(data, 8); step++; return;} //----
if(step==7) {if ((crc !=data[8]) || (data[4]==0)) {cntErr++; if(cntErr>5) {cntErr=5; T_float=NAN;} step++; return;} //----Выход, если несовпадение CRC;
raw = (data[1] << 8) | data[0]; //---Вычисление измеренного значения;
if (mode) {raw = raw << 3; if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; }}
else {uint8_t cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw & ~7; //--Урезаем, если 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; //--Урезаем, если 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; //--Урезаем, если 11 bit res, 375 ms
}
cntErr=0; T=(float)raw / 16.0; step++;}
if(step==8) {if((millis()-timeStart) <1000) {return;}; step=1;return;}
1530
void
meter
200@90 corner: 214@110
200@120
220@120
187.0d@123.5d
200@110 corner: 220@130
err
14.0d
265.0d@100
285.0d@100
7c432315-3faa-49e6-ac23-cc0f1d609a77
dd414df8-bd28-4269-8f2e-5f8b7ad741d6
5d2b3c28-fcf4-4977-9ff8-b95d2ece01d4
============Блок чтения с DS1820================================================
1.Блок опрашивает значения температуры с сенсора ds1820.
2.Блоку не требуется указание адрес сенсора на шине - требуется только, чтобы на шине находился только один датчик.
3.Блок позволяет работать с датчиками с "паразитным" питанием - режим выбирается параметром "РЕЖИМ_ПИТАНИЯ".
4.Блок опрашивает сенсор с периодом= "ПЕРИОД ОПРОСА В МС".
5.Можно приостанавливать опрос через вход EN, при этом начатое измерение будет выполнено до конца.
6.При 5-ти кратной ошибке обмена, устанавливается флаг err, T=-0.1;
7.В отличии от стандартного блока FLProg, у которого при измерении возникает задержка >17мс,
у данного блока несколько задержек разнесенных по времени -1мс,1.3мс, 4.7мс (для AV328).
------------------------------------------------------------
Блок использует только библиотеку "OneWire.h" - это немного адаптированная библиотека с именем RT_50_HW_OneWire-master_PaulStoffregen.
-------------------------------------------------------------
ecoins@mail.ru 12.08.2020
1060
РЕЖИМ_ПИТАНИЯ
1834915e-98e4-4b63-93f7-d9564e5280ff
d838e8e6-869d-4147-9910-425f122ec825
if(step==0) {if((int8_t)pin<0) {return;} period=ПЕРИОД_ОПРОСА_МС; if(period<1000) {period=1000;} ds.begin(pin); T=-0.1; step++;}
if(step==1) {if(EN) {timeStart=millis(); ds.reset(); step++; return;} }
if(step==2) {ds.write(0xCC); ds.write(0x44,1); timeDelay=millis(); step++; return;} //----Запуск преобразования с учетом сенсоров с "паразитным питанием"
if(step==3) {if( (millis() - timeDelay)<800) {return;}; step++;} //----Пауза для преобразования сенсором;
if(step==4) {ds.reset(); step++; return;} //----Сброс шины;
if(step==5) {ds.write(0xCC); ds.write(0xBE,mode); step++; return;} //----Запрос на чтение параметров;
if(step==6) {ds.read_bytes(data, 9); crc=OneWire::crc8(data, 8); step++; return;} //----
if(step==7) {if ((crc !=data[8]) || (data[4]==0)) {cntErr++; if(cntErr>5) {cntErr=5; err=0; T=-0.1;} step++; return;} //----Выход, если несовпадение CRC;
raw = (data[1] << 8) | data[0]; //---Вычисление измеренного значения;
if (mode) {raw = raw << 3; if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; }}
else {uint8_t cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw & ~7; //--Урезаем, если 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; //--Урезаем, если 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; //--Урезаем, если 11 bit res, 375 ms
}
cntErr=0; err=0; T=(float)raw / 16.0; step++;}
if(step==8) {if((millis()-timeStart) <1000) {return;}; step=1;return;}
1536
265.0d@90 corner: 285.0d@110
265.0d@110 corner: 285.0d@130
285.0d@120
ds1820
0c067488-5cae-464e-a0a0-dd6538a33157
5.ds1820 - Один сенсор на пине
============Блок чтения с DS1820================================================
1.Блок опрашивает значения температуры с сенсора ds1820.
2.Блоку не требуется указание адрес сенсора на шине - требуется только, чтобы на шине находился только один датчик.
3.Блок позволяет работать с датчиками с "паразитным" питанием - режим выбирается параметром "РЕЖИМ_ПИТАНИЯ" (в отладке).
4.Блок опрашивает сенсор с периодом= "ПЕРИОД ОПРОСА В МС".
5.Можно приостанавливать опрос через вход EN, при этом начатое измерение будет выполнено до конца.
6.При 5-ти кратной ошибке обмена, устанавливается флаг err, температура T=-0.1;
7.В отличии от стандартного блока FLProg, у которого при измерении возникает задержка >17мс,
у данного блока несколько задержек разнесенные во времени - 1мс,1.3мс, 4.7мс (для AV328).
8.Опрос параметра занимает 5-6 программных прерываний. Рекомендуется не превышать период программных перываний 200мс.
Блок использует только библиотеку "OneWire.h" - это немного адаптированная библиотека с именем RT_50_HW_OneWire-master_PaulStoffregen.
-------------------------------------------------------------------------------------------------------------
Примечание: Рекомендуется подключать блок как оперативную, быструю или свободную задачу.
--------------------------------------------------------------------------------------
ecoins@mail.ru 12.08.2020
1366
if(step==0) {if((int8_t)pin<0) {return;} period=ПЕРИОД_ОПРОСА_МС; if(period<1000) {period=1000;} ds.begin(pin); T=-0.1; step++;}
if(step==1) {if(EN) {timeStart=millis(); ds.reset(); step++; return;} }
if(step==2) {ds.write(0xCC); ds.write(0x44,1); timeDelay=millis(); step++; return;} //----Запуск преобразования с учетом сенсоров с "паразитным питанием"
if(step==3) {if( (millis() - timeDelay)<800) {return;}; step++;} //----Пауза для преобразования сенсором;
if(step==4) {ds.reset(); step++; return;} //----Сброс шины;
if(step==5) {ds.write(0xCC); ds.write(0xBE,mode); step++; return;} //----Запрос на чтение параметров;
if(step==6) {ds.read_bytes(data, 9); crc=OneWire::crc8(data, 8); step++; return;} //----
if(step==7) {if ((crc !=data[8]) || (data[4]==0)) {cntErr++; if(cntErr>5) {cntErr=5; err=0; T=-0.1;} step++; return;} //----Выход, если несовпадение CRC;
raw = (data[1] << 8) | data[0]; //---Вычисление измеренного значения;
if (mode) {raw = raw << 3; if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; }}
else {uint8_t cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw & ~7; //--Урезаем, если 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; //--Урезаем, если 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; //--Урезаем, если 11 bit res, 375 ms
}
cntErr=0; err=0; T=(float)raw / 16.0; step++;}
if(step==8) {if((millis()-timeStart) <1000) {return;}; step=1;return;}
1537
45.0d
8.0d
265.0d@120
285.0d@120 corner: 285.0d@120
I1
460@120
480@120
290@140
310@140 corner: 390@180
290@140 corner: 410@180
322.0d@153.5d
410@170
223676050
110205736
Graphics.ColorValue brown
r15g7b7
Q
9.0d
390@170
410@140 corner: 410@170
I2
460@140
480@140
560@140
9.0d
540@140
560@140 corner: 560@140
570@140
590@140
10.0d
84.0d
Ds18b20 На яйцо
1
520@450
540@450
520@440 corner: 540@460
S
520@470
540@470
520@460 corner: 540@480
640@70
660@70 corner: 726.0d@210
640@70 corner: 746.0d@210
675.5d@84.5d
230@50
250@50 corner: 330@90
230@50 corner: 350@90
262.0d@63.5d
330@70 corner: 350@90
350@80
150643427
Graphics.ColorValue cyan
r0g31b31
Q
9.0d
330@80
350@80 corner: 350@100
352@76.5d corner: 384.0d@83.5d
606.0d@96.5d corner: 638.0d@103.5d
Period
period
640@100
660@100
PID
tick
5990cc8e-8421-4ca8-ac33-1851f581e1e7
тактирование блока
a47c9b47-715f-4057-b87b-388a7e78d7c9
Value
9bc2da38-73a5-4afe-98d4-10ad0b9b1d6f
входная величина
2375b850-78cd-48b7-8d77-0216be7faca8
Set
d93c1c08-e6ab-44ed-8279-3677439f7725
уставка
09bd6579-2524-4374-900a-029628f485a3
Kp
224febce-1f7f-4909-b5b6-4f4ab3f3d129
пропорциональная составляющая
3dfe45df-64c2-4487-b52f-a492ea28b246
Ki
f78172ce-e204-4e92-bd65-55e4be9806fc
интегральная составляющая
4bae2e38-7f86-43ac-9960-8cd21c61f445
Kd
b3035d22-af3b-490d-90ec-48f1e5c8331d
дифференциальная составляющая
78867cbe-ece8-4a3f-a3fc-061d5434780b
Max_int
66196775-570f-49a5-a965-fed6a88a76e0
ограничение дифференциала
659743a0-164c-4ce5-9a4d-ddb54e203936
Y_PID
75a9b898-97e9-4f5a-8052-f0f260bcd312
выходное воздействие
315b0a14-1b72-4b56-a898-bb13b93d2ae1
PWM_out
e1cc7544-672c-45fd-84f0-89154f51bafc
выход на нагреватель/охладитель
9d1dbee5-d698-43f1-afb0-08e30d0fa82c
up_3valve
85aefe8e-df64-4ed7-93f7-6804810a54e3
открыть трехходовой кран
23873e24-4ef6-4be1-a78c-b2c83414f914
down_3valve
b900024e-3e27-4497-b2af-65028162f85d
закрыть трехходовой кран
62fed513-590c-46fd-919e-05e288a4d3a2
5ce9c5cf-34c0-40a7-a174-9015369d40a5
PID
if (en)
{
}
17
c90a9a5e-dd53-4d50-bc0a-ecca18040743
170d9374-b8c8-4bcc-833b-64a6def5b0c8
5d64dc8e-74df-4dc0-91a5-e12d3e285369
245077a1-41ce-4b7c-8426-5ef1c2f7a0c5
b20142d0-cd24-4d43-9561-86afc4497c1b
b6b2d816-7866-474c-838f-07b2d29f8a03
d265e501-9ff6-47b8-bdb7-2b4ce5cf580a
2c22e18b-16fa-4557-8ff0-d4acc985dc40
630decbe-ab46-4493-86d7-419657f94f17
40477d90-212d-428c-8134-4d4158222439
43f4b82e-77e7-4473-acc1-e6bd6a7da39d
1d7afe60-9bc1-4374-8b3b-92ee03461920
период ПИД и ШИМ в милисекундах
640@90 corner: 660@110
640@110 corner: 660@130
520@300
540@300 corner: 600@380
520@300 corner: 620@380
554.0d@313.5d
320@300
340@300 corner: 420@340
320@300 corner: 440@340
352.0d@313.5d
420@320 corner: 440@340
440@330
95161091
9.0d
420@330
440@330 corner: 440@330
0
520@330
540@330
520@320 corner: 540@340
520@350
540@350
520@340 corner: 540@360
520@370
540@370
520@360 corner: 540@380
600@360 corner: 620@380
620@370
Q
9.0d
600@370
630@140 corner: 630@370
622@365.5d corner: 731.0d@374.5d
529.0d@135.5d corner: 638.0d@144.5d
Уставка температуры
640@140
660@140
640@130 corner: 660@150
230@100
250@100 corner: 330@140
230@100 corner: 350@140
262.0d@113.5d
330@120 corner: 350@140
350@130
182455203
9.0d
330@130
350@130 corner: 350@160
352@125.5d corner: 366.0d@134.5d
624.0d@155.5d corner: 638.0d@164.5d
Kp
640@160
660@160
пропорциональная составляющая >= 0
640@150 corner: 660@170
230@150
250@150 corner: 330@190
230@150 corner: 350@190
262.0d@163.5d
330@170 corner: 350@190
350@180
239115479
9.0d
330@180
350@180 corner: 350@180
352@176.5d corner: 363.0d@183.5d
627.0d@176.5d corner: 638.0d@183.5d
Ki
640@180
660@180
интегральная составляющая >= 0
640@170 corner: 660@190
230@200
250@200 corner: 330@240
230@200 corner: 350@240
262.0d@213.5d
330@220 corner: 350@240
350@230
117882616
9.0d
330@230
350@200 corner: 350@230
352@226.5d corner: 366.0d@233.5d
624.0d@196.5d corner: 638.0d@203.5d
Kd
640@200
660@200
дифференциальная составляющая >= 0
640@190 corner: 660@210
ok
12.0d
726.0d@160
746.0d@160
тактирование блока (сигнал с генератора и RTrig)
интегральная составляющая > 0
ограничение интегральной состовляющей в выходном сигнале
Err
8ed8e0d9-beeb-409d-956d-ba5484e82bac
Ошибка входных данных
97a03a86-57b0-4f2f-a5bd-5cc408d826ea
выходное воздействие -100..+100
Y_PWM
d99d73c2-161a-4586-b99a-cfe07688f58e
выходное воздействие 0..100%
f13e0cc8-6b2b-488a-b25a-4b75f63fb78b
Err
ab70f12b-9a0c-430b-8a4b-287ba30289cc
ошибка входных данных
06be2e26-d2d5-4c32-93d2-b9646b9c9848
5e3da54a-8cc0-4965-9201-84005876fee7
if (en)
{
err = false;
if (Kp >= 0) and (Ki > 0) and (Kd > 0)
{
E_pid = set - value;
Pr = Kp * E_pid;
Integr = Integr + ( E_pid / Ki );
Df = Kd * ( E_pid - E_pid_old );
Y_pid = Pr + Integr + Df;
E_pid_old = E_pid;
}
else
{
err = true;
}
}
262
E_pid
;
float
E_pid_old
;
float
Pr
;
float
Integ
;
float
Df
;
float
4c052d7c-5fb7-4452-9b35-a43324a13bee
78999638-89ef-4771-b088-3512cfe4636b
Данный самописный PID-регулятор с успехом используется
на ПЛК известного Российского производителя на промышленных объектах.
Регулирует температуру и давление в трубопроводах посредством трехходовых кранов.
Также управляет частотными преобразователями трехфазных двигаталей по интерфейсу 4-20мА.
295
if (tick)
{
Err = false;
if ( (Kp >= 0) and (Ki > 0) and (Kd > 0) )
{
E_pid = Set - Value;
Pr = Kp * E_pid;
Integ = Integ + ( E_pid / Ki );
Integ = constrain( Integ, -Max_int, Max_int );
Df = Kd * ( E_pid - E_pid_old );
Y = Pr + Integ + Df;
E_pid_old = E_pid;
}
else
{
Err = true;
}
Y_PID = int (Y);
Y_PID = constrain( Y_PID, -100, 100 );
Y_PWM = map(Y_PID, -100, 100, 0, 100);
}
408
E_pid
;
float
E_pid_old
;
float
Pr
;
float
Integ
;
float
Df
;
float
Y
;
float
14cfe269-dbc1-4860-8240-5c26ecee5721
Данный самописный PID-регулятор с успехом используется в системах на ПЛК
известного Российского производителя на промышленных объектах.
Регулирует температуру и давление в трубопроводах посредством трехходовых кранов.
Также управляет частотными преобразователями трехфазных двигаталей по интерфейсу 4-20мА.
Err = false;
if (tick)
{
if ( (Kp >= 0) and (Ki > 0) and (Kd > 0) )
{
E_pid = Set - Value;
Pr = Kp * E_pid;
Integ = Integ + ( E_pid / Ki );
Integ = constrain( Integ, -Max_int, Max_int );
Df = Kd * ( E_pid - E_pid_old );
Y = Pr + Integ + Df;
E_pid_old = E_pid;
}
else
{
Err = true;
}
Y_PID = int (Y);
Y_PID = constrain( Y_PID, -100, 100 );
Y_PWM = map( Y_PID, -100, 100, 0, 100 );
}
410
E_pid
;
float
E_pid_old
;
float
Pr
;
float
Integ
;
float
Df
;
float
Y
;
float
выходное воздействие -100..+100% (для трехходовых)
выходное воздействие 0..100% (для нагревателя)
f6dbf899-6789-429d-8934-ed6d17c6ee7e
данные изменилисы
f6621c7d-8855-4430-995a-f18abbcd5df8
7ed8c374-de0d-4399-9032-f4ef729ccb7a
Данный самописный PID-регулятор с успехом используется в системах на ПЛК
известного Российского производителя на промышленных объектах.
Регулирует температуру и давление в трубопроводах посредством трехходовых кранов.
Также управляет частотными преобразователями трехфазных двигаталей по интерфейсу 4-20мА.
Автор: Boroda.
321
ok = false;
Err = false;
if (tick)
{
if ( (Kp >= 0) and (Ki > 0) and (Kd > 0) )
{
E_pid = Set - Value;
Pr = Kp * E_pid;
Integ = Integ + ( E_pid / Ki );
Integ = constrain( Integ, -Max_int, Max_int );
Df = Kd * ( E_pid - E_pid_old );
Y = Pr + Integ + Df;
E_pid_old = E_pid;
Y_PID = int (Y);
Y_PID = constrain( Y_PID, -100, 100 );
Y_PWM = map( Y_PID, -100, 100, 0, 100 );
ok = true;
}
else
{
Err = true;
}
}
438
данные изменились
726.0d@150 corner: 746.0d@170
PWR
25.0d
726.0d@180
746.0d@180
выходная мощность 0..1000 (0..+100,0%) (для аналоговых ИМ)
726.0d@170 corner: 746.0d@190
880@200
900@200 corner: 960@280
880@200 corner: 980@280
914.0d@213.5d
880@230
900@230
856.0d@233.5d
880@220 corner: 900@240
880@240 corner: 900@260
880@270
894@270
880@260 corner: 900@280
1050@260
1070@260 corner: 1208.0d@280
1050@260 corner: 1228.0d@280
1080@274.5d
1050@260 corner: 1070@280
1050@270
9.0d
118.0d
Выход PiD на симистор
310@80
330@80 corner: 386.31579005487d@260
310@80 corner: 406.31579005487d@260
332.65789502744d@94.5d
B0
310@110
330@110
BitReg_8
d82c0e23-4b12-4a98-9277-5b647de200c2
c72fed24-afd8-48b6-ad12-ad40066aa01e
B1
72cd34c9-b2ac-4799-9a82-08a70d91c5c5
3cd45614-1d75-42cf-b33e-4580ad785088
B2
54f93ea9-a146-4ef5-8481-7c3cc6c3539d
529d99a6-b333-46f8-bddf-0fb6bfaec3a7
B3
f8c5c3a2-d45b-4435-92df-746dcf13f776
b1290541-8338-4e4a-b1eb-829cd6f902d9
B4
b139da50-22ad-40eb-884d-3b104b4256ac
dbee93d4-1261-4ac7-bbf3-47a549a383ec
B5
76d9e1ec-0883-421c-9f4a-3796db32846d
3454ef34-b3a2-4f58-ad5a-22ce5b918acd
B6
272627ae-0ab7-48db-8e55-99c800151220
f979c2e9-c850-4b5f-abd5-d8bed549557a
B7
664a8415-bde3-4332-8f4e-71efb7c30997
5376a12e-1f49-4ffd-a013-6c2897760c68
Reg
92bf78b7-494e-453f-b773-8070337387ec
e786071b-b45b-4ccd-b091-e4dab9bd0262
58e35bc8-c491-48d3-8e18-99289f16be52
BitReg_8
register=0;
bitWrite(register, 0, B0);
bitWrite(register, 1, B1);
bitWrite(register, 2, B3);
bitWrite(register, 3, B3);
bitWrite(register, 4, B4);
bitWrite(register, 5, B5);
bitWrite(register, 6, B6);
bitWrite(register, 7, B7);
Reg = register ;
246
register
;
byte
310@100 corner: 330@120
310@130
330@130
310@120 corner: 330@140
310@150
330@150
310@140 corner: 330@160
310@170
330@170
310@160 corner: 330@180
310@190
330@190
310@180 corner: 330@200
310@210
330@210
310@200 corner: 330@220
310@230
330@230
310@220 corner: 330@240
310@240 corner: 330@260
750@190
770@190 corner: 827.36842164703d@290
750@190 corner: 847.36842164703d@290
773.68421082351d@204.5d
EN
750@220
764@220
mcp23x17
97a520da-0c56-48e9-825e-00b74b71e26b
7a910c09-c236-4efc-91cd-c4aefb7901ba
mcp.AB
mcp
0a323118-7b5a-4db3-8cf8-665013497fae
181acc1d-7656-420a-b869-2da0e68e3ab7
A
ff014b34-8778-49a9-a30f-fe25f120d487
b6dc5752-a6cd-4bfc-b807-84bf3746f699
B
6306baef-b15a-4b05-ace0-4378fc2486d5
93e22d44-8f9c-4b36-9191-e14bfb644fed
88011128-6fd8-463f-b934-50df5cfecabc
02.mcp.AB:вывод в регистры AB
ПЕРИОД ОБНОВЛЕНИЯ (в тиках 10мс)
dec4f0ee-229e-4074-9fbd-a559d89a694e
22d2e9cc-510f-46cf-b790-e95eadb6ce6b
e1b053f1-81dc-4779-8768-cee3b0a144e8
adr
mode
46db83cd-1dd0-4a1c-ad45-0a88f22f873b
9a8dbc74-6165-408e-a028-1dba2635028d
5222d8c8-e9aa-453f-b4ad-a758082611b3
01.mcp.AB:вывод в регистры AB
БЛОК ВВОДА_ВЫВОДА MCP23017.
Блок содержит два 8-разрядных регистра A и B, кадый из которых может настроен на вывод или ввод.
Обмен с регистрами осуществляется через шину i2c по адресу=adr или через SPI через пин cs=adr.
Если adr <0, устройство не используется.
Для i2c: Обычно mcp23017 выпускаются с базовым адресом 0x20 (32 десятичный).
Это адрес по умолчанию установлен в библиотеке как "базовый адрес".
Пространство адресов может меняться входами a0,a1,a2 mcp23017 - всего восемь адресов.
Если аdr в диапазоне 0-7, то к этому значению будет прибавлено значение базового адреса.
Алгоритм поиска устройства на шине i2c стандартный для библиотек ecoins.
---------------------------------------------------------------------------------------------------------------------------------
Обмен с устройством осуществляется не чаще параметра ПЕРИОД ОБНОВЛЕНИЯ (в тиках 10мс).
Вывод може быть постоянный или по изменению входных параметров.
---------------------------------------------------------------------------------------------------------------------------------
Режимы работы устанавливаются через пользовательские параметры, из которых формируется
регистр управления mode:
bit0: 0/1 - подключение: i2c / SPI;
bit1: 0/1 - регистр А: вход / выход;
bit2: 0/1 - регистр В: вход / выход;
bit3: 0/1 - тип выходов: обычный / открытый выход;
bit4: 0/1 - инверсия выходов: без инверсии / с инверсией;
bit5: 0/1 - режим записи выходов: всегда / по изменению входных значений;
bit6: 0/1 - тип входов: без подтяжки к +Vcc / c подтяжкой к +Vcc;
bit7: 0/1 - инверсия входов: без инверсии / с инверсией;
-----------------------------------------------------------------------------------------------------------------------------------
ecoins@mail.ru 12.07.19; 21.07.19; 28.10.19. new 07.04.2020
1843
ИНТЕРФЕЙС ПОДКЛЮЧЕНИЯ
0/1 i2c/SPI
11b55c63-f8bf-473a-a67b-5729598bcad8
I
2ab33426-f189-430e-8a10-ed7853d2ef5a
РЕЖИМ РЕГИСТРА А
0/1- вход/выход
52765991-794d-466f-bce9-44ef99bb21cb
1b9d4afe-dc36-4f17-99d6-09dc19355e3a
РЕЖИМ РЕГИСТРА B
0/1- вход/выход
6d0b3850-22c7-4c3a-99b1-173308f84400
ec387e77-2b21-402a-877a-058695c65342
РЕЖИМ ВЫХОДОВ
0/1 - обычный выход/открытый выход
44a0582d-19d2-482f-91a7-e4333de6e6c4
f89da492-c39d-4ce1-8f1e-b4271ae11189
ИНВЕРСИЯ ВЫХОДОВ
0/1 - нет инверсии выходов/инверсия выходов
d12537cd-5bd3-4aee-877b-0a1b85a848b6
38bf66d7-60e6-4e06-8368-17b1f34e5da7
РЕЖИМ ЗАПИСИ ВЫХОДНЫХ ЗНАЧЕНИЙ
0/1 всегда/по изменению
6c3e9ac0-f9cc-4a19-8509-bf27bebf839a
e61c910d-3149-42af-b39a-5ec34e8470b8
ПОДТЯЖКА ВХОДОВ К Vcc
0/1 - нет подтяжки/подтяжка к +Vcc
fbf3c7c7-c603-43db-9c01-8a72cf19d788
aa98a3f2-330b-46e6-8d35-ce72d399ae9a
ИНВЕРСИЯ ВХОДОВ
0/1 -нет инверсии/инверсия входов
691bfa9a-a89b-4fb1-ae98-27280d5eb8ff
836ad0a5-ad3d-4955-98fb-eaad3681bdb0
//-----Вывод в mcp23017
if (!z.custom) {z.mode=0;
bitWrite(z.mode,0, ИНТЕРФЕЙС ПОДКЛЮЧЕНИЯ );
bitWrite(z.mode,1, РЕЖИМ РЕГИСТРА А );
bitWrite(z.mode,2, РЕЖИМ РЕГИСТРА B );
bitWrite(z.mode,3, РЕЖИМ ВЫХОДОВ );
bitWrite(z.mode,4, ИНВЕРСИЯ ВЫХОДОВ );
bitWrite(z.mode,5, РЕЖИМ ЗАПИСИ ВЫХОДНЫХ ЗНАЧЕНИЙ );
bitWrite(z.mode,6, ПОДТЯЖКА ВХОДОВ К Vcc );
bitWrite(z.mode,7, ИНВЕРСИЯ ВХОДОВ );
RT_HW_mcp23017.setID_device(z, (int8_t)adr,ПЕРИОД ОБНОВЛЕНИЯ (в тиках 10мс) );
}
//RT_HW_mcp_23017.device (mcp);
mode=z.mode;
//-------------------------------------------------------------------------------------------------
628
z.custom=0;
#include
"RT_HW_MCP23017.h"
z
;
RT_HW_MCP23017_DEVICE
mode
;
uint8_t
outA
094199f9-cb99-48aa-a3dd-14ab26370dd0
08e2598f-d0f0-441a-b4df-10f89b57985c
outB
6ebe6d9c-6384-4426-92eb-7a2c329d6fb6
cc21771f-3906-4019-8c2b-f22a5b40ee8e
c71075da-3e47-4925-83f8-fe0b12fb164a
ПЕРИОД ОБНОВЛЕНИЯ В ТИКАХ 10_МС
РЕЖИМ_РЕГИСТРА_A
0/1- ввод/вывод
РЕЖИМ_РЕГИСТРА_B
0/1- ввод/вывод
ИНВЕРСИЯ РЕГИСТРА_А
ИНВЕРСИЯ РЕГИСТРА_В
ВХОДА РЕГИСТРА_A
0/1 - без подтяжки/ с подтяжкой к +Vcc
ВХОДА РЕГИСТРА_В
0/1 - без подтяжки/ с подтяжкой к +Vcc
1fb2c269-4b78-45fd-9428-51d878ff3819
b367804a-b80c-4a9b-b628-0cc66e98ad1e
РЕЖИМ ЗАПИСИ
//-----Вывод в mcp23017
if (!z.ok.custom) {z.mode=0;
bitWrite(z.mode,0, ИНТЕРФЕЙС ПОДКЛЮЧЕНИЯ ); //--bit0: 0/1 ->i2c/SPI;
bitWrite(z.mode,1, РЕЖИМ_РЕГИСТРА_A ); //--bit1: 0/1 ->вывод/ввод;
bitWrite(z.mode,2, РЕЖИМ_РЕГИСТРА_B ); //--bit2: 0/1 ->вывод/ввод;
bitWrite(z.mode,3, ИНВЕРСИЯ РЕГИСТРА_А ); //--bit3: 0/1 ->без инверсии/ с инверсией;
bitWrite(z.mode,4, ИНВЕРСИЯ РЕГИСТРА_В ); //--bit4: 0/1 ->без инверсии/ с инверсией; ;
bitWrite(z.mode,5, ВХОДА РЕГИСТРА_A ); //--bit5: 0/1 ->без подтяжки/ с подтяжкой к Vcc;
bitWrite(z.mode,6, ВХОДА РЕГИСТРА_В ); //--bit6: 0/1 ->без подтяжки/ с подтяжкой к Vcc;
bitWrite(z.mode,7, РЕЖИМ ЗАПИСИ ); //--bit5: 0/1 ->в каждом цикле/ по изменениям значения;
RT_HW_mcp23017.setID_device(z, (int8_t)adr, ПЕРИОД ОБНОВЛЕНИЯ В ТИКАХ 10_МС );
}
//RT_HW_mcp_23017.device (mcp);
mode=z.mode;
outA=z.regA;
outB=z.regB;
//-------------------------------------------------------------------------------------------------
987
z.ok.custom=0;
#include
"RT_HW_MCP23017.h"
z
;
RT_HW_MCP23017_DEVICE
inA
inB
2e8e2041-f3ad-4250-90ac-ae91ea9b30c9
00_mcp23x17:ввод/вывод регистров A,B
БЛОК ВВОДА_ВЫВОДА MCP23017.
Блок содержит два 8-разрядных регистра A и B, кадый из которых может настроен на вывод или ввод.
Настройка режимов работы регистров А и В:
w - вывод с записью в каждом цикле;
W -вывод с записью по изменению;
r -ввод;
R -ввод с инверсией и подтяжкой входов к +Vcc
Обмен с регистрами осуществляется через шину i2c по адресу=adr или через SPI через пин cs=adr.
Если adr <0, устройство не используется.
Для i2c: Обычно mcp23017 выпускаются с базовым адресом 0x20 (32 десятичный).
Это адрес по умолчанию установлен в библиотеке как "базовый адрес".
Пространство адресов может меняться входами a0,a1,a2 mcp23017 - всего восемь адресов.
Если аdr в диапазоне 0-7, то к этому значению будет прибавлено значение базового адреса.
Алгоритм поиска устройства на шине i2c стандартный для библиотек ecoins.
---------------------------------------------------------------------------------------------------------------------------------
Обмен с устройством осуществляется не чаще параметра ПЕРИОД ОБНОВЛЕНИЯ (в тиках 10мс).
Вывод може быть постоянный или по изменению входных параметров.
---------------------------------------------------------------------------------------------------------------------------------
Режимы работы устанавливаются через пользовательские параметры, из которых формируется
регистр управления mode:
bit0: 0/1 - подключение: i2c / SPI;
bit1: 0/1 - регистр А: вход / выход;
bit2: 0/1 - регистр В: вход / выход;
bit3: 0/1 - тип выходов: обычный / открытый выход;
bit4: 0/1 - инверсия выходов: без инверсии / с инверсией;
bit5: 0/1 - режим записи выходов: всегда / по изменению входных значений;
bit6: 0/1 - тип входов: без подтяжки к +Vcc / c подтяжкой к +Vcc;
bit7: 0/1 - инверсия входов: без инверсии / с инверсией;
-----------------------------------------------------------------------------------------------------------------------------------
ecoins@mail.ru 12.07.19; 21.07.19; 28.10.19. new 07.04.2020
2017
РЕЖИМ РЕГИСТРА_А
aee3ecaf-a995-4b82-86a1-2b7bdf962b27
W
W
5b2166f0-8718-4d0b-af19-c332e0a5a0be
РЕЖИМ РЕГИСТРА_В
a42c586a-4d87-48da-a187-068226f81a6f
W
W
8a87ae01-1c27-4140-a64b-a31164f99ad3
ИНТЕРФЕЙС ПОДКЛЮЧЕНИЯ
'i' -i2c; 's' -SPI
8072dca6-5e9a-41c5-af47-636d6c496942
i
i
70ccce9c-d3fa-43b4-aea5-168e660a39d2
ИНИЦИАЛИЗИРОВАТЬ ИНТЕРФЕЙСЫ
c8b7ba52-0872-45b4-9a4b-372dac9b5749
N
Y
ca60dc20-e812-4f4f-8cc0-6e50b74271bf
//-----Вывод в mcp23017
if(EN){
if (!z.ok.custom) { if( ИНИЦИАЛИЗИРОВАТЬ ИНТЕРФЕЙСЫ == 'Y') RT_HW_mcp23017.hive.permit_bus=true;
RT_HW_mcp23017.setID_device(z, (int8_t)adr, ИНТЕРФЕЙС ПОДКЛЮЧЕНИЯ , РЕЖИМ РЕГИСТРА_А , РЕЖИМ РЕГИСТРА_В , ПЕРИОД ОБНОВЛЕНИЯ В ТИКАХ 10_МС );}
RT_HW_mcp23017.direct (z, A , B); }
//tun=z.tuning;
inA=z.inA;
inB=z.inB;
//-------------------------------------------------------------------------------------------------
454
#include
"RT_HW_MCP23017.h"
z
;
RT_HW_MCP23017_DEVICE
750@240
770@240
750@260
660@330
680@330 corner: 736.31579005487d@510
660@330 corner: 756.31579005487d@510
682.65789502744d@344.5d
660@360
680@360
660@350 corner: 680@370
660@380
680@380
660@370 corner: 680@390
660@400
680@400
660@390 corner: 680@410
660@420
680@420
660@410 corner: 680@430
260@330
280@330 corner: 320@370
260@330 corner: 340@370
292.5d@343.5d
180@310
200@310 corner: 240@370
180@310 corner: 260@370
208.5d@323.5d
180@340
194@340
50@470
70@470 corner: 115.0d@490
50@470 corner: 135.0d@490
80@484.5d
0@310
20@310 corner: 80.0d@330
0@310 corner: 100.0d@330
24@324.5d
100.0d@320
9.0d
52.0d
Fiz_2_Key
848af76d-4a47-4e99-a790-9635aec14b77
sck
SPI
D5
0.0d
86.0d@320
26
400@470
420@470 corner: 460@530
400@470 corner: 480@530
428.5d@483.5d
400@500
400@520
420@520
27
500@410
520@410 corner: 560@470
500@410 corner: 580@470
531.5d@423.5d
500@440
520@440
500@460
29
580@430
600@430 corner: 640@470
580@430 corner: 660@470
606.5d@444.5d
580@460
33
660@430
680@430 corner: 740@470
660@430 corner: 760@470
699.0d@443.5d
660@460
ETM
830@420
850@420
770@420 corner: 770@460
9.0d
740@460
760@460
200
EN
680@460
660@460 corner: 660@460
9.0d
640@460
660@460
I
600@460
580@460 corner: 580@460
9.0d
560@460
580@460
520@460
30
500@490
520@490 corner: 580@530
500@490 corner: 600@530
538.5d@503.5d
500@510 corner: 520@530
31
580@490
600@490 corner: 640@550
580@490 corner: 660@550
611.5d@503.5d
580@520
580@540
600@540
32
700@510
720@510 corner: 760@550
700@510 corner: 780@550
726.5d@524.5d
700@530 corner: 720@550
ExFM
830@440
850@440
780@440 corner: 780@540
9.0d
760@540
780@540
760@530 corner: 780@550
700@540
720@540
660@540 corner: 660@540
9.0d
640@540
660@540
600@520
580@520 corner: 580@520
9.0d
580@520
600@520
580@510 corner: 600@530
500@520
1500
520@520
480@460 corner: 480@520
9.0d
460@520
480@520
420@500
37
70@160
90@160 corner: 130@260
70@160 corner: 150@260
101.5d@173.5d
70@190
90@190
70@180 corner: 90@200
70@200 corner: 90@220
0@340
20@340 corner: 80.0d@360
0@340 corner: 100.0d@360
24@354.5d
100.0d@350
9.0d
52.0d
Fiz_3_Key
586f0771-d6f6-4ae7-b993-8e997f9783d1
rx
UART
RX
0.0d
86.0d@350
35
400@280
420@280 corner: 460@340
400@280 corner: 480@340
431.5d@293.5d
400@300 corner: 420@320
400@330
420@330
400@320 corner: 420@340
V+
830@380
850@380
480@330 corner: 480@380
9.0d
460@330
480@330
460@320 corner: 480@340
400@310
420@310
50@510
70@510 corner: 115.0d@530
50@510 corner: 135.0d@530
80@524.5d
50@510 corner: 70@530
50@520
9.0d
25.0d
Key3
180@380
200@380 corner: 240@440
180@380 corner: 260@440
208.5d@393.5d
180@410
194@410
180@400 corner: 194@420
180@420 corner: 200@440
660@480
680@480
260@430 corner: 260@480
262@425.5d corner: 369.0d@434.5d
551.0d@475.5d corner: 658.0d@484.5d
Поворот лотка в лево
9.0d
240@430
260@430
240@420 corner: 260@440
180@430
200@430
70@520
80@230 corner: 80@520
102.0d@345.5d corner: 127.0d@354.5d
373.0d@305.5d corner: 398.0d@314.5d
43.0d@225.5d corner: 68.0d@234.5d
23.0d@515.5d corner: 48.0d@524.5d
Key3
70@230
90@230
70@220 corner: 90@240
0@370
20@370 corner: 80.0d@390
0@370 corner: 100.0d@390
24@384.5d
100.0d@380
9.0d
52.0d
Fiz_4_Key
c63b74bd-12b3-4cae-ac2d-2d2630877fef
tx
UART
TX
0.0d
86.0d@380
36
400@350
420@350 corner: 460@410
400@350 corner: 480@410
431.5d@363.5d
400@380
400@400
420@400
V-
830@400
850@400
480@400 corner: 480@400
9.0d
460@400
480@400
420@380
50@550
70@550 corner: 116.0d@570
50@550 corner: 136.0d@570
80@564.5d
50@560
9.0d
26.0d
Key4
180@460
200@460 corner: 240@520
180@460 corner: 260@520
208.5d@473.5d
180@490
194@490
180@480 corner: 194@500
180@500 corner: 200@520
660@460
680@460
270@460 corner: 270@510
262@505.5d corner: 375.0d@514.5d
545.0d@455.5d corner: 658.0d@464.5d
Поворот лотка в право
9.0d
240@510
260@510
240@500 corner: 260@520
180@510
200@510
70@560
50@250 corner: 50@560
102.0d@375.5d corner: 128.0d@384.5d
372.0d@375.5d corner: 398.0d@384.5d
42.0d@245.5d corner: 68.0d@254.5d
22.0d@555.5d corner: 48.0d@564.5d
Key4
70@250
90@250
70@240 corner: 90@260
38
170@220
190@220 corner: 230@260
170@220 corner: 250@260
196.5d@234.5d
170@240 corner: 190@260
260@240
280@240 corner: 405.0d@260
260@240 corner: 425.0d@260
290@254.5d
260@250
9.0d
105.0d
Импульс Key Зуммер
480@510
500@510 corner: 540@570
480@510 corner: 560@570
511.5d@523.5d
480@530 corner: 500@550
480@560
500@560
480@550 corner: 500@570
660@500
680@500
560@500 corner: 560@560
9.0d
540@560
560@560
540@550 corner: 560@570
480@540
500@540
280@250
250@250 corner: 250@250
9.0d
230@250
250@250
230@240 corner: 250@260
170@250
190@250
150@250 corner: 150@250
9.0d
130@250
150@250
130@240 corner: 150@260
70@210
90@210
60@210 corner: 60@500
102.0d@315.5d corner: 127.0d@324.5d
373.0d@495.5d corner: 398.0d@504.5d
43.0d@205.5d corner: 68.0d@214.5d
23.0d@475.5d corner: 48.0d@484.5d
Key2
50@480
70@480
9.0d
25.0d
Key2
180@360
200@360
260@360
9.0d
240@360
260@360 corner: 260@360
T
260@360
280@360
340@360
Свет
27@-22.368421145093d
25.0d
3@10.0d
7.0d
287@307.63157885491d corner: 318.0d@325.63157885491d
center
9.0d
320@360
340@360 corner: 340@440
342@356.5d corner: 357.0d@363.5d
643.0d@436.5d corner: 658.0d@443.5d
B4
660@440
680@440
660@430 corner: 680@450
660@450 corner: 680@470
660@470 corner: 680@490
660@490 corner: 680@510
736.31579005487d@490 corner: 756.31579005487d@510
756.31579005487d@500
Bit_Reg_8
31460175-184d-465c-9ffb-f43c8960cfb1
Bit_Reg_8
register=0;
bitWrite(register, 0, B0);
bitWrite(register, 1, B1);
bitWrite(register, 2, B2);
bitWrite(register, 3, B3);
bitWrite(register, 4, B4);
bitWrite(register, 5, B5);
bitWrite(register, 6, B6);
bitWrite(register, 7, B7);
Reg = register ;
56.315790054871d
20.0d
736.31579005487d@500
750@280 corner: 750@500
758.31579005487d@495.5d corner: 801.31579005487d@504.5d
705.0d@275.5d corner: 748.0d@284.5d
Registr B
750@280
770@280
18.0d
827.36842164703d@260
847.36842164703d@260
17.0d
827.36842164703d@280
847.36842164703d@280
57.368421647027d
770@260
406.31579005487d@250 corner: 406.31579005487d@260
408.31579005487d@245.5d corner: 452.31579005487d@254.5d
704.0d@255.5d corner: 748.0d@264.5d
Registr A
20.0d
386.31579005487d@250
406.31579005487d@250
386.31579005487d@240 corner: 406.31579005487d@260
310@250
56.315790054871d
330@250
1070@270
980@270 corner: 980@270
9.0d
960@270
980@270
960@260 corner: 980@280
880@250
880@270
900@250
746.0d@200 corner: 746.0d@250
pwm
23.0d
726.0d@200
746.0d@200
open
34820891-d422-4290-95ca-51aeea963eb3
открытие дискретного клапана
2a9d3a91-6cf8-4944-97ba-fb003381c1ff
close
836745c6-46fc-4bea-bc2f-e5c46a3fb32c
закрытие дискретного клапана
33b4d3f5-0311-41a8-8aa8-468fdf2b50f8
pwm
890f5fb2-becd-4bcc-aff5-4104a96e4e9e
ШИМ на нагреватель
b2f9a78c-ec80-4e5e-9e10-048602fe0792
7eae5812-c3a8-46f1-8369-7aeba1df129c
ok = false;
time = millis() - time_old;
if (time > period)
{
time_old = millis();
E_pid = Set - Value;
Pr = Kp * E_pid;
Integ = Integ + ( E_pid / Ki );
Integ = constrain( Integ, -Max_int, Max_int );
Df = Kd * ( E_pid - E_pid_old );
Y = Pr + Integ + Df;
E_pid_old = E_pid;
Y_PID = int (Y);
Y_PID = constrain( Y_PID, -100, 100 );
Y_PWM = map( Y_PID, -100, 100, 0, 100 );
ok = true;
}
397
E_pid
;
float
E_pid_old
;
float
Pr
;
float
Integ
;
float
Df
;
float
Y
;
float
time
;
long
time_old
;
long
726.0d@190 corner: 746.0d@210
640@120
PID_v3
8bf73e50-2148-40cb-ab79-614ad0a2bcf5
PID_v3
Классический ПИД регулятор.
Регулятор может управлять нагревателем/холодильником и аналоговыми ИМ.
-------------------------------------------------------------------------------------------------------------------------
Расчет мощности идет по формуле PWR = Kp*E(t)+сумма(E(t)/Ki)+Kd*dE(t), где
E(t) - рассогласование (уставка - вход),
dE(t) - дельта рассогласования по сравнению с предыдущим измерением,
Kp,Ki,Kd - коэфф ПИД.
------------------------------------------------------------------------------------------------------------------------
Входы блока:
period - период работы ПИД и ШИМ в милисекундах.
Value - входная величина
Set - уставка
Kp - коэффициент пропорциональной составляющей >= 0
Ki - коэффициент интегральной составляющей >= 0 (интеграл отключается при Ki=0)
Kd - коэффициент дифференциальной составляющей >= 0
------------------------------------------------------------------------------------------------------------------------
Параметры пользователя:
MaxPow - максимальная мощность на выходе, %
MinPow - минимальная мощность на выходе, %
MinPulse - минимальное время импульса на дискретных выходах, мс
------------------------------------------------------------------------------------------------------------------------
Выходы блока:
PWR - выходная мощность 0..1000 (0..+100,0%)
pwm - медленный ШИМ на нагреватель/холодильник
------------------------------------------------------------------------------------------------------------------------
Просто о составляющих ПИД (для простоты в качестве регулируемого параметра возьмем температуру):
("уставка" - "текущая температура") = ошибка регулирования.
Пропорциональная составляющая - мощность на выходе равна ("ошибка регулирования") * Kp,
чем больше коэфф. Kp, тем больше мощность. Если уставка = 40, температура = 30, Kp = 2, то мощность = 20%.
Если температура = уставке, то Пропорц = 0.
Интегральная составляющая - каждый период работы регулятора мощность на выходе будет увеличиваться
или уменьшаться на величину ("ошибка регулирования") / Ki, можно сказать, что интегр. составл. это
накопитель мощности и чем меньше коэфф. Ki, тем быстрее мощность будет возрастать или уменьшаться.
Если уставка = 40, температура = 30, Ki = 5, то мощность будет прибавляться на 2% каждый период.
Если температура = уставке, то мощность не меняется.
Дифференциальная составляющая - мощность на выходе равна:
("ошибка регулирования сейчас" - "ошибка регулирования в прошлом периоде") * Kd.
Этот параметр следит за скоростью изменения температуры. Если коэфф Kd = 6, сейчас ошибка регулирования = 5,
а в предыдущий период была = 10 (т.е. температура возросла на 5 градусов), то мощность на выходе будет
равна (-5*6) = -30%. Дифф составляющая уменьшила мощность, потому как температура очень сильно начала
подниматься. Если температура стабильна, то Дифф = 0.
Полная мощность ПИД-регулятора считается по формуле PWR = (пропорц + интегр + дифф).
Допустим мощность, накопленная в интегральной составляющей = 42%, тогда в нашем случае
PWR = 20+42-30 = 32%. Из этого примера видно, как "П" и "Д" оперативно помогают медленно меняющейся "И"
корректировать выходную мощность в зависимости от текущего состояния объекта регулирования.
--------------------------------------------------------------------------------------------------------------------------
Автор: Boroda.
3342
MaxPow
100
максимальная мощность на выходе, %
aed3d637-8bff-4a8d-a323-53f21e98357d
08f63c69-b224-4e1d-874b-8b53a09d0d67
MinPow
минимальная мощность на выходе, %
91918907-ce2a-493d-bfd7-fcf0eb2a5db7
eac7e8bf-f32a-4df4-85a8-c49b017ba62a
MinPulse
минимальное время импульса на дискретных выходах, мс
fdafe58d-f887-41d8-87d9-5015a629e428
b200a7cf-4092-48d8-aec3-59bbda62049d
// PID_v2
ok = false;
time = millis() - time_old;
if (time > period) // период работы ПИД
{
time_old = millis();
time = 0;
E_pid = (Set - Value) * 10; // *10 так как диапазон выходных данных до 1000, чтоб получить мощность с дискретностью 0,1%
Pr = Kp * E_pid; // пропорциональная составляющая
Pr = constrain( Pr, (-1000.0), (1000.0) ); // ограничиваем +/-1000
if (Ki>0)
{
Integ = Integ + ( E_pid / Ki ); // интегральная составляющая
Integ = constrain( Integ, (MinPow * 10), (MaxPow * 10) ); // ограничиваем интегральную составляющую 0..100%
}
else
{ Integ = 0; }
Df = Kd * ( E_pid - E_pid_old ); // дифференциальная составляющая
Df = constrain( Df, (-1000.0), (1000.0) ); // ограничиваем +/-1000
E_pid_old = E_pid;
PWR = int(Pr + Integ + Df); // считаем текущую мощность
PWR = constrain( PWR, (MinPow * 10), (MaxPow * 10)); // ограничиваем текущую мощность 0..100%
if ( PWR > 0 ) { pwm = true; } // если мощность больше нуля, то включаем выход PWM
temp1 = ( (period * abs(PWR)) / 1000 ); // вычисляем время импульса от общего периода ШИМ
if (temp1 < MinPulse) { pwm = false; } // если импульс короче Min_pulse, то отключаем выход PWM
ok = true; // расчет произведен
}
if (time >= temp1) { pwm = false; } // если время вышло, то отключаем выход PWM
1278
E_pid
;
float
E_pid_old
;
float
Pr
;
float
Integ
;
float
Df
;
float
time
;
unsigned long
time_old
;
unsigned long
temp1
;
unsigned long
66.0d
660@120
620@120 corner: 620@470
622@466.0d corner: 705.0d@474.0d
555.0d@116.0d corner: 638.0d@124.0d
Тем. тек для PiD
9.0d
600@470
620@470
600@460 corner: 620@480
520@430
540@430
570@220
590@220 corner: 699.0d@240
570@220 corner: 719.0d@240
600@234.5d
460@180
480@180 corner: 540@240
460@180 corner: 560@240
494.5d@194.0d
200@160
220@160 corner: 259.47368458037d@240
200@160 corner: 279.47368458037d@240
226.23684229019d@173.5d
EN
200@190
214@190
bme280
afd76321-c243-4d29-9374-ccde074f84d0
74742f7e-11ba-4be7-8fd2-e9432e4b8441
adr
46f9b6a5-b639-47d6-b33b-5eb9907c6d6c
26fefc2b-fb56-48fe-98a0-cf5230d6d229
err
6e17af8b-c3e7-47e8-92fd-c0faa67b1205
cca7eca0-43a3-4fcf-8ff5-8fcda0bc67cb
T
51280c4d-c719-4bd2-a4c2-3f8e9d119a5a
Температура в градусах С
8f02bd03-372b-440c-8640-497d3d231945
H
e200e949-59ad-47e5-b384-a28582dee47e
Влажность в %
aa64d150-f398-4bc6-a11e-c81b3eda0d8e
P
e78fdf24-0cee-4a9a-8f84-45bdad96ca43
Давление в кПа
509c5d6d-36ab-4276-9b1b-240186fff79e
A
32b1a9ad-1274-41ad-99b3-a906fa5680ae
Высота над уровнем моря в м
3c8c0c80-36ea-470c-9417-2c9ea5fd8b80
015ac691-2293-4200-ae1e-4ddf85d6ba90
3.bme280:Сенсор Bosh T,H,P
Блок чтения сенсора BME280 (температура, влажность, атмосферное давление, высота)
1. Поддерживает подключение через i2c(проверено), SPI(в работе), через 4-пина - программный SPI (в работе).
2. Поддерживает одновременную работу с несколькими сенсорами (в т.ч. и с разными интерфейсами подключения);
3. Точность измерения 20 разрядов АЦП для температуры и давления и 16 разрядов АЦП для влажности.
4. Измерение производится через программные прерывания - длительность цикла не более 300 мкс при скорости шины i2c 400кГц.
5. Измерения каждого параметра (T,H,P) занимает 2 программных вхождения.
В терминах FLProg/EIS рекомендуется использовать блок в "свободной" задаче.
6. Периодичность вызова определяется параметрами id.periodTemper(default=20 - 1сек), id.periodHum(default=40 -2 сек), id.period.Press(default=60 -3 сек)-
значения в тиках. Максимальное значение 255. 1 тик=50мс. Если значение параметра=0, соответствующий параметр не опрашивается.
7. При обрыве связи на время более 5сек (параметр id.periodErr=100) взводится флаг id.err и устанавливаются значения по умолчанию
id.T=20.5 (градусы С); id.H=40.5(%); id.P=1000.5(кПа); id.A=35.5(м);
8. При восстановление связи повторно считываются из сенсора и записываются в сенсор коректирующие коэффициенты и настроечные параметры
и производятся измерения.
9. При обновлении данных взводится флаг id.fresh, который сбрасывается пользователем.
10. Подробное использование параметров приведено в datasheet BME280 BOSH.
-----------------------------------------------------------------------------------------------------------------------------------
ecoins@mail.ru 07.08,20 v.1.1
1660
ИНТЕРФЕЙС
I - i2c; S -SPI; P- 4-пина (softSPI)
48418a91-e092-4aaa-9b39-a7e988aa2e69
I
a4e2413d-e5e5-4679-8eeb-cb9b1e15928f
//--Блок BME280 (температура, влажность, атмосферное давление, высота)
if(!id.custom) {RT_HW_bme280.setID(id, ИНТЕРФЕЙС ,(int8_t)adr);} RT_HW_bme280.directDevice(id); if(id.fresh) {id.fresh=0; T=id.T; H=id.H; P=id.P; A=id.A; err=id.err;}
237
id.custom=0;
#include
"RT_HW_BME280.h"
--Создание объекта с данными под сенсор.
id
;
RT_HW_BME280_ID
ec8b2224-edce-461e-b11b-6cc7cce92bc6
//--Блок BME280 (температура, влажность, атмосферное давление, высота)
if(!id.custom) {RT_HW_bme280.setID(id, ИНТЕРФЕЙС ,(int8_t)adr);}
if(EN) {RT_HW_bme280.directDevice(id); if(id.fresh) {id.fresh=0; T=id.T; H=id.H; P=id.P; A=id.A; err=id.err;}}
247
200@180 corner: 214@200
14.0d
259.47368458037d@190
279.47368458037d@190
259.47368458037d@180 corner: 279.47368458037d@200
259.47368458037d@200 corner: 279.47368458037d@220
460@280
480@280 corner: 540@340
460@280 corner: 560@340
494.5d@294.0d
460@310
300@330
320@330 corner: 400@370
300@330 corner: 420@370
332.0d@343.5d
420@360
71010809
Q
9.0d
400@360
420@330 corner: 420@360
460@330
480@330
560@320
580@320 corner: 677.0d@340
560@320 corner: 697.0d@340
590@334.0d
560@330
8.0d
77.0d
HTU влажность
440@470
460@470 corner: 513.0d@570
440@470 corner: 533.0d@570
465.0d@483.5d
440@500
460@500
440@490 corner: 460@510
440@520
454@520
440@510 corner: 454@530
440@540
460@540
440@530 corner: 460@550
440@550 corner: 460@570
2 строка
45.0d
3@12.0d
9.0d
466@445.52631567059d corner: 517.0d@465.52631567059d
~
L
1
53.0d
440@560
460@560
580@330
560@330 corner: 560@330
9.0d
540@330
560@330
480@310
279.47368458037d@230 corner: 279.47368458037d@310
8.0d
259.47368458037d@230
279.47368458037d@230
259.47368458037d@220 corner: 279.47368458037d@240
279.47368458037d@210
htu21
c74caa1c-834a-4d73-8102-2128db5b1264
2.htu21:i2c cенсор T,H
Блок сенсора HTU21 (температура, влажность).
1. Поддерживает подключение через i2c.
2. Измерение производится через программные прерывания.
В режиме обращения к сенсору через i2c длительность цикла не более 300 мкс (при скорости шины i2c 400кГц).
В режиме ожидания события по времени не более 14мкс (для AVR328).
5. Измерения каждого параметра (T,H) занимает 2 программных вхождения (разделенные длительностью 60мс);
6. В терминах FLProg/EIS рекомендуется использовать блок в "свободной" задаче.
Возможно использовать и в быстрых,оперативных и фоновых задачах.
7. Периодичность вызова определяется параметрами пользователя.
По умолчанию периоды: температура - 1200мс (не менее 1000мс);
влажность - 2000мс (не менее 1500мс);
значения в тиках. Максимальное значение 255. 1 тик=50мс. Если значение параметра=0, соответствующий параметр не опрашивается.
7. При обрыве связи на время более 5сек (параметр id.periodErr=100) взводится флаг id.err и устанавливаются значения по умолчанию
id.T=20.5 (градусы С); id.H=40.5(%); id.P=1000.5(кПа); id.A=35.5(м);
8. При восстановление связи повторно считываются из сенсора и записываются в сенсор коректирующие коэффициенты и настроечные параметры
и производятся измерения.
9. При обновлении данных взводится флаг id.fresh, который сбрасывается пользователем.
10. Подробное использование параметров приведено в datasheet BME280 BOSH.
-----------------------------------------------------------------------------------------------------------------------------------
ecoins@mail.ru 07.08,20 v.1.1
1581
ПЕРИОД_ОПРОСА_ТЕМПЕРАТУРЫ_МС
1200
ПЕРИОД_ОПРОСА_ВЛАЖНОСТИ_МС
2000
f4c6012d-67fb-490c-a320-dbc4b2e2b0f9
1d8789a8-037f-4d3b-887d-6ce67e19a9d9
//--Блок HTU21 (температура, влажность)
if(id.custom==0) {RT_HW_htu21.setID(id, ПЕРИОД_ОПРОСА_ТЕМПЕРАТУРЫ_МС , ПЕРИОД_ОПРОСА_ВЛАЖНОСТИ_МС );}
RT_HW_htu21.direct(id,EN); err=id.err; T=id.valTmp; H=id.valHum;
208
#include
"RT_HW_HTU21.h"
--Создание объекта с данными под сенсор.
id
;
RT_HW_HTU21_ID
39.473684580372d
8.0d
259.47368458037d@210
279.47368458037d@210 corner: 279.47368458037d@210
460@210
480@210
300@240
320@240 corner: 400@280
300@240 corner: 420@280
332.0d@253.5d
420@270
165572374
9.0d
400@270
420@230 corner: 420@270
460@230
480@230
560@230
9.0d
540@230
560@230 corner: 560@230
570@230
590@230
9.0d
89.0d
HTU температура
440@420
460@420
440@410 corner: 460@430
1 строка
44.0d
3@12.0d
9.0d
466@305.5263156706d corner: 516.0d@325.5263156706d
~
L
1
440@360
460@360
260@350
280@350 corner: 330.00000050193d@430
260@350 corner: 350.00000050193d@430
284.00000025097d@363.5d
260@370 corner: 280@390
260@400
274@400
260@390 corner: 274@410
260@420
280@420
260@410 corner: 280@430
1 строка
44.0d
3@12.0d
9.0d
285@325.5263156706d corner: 335.0d@345.5263156706d
C
tW>
260@380
280@380
260@490
280@490 corner: 330.00000050193d@570
260@490 corner: 350.00000050193d@570
284.00000025097d@503.5d
2 строка
45.0d
3@12.0d
9.0d
285@465.52631567059d corner: 336.0d@485.5263156706d
C
H%>
260@540
274@540
260@560
280@560
260@520
280@520
140.0d@26.5d corner: 155.0d@33.5d
183.0d@26.5d corner: 198.0d@33.5d
773.0d@156.5d corner: 788.0d@163.5d
663.0d@46.5d corner: 678.0d@53.5d
423.0d@636.5d corner: 438.0d@643.5d
243.0d@656.5d corner: 258.0d@663.5d
213.0d@786.5d corner: 228.0d@793.5d
323.0d@786.5d corner: 338.0d@793.5d
423.0d@786.5d corner: 438.0d@793.5d
423.0d@356.5d corner: 438.0d@363.5d
243.0d@376.5d corner: 258.0d@383.5d
423.0d@496.5d corner: 438.0d@503.5d
243.0d@516.5d corner: 258.0d@523.5d
lcd
440@640
460@640
440@680
460@680
440@660
454@660
1180@710
24
1160@770
1180@770 corner: 1220@830
1160@770 corner: 1240@830
1188.5d@783.5d
990@730
1010@730 corner: 1070@810
990@730 corner: 1090@810
1024.0d@743.5d
860@730
880@730 corner: 920@770
860@730 corner: 940@770
886.5d@744.5d
670@710
690@710 corner: 730@770
670@710 corner: 750@770
698.5d@723.5d
670@740
684@740
22
550@740
570@740 corner: 610@780
550@740 corner: 630@780
576.5d@754.5d
550@770
564@770
630@770
9.0d
610@770
630@760 corner: 630@770
670@760
690@760
750@760
9.0d
730@760
760@760 corner: 760@760
860@760
880@760
940@760
9.0d
920@760
940@760 corner: 940@760
990@760
1010@760
990@750 corner: 1010@770
990@780
1010@780
966.0d@783.5d
990@770 corner: 1010@790
21
840@780
860@780 corner: 920@820
840@780 corner: 940@820
879.0d@793.5d
840@810
860@810
940@810
2400
9.0d
920@810
940@800 corner: 940@810
990@800
1010@800
990@790 corner: 1010@810
1070@790 corner: 1090@810
1090@800
9.0d
1070@800
1090@800 corner: 1090@800
1160@800
1180@800
1160@820
1260@810
1280@810 corner: 1417.0d@830
1260@810 corner: 1437.0d@830
1290@824.5d
1260@820
Короткое нажатие Key1
1280@820
1240@820 corner: 1240@820
9.0d
1220@820
1240@820
1174@820
400@520 corner: 400@820
1092@706.5d corner: 1120.0d@713.5d
1130.0d@706.5d corner: 1158.0d@713.5d
1130.0d@816.5d corner: 1158.0d@823.5d
370.0d@516.5d corner: 398.0d@523.5d
Menu
9.0d
1070@710
1090@710
1070@700 corner: 1090@720
990@710
1010@710
940@710 corner: 940@710
9.0d
920@710
940@710
880@710
750@680 corner: 750@810
752@675.5d corner: 867.0d@684.5d
743.0d@705.5d corner: 858.0d@714.5d
723.0d@805.5d corner: 838.0d@814.5d
Длинное нажатие Key1
9.0d
730@680
750@680
730@670 corner: 750@690
670@680
690@680
630@680 corner: 630@740
9.0d
610@720
630@720
610@710 corner: 630@730
550@700
S
570@700
540@700 corner: 540@700
9.0d
520@700
540@700
2500
460@700
70@190 corner: 70@770
102.0d@285.5d corner: 126.0d@294.5d
414.0d@695.5d corner: 438.0d@704.5d
524.0d@715.5d corner: 548.0d@724.5d
524.0d@765.5d corner: 548.0d@774.5d
684.0d@315.5d corner: 708.0d@324.5d
44.0d@185.5d corner: 68.0d@194.5d
Key1
710@320
730@320
710@310 corner: 730@330
710@340
730@340
710@330 corner: 730@350
770@330 corner: 790@350
790@340
9.0d
770@340
790@340 corner: 790@340
MU
830@340
850@340
830@330 corner: 850@350
MD
830@360
850@360
830@350 corner: 850@370
830@370 corner: 850@390
830@390 corner: 850@410
830@410 corner: 850@430
830@430 corner: 850@450
930@390 corner: 950@410
930@410 corner: 950@430
930@430 corner: 950@450
Menu
Clock
25114385
Graphics.ColorValue blue
r0g0b31
Save
170811777
Graphics.ColorValue black
r0g0b0
customText
1.1
Save on
Save off
Chas
94061088
dec
1.2
Minuta
78084620
1.3
59
1
Pid Hot
83244604
Time
2.1
20000
Kp
2.2
150
0.1
Ki
2.3
0.1
19.5
Kd
2.4
0.1
0.4
2
Service
53073332
tO Correct
3.1
-5
0.01
tW Correct
3.2
0.01
H% Correct
3.3
0.01
3
Lotki
199244162
Lotok auto
234798203
4.1
4
Set Temp
238655316
Set temp Hot W
5.1
40
0.1
37.5
5
DoubleAcceleration
4000
1060@300
1060@300 corner: 1356.0d@334.0d
Эта задача работает со строками - это занимает время.
Лучше её вызывать как быструю задачу - это 1 раз в 100мс
Эта задача работает со строками - это занимает время.
278.0d
3@12.0d
9.0d
Лучше её вызывать как быструю задачу - это 1 раз в 100мс
290.0d
3@26.0d
9.0d
928.0d
Вывод на дисплей
20@90
20@90 corner: 371.0d@186.0d
Вывод на дисплей использует библиотеку, которая длч оптимизации
времени процессора осуществляет вывод одного символа
через выполнение несколько микроопераций.
Для вывода строки 10 символов приходиться делать иногда
несколько десятков (это по смыслу, но не точно) вхождений в блок.
ПОЭТОМУ ЭТА ЗАДАЧА ВСЕГДА СВОБОДНАЯ !!!
Вывод на дисплей использует библиотеку, которая длч оптимизации
345.0d
3@13.0d
10.0d
времени процессора осуществляет вывод одного символа
293.0d
3@25.0d
7.0d
через выполнение несколько микроопераций.
230.0d
3@40.0d
10.0d
Для вывода строки 10 символов приходиться делать иногда
303.0d
3@54.0d
9.0d
несколько десятков (это по смыслу, но не точно) вхождений в блок.
338.0d
3@69.0d
10.0d
ПОЭТОМУ ЭТА ЗАДАЧА ВСЕГДА СВОБОДНАЯ !!!
244.0d
3@83.0d
9.0d
0.0d
3@88.0d
0.0d
70@50
70@50 corner: 148.0d@71.0d
Дисплей 20x4
72.0d
3@13.0d
10.0d
190@50
190@50 corner: 333.0d@70.0d
Вывод в 1 колонку 1 строки
137.0d
3@12.0d
9.0d
958.0d
Сенсоры влажности и температуры
88.0d
Плата выходов контроллера
MCP23017
668.0d
Часы реального времени
590@50
610@50 corner: 690@130
590@50 corner: 710@130
490@50
510@50 corner: 570@90
490@50 corner: 590@90
410@30
430@30 corner: 470@90
410@30 corner: 490@90
300@10
320@10 corner: 360@70
300@10 corner: 380@70
160@10
180@10 corner: 260@50
160@10 corner: 280@50
20@60
40@60 corner: 120@100
20@60 corner: 140@100
140@90
120@90
Hour
590@100
140@40 corner: 140@100
Value
160@40
280@40
Q
260@40
280@40 corner: 280@40
300@40
150@130
170@130 corner: 250@170
150@130 corner: 270@170
20@130
40@130 corner: 120@170
20@130 corner: 140@170
140@160
120@160
Min
590@120
140@120 corner: 140@160
150@160
270@160
250@160
270@60 corner: 270@160
300@60
380@60
360@60
380@60 corner: 380@60
410@60
270@130
290@130 corner: 370@170
270@130 corner: 390@170
390@160
370@160
390@80 corner: 390@160
410@80
490@80
470@80
490@80 corner: 490@80
490@80
590@80
570@80
590@80 corner: 590@80
EN
590@80
88.0d
Поворот лотков
360@100
380@100 corner: 440@360
360@100 corner: 460@360
395.0d@114.5d
Sel
360@350
380@350
v0
360@130
380@130
352.0d@133.5d
v1
43200
360@150
380@150
328.0d@153.5d
v2
21600
360@170
380@170
328.0d@173.5d
v3
11400
360@190
380@190
329.0d@193.5d
v4
10800
360@210
380@210
329.0d@213.5d
v5
8640
360@230
380@230
334.0d@233.5d
v6
7200
360@250
380@250
334.0d@253.5d
v7
6172
360@270
380@270
334.0d@273.5d
v8
5400
360@290
380@290
334.0d@293.5d
v9
4800
360@310
380@310
334.0d@313.5d
v10
4320
360@330
380@330
334.0d@333.5d
Q
9.0d
440@350
460@350
441.0d
PiD нагреватель увлажнитель
578.0d
9600
arduinoIDE
allInOne
landscape
all
223
4096
193244538
57
ESP8266 NodeMcu v3
109802410
default