Инициализация библиотечного объекта в собственной библиотеке

EDIT: @Juraj исправил проблему, изменения в конце сообщения

Я разрабатываю приложение для программирования чипов OneWire ID. Я использую библиотеку OneWire (https://github.com/PaulStoffregen/OneWire) и создал собственную библиотеку для микросхемы DS28EC20. поверх него.

Это работает, но не очень элегантно. У меня проблемы с инициализацией объекта OneWire в моей собственной библиотеке. На данный момент он работает только с фиксированным выводом, объявленным в моей собственной библиотеке.

Я хочу вызвать в своем коде функцию, которая инициализирует библиотеку OneWire, а также мою собственную библиотеку для DS28EC20.

Я не использую Arduino IDE, я использую Platform.io для VSCode, потому что он более мощный.

Было бы здорово, если бы кто-нибудь помог мне, потому что мне нужно использовать несколько чипов идентификации в моем приложении.

По неизвестным причинам мне нужно передать переменную в конструктор DS28EC20. Вызов библиотеки OneWire оттуда не работает...

Я исключил другие функции в файле DS28EC20.cpp, я думаю, что они не нужны rn

Заранее большое спасибо! - согнутый

main.cpp:

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

uint8_t scratchpad[32];                                                   // Массив для блокнота
uint16_t location;                                                        //Ячейка памяти для хранения блокнота
//память uint8_t[32];
bool status;                                                              // Статус проверки crc


DS28EC20 One(5); 

void setup() {


  pinMode(13,OUTPUT);
  Serial.begin(115200);                                                   //начать последовательное соединение 0
  location = 0x460;                                                       //Место памяти

  for (uint8_t i = 0; i < 32; i++)                                        // заполнение массива для блокнота
  {
    scratchpad[i]=0x22;
  }
  Serial.println(scratchpad[2]);

  status = One.write_scratchpad(scratchpad,32,location);                  //запись блокнота
  Serial.println("Status:");                                              //распечатать статус
  Serial.println(status);


  // поместите сюда код установки для однократного запуска:
}

void loop() {



  // поместите сюда ваш основной код для многократного запуска:
}

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 для байтов адреса
  uint8_t TA2;
  uint8_t crc_rec[6];                                                     // Массив полученных байтов CRC
  uint8_t crc_array[leng+3];                                              // Массив для вычисления значения CRC

  TA1 = (adress & 0xFF);                                                  // расчет TA1 & ТА2
  TA2 = ((adress >> 8) & 0xFF);
 crc_array[0]=WRITE_SCRATCHPAD;                                            // Сумма CRC вычисляется из команды так же, как и байты адреса
  crc_array[1]=TA1;                                                         //
  crc_array[2]=TA2;   

  for (int i = 0; i < leng; i++)                                            // запись данных в массив crc
  {
    crc_array[i+3]=data[i];
  }
 Wire.reset();                                                             // Перезагрузить
  Wire.write(SKIP_ROM);                                                     // Пропустить ПЗУ
  Wire.write(WRITE_SCRATCHPAD);                                             // запись в блокнот

  Wire.write(TA1);                                                          // отправляем байты адреса
  Wire.write(TA2);

  for(int i=0;i<leng; i++)                                                  // записываем данные
  {
    Wire.write(data[i]);
  }

  Wire.read_bytes(crc_rec,6);                                               // безопасные значения CRC, отправленные с чипа

  delay(10);
 Wire.reset();                                                             // Перезагрузить
if(Wire.check_crc16(crc_array,leng+3,&crc_rec[0]))                        // Проверка CRC
  {
    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                                              // команды для 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); // Конструктор, добавляем DS28EC20 в "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:    


};

Исправить:

В main.cpp вызовите объект с соответствующим выводом:

DS28EC20 One(31);

В DS28EC20.cpp добавьте

OneWire Wire;

после включения измените и конструктор:

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

В DS28EC20.h вам нужно изменить класс на:

class DS28EC20
{
    public:

     DS28EC20(uint8_t pin); // Конструктор, добавляем DS28EC20 в "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;                                                   

};

, 👍0

Обсуждение

Вы получаете сообщение об ошибке, если не указываете параметр конструктора?, @chrisl

Да. Ответ @Juraj как бы решил проблему. Единственная проблема, которая все еще сохраняется, я вызываю второй экземпляр..., @pitchbent


1 ответ


Лучший ответ:

0

Используйте конструктор без параметра OneWire wire; и вызовите wire.begin(pin);, чтобы установить контакт.

Чтобы использовать больше датчиков на разных выводах, сделайте экземпляр OneWire членом класса DS28EC20.

,

Теперь работает лучше, чем раньше, спасибо. Инициализация с помощью DS28EC20 One(31) теперь работает, но если я инициализирую второй экземпляр (например, DS28EC20 Two(32), я возвращаю те же результаты, что и в первом объекте...., @pitchbent

Обратите внимание на комментарий над вашим :), @pitchbent

Большое спасибо! Мне еще нужно многому научиться., @pitchbent