DS2401+ og OneWire med arduino

Dette er en gjennomgang for å forstå en DS2401 og OneWire protokollen.

Mål

En DS2401+ er en komponent som returnerer en unik identifikator. Målet er å hente ut den unike koden.

Komponenten bruker OneWire protokollen og målet er å få kommunisert med denne og få verifisert resultatet. For å gjøre dette så kobles det to DS2401+ på samme pin.

Utstyr

  • En arduino (I dette tilfellet en Mega ADK)
  • 2x DS2401+ (En er nok, men for å teste kommunikasjon med flere enhet trengs to.)
  • 4,7K ohm motstand

Krets

ds2401

20160925_170234

Bibliotek

Bruker OneWire biblioteket hentet her.

Program

Koden kan lastes ned her.

#include <OneWire.h>

/**
 * Pin the DS2401 is connected to.
 */
#define ONEWIRE_PIN             10
/**
 * Address size.
 */
#define ONE_WIRE_ADDRESS_SIZE   8
/**
 * Serial baud speed.
 */
#define SERIAL_BAUD             9600
/**
   Object for communicating with the OneWire bus.
*/
OneWire onewire(ONEWIRE_PIN);

/**
   Address of the component found.
*/
byte owAddr[ONE_WIRE_ADDRESS_SIZE];

void setup() {
  /**
     Serial communication speed. This is only for serial information back.
  */
  Serial.begin(SERIAL_BAUD);

  /**
     Initalize onewire.
  */
  onewire.reset();

}

void loop() {
  /**
   * Verify that component is present.
   */
  boolean present = onewire.search(owAddr);
  printPresent(present);  
  if (present) {
    /**
     * Print component address.
     */
    printData();
    /**
     * Calculate crc code. It should be equal to the last byte.
     */
    byte crc = OneWire::crc8(owAddr, 7);
    printCrc(crc);
  } 
}

/**
 * Print present result.
 */
void printPresent(int present) {
  Serial.print("Present: ");
  Serial.println(present);
}

/**
   Print data.
*/
void printData() {
  Serial.print("Data: ");
  for (int i = 0; i < ONE_WIRE_ADDRESS_SIZE; i++) {
    Serial.print(owAddr[i], HEX);
    Serial.print(" ");
  }
  Serial.println();
}

/**
   Print crc result.
*/
void printCrc(byte crc) {
  Serial.print("CRC: ");
  Serial.println(crc, HEX);
}


Data resultat

Present: 1
Data: 1 87 23 84 18 0 0 5C 
CRC: 5C
Present: 0
Present: 1
Data: 1 58 8 83 18 0 0 B2 
CRC: B2

Det i blått er første komponent og orange er komponent to.

Byte 1 i begge dataene har verdi 1 og er familie koden.

Byte 2-7 er den unike adressen.

Byte 8 er CRC verdien og skal være lik den beregnete CRC verdien.

20160925_170215
DS2401+