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