0

EDIT: @Juraj fixed the Issue, changes at the end of the post

I am developing an application to program OneWire ID Chips. I am using the OneWire library (https://github.com/PaulStoffregen/OneWire) and built my own Library for the DS28EC20 Chip on top of it.

It is working but it's not very elegant. I have issues initalizing the OneWire object in my own library. At the moment it is only working with a fixed pin declared in my own library.

I want to call a function in my code which initalizes the OneWire library aswell as my own library for the DS28EC20.

I am not using the Arduino IDE, I am using Platform.io for VSCode because it's more powerful.

It would be awesome if someone could help me, because I need to use multiple ID Chips in my application.

Because of unkown reasons I need to pass a variable to the constructor of the DS28EC20. Calling the OneWire library in there does not work...

I excluded the other functions in the DS28EC20.cpp file, I think they are not necessary rn

Thank you very much in advance! - pitchbent

main.cpp:

#include <Arduino.h>
#include <OneWire.h>
#include <DS28EC20.h>

uint8_t scratchpad[32];                                                   // Array for scratchpad
uint16_t location;                                                        //Memory location to store scratchpad in
//uint8_t memory[32];                                                       
bool status;                                                              // Status of the crc check


DS28EC20 One(5); 

void setup() {


  pinMode(13,OUTPUT);
  Serial.begin(115200);                                                   //begin serial connection 0
  location = 0x460;                                                       //Memory location

  for (uint8_t i = 0; i < 32; i++)                                        //filling array for scratchpad
  {
    scratchpad[i]=0x22;
  }
  Serial.println(scratchpad[2]);

  status = One.write_scratchpad(scratchpad,32,location);                  //write scratchpad
  Serial.println("Status:");                                              //print status
  Serial.println(status);


  // put your setup code here, to run once:
}

void loop() {



  // put your main code here, to run repeatedly:
}

DS28EC20.cpp:

#include "Arduino.h"
#include "OneWire.h"
#include "DS28EC20.h"


OneWire Wire(31);

DS28EC20::DS28EC20(uint8_t)
{

}
bool DS28EC20::write_scratchpad(uint8_t *data, uint8_t leng, uint_fast16_t adress)
{
  Serial.println("123");
  uint8_t TA1;                                                            // Var for adress Bytes
  uint8_t TA2;
  uint8_t crc_rec[6];                                                     // Array for recieved CRC Bytes
  uint8_t crc_array[leng+3];                                              // Array for calculation of CRC value

  TA1 = (adress & 0xFF);                                                  // calculation of TA1 & TA2
  TA2 = ((adress >> 8) & 0xFF);
 crc_array[0]=WRITE_SCRATCHPAD;                                            // The CRC sum is computed out of the command aswell as the adress byteys 
  crc_array[1]=TA1;                                                         // 
  crc_array[2]=TA2;   

  for (int i = 0; i < leng; i++)                                            // write data into crc array
  {
    crc_array[i+3]=data[i];
  }
 Wire.reset();                                                             // Reset
  Wire.write(SKIP_ROM);                                                     // Skip ROM
  Wire.write(WRITE_SCRATCHPAD);                                             // write Scratchpad

  Wire.write(TA1);                                                          // send adress bytes
  Wire.write(TA2);

  for(int i=0;i<leng; i++)                                                  // write data
  {
    Wire.write(data[i]);
  }

  Wire.read_bytes(crc_rec,6);                                               // safe CRC values sent from chip

  delay(10);
 Wire.reset();                                                             // Reset
if(Wire.check_crc16(crc_array,leng+3,&crc_rec[0]))                        // CRC Check
  {
    return true;
  }
  else
  {
    return false;
  }

}

DS28EC20.h

/*
Library for DS28EC20, built on top of OneWire.h lib
*/


#ifndef DS28EC20_h
#define DS28EC20_h


#include "Arduino.h"
#include "OneWire.h"
#include "DS28EC20.h"

#define WRITE_SCRATCHPAD 0xF                                              // commands für DS28EC20
#define READ_SCRATCHPAD 0xAA
#define COPY_SCRATCHPAD 0x55
#define READ_MEMORY 0xF0
#define EXTENDED_READ_MEMORY 0xA5

#define READ_ROM 0x33
#define MATCH_ROM 0x55
#define SEARCH_ROM 0xF0
#define SKIP_ROM 0xCC
#define RESUME 0xA5



class DS28EC20
{
    public:
     DS28EC20(uint8_t); // Constructor, add DS28EC20 to "pin"
     bool write_scratchpad(uint8_t *data, uint8_t leng, uint_fast16_t adress);
     bool write_memory(uint16_t adress);
     void read_memory(uint16_t adress,uint8_t *data, uint8_t leng);

     private:    


};

Fix:

In main.cpp call Object with corresponding pin:

DS28EC20 One(31);

In DS28EC20.cpp add

OneWire Wire;

after includes, change the constructor aswell:

DS28EC20::DS28EC20(uint8_t pin)
{
  Wire.begin(pin);  
}

In DS28EC20.h you need to change the class to:

class DS28EC20
{
    public:

     DS28EC20(uint8_t pin); // Constructor, add DS28EC20 to "pin"
     bool write_scratchpad(uint8_t *data, uint8_t leng, uint_fast16_t adress);
     bool write_memory(uint16_t adress);
     void read_memory(uint16_t adress,uint8_t *data, uint8_t leng);

     private:    
     OneWire Wire;                                                   

};
  • Do you get an error, if you don't provide a constructor parameter? – chrisl Nov 20 '19 at 11:35
  • 1
    Yes. The answer of @Juraj kinda solved the issue. The only issue which still persists i calling a second instance... – pitchbent Nov 20 '19 at 12:38
0

Use the constructor without parameter OneWire wire; and call wire.begin(pin); to set the pin.

And to use more sensors on different pins, make the OneWire instance member of the DS28EC20 class.

| improve this answer | |
  • It works better than before now, thank you. Initializing via DS28EC20 One(31)works now, but if I initalize a second instance (for example DS28EC20 Two(32) i return the same results as in the first object.... – pitchbent Nov 20 '19 at 12:28
  • Please notice the commenct above yours :) – pitchbent Nov 20 '19 at 12:31
  • Thank you so much! I still need to learn a lot of things. – pitchbent Nov 20 '19 at 12:44

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.