Не получается считать данные с ключа ibutton...

8toni8
Offline
Зарегистрирован: 06.03.2020

Использую такой скетч и схему:
https://yadi.sk/d/V9IN8ujx-F1bVw

Вроде все просто и понятно, но почему то не работает:(

Пробовал сопротивления разного номинала.
Причем если подключать без сопротивления, и взять руками за GND и 10-ый пин (в данном скетче он и является читающим), то иногда в мониторе com порта появляется значения, то есть значит программа все таки работает, но с ключа почему то не читает, причем на сколько я понимаю, дело тут не в номинале сопротивления, так как он на сколько я понимаю используется для подтягивания ноги, что бы не было ложных наводок или для чего он в схеме?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

8toni8 пишет:
Использую такой скетч и схему
Какой "вот такой"? Выкладывайте.

8toni8
Offline
Зарегистрирован: 06.03.2020
#include <OneWire.h>

OneWire iButton(10); // создаём объект 1-wire на 10 выводе

void setup (void) {
  Serial.begin(9600);
}

void loop(void) {
  delay(1000); // задержка 1 сек
  byte addr[8]; // массив для хранения данных ключа
  
  if ( !iButton.search(addr) ) { // если ключ не приложен
      Serial.println("No key connected..."); // сообщаем об этом
      return; // и прерываем программу
  }
  
  Serial.print("Key : ");
  for(int i=0; i<8; i++) {
    Serial.print(addr[i], HEX); // выводим побайтно данные ключа
    Serial.print(" ");
  }
  Serial.println();
  iButton.reset(); // сброс ключа
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ЕМНИП, после строки №13 нужно ещё

iButton.reset_search();

 

8toni8
Offline
Зарегистрирован: 06.03.2020

честно говоря, не понятно зачем производить сброс, по скольку при прикосновении к контактам рукой (и отсутствия в схеме сопротивления), наводками ключ записываеться в монитор com порта, после чего опять пишет "No key connected...", получаеться память сбрасываеться и так... 

Есть ли еще варианты? 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Т.е. Вы даже не попробовали? Смешной Вы, право.

8toni8
Offline
Зарегистрирован: 06.03.2020

Извиняюсь, подумать подумал, но не написал:) Конечно попробовал, других то вариантов пока у меня нет:))) 

Вообщем не помогло:( 

Блин, может ключи какие то разные бывают, ну типо потребление у них высокое и им не хватает:))) 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Знаете, был тут такой деятель, у которого датчик был не к тому пину присоединён. Ему на это указали, а он такой: "Попробвал другой пин - не помогло, вернул как было". Вот и Вы также.

Я Вам показал на очевидную ошибку, исправьте её, опубликуйте скетч и тогда можно будет смотреть дальше.

8toni8
Offline
Зарегистрирован: 06.03.2020
#include <OneWire.h>

OneWire iButton(10); // создаём объект 1-wire на 10 выводе

void setup (void) {
  Serial.begin(9600);
}

void loop(void) {
  delay(1000); // задержка 1 сек
  byte addr[8]; // массив для хранения данных ключа
  
  if ( !iButton.search(addr) ) { // если ключ не приложен
      iButton.reset_search();
      Serial.println("2 No key connected..."); // сообщаем об этом
      return; // и прерываем программу
  }
  
  Serial.print("Key : ");
  for(int i=0; i<8; i++) {
    Serial.print(addr[i], HEX); // выводим побайтно данные ключа
    Serial.print(" ");
  }
  Serial.println();
  iButton.reset(); // сброс ключа
}

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Чой та не видать, где вы считанное значение в массив вносите ?
Нигде не хотите там добавить ничего типа:
addr[i] = iButton.read();

sadman41
Offline
Зарегистрирован: 19.10.2016

 

read не нужен в данном случае: onewire.search()  ...The addrArray is an 8 byte array. If a device is found, addrArray is filled with the device's address and true is returned. If no more devices are found, false is returned.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

В принципе, она должна нормально работать. 

Схему Вы нам не показали. Давайте ка схему (Вашу, реальную схему, а не левую картинку из интернета, которую Вы там в первом посте положили) и фото сборки.

sadman41
Offline
Зарегистрирован: 19.10.2016

В принципе - должна. Более того - Example для DS18x20 из библиотеки OneWire вроде как этот ключ находит без проблем.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, я попробовал, всё работает.

8toni8
Offline
Зарегистрирован: 06.03.2020

ЕвгенийП пишет:

В принципе, она должна нормально работать. 

Схему Вы нам не показали. Давайте ка схему (Вашу, реальную схему, а не левую картинку из интернета, которую Вы там в первом посте положили) и фото сборки.

https://ibb.co/Jnj6H64

https://ibb.co/ZhfYY0Y

8toni8
Offline
Зарегистрирован: 06.03.2020

sadman41 пишет:

В принципе - должна. Более того - Example для DS18x20 из библиотеки OneWire вроде как этот ключ находит без проблем.

Да я понимаю, что должен, но по какой то причине не работает( 

ASidneff
ASidneff аватар
Offline
Зарегистрирован: 20.09.2015
#include <OneWire.h>

#define pin 0
OneWire ibutton (pin); // Пин D0 для подлючения iButton (Data)
byte addr[8];
byte ReadID[8] = { 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x2F }; // "Универсальный" ключ. Прошивается последовательность 01:FF:FF:FF:FF:FF:FF:2F

const int buttonPin = 5;
const int ledPin = 2;
int buttonState = 0;
int writeflag = 0;
int readflag = 0;
int val = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  Serial.begin(115200);
}

void loop() {

  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {
    readflag = 1;
    writeflag = 1;
    digitalWrite(ledPin, HIGH);
    val++;
    if (val > 6) val = 6;
    Serial.print(val);
    delay(500);
  }
  else {
    val = 0;
  }


  if (!ibutton.search (addr)) {
    ibutton.reset_search();
    delay(50);
    if (val <= 5) return;
    val = 0;
  }

  digitalWrite(ledPin, HIGH);
  delay(50);

  for (byte x = 0; x < 8; x++) {
    Serial.print(addr[x], HEX);
    if (readflag == 0) {
      ReadID[x] = (addr[x]);
    }
    Serial.print(":");
  }

  byte crc; // Проверка контрольной суммы
  crc = ibutton.crc8(addr, 7);
  Serial.print("CRC: ");
  Serial.println(crc, HEX);
  digitalWrite(ledPin, LOW);

  if ((writeflag == 1) or (Serial.read() == 'w')) {
    ibutton.skip(); ibutton.reset(); ibutton.write(0x33);
    Serial.print("  ID before write:");
    for (byte x = 0; x < 8; x++) {
      Serial.print(' ');
      Serial.print(ibutton.read(), HEX);
    }
    // send reset
    ibutton.skip();
    ibutton.reset();
    // send 0xD1
    ibutton.write(0xD1);
    // send logical 0
    digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(60);
    pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10);

    Serial.print('\n');
    Serial.print("  Writing iButton ID:\n    ");
    byte newID[8] = { (ReadID[0]), (ReadID[1]), (ReadID[2]), (ReadID[3]), (ReadID[4]), (ReadID[5]), (ReadID[6]), (ReadID[7]) };
    ibutton.skip();
    ibutton.reset();
    ibutton.write(0xD5);
    for (byte x = 0; x < 8; x++) {
      writeByte(newID[x]);
      Serial.print('*');
    }
    Serial.print('\n');
    ibutton.reset();
    // send 0xD1
    ibutton.write(0xD1);
    //send logical 1
    digitalWrite(pin, LOW); pinMode(pin, OUTPUT); delayMicroseconds(10);
    pinMode(pin, INPUT); digitalWrite(pin, HIGH); delay(10);
    writeflag = 0;
    readflag = 0;
    digitalWrite(ledPin, LOW);
  }
}

int writeByte(byte data) {
  int data_bit;
  for (data_bit = 0; data_bit < 8; data_bit++) {
    if (data & 1) {
      digitalWrite(pin, LOW); pinMode(pin, OUTPUT);
      delayMicroseconds(60);
      pinMode(pin, INPUT); digitalWrite(pin, HIGH);
      delay(10);
    } else {
      digitalWrite(pin, LOW); pinMode(pin, OUTPUT);
      pinMode(pin, INPUT); digitalWrite(pin, HIGH);
      delay(10);
    }
    data = data >> 1;
  }
  return 0;
}

Вот скетч под Вашу схему! (Читает и шьёт! ключи Dalas1990) И R1 Замените на 500 Ом!!!