0@0 0@0 179 0@-140 70 482 0@-216 root input output globalVariable 2 95887a02-9001-4b2f-8f35-13c5f373e3dc LibraryGroup-Байты, UART 0@0 4 10 430@590 450@590 corner: 530@730 430@590 corner: 550@730 471.5d@603.5d H 8.0d 530@620 550@620 530@610 corner: 550@630 Min 19.0d 530@640 550@640 530@630 corner: 550@650 26 570@650 590@650 corner: 655.0d@670 570@650 corner: 675.0d@670 594@664.5d 570@660 655.0d@660 675.0d@660 1 dannie byte 57.0d 9.0d 590@660 550@660 corner: 550@660 Sec 20.0d 530@660 550@660 530@650 corner: 550@670 Mo 16.0d 530@680 550@680 530@670 corner: 550@690 Day 20.0d 530@700 550@700 530@690 corner: 550@710 1670@180 1690@180 corner: 1786.0d@360 1670@180 corner: 1806.0d@360 1670@210 znak1 1670@230 disp SR text a58bfc88-593b-442c-ad19-00ead6cec3db вход текста для вывода на экран 66708cca-95ef-47d7-820f-f6d94d0de304 0cf4b379-8f5f-40a8-a2b7-c75cad68e2f3 lcd 1602 74hc164 тест подключения экрана 1602 через 74нс164 43 dat вход дата 3b324f62-0e4b-4561-8db2-f08bff06ea24 4 049032aa-5feb-4a9f-a043-d9cb46b1e945 clk вход клок 0efe4a09-a86e-4da2-a7dc-a3bbdd42660f 5 9bd5c1b2-bfc6-4534-b17d-0691d29997d7 Datain znak 7c462cb8-78d3-4cb6-99ca-f959273a6109 положение курсора знак от 0 до 15 364f65cd-0ca6-4faa-ae5f-6e6d17257f9b stroka 59a8d917-c2b6-42d7-8b17-1f127687a582 строка 0=первая . 1=вторая dff95035-5656-4951-aa24-72a9b496f61f 506af7ef-e9dc-416c-b383-5949420fb728 5 lcd.begin(16,2); lcd.setCursor(znak, stroka); lcd.print(Datain); 64 #include <Wire.h> #include <LiquidCrystal_SR.h> lcd (dat,clk,TWO_WIRE); LiquidCrystal_SR начало первой строки, знак от 0 до 19 8 1490@130 1510@130 corner: 1550@210 1490@130 corner: 1570@210 1515.0d@143.5d 25 1340@100 1360@100 corner: 1400@160 1340@100 corner: 1420@160 1365.0d@113.5d 1 N bloka= 1340@130 1360@130 1298.0d@134.0d 30 620@230 640@230 corner: 680@270 620@230 corner: 700@270 643.5d@243.5d 480@310 500@310 corner: 580@390 480@310 corner: 600@390 522.5d@323.5d 400@310 420@310 corner: 436.0d@330 400@310 corner: 456.0d@330 424@323.5d 456.0d@320 2 17484423 8.0d 7.0d 0.0d 442.0d@320 456.0d@320 corner: 456.0d@340 C+ 480@340 500@340 480@330 corner: 500@350 6 390@370 410@370 corner: 426.0d@390 390@370 corner: 446.0d@390 414@383.5d 432.0d@370 corner: 446.0d@390 446.0d@380 3 3 27725101 8.0d 7.0d 0.0d 432.0d@380 446.0d@360 corner: 446.0d@380 C - 480@360 500@360 480@350 corner: 500@370 R 480@380 500@380 480@370 corner: 500@390 580@370 corner: 600@390 600@380 twoInputs 0 V 10.0d 580@380 29 910@350 930@350 corner: 1035.0d@490 910@350 corner: 1068.0d@490 935.0d@364.5d 12 810@370 830@370 corner: 875.0d@390 810@370 corner: 895.0d@390 834@384.5d 810@380 830@380 810@370 corner: 830@390 875.0d@370 corner: 895.0d@390 895.0d@380 reading 37.0d 9.0d 0.0d 875.0d@380 895.0d@380 corner: 895.0d@380 Reading 910@380 930@380 24C32_Запись record c4a8464a-7a72-4793-a52b-b4e0f9698ce0 b22d5422-f403-475c-a799-a2faa73cc762 firstbyte 681a4a8c-aa3d-407c-aa5e-81da6f3c52b2 c2a5bc0c-8faf-4c20-aa9e-ae77b5aa349d PCF8574_out adress e1380d15-747b-4bfd-a458-65eaa6b5818a Адрес устройства в десятичном формате 59759704-7e48-4ec1-a4b7-91ac5f72af5d data c2f661f0-657c-4692-8be8-bec0439cb228 9ff6970e-e820-4c26-8a2c-8aacb08b56c9 e4b15db8-6781-434e-b1bb-e80b1a8b8042 PCF8574_OUT Wire.beginTransmission( adress ); // передача для устройства с адресом = adress Wire.write( data ); // отправка байта data Wire.endTransmission(); // передача данных delay(500); // удалить или уменьшить, сделано для теста 249 Wire.begin(); 15 #include <Wire.h> byte_in_1 byte_in_2 07590666-f10f-4f5b-9fb5-43191c8edcda 60997372-a994-422f-8c67-6669c48d4b87 int1 51886b53-bee7-4f31-ba4d-a8d84ecbff8d 0aa4860a-51cf-4d5a-839b-d0e10764387e int2 3f38d478-79b7-44dd-b73e-6c1dac4264fe 4f3a4651-d7ec-4af6-8c1c-abcf7d2a254e int3 77043a3c-0a2d-4396-8d2d-52d1d0386b9b eee73eb1-5b58-413f-9a78-52b7c2d6841c PCF8574 byte in byte out fc54e8c4-7781-4c72-86a7-929c4919d8e1 54869a33-dc5c-49e8-8d65-1bb2abd4cfc8 51a35c52-e17c-4d6e-8d44-8185a5a10417 PCF8574 byte out = read_write( adress, byte in); Wire.beginTransmission( adress ); Wire.write( byte in ); Wire.endTransmission(); delay(1); Wire.beginTransmission(adress); Wire.write(); Wire.endTransmission(); Wire.requestFrom(adress, (uint8_t) 1); return Wire.read(); 250 byte read_write uint8_t adress uint8_t byte in byte_out 964ce2ea-1c2f-4d70-bc9d-71ecbc72aa13 24C32_Запись Адрес для входа должен подаваться в виде байта(0-255), например: 3C= 3x16 + C = 48+12=60 Для работы в качестве ТОЛЬКО НА ВЫХОД(управляем нагрузками) сигнал byte_out не используется, на нём будет повтор входа. Физически работа выхода почти соответствует схеме с открытым коллектором и по + питания токооганичивающий резистор(не более 100мкА). Снять логическую единицу с бОльшим током не получится. Для работы ТОЛЬКО НА ВХОД(считываем входа) на вход необходимо подать byte 255. Поясню. Сигналы принимаются только прижиманием к общему, поэтому необходимо перевести выводы в 1, внутренне подтянуть к +, ток очень мал - 100мкА: при помехах ДОПОЛНИТЕЛЬНО можно добавить внешние резисторы(20-4,7 кОм). Для одновременной работы ВХОД/ВЫХОД необходимо так организовать подачу байта на вход, что-бы на выводах, подключенных для ввода присутствовали единицы. Образно говоря, указанная микросхема принимает байт и распаковывает на биты, или считывая биты- упаковывает их в байт. Данный блок представляет собой образец/шаблон работы с I2C. 1040 _adress 0x57 адрес микросхемы 24С32, вводить в виде 0x57, 0x56, 0x55 3a3e2005-ca6f-402a-9779-c3121d6edd20 d57893b6-fddf-4d72-8aa1-daa8e67f67db byte_out = read_write( adress, byte_in); Wire.beginTransmission((int) _adress); Wire.write((int)( firstbyte >> 8)); Wire.write((int)( firstbyte & 0xFF)); Wire.write( byte_in_1 ); Wire.write( byte_in_2 ); Wire.write(* ((byte *)(& int1))); Wire.write(* ((byte *)(& int1)+1)); Wire.write(* ((byte *)(& int2))); Wire.write(* ((byte *)(& int2)+1)); Wire.write(* ((byte *)(& int3))); Wire.write(* ((byte *)(& int3)+1)); Wire.endTransmission(); 421 void eeprom_i2c_write_block_8 unsigned int firstbyte 37e4f055-e048-49ea-9b6e-71d16125d965 if ( record ) { if (triger_01) { triger_1 = 0;} else {triger_1 = 1; triger_01 = 1;} } else {triger_1 = 0; triger_01 = 0;}; if ( triger_1) {eeprom_i2c_write_block_8();} 174 #include <Wire.h> triger_1 = 0; bool triger_01 = 0; bool void eeprom_i2c_write_block_8 При 1 происходит чтение. 910@370 corner: 930@390 910@390 corner: 930@410 sec 18.0d 1035.0d@380 1055.0d@380 24C32_Чтение Firstbyte byte_out_1 55b1ebcf-ade3-4c6b-805c-782e8d1c50e4 be7ef89e-c71c-4ca8-ad0e-e4d4ae1b18b2 byte_out_2 25fbb64f-7153-41dd-8e5e-5d0604675928 405bc6a0-482d-40da-ac7f-b1a640a230d0 int_out_1 5d69dea2-d27d-4c2c-afca-18bae25d6a30 35952e92-a16a-4804-90c9-2ad246f9326c int_out_2 39a09941-8f0b-4d7d-9070-58c3cb61eaa0 182f056e-9a13-4215-af2e-8e4a574b3efd int_out_3 b2520d52-914d-451d-a28c-9e891bc4ac61 a048e355-c9f8-49b1-bf08-ebb6bd30d909 502f02cd-cff0-45ff-b510-92eadf7de1ef 24C32_Чтение if ( Reading ) { Firstbyte *= 8; eeprom_i2c_read_block_8( Firstbyte ); } 78 #include <Wire.h> Wire.beginTransmission((int) _adress); Wire.write((int)( _firstbyte >> 8)); Wire.write((int)( _firstbyte & 0xFF)); Wire.write( byte_in_1 ); Wire.write( byte_in_2 ); Wire.write(* ((byte *)(& int1))); Wire.write(* ((byte *)(& int1)+1)); Wire.write(* ((byte *)(& int2))); Wire.write(* ((byte *)(& int2)+1)); Wire.write(* ((byte *)(& int3))); Wire.write(* ((byte *)(& int3)+1)); Wire.endTransmission(); 423 void eeprom_i2c_read_block_8 unsigned int _firstbyte 1035.0d@370 corner: 1055.0d@390 minute 34.0d 1035.0d@400 1055.0d@400 1035.0d@390 corner: 1055.0d@410 33 1300@390 1320@390 corner: 1360@430 1300@390 corner: 1380@430 1323.5d@403.5d 1300@410 corner: 1320@430 23 1530@360 1550@360 corner: 1590@460 1530@360 corner: 1610@460 1 read= 1530@390 1530@410 3 : 1530@430 4 1530@450 Datain4 1670@330 Lcd 2004 SR вход текста для вывода на экран, первая строка положение курсора первой строки, знак от 0 до 19 положение курсора верхней строки знак от 0 до 15 datain2 3dab2672-bf84-4d40-b19a-92183541021e вход второй строки 995d8568-90b8-4e79-bf46-bc4699cbf523 znak2 f100b423-3346-45a4-a7f1-b50e54f24df8 положение курсора нижней строки от 0 до 15 363455f1-1649-4071-823b-92f4657c5696 cc7be027-0f42-4204-922b-399ce438a89c lcd.begin(16,2); lcd.setCursor(znak, 0); lcd.print(Datain); lcd.setCursor(znak2, 1); lcd.print(datain2); 104 Datain2 вход текста для вывода на экран, вторая строка положение курсора второй строки, знак от 0 до 19 Datain3 81a6229b-fd87-4156-b578-ffdd24b4697a вход третья строка e1eb6955-ffce-40f0-9f7c-4219f30262c1 znak3 7ac6a6e7-66ae-45f6-b2e2-f1f27c9e57e0 положение курсора третьей строки 37be95ee-bd6e-4f06-aa28-154b1275ed78 155c12a5-118e-4e8a-a69a-879674545840 вход четвертая строка 16d388f2-701c-462f-b261-781dc978321b znak4 1922baf7-612b-48db-8865-064b5eefa785 положение курсора четвертой строки a03bd090-60c0-41b8-a8a8-d07a7b286728 da7f9993-2ff5-48fe-b051-b7227924c40d lcd 2004 74hc164 Тест подключения экрана 1602 через 74нс164 Требуестя установленная библиотека LiquidCrystal_SR.h В параметрах пользователя указать цифровые выводы ардуино к которым подключены Clock и Data. По умолчанию Clock = 4, Data = 5. Вход Datain - подать данные (или вставить константу) для отображения на первой (верхней) строке. Вход znak - указание номера столбца, с которого начнется отображение данных для верхней строки. Если ничего не указывать, будет отображать с начала строки. Если вставить константу от 0 до 15, то соответственно выводимые данные будут начинаться с указанного знакоместа. Datain2 и znak2 - все точно так же, только для второй (нижней строки). 662 вход Data вход Clock lcd.begin(20,4); lcd.setCursor(znak, 0); lcd.print(Datain); lcd.setCursor(znak2, 1); lcd.print(Datain2); lcd.setCursor(znak3, 2); lcd.print(Datain3); lcd.setCursor(znak4, 3); lcd.print(Datain4); 194 1610@330 corner: 1610@450 Q 1590@450 1610@450 2 1380@410 corner: 1380@420 Q 9.0d 1360@420 1380@420 1360@410 corner: 1380@430 1300@420 dec I 1320@420 1055.0d@420 corner: 1055.0d@420 hour 23.0d 1035.0d@420 1055.0d@420 24C32_Чтение_4 Numblock byte_out_1 byte_out_2 byte_out_3 c11eb454-dbe9-4699-a2b0-1bc1d6459498 9abc1622-0474-41fa-b6d0-6129cbc0463d byte_out_4 7c9aef51-bf52-49c5-bb02-b0d4263d2662 94e73254-b361-4265-be78-879426ee1143 037e8096-a4c4-4b64-91d6-6423b3364682 24C32_Чтение_4 Тестовый блок считывания на 4 BYTE На вход номера блока 0-1023 Автор: Sancho (omelchuk890) 90 if ( Reading ) { Numblock *= 4; // размер блока в байтах eeprom_i2c_read_block_4( Numblock ); } 109 byte* ptrint; Wire.beginTransmission((int) _adress); Wire.write((int)( _firstbyte >> 8)); Wire.write((int)( _firstbyte & 0xFF)); Wire.endTransmission(); Wire.requestFrom((int) _adress,8); if (Wire.available()) byte_out_1 = Wire.read(); if (Wire.available()) byte_out_2 = Wire.read(); if (Wire.available()) byte_out_3 = Wire.read(); if (Wire.available()) byte_out_4 = Wire.read(); if (Wire.available()) *(ptrint+3) = Wire.read(); 489 void eeprom_i2c_read_block_4 unsigned int _firstbyte 1035.0d@410 corner: 1055.0d@430 day 19.0d 1035.0d@440 1055.0d@440 1035.0d@430 corner: 1055.0d@450 mounth 37.0d 1035.0d@460 1055.0d@460 24C32_Read_Time 07eee375-d05d-4397-8c7e-91be0cfd9d6b 28458bb8-941b-492d-a2e8-79dbc38abdc4 rezerv a7cedf6b-c226-4510-bf67-d19a1f24a9b4 261ee38e-4407-4748-b85d-3206a0c708be 2c623a4a-9d0e-474a-b4de-c4790f895675 24C32_Read_Time_4byte if ( Reading ) { Numblock *= 4; // размер блока в байтах eeprom_i2c_read_block_4( Numblock ); sec = byte_out_1 >>2; minute = byte_out_2 >>2; hour = byte_out_3 >>2; day = byte_out_4 >>2; rezerv = ((byte_out_3 & 0x07) <<3) | ( byte_out_4 & 0x07); } 270 #include <Wire.h> byte_out_1 ; byte byte_out_2 ; byte byte_out_3 ; byte byte_out_4 ; byte byte* ptrint; Wire.beginTransmission((int) _adress); Wire.write((int)( _firstbyte >> 8)); Wire.write((int)( _firstbyte & 0xFF)); Wire.endTransmission(); Wire.requestFrom((int) _adress,8); if (Wire.available()) byte_out_1 = Wire.read(); if (Wire.available()) byte_out_2 = Wire.read(); if (Wire.available()) byte_out_3 = Wire.read(); if (Wire.available()) byte_out_4 = Wire.read(); 440 1035.0d@450 corner: 1055.0d@470 30.0d 1035.0d@480 1055.0d@480 1035.0d@470 corner: 1055.0d@490 910@400 f766018e-37e2-4a30-9bdd-27a447db5a43 Тестовый блок считывания ВРЕМЕНИ в 4 BYTE На вход номера блока 0-1023 Автор: Sancho (omelchuk890) 97 if ( Reading ) { Numblock *= 4; // размер блока в байтах eeprom_i2c_read_block_4( Numblock ); sec = byte_out_1 >>2; minute = byte_out_2 >>2; hour = byte_out_3 >>3; day = byte_out_4 >>3; mounth = ((byte_out_1 & 0x03) <<2) | ( byte_out_2 & 0x03); rezerv = ((byte_out_3 & 0x07) <<3) | ( byte_out_4 & 0x07); } 330 105.0d 930@400 910@530 930@530 corner: 1035.0d@710 910@530 corner: 1055.0d@710 935.0d@544.5d 19 800@550 820@550 corner: 873.0d@570 800@550 corner: 893.0d@570 824@564.5d 800@560 893.0d@560 recording 45.0d 9.0d 0.0d 873.0d@560 893.0d@560 corner: 893.0d@560 Record 910@560 930@560 При поступлении 1 в этом цикле происходит запись. Встроен R тригер. Что-бы не протереть дырку в памяти. :) 910@550 corner: 930@570 910@570 corner: 930@590 730@590 750@590 corner: 815.0d@610 730@590 corner: 835.0d@610 754@604.5d 730@600 835.0d@600 57.0d 9.0d 0.0d 815.0d@600 835.0d@600 corner: 835.0d@600 sec 910@600 930@600 максимальное число 63 910@590 corner: 930@610 minute 910@620 930@620 24C32_Запись_4byte Numblock Номер блока. Для 24С32 от 0 до 1023 byte_in_3 b288ab36-ac52-46be-b6bc-c2de5bdfe217 cd9b10d3-56b2-453b-a504-1f7fd2cf6966 byte_in_4 a8fd0cea-df6d-432a-8943-653856402fec c7ea1750-162a-461e-8a9b-ca67abc3a4e4 cf95e30a-51fc-4035-85df-48e98626068c 24C32_Запись_4byte Тестовый блок записи на 4 BYTE,блоком. На вход номера блока 0-1023 Автор: Sancho (omelchuk890) 94 if ( Record ) { if (triger_01) { triger_1 = 0;} else {triger_1 = 1; triger_01 = 1;} } else {triger_1 = 0; triger_01 = 0;}; if ( triger_1) { Numblock *= 4; // размер блока в байтах eeprom_i2c_write_block_4( Numblock ); delay (5); // если не будет немедленного обращения к чтению - можно удалить } 310 Wire.beginTransmission((int) _adress); Wire.write((int)( _firstbyte >> 8)); Wire.write((int)( _firstbyte & 0xFF)); Wire.write( byte_in_1 ); Wire.write( byte_in_2 ); Wire.write( byte_in_3 ); Wire.write( byte_in_4 ); Wire.endTransmission(); 259 void eeprom_i2c_write_block_4 unsigned int _firstbyte максимальное число 63 910@610 corner: 930@630 hour 910@640 930@640 902.0d@643.5d максимальное число 31 910@630 corner: 930@650 day 910@660 930@660 максимальное число 31 910@650 corner: 930@670 mounth 910@680 930@680 24C32_Rec_TIME 3c3830a3-36fe-4f41-b277-d147a81c57f0 максимальное число 15 91938751-13cc-4358-8bea-73ffc20f549d rezerv 65dff590-f6eb-4c67-99db-2df91740b205 максимальное число 63 1f8c1bf2-b27c-4a78-9de3-8a4c82fd09e7 e3857bc1-988d-46cb-ad2a-e24e39793ec7 24C32_Rec_TIME_4byte if ( Record ) { if (triger_01) { triger_1 = 0;} else {triger_1 = 1; triger_01 = 1;} } else {triger_1 = 0; triger_01 = 0;}; if ( triger_1) { byte_1 = (sec <<2) | ( mounth >>2); byte_2 = (minute <<2) | (mounth & 0x03); byte_3 = ( day <<3) | (rezerv >>3) ; byte_4 = ( hour <<3) | ( rezerv & 0x07); Numblock *= 4; // размер блока в байтах eeprom_i2c_write_block_4( Numblock ); delay (5); // если не будет немедленного обращения к чтению - можно удалить } 471 #include <Wire.h> triger_1 = 0; bool triger_01 = 0; bool byte_1 ; byte byte_2 ; byte byte_3 ; byte byte_4 ; byte Wire.beginTransmission((int) _adress); Wire.write((int)( _firstbyte >> 8)); Wire.write((int)( _firstbyte & 0xFF)); Wire.write(byte_1); Wire.write(byte_2); Wire.write(byte_3); Wire.write(byte_4); Wire.endTransmission(); 235 910@670 corner: 930@690 910@700 930@700 910@690 corner: 930@710 910@580 24C32_Write_TIME 24460d5b-694f-4627-af57-1802bd90d519 24C32_Write_TIME_4byte Тестовый блок записи ВРЕМЕНИ в 4 BYTE,блоком. На вход номера блока 0-1023 резерв - максимум 63 Автор: Sancho (omelchuk890) 122 if ( Record ) { if (triger_01) { triger_1 = 0;} else {triger_1 = 1; triger_01 = 1;} } else {triger_1 = 0; triger_01 = 0;}; if ( triger_1) { byte_1 = (sec <<2) | ( mounth >>2); byte_2 = (minute <<2) | (mounth & 0x03); byte_3 = ( hour <<3) | (rezerv >>3) ; byte_4 = ( day <<3) | ( rezerv & 0x07); Numblock *= 4; // размер блока в байтах eeprom_i2c_write_block_4( Numblock ); delay (5); // если не будет немедленного обращения к чтению - можно удалить } 475 105.0d 930@580 600@260 corner: 600@580 620@260 640@260 620@250 corner: 640@270 680@250 corner: 700@270 700@260 9.0d 680@260 700@150 corner: 700@260 2 1340@150 1360@150 1420@150 9 9.0d 1400@150 1420@150 corner: 1420@160 1 1490@160 1510@160 1270@160 1290@160 corner: 1350@240 1270@160 corner: 1370@240 1304.0d@173.5d 0 1270@190 1290@190 1270@180 corner: 1290@200 1 READING 1270@210 1290@210 1216.0d@214.0d 1270@200 corner: 1290@220 13 1200@220 1220@220 corner: 1265.0d@240 1200@220 corner: 1285.0d@240 1224@234.5d 1200@230 1220@230 1200@220 corner: 1220@240 1265.0d@220 corner: 1285.0d@240 1285.0d@230 37.0d 9.0d 0.0d 1265.0d@230 1270@230 corner: 1270@230 S 1270@230 1290@230 1270@220 corner: 1290@240 1350@220 corner: 1370@240 1370@230 Q 9.0d 1350@230 1370@180 corner: 1370@230 2 1490@180 1510@180 20 1280@250 1300@250 corner: 1360@330 1280@250 corner: 1380@330 1314.0d@263.5d 1280@280 1300@280 REC 1280@300 1300@300 1251.0d@304.0d 21 1200@310 1220@310 corner: 1273.0d@330 1200@310 corner: 1293.0d@330 1224@324.5d 1200@320 1220@320 1200@310 corner: 1220@330 1273.0d@310 corner: 1293.0d@330 1293.0d@320 45.0d 9.0d 0.0d 1273.0d@320 1280@320 corner: 1280@320 1280@320 1300@320 1380@320 9.0d 1360@320 1380@200 corner: 1380@320 3 1490@200 1510@200 1570@200 9.0d 1550@200 1570@200 corner: 1570@250 1670@250 1670@270 начало второй строки, знак от 0 до 19 22 1520@270 1540@270 corner: 1580@330 1520@270 corner: 1600@330 real= 1520@300 31 1350@340 1370@340 corner: 1410@380 1350@340 corner: 1430@380 1373.5d@353.5d 24 1200@360 1220@360 corner: 1285.0d@380 1200@360 corner: 1305.0d@380 1224@374.5d 1200@370 1305.0d@370 57.0d 9.0d 0.0d 1285.0d@370 1305.0d@370 corner: 1305.0d@370 1350@370 1370@370 1430@370 9.0d 1410@370 1430@320 corner: 1430@370 1520@320 1600@320 1580@320 1600@290 corner: 1600@320 1670@290 1670@310 начало третьей строки 1670@350 начало четвертой строки Lcd 2004 SR auto Datain1 d79000f1-d622-4afe-8bae-910be0afbe07 lcd 2004 74hc164 v3 auto Тест подключения экрана 2004 через 74нс164 Требуестя установленная библиотека LiquidCrystal_SR.h В параметрах пользователя указать цифровые выводы ардуино к которым подключены Clock и Data. По умолчанию Clock = 4, Data = 5. Вход Datain1 - подать данные (или вставить константу) для отображения на первой строке. Вход znak1 - указание номера столбца, с которого начнется отображение данных для первой строки. Если ничего не указывать, будет отображать с начала строки. Если вставить константу от 0 до 19, то соответственно выводимые данные будут начинаться с указанного знакоместа. Datain2 и znak2 - все точно так же, только для второй. и так далее до четвертой строки. Реализовано автоматическое очищение экрана при изменении длины строки. 741 if (Nadosteret) {lcd.clear(); Nadosteret= 0;} dlinasrokiTemp1 = ((String(Datain1))).length(); if (starayaDlinasroki1 > dlinasrokiTemp1) {Nadosteret = 1;} starayaDlinasroki1 = dlinasrokiTemp1; dlinasrokiTemp2 = ((String(Datain2))).length(); if (starayaDlinasroki2 > dlinasrokiTemp2) {Nadosteret = 1;} starayaDlinasroki2 = dlinasrokiTemp2; dlinasrokiTemp3 = ((String(Datain3))).length(); if (starayaDlinasroki3 > dlinasrokiTemp3) {Nadosteret = 1;} starayaDlinasroki3 = dlinasrokiTemp3; dlinasrokiTemp4 = ((String(Datain4))).length(); if (starayaDlinasroki4 > dlinasrokiTemp4) {Nadosteret = 1;} starayaDlinasroki4 = dlinasrokiTemp4; lcd.setCursor(znak1, 0); lcd.print((String(Datain1))); lcd.setCursor(znak2, 1); lcd.print((String(Datain2))); lcd.setCursor(znak3, 2); lcd.print((String(Datain3))); lcd.setCursor(znak4, 3); lcd.print((String(Datain4))); 861 lcd.begin(20,4); 17 #include <Wire.h> #include <LiquidCrystal_SR.h> lcd (dat,clk,TWO_WIRE); LiquidCrystal_SR Nadosteret ; boolean dlinasrokiTemp1 = 0; int starayaDlinasroki1 = 0; int dlinasrokiTemp2 = 0; int starayaDlinasroki2 = 0; int dlinasrokiTemp3 = 0; int starayaDlinasroki3 = 0; int dlinasrokiTemp4 = 0; int starayaDlinasroki4 = 0; int 96.0d 560@210 corner: 560@720 552@716.5d corner: 565.0d@723.5d 1655.0d@206.5d corner: 1668.0d@213.5d L2 StrD-T 31.0d 530@720 550@720 530@710 corner: 550@730 A A 187412621 92630732 18 DS3231 d-M-y, H:i:s 14 200@430 220@430 corner: 237.0d@450 200@430 corner: 257.0d@450 224@443.5d 11 260@430 280@430 corner: 325.0d@450 260@430 corner: 345.0d@450 284@444.5d 260@440 325.0d@440 345.0d@440 37.0d 9.0d 280@440 257.0d@440 corner: 257.0d@440 0.0d 243.0d@440 257.0d@440 243.0d@430 corner: 257.0d@450 4 50004099 9.0d 7.0d 200@490 220@490 corner: 236.0d@510 200@490 corner: 256.0d@510 224@503.5d 270@490 290@490 corner: 343.0d@510 270@490 corner: 363.0d@510 294@504.5d 270@500 343.0d@500 363.0d@500 45.0d 9.0d 290@500 256.0d@500 corner: 256.0d@500 0.0d 242.0d@500 256.0d@500 242.0d@490 corner: 256.0d@510 5 75375175 8.0d 7.0d 16 470@130 490@130 corner: 617.0d@170 470@130 corner: 637.0d@170 495.0d@144.5d 28 270@100 290@100 corner: 350@140 270@100 corner: 370@140 308.5d@113.5d 220@130 240@130 corner: 256.0d@150 220@130 corner: 276.0d@150 244@143.5d 276.0d@140 6 41677856 8.0d 7.0d 0.0d 262.0d@140 270@130 corner: 270@140 EN 270@130 290@130 270@120 corner: 290@140 350@120 corner: 370@140 370@130 1000 Q 9.0d 350@130 27 490@210 510@210 corner: 546.0d@230 490@210 corner: 566.0d@230 514@223.5d 490@210 corner: 510@230 490@220 13led 19338424 28.0d 7.0d 510@220 36 410@410 430@410 corner: 490@490 410@410 corner: 510@490 444.0d@423.5d 0 xxxxx 410@440 430@440 382.0d@442.5d 410@430 corner: 430@450 1 erase 410@460 430@460 384.0d@462.5d 410@450 corner: 430@470 410@470 corner: 430@490 Q 9.0d 490@480 510@480 490@470 corner: 510@490 410@480 S 430@480 370@130 corner: 370@480 CLeaR 470@160 490@160 24C32_Запись record c4a8464a-7a72-4793-a52b-b4e0f9698ce0 b22d5422-f403-475c-a799-a2faa73cc762 firstbyte 681a4a8c-aa3d-407c-aa5e-81da6f3c52b2 c2a5bc0c-8faf-4c20-aa9e-ae77b5aa349d PCF8574_out adress e1380d15-747b-4bfd-a458-65eaa6b5818a Адрес устройства в десятичном формате 59759704-7e48-4ec1-a4b7-91ac5f72af5d data c2f661f0-657c-4692-8be8-bec0439cb228 9ff6970e-e820-4c26-8a2c-8aacb08b56c9 e4b15db8-6781-434e-b1bb-e80b1a8b8042 PCF8574_OUT Wire.beginTransmission( adress ); // передача для устройства с адресом = adress Wire.write( data ); // отправка байта data Wire.endTransmission(); // передача данных delay(500); // удалить или уменьшить, сделано для теста Wire.begin(); #include <Wire.h> byte_in_1 byte_in_2 07590666-f10f-4f5b-9fb5-43191c8edcda 60997372-a994-422f-8c67-6669c48d4b87 int1 51886b53-bee7-4f31-ba4d-a8d84ecbff8d 0aa4860a-51cf-4d5a-839b-d0e10764387e int2 3f38d478-79b7-44dd-b73e-6c1dac4264fe 4f3a4651-d7ec-4af6-8c1c-abcf7d2a254e int3 77043a3c-0a2d-4396-8d2d-52d1d0386b9b eee73eb1-5b58-413f-9a78-52b7c2d6841c PCF8574 byte in byte out fc54e8c4-7781-4c72-86a7-929c4919d8e1 54869a33-dc5c-49e8-8d65-1bb2abd4cfc8 51a35c52-e17c-4d6e-8d44-8185a5a10417 PCF8574 byte out = read_write( adress, byte in); Wire.beginTransmission( adress ); Wire.write( byte in ); Wire.endTransmission(); delay(1); Wire.beginTransmission(adress); Wire.write(); Wire.endTransmission(); Wire.requestFrom(adress, (uint8_t) 1); return Wire.read(); byte read_write uint8_t adress uint8_t byte in byte_out 964ce2ea-1c2f-4d70-bc9d-71ecbc72aa13 24C32_Запись Адрес для входа должен подаваться в виде байта(0-255), например: 3C= 3x16 + C = 48+12=60 Для работы в качестве ТОЛЬКО НА ВЫХОД(управляем нагрузками) сигнал byte_out не используется, на нём будет повтор входа. Физически работа выхода почти соответствует схеме с открытым коллектором и по + питания токооганичивающий резистор(не более 100мкА). Снять логическую единицу с бОльшим током не получится. Для работы ТОЛЬКО НА ВХОД(считываем входа) на вход необходимо подать byte 255. Поясню. Сигналы принимаются только прижиманием к общему, поэтому необходимо перевести выводы в 1, внутренне подтянуть к +, ток очень мал - 100мкА: при помехах ДОПОЛНИТЕЛЬНО можно добавить внешние резисторы(20-4,7 кОм). Для одновременной работы ВХОД/ВЫХОД необходимо так организовать подачу байта на вход, что-бы на выводах, подключенных для ввода присутствовали единицы. Образно говоря, указанная микросхема принимает байт и распаковывает на биты, или считывая биты- упаковывает их в байт. Данный блок представляет собой образец/шаблон работы с I2C. _adress 0x57 адрес микросхемы 24С32, вводить в виде 0x57, 0x56, 0x55 3a3e2005-ca6f-402a-9779-c3121d6edd20 d57893b6-fddf-4d72-8aa1-daa8e67f67db byte_out = read_write( adress, byte_in); Wire.beginTransmission((int) _adress); Wire.write((int)( firstbyte >> 8)); Wire.write((int)( firstbyte & 0xFF)); Wire.write( byte_in_1 ); Wire.write( byte_in_2 ); Wire.write(* ((byte *)(& int1))); Wire.write(* ((byte *)(& int1)+1)); Wire.write(* ((byte *)(& int2))); Wire.write(* ((byte *)(& int2)+1)); Wire.write(* ((byte *)(& int3))); Wire.write(* ((byte *)(& int3)+1)); Wire.endTransmission(); void eeprom_i2c_write_block_8 unsigned int firstbyte 37e4f055-e048-49ea-9b6e-71d16125d965 if ( record ) { if (triger_01) { triger_1 = 0;} else {triger_1 = 1; triger_01 = 1;} } else {triger_1 = 0; triger_01 = 0;}; if ( triger_1) {eeprom_i2c_write_block_8();} #include <Wire.h> triger_1 = 0; bool triger_01 = 0; bool void eeprom_i2c_write_block_8 При поступлении 1 в этом цикле происходит стирание. Встроен R тригер. Что-бы не протереть дырку в памяти. :) 470@150 corner: 490@170 24C32_Стирание по 16 f01f8b92-8901-4723-bdca-745671212b2a 24C32_Стирание по 16 Тестовый блок стирания. Не тестировался. Автор: Sancho (omelchuk890) 68 if ( CLeaR ) { if (triger_015) { triger_15 = 0;} else {triger_15 = 1; triger_015 = 1;} } else {triger_15 = 0; triger_015 = 0;}; if ( triger_15) { eeprom_i2c_cler(); delay (5); // если не будет немедленного обращения к чтению - можно удалить } #include <Wire.h> triger_15 = 0; bool triger_015 = 0; bool for ( int i = 0; i < 256; i++){ delay(3); Wire.beginTransmission((int) _adress); Wire.write((int)( (i * 16) >> 8)); Wire.write((int)( (i * 16) & 0xFF)); for (byte rr = 0; rr < 16; rr++){ Wire.write(0);} Wire.endTransmission(); } 240 void eeprom_i2c_cler 820@690 820@690 corner: 893.0d@710.0d left Максимум 63 67.0d 3@12.0d 9.0d 820 (0 to: 820) erase dannie integ 9600 arduinoIDE 124 1024 4096 57 Arduino Nano(ATmega328) 71046910