Contr1 Tags1 Outputs1 Variables1 0@0 LibraryRoot LibraryGroup-Триггеры LibraryGroup-Дисплеи LibraryGroup-Датчики LibraryGroup-Датчики температуры LibraryGroup-Конвертация типов LibraryGroup-Другие 0@-273 327 0@0 45 296 0@0 root 2 0@0 1 6 3 30@0 50@0 corner: 113.0d@120 30@0 corner: 133.0d@120 55.0d@13.5d quick 26.0d 113.0d@30 133.0d@30 RT.shed+ 9f53be78-23e3-49fb-9e36-7e1053b224d6 27912915-0b95-4069-ada5-41460abbd2b6 fast 85a4d73d-eeb3-4fb6-a664-baca19b3de8a fe3dc41f-30be-44f8-b963-5b637c795e4e slow 88b371df-2329-4477-82fc-4cabfeb9a454 7656bcd6-5562-4f08-a24b-48f9f6822a32 back bd536d28-0990-454d-869b-5205b56a2c4e 62ae6443-d664-47db-8f54-309321c01bf0 frdm 3b98dea2-1ca2-4b5c-946a-b095467b5db8 c90e7821-0c4e-4637-9bf4-9be3242e04a8 504d8d2e-70f5-4174-b84b-2a3d9abc381c 02.RT.sheduler+:Диспетчер задач //---ДИСПЕТЧЕР СИСТЕМЫ ----------------------------------------------------------------------------- //RT_HW_Boards.Task.: // Вход: // кратность периодов: qntPeriodSlow, qntPeriodBack; // кол-во задач: qnt.quick,qnt.fast,qnt.slow,qnt.back,qnt.frdm; // Выход: // события: tick10,tick25,tick50,tick100,quick,fast,slow,frdm; // меандры: blink10,blink25,blink50,blink100; // blinkQuick, blinkFast, blinkSlow, blinkBack, blinkFrdm; // blinkQUICK, blinkFAST, blinkSLOW, blinkBACK, blinkFRDM; // номера задач как событие: num.quick, num.fast, num.slow, num.back, num.frdm; // номера задач: cnt.quick, cnt.fast, cnt.slow, cnt.back, cnt.frdm; // управление: reset,init,permit; //-------------------------------------------------------------------------------------------------- 856 Кол-во срочных задач 5 e582967a-3cee-4784-9c0f-fbd66bc9247f 12c1c454-1449-4d28-847e-ef465e42dddf Кол-во быстрых задач 4 6692fa72-0a8e-4440-92e2-adb9ea04987a 1db156e7-ff01-4f0f-b610-bc6cc7cda45d Кол-во медленных задач 3d2620be-a9a7-4722-9ba3-e0a6bd518915 38d39482-a6b3-4d48-a6cb-9a50e97ede4d Кол-во фоновых задач 303077b1-0063-4f9f-b7d8-c694e78aa340 766fbed5-97c3-4b8d-ae56-3a05254d81b8 Кол-во свободных задач 20 a20d0a9e-cd9d-4f46-9fe3-d7a4b67f9e9d fb3350d2-f2fa-4b44-b12d-425fa9f0922f Разрешить инициализацию i2c в диспетчере 'Y' - разрешить; 'N' - запретить 16ee3521-ef95-4da4-8b91-e94c2156ce04 Y bfa4a085-99eb-46d1-bbcc-584b5f9f2cc4 Разрешить инициализацию консоли в диспетчере 'Y' - разрешить; 'N' - запретить 3d3ed151-9ea0-42df-9387-3603973316e7 Y e8d456d0-0740-4ef1-820d-5f62dc6a5702 //-------------------------------------------------------------------------------------------------- switch(RT_HW_Boards.dir){default: RT_HW_Boards.dir=0; case 0: RT_HW_Boards.pinSetDOT_ALL(); //--Установка всех пинов на выход;; RT_HW_Boards.Task.qnt.quick= Кол-во срочных задач ; RT_HW_Boards.Task.qnt.fast = Кол-во быстрых задач ; RT_HW_Boards.Task.qnt.slow = Кол-во медленных задач ; RT_HW_Boards.Task.qnt.back = Кол-во фоновых задач ; RT_HW_Boards.Task.qnt.frdm = Кол-во свободных задач ; RT_HW_Boards.Console.permit=true; if( Разрешить инициализацию i2c в диспетчере == 'Y') RT_HW_Boards.i2c_begin(); //--Инициализация i2c RT_HW_Boards.dir++; case 1: RT_HW_Boards.sheduler(); //--Вызов диспетчера планировщика здач; break; } //---Вывод параметров; quick=RT_HW_Boards.Task.num.quick; fast=RT_HW_Boards.Task.num.fast; slow=RT_HW_Boards.Task.num.slow; back=RT_HW_Boards.Task.num.back; frdm=RT_HW_Boards.Task.num.frdm; //-------------------------------------------------------------------------------------------------------- 1150 #include "RT_HW_BOARDS.h" 113.0d@20 corner: 133.0d@40 19.0d 113.0d@50 133.0d@50 113.0d@40 corner: 133.0d@60 140@60 160@60 corner: 295.0d@80 140@60 corner: 315.0d@80 164@75.0d 140@60 corner: 160@80 0.0d 295.0d@70 315.0d@70 295.0d@60 corner: 315.0d@80 140@70 10.0d 127.0d Номер медленной задачи 160@70 133.0d@70 corner: 133.0d@70 23.0d 113.0d@70 133.0d@70 113.0d@60 corner: 133.0d@80 113.0d@90 133.0d@90 113.0d@80 corner: 133.0d@100 140@100 160@100 corner: 293.0d@120 140@100 corner: 313.0d@120 164@115.0d 140@100 corner: 160@120 293.0d@110 313.0d@110 293.0d@100 corner: 313.0d@120 140@110 125.0d Номер свободной задачи 160@110 133.0d@110 corner: 133.0d@110 113.0d@110 133.0d@110 113.0d@100 corner: 133.0d@120 Task.shed+ ab76c5db-8b13-4823-b1b7-f16d6202499b 02.Task.shed+:диспетчер задач с выводом номеров задач RT_HW_Task.sheduler(); //--Вызов диспетчера задач; quick=RT_HW_Task.Shed.quick.num; fast =RT_HW_Task.Shed.fast.num; slow =RT_HW_Task.Shed.slow.num; back=RT_HW_Task.Shed.back.num; frdm= RT_HW_Task.Shed.frdm.num; //-------------------------------------------------------------------------------------------------------- 325 #include "RT_HW_TASK.h" 63.0d 260@0 280@0 corner: 314.0d@40 260@0 corner: 334.0d@40 285.0d@13.5d blink пин DO pin a12f003b-579d-46ac-9650-282bb96bc64a ffb0b749-ec28-4014-9aa6-ced3149358a6 val 4f74aeeb-5313-4320-8c0f-c11babcff491 7f4d07f9-f51d-469a-a888-ff89960b9429 44636600-f522-487d-a48e-491b727da656 21.пин DO -Вывод на пин дискретного вывода ОТКРЫТЫЙ ВЫХОД N - обычный выход; Y - открытый выход; 631127a0-0cf9-4a8c-9c00-46264b7dbd5d N f4816995-55a5-4b44-aebf-68139308f60e ИНВЕРСИЯ ВЫХОДНОГО ЗНАЧЕНИЯ N -обычный выход; Y -инверсный выход; 6dbab3c2-8b51-4b6b-87ad-0e7c79c47ffb N 235ef8fc-bba7-4c40-a8a6-9cf995f5b72e ВЫВОД ПОСТОЯННЫЙ N - вывод только когда изменяется входной сигнал; Y -вывод постоянный 9eaa6191-c768-47f8-b6f2-3cd36315f1ac N a0c0626e-be18-4a51-867b-6dbecdc11850 if(!id.dir) {RT_HW_Boards.pinModeDOT (id, pin, ОТКРЫТЫЙ ВЫХОД , ИНВЕРСИЯ ВЫХОДНОГО ЗНАЧЕНИЯ , ВЫВОД ПОСТОЯННЫЙ , val);} //Настройка дискретного вывода RT_HW_Boards.pinWriteDOT(id,val); //--Вывод на дискретный пин; 254 #include "RT_HW_BOARDS.h" id ; RT_HW_BOARDS_DOT_ID 08971110-7534-490d-a550-5676f9514482 00.blink:мерцание на дискретном пине //-----------------------Вывод на дискретный пин------------------------------------ if(dir<0) {if((pin>=0) && (pin<=127)) {dir=0; pinMode(pin,OUTPUT);}} else {if(dir) dir=0; else dir=1; digitalWrite(pin,dir);} 212 dir =-1; int8_t 9 260@30 280@30 252.0d@33.5d 34.0d 201.0d 50@0 70@0 corner: 134.0d@80 50@0 corner: 178.0d@80 75.0d@14.5d EN 50@30 64@30 frd_ds1820 fe5a4751-e1bb-495f-ad47-414ce97c8b92 e51d3655-5f70-4947-ab6c-154198ddc88d T_float 9fd89c6e-1fef-442d-b392-f3a4d4768e95 865c3993-5497-4a72-a2b2-5dfc2e642826 EN 41dca5e4-cc39-4e16-96a5-bbe43f828337 92932339-dee4-462c-9b3d-88689de258b9 41ee7ffc-98e3-4a9f-805b-8efb70b46e69 frd_ds1820 //---БЛОК ЧТЕНИЯ ДАТЧИКА ТЕМПЕРАТУРЫ DS1820 switch(step) { default: step=0; case 0: Serial.println(F("ds1820_0")); break; //if(( pin <0) || ( pin >=100)) {step=20; break;} //ds.begin(pin); period= ПЕРИОД ОПРОСА МС ; if(period<1000) period=1; cntErr=0; mode=0; T_float=20.0; step++; case 1: if (! EN ) { break;} step++; //----Проверка на внешнее разрешение измерения Serial.println(F("ds1820_1")); case 2: timeStart=millis(); ds.reset(); step++; break; case 3: ds.write(0xCC); ds.write(0x44,1); //--Начало преобразование с учетом сенсоров с "паразитным питанием" timeDelay=millis(); step++; //--Начало преобразование с учетом сенсоров с "паразитным питанием" case 4: if (getPastTime( timeDelay,millis()) <800) break; step++; //--Выдерживаем паузу для измерения сенсором case 5: ds.reset(); step++; Serial.println(F("ds1820_5")); break; case 6: ds.write(0xCC); ds.write(0xBE,mode); step++; Serial.println(F("ds1820_6")); break; case 7: ds.read_bytes(data, 9); crc=OneWire::crc8(data, 8); step++; break; case 8: if ((crc !=data[8]) || (data[4]==0)) {cntErr++; if(cntErr>5) {cntErr=5; T_float=NAN;} step=15; break;} step++; case 9: raw = (data[1] << 8) | data[0]; if (mode) {raw = raw << 3; if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; }} else {byte 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=(float)raw / 16.0; step=15; Serial.println(F("ds1820_9")); case 15: if (getPastTime( timeStart,millis()) <1000) break; Serial.println(F("ds1820_15")); step=1; break; case 20: break; } //--end switch //============================================== 1981 --Библиотека интерфейса 1-Wire #include "OneWire.h" --Создание объекта для ds1820 на пине 10 ds (10); OneWire --Тип датчика - новый/старый (0/1) mode ; uint8_t --Период опроса сенсора period ; int --Номер шага step =0; byte --Буфер для данных data [10]; byte --Результат raw ; int16_t --Буфер timeStart ; uint32_t timeDelay ; uint32_t crc ; byte cntErr ; byte if (t2>=t1) {return (t2-t1);} else {return (0xFFFFFFFF-t1+t2);}; 64 uint32_t getPastTime uint32_t &t1 uint32_t t2 658f8d13-e866-4eb5-a041-eac4326582c5 50@20 corner: 64@40 36.0d 134.0d@30 154.0d@30 134.0d@20 corner: 154.0d@40 170@40 190@40 corner: 300.0d@60 170@40 corner: 320.0d@60 200@54.5d 170@40 corner: 190@60 170@50 9.0d 90.0d Температура х 10 170@10 190@10 corner: 250@250 170@10 corner: 270@250 198.0d@24.5d 170@30 corner: 190@50 dp1 170@60 190@60 170@50 corner: 190@70 dp2 170@80 190@80 170@70 corner: 190@90 dp3 170@100 190@100 170@90 corner: 190@110 7 280@30 300@30 corner: 318.0d@50 280@30 corner: 338.0d@50 304@43.5d 280@30 corner: 300@50 280@40 7.0d A D3 digital 300@40 270@40 corner: 270@40 a1 12.0d 250@40 270@40 250@30 corner: 270@50 8 280@50 300@50 corner: 316.0d@70 280@50 corner: 336.0d@70 304@63.5d 280@50 corner: 300@70 280@60 8.0d B D7 300@60 270@60 corner: 270@60 b1 250@60 270@60 250@50 corner: 270@70 280@70 300@70 corner: 316.0d@90 280@70 corner: 336.0d@90 304@83.5d 280@70 corner: 300@90 280@80 C 15 0 14 A0 300@80 270@80 corner: 270@80 c1 11.0d 250@80 270@80 250@70 corner: 270@90 10 280@90 300@90 corner: 316.0d@110 280@90 corner: 336.0d@110 304@103.5d 280@90 corner: 300@110 280@100 D 17 16 A2 300@100 270@100 corner: 270@100 d1 250@100 270@100 250@90 corner: 270@110 11 280@110 300@110 corner: 316.0d@130 280@110 corner: 336.0d@130 304@123.5d 280@110 corner: 300@130 280@120 E 18 A3 300@120 270@120 corner: 270@120 e1 250@120 270@120 250@110 corner: 270@130 12 280@130 300@130 corner: 315.0d@150 280@130 corner: 335.0d@150 304@143.5d 280@130 corner: 300@150 280@140 F D4 300@140 270@140 corner: 270@140 f1 250@140 270@140 250@130 corner: 270@150 13 280@150 300@150 corner: 317.0d@170 280@150 corner: 337.0d@170 304@163.5d 280@150 corner: 300@170 280@160 G sck SPI D13 300@160 270@160 corner: 270@160 g1 250@160 270@160 250@150 corner: 270@170 dp 13.0d 250@180 270@180 250@170 corner: 270@190 280@190 300@190 corner: 314.0d@210 280@190 corner: 334.0d@210 304@203.5d 280@190 corner: 300@210 280@200 6.0d 1 D8 300@200 270@200 corner: 270@200 r1 250@200 270@200 250@190 corner: 270@210 280@210 300@210 corner: 316.0d@230 280@210 corner: 336.0d@230 304@223.5d 280@210 corner: 300@230 280@220 2 ss SPI D10 300@220 270@220 corner: 270@220 r2 250@220 270@220 250@210 corner: 270@230 280@230 300@230 corner: 316.0d@250 280@230 corner: 336.0d@250 304@243.5d 280@230 corner: 300@250 280@240 3 mosi SPI D11 300@240 270@240 corner: 270@240 r3 250@240 270@240 250@230 corner: 270@250 170@40 Val 190@40 190@50 154.0d@50 corner: 154.0d@50 Tx10 25.0d 134.0d@50 154.0d@50 77a50e7a-2cca-4f84-ba01-d482d01df5d3 dba23054-09dc-42cc-ab10-ecae646be35e Tx100 75076e91-8e49-4943-8e2e-accdebd7d92e 3c928ecd-24e2-430b-a2a3-e88a338a2e91 31fa5a63-ab95-4d5f-9db9-329eaee2579b НОМЕР ПИНА 5bd2d42d-e8f7-4ab0-b3a1-db337b39f873 eb31fa52-5929-4f5f-bb0d-fd571e16d833 РЕЖИМ ПИТАНИЯ 6193e6f0-5265-4731-b6d5-be7861e1ad0f 507af109-2b85-4aca-823c-db437a934993 ПЕРИОД ОПРОСА В МС 1500 ecdcd85c-24ec-40a7-b66c-55a2e4f0ee59 5b6c8fcd-29a9-4768-95a9-6c737ea7baa8 //---БЛОК ЧТЕНИЯ ДАТЧИКА ТЕМПЕРАТУРЫ DS1820 switch(step) { default: step=0; case 0: pin= НОМЕР ПИНА; if( ( pin <0) || ( pin >=100) ) {step=20; break;} period= ПЕРИОД ОПРОСА В МС ; if(period<1000) period=1000; cntErr=0; mode=0; T_float=20.0; timeStart=millis(); //ds.begin(pin); step=1; break; case 1: if (!EN) {break;} //----Проверка на внешнее разрешение измерения if ( getPastTime(timeStart,millis() ) >1500) { timeStart=millis()+period; step=2;} break; //------Операции по запуску измерения в датчике case 2: step=3; break; case 3: ds.reset(); //--Cброс шины; ds.write(0xCC, РЕЖИМ ПИТАНИЯ ); //--Пропуск адреса; ds.write(0x44, РЕЖИМ ПИТАНИЯ ); timeDelay=micros(); step=4; break; case 4: if ( getPastTime(timeDelay ,micros() ) >900) {step=5;} break; //------Операции по получению измеренных данных case 5: ds.reset(); //--Cброс шины; ds.write(0xCC, РЕЖИМ ПИТАНИЯ ); //--Пропуск адреса; ds.write(0xBE, РЕЖИМ ПИТАНИЯ ); //--Команда чтения памяти; ds.read_bytes(data, 9); //--Чтение буфера данных; step=6; break; case 6: crc=OneWire::crc8(data, 8); if ((crc !=data[8]) || (data[4]==0)) {cntErr++; if(cntErr>5) {cntErr=5; T_float=NAN;} step=1; break;} step=7; break; case 7: raw = (data[1] << 8) | data[0]; if (mode) {raw = raw << 3; if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; }} else {byte 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=(float)raw / 16.0; Tx100 =T_float*100; timeStart=millis(); step=1; break; case 20: break; } //--end switch //============================================== 2034 --Библиотека интерфейса 1-Wire #include "OneWire.h" --Создание объекта для ds1820 на пине 10 ds ( НОМЕР ПИНА ); OneWire --Тип датчика - новый/старый (0/1) mode ; uint8_t pin ; int8_t --Период опроса сенсора period ; int --Номер шага step =0; byte --Буфер для данных data [10]; byte --Результат raw ; int16_t --Буфер timeStart ; uint32_t timeDelay ; uint32_t crc ; byte cntErr ; byte if(timeEnd >= timeBegin) return (timeEnd-timeBegin); else return (0xFFFFFFFF-timeBegin+timeEnd); 96 uint32_t getPastTime uint32_t &timeBegin uint32_t timeEnd f79b1a4f-62a3-4e2b-836b-ca825f63f764 //---БЛОК ЧТЕНИЯ ДАТЧИКА ТЕМПЕРАТУРЫ DS1820 switch(step) { default: step=0; case 0: pin= НОМЕР ПИНА; if( ( pin <0) || ( pin >=100) ) {step=20; break;} period= ПЕРИОД ОПРОСА В МС ; if(period<1000) period=1000; cntErr=0; mode=0; T_float=20.0; timeStart=millis(); //ds.begin(pin); step=1; break; case 1: if (!EN) {break;} //----Проверка на внешнее разрешение измерения if ( getPastTime(timeStart,millis() ) >1500) { timeStart=millis()+period; step=2;} break; //------Операции по запуску измерения в датчике case 2: step=3; break; case 3: ds.reset(); //--Cброс шины; ds.write(0xCC, РЕЖИМ ПИТАНИЯ ); //--Пропуск адреса; ds.write(0x44, РЕЖИМ ПИТАНИЯ ); timeDelay=micros(); step=4; break; case 4: if ( getPastTime(timeDelay ,micros() ) >900) {step=5;} break; //------Операции по получению измеренных данных case 5: ds.reset(); //--Cброс шины; ds.write(0xCC, РЕЖИМ ПИТАНИЯ ); //--Пропуск адреса; ds.write(0xBE, РЕЖИМ ПИТАНИЯ ); //--Команда чтения памяти; ds.read_bytes(data, 9); //--Чтение буфера данных; step=6; break; case 6: crc=OneWire::crc8(data, 8); if ((crc !=data[8]) || (data[4]==0)) {cntErr++; if(cntErr>5) {cntErr=5; T_float=NAN;} step=1; break;} step=7; break; case 7: raw = (data[1] << 8) | data[0]; if (mode) {raw = raw << 3; if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; }} else {byte 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=(float)raw / 16.0; Tx10 =T_float*10; Tx100 =T_float*100; timeStart=millis(); step=1; break; case 20: break; } //--end switch //============================================== 2053 134.0d@40 corner: 154.0d@60 31.0d 134.0d@70 154.0d@70 134.0d@60 corner: 154.0d@80 4217df52-ab28-46a5-9e5e-78945613098e Блок ds1820. --------------------------- 1.Опрашивает сенсор ds1820 c периодом=ПЕРИОД ОПРОСА В МС. 2.Не требует указания адреса(только пин, к которому подключается сенсор). 3. Вызов задачи должен планироваться как вызов "Свободная задача". 4. Максимальная задержка во время опроса менее 4.8 мс. ------------------- ecoins@mail.ru 16.06.2020 (временное решение). 361 //---БЛОК ЧТЕНИЯ ДАТЧИКА ТЕМПЕРАТУРЫ DS1820 switch(step) { default: step=0; case 0: pin= НОМЕР ПИНА; if( ( pin <0) || ( pin >=100) ) {step=20; break;} period= ПЕРИОД ОПРОСА В МС ; if(period<1000) period=1000; cntErr=0; mode=0; T_float=20.0; timeStart=millis(); //ds.begin(pin); step++; break; case 1: if (!EN) {break;} //----Проверка на внешнее разрешение измерения if ( getPastTime(timeStart,millis() ) > period) { timeStart=millis()+period; step++;} break; //------Операции по запуску измерения в датчике case 2: ds.reset(); //--Cброс шины; step++; break; case 3: ds.write(0xCC, РЕЖИМ ПИТАНИЯ ); //--Пропуск адреса; ds.write(0x44, РЕЖИМ ПИТАНИЯ ); timeDelay=micros(); step++; break; case 4: if ( getPastTime(timeDelay ,micros() ) >900) {step++;} break; //------Операции по получению измеренных данных case 5: ds.reset(); //--Cброс шины; step++; break; case 6: ds.write(0xCC, РЕЖИМ ПИТАНИЯ ); //--Пропуск адреса; ds.write(0xBE, РЕЖИМ ПИТАНИЯ ); //--Команда чтения памяти; step++; break; case 7: ds.read_bytes(data, 9); //--Чтение буфера данных; step++; break; case 8: crc=OneWire::crc8(data, 8); if ((crc !=data[8]) || (data[4]==0)) {cntErr++; if(cntErr>5) {cntErr=5; T_float=NAN;} step=1; break;} step++; break; case 9: raw = (data[1] << 8) | data[0]; if (mode) {raw = raw << 3; if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; }} else {byte 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=(float)raw / 16.0; Tx10 =T_float*10; Tx100 =T_float*100; timeStart=millis(); step=1; break; case 20: break; } //--end switch //============================================== 2104 171.0d 348.0d 9600 arduinoIDE 1024 164990438 Arduino Nano 90109856 default