Считыватель Matrix II + Arduino uno

Всем привет! Я тут новенький, так что не судите строго если что не так.
Нашёл на старом форуме статью о подключении matrix II к ардуино и там был пример скетча:
`#include <OneWire.h>

OneWire ds(7); // выход считывателя на 7 пин

byte addr[8];// буфер приема

void setup() {// стартовая инициализация
Serial.begin(9600);
delay(100);
Serial.println(“Start…”);
}
void loop() {
if(ds.reset()){ // если обнаружено устройттво
ds.write(0x33); // отправляем команду “считать ROM”
delay(50); // на всякий случай ждем
for(int i=0;i<8;i++){
addr[i] = ds.read(); // считываем
}
Serial.print(“ROM =”); // выводим
for(int i = 0; i < 8; i++) {
Serial.write(’ ');
Serial.print(addr[i], HEX);
}
Serial.println();
delay(500);
}
}`
Все подключил, скетч залил, но имею вот такое в консоли, периодически выскакивают FF FF FF FF FF FF FF FF
image
Подскажите если кто сталкивался, как победить такое не хорошее поведение схемы?

Первая подсказка

Да я вроде так сделал, но что то пошло не так. Теперь не найду как отредактировать сообщение

Еще раз - три (ТРИ) обратных апострофа, а не один. И на отдельных строках. Или воспользуйтесь кнопкой </>

Никак. Новичкам это недоступно. Вставьте код новым сообщением. В этой же теме

#include <OneWire.h>

OneWire ds(7); // выход считывателя на 7 пин

byte addr[8];// буфер приема

void setup() {// стартовая инициализация
  Serial.begin(9600);
  delay(100);
  Serial.println("Start...");
}
void loop() { 
  if(ds.reset()){ // если обнаружено устройттво
    ds.write(0x33); // отправляем команду "считать ROM"
    delay(50); // на всякий случай ждем
    for(int i=0;i<8;i++){
      addr[i] = ds.read(); // считываем
    }
    Serial.print("ROM ="); // выводим
  for(int i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }
  Serial.println();
    delay(500);
  }
}

для начала включить проверку принятых данных по CRC и далее если сошлось - выводим, но это не панацея

Тем самым я только буду отсекать эти пропуски, сами то они никуда не денутся. Я грешу на схему. Подключил я DATA0 на пин 7 и GND на GND. Но думаю что если это OneWire то , что то мне подсказывает, что нужно воткнуть сопротивление 4.7 ком. Но куда? В схеме с датчиком DS18B20 он идет между плюсом и DATA. Но тут то нет плюса, только дата и земля(

Считыватель-то исправный? Может он сам по себе VCC на DATA коротит?

в связке с контроллером работает корректно

Можт контроллер отсекает эти FFF…
Провод длинный? Я смотрю - он от +12V питается. А в шину те же +12 лупит?

В шину 5 вольт, это точно

Похоже я был прав, в сему добавил резистор на 4.7 ком и вроде ушла проблема. Если кому будет нужна схема, могу нарисовать . Пишите

Пока только не решил один вопрос. Приходит HEX карты в виде 150bd41069037. А на самой карте десятеричный серийник, вот как они связаны, какой алгоритм дешифровки хекса в этот самый серийник на карте…

По-моему нет никакой связи. Мы не обнаружили.

Так, связь нашел. Вот HEX: 150bd41069037, а вот серийник: 4308304
Калькулятор говорит, что HEX числа 4308304 равен 41 BD 50, а это часть приходящего HEX от ключа после первой единицы но в обратном порядке. Вот теперь вопрос, как это в код воткнуть, ну нужна какая то функция для разбора хекса в число.

const char *hexstring = "abcdef0";
long number = strtol(hexstring, NULL, 16);

У вас массив байтов, в этом массиве 1-3 байты хранят нужное число, зачем переводить их в строку и затем конвертировать строку в число? Соберите три байта в uint32_t число - и никакой перекодировки не понадобится

1 лайк

Интересно. Надо на наших карточках проверить - есть ли такая связь.

Если не сложно, можно пример, а то я не сильный гуру))

Спасибо за ответ, вот бы ещё понять как эту строку собрать) Там же идёт перебор бай по порядку, а надо 1-3 да ещё и в обратном порядке…