Доброго времени суток! Есть две UNO, на одной из стоит RFID считыватель (RC522). Обе Arduino UNO объединены по I2C сети. Плата с RFID - Мастер, Вторая - Slave. Мне необходимо по I2C передавать UID карты на Slave. Вот код: Спойлер: Master Код (C++): // Master #include <Wire.h> // Main I2C Lib #include <iarduino_I2C_connect.h> // Old I2C Lib // RFID #include <SPI.h> #include <MFRC522.h> #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); unsigned long uidDec, uidDecTemp; // для храниения номера метки в десятичном формате // RFID END iarduino_I2C_connect I2C2; int RFCHECK = 0; byte REG_Massive[3]; int VAR_RFID = 0; void setup() { // RFID Serial.begin(9600); Serial.println("Waiting for card..."); SPI.begin(); // инициализация SPI / Init SPI bus. mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card. // RFID END //Wire.setClock(400000); // устанавливаем скорость передачи данных по шине I2C = 400кБит/с Wire.begin(); // инициируем подключение к шине I2C в качестве ведущего (master) устройства } void loop(){ //Считываем данные: // RFID // Поиск новой метки if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Выбор метки if ( ! mfrc522.PICC_ReadCardSerial()) { return; } uidDec = 0; // Выдача серийного номера метки. for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec * 256 + uidDecTemp; } Serial.println(uidDec); // Выводим UID // Test VAR_RFID = uidDec; REG_Massive[1] = VAR_RFID>>8; REF_Massive[2] = VAR_RFID; if(uidDec == 2893284997) { I2C2.writeByte(0x02, 0) // ????? Здесь проблема } } Спойлер: Slave Код (C++): // Slave // Подключаем библиотеки: #include <Wire.h> // подключаем библиотеку для работы с шиной I2C #include <iarduino_I2C_connect.h> // подключаем библиотеку для соединения arduino по шине I2C // Объявляем переменные и константы: iarduino_I2C_connect I2C2; // объявляем переменную для работы c библиотекой iarduino_I2C_connect const byte PIN_LED = 13; // объявляем константу с указанием номера цифрового вывода, к которому подключен светодиод byte REG_Massive[3]; // объявляем массив, данные которого будут доступны для чтения/записи по шине I2C void setup(){ //Wire.setClock(400000); // устанавливаем скорость передачи данных по шине I2C = 400кБит/с Wire.begin(0x02); // инициируем подключение к шине I2C в качестве ведомого (slave) устройства, с указанием своего адреса на шине. I2C2.begin(REG_Massive); // инициируем возможность чтения/записи данных по шине I2C, из/в указываемый массив pinMode(PIN_LED, OUTPUT); // Устанавливаем режим работы вывода светодиода, как выход } void loop(){ //Здесь мне обходимо принимать UID метки, но непонятно, как? /*if(REG_Massive[0] == 5) { digitalWrite(PIN_LED, HIGH); } if (REG_Massive[0] == 8) { digitalWrite(PIN_LED, LOW); // вкл/выкл светодиод в соответствии со значением 0 элемента массива REG_Massive }*/ } Изначально у меня получалось передавать числа типа "1", "9", приняв которые я включал светодиод. Но UID метки длинный, поэтому, насколько я понял, его нужно разбивать и на стороне Slave собирать. Как решить это?
зачем его "разбивать", если он у вас и так с карты читается побайтно? Отправляйте отдельными байтами mfrc522.uid.uidByte. Да и "собирать" его потом на стороне Slave я тоже бы не стал. Вообще не вижу смысла преобразовывать UID в десятичное число... работайте с байтами, как есть
Добрый день! Я решил попробовать так: Спойлер: master Код (C++): Rfid = 453781458; R1 = Rfid>>8; R2 = Rfid; delay(500); I2C2.writeByte(0x02,1,R1); I2C2.writeByte(0x02,2,R2); Спойлер: slave Код (C++): URE = REG_Massive[1]<<8; URE += REG_Massive[2]; if(URE == 453781458) { digitalWrite(LED, HIGH); Serial.println("Hello World!"); } К сожалению, работать не хочет пока.
и не будет. Особо глубоко не копал, но некоторые ошибки видны сразу. Вы о разрядности чисел слышали что-нибудь? В Вашем примере RFID = 453781458, разрядность этого числа явно больше 16бит, а значит переслать его в виде двух байт, как это делаете вы - никак не выйдет. Я ж вам предлагал посылать RFID побайтно... а вы все пытаетесь по своему.
Надо уид в переменную. Byte rfidka; И от тут https://lesson.iarduino.ru/page/urok-26-3-soedinyaem-dve-arduino-po-shine-i2c/ как по |2с дуинки дружить.