Инициализация библиотечного объекта в собственной библиотеке
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;
};
@pitchbent, 👍0
Обсуждение1 ответ
Лучший ответ:
Используйте конструктор без параметра OneWire wire;
и вызовите wire.begin(pin);
, чтобы установить контакт.
Чтобы использовать больше датчиков на разных выводах, сделайте экземпляр OneWire членом класса DS28EC20.
Теперь работает лучше, чем раньше, спасибо. Инициализация с помощью DS28EC20 One(31)
теперь работает, но если я инициализирую второй экземпляр (например, DS28EC20 Two(32)
, я возвращаю те же результаты, что и в первом объекте...., @pitchbent
Обратите внимание на комментарий над вашим :), @pitchbent
Большое спасибо! Мне еще нужно многому научиться., @pitchbent
- Можно ли запустить код ардуино на 6502?
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Как читать и записывать EEPROM в ESP8266
- Как получить исходные файлы для библиотек Arduino?
- Ошибка: "недопустимое использование нестатической функции-члена" при вызове функции из моего собственного класса-метода
- Какой реальный срок службы EEPROM?
- Как запомнить значения переменных после перезагрузки платы Arduino Uno R3
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
Вы получаете сообщение об ошибке, если не указываете параметр конструктора?, @chrisl
Да. Ответ @Juraj как бы решил проблему. Единственная проблема, которая все еще сохраняется, я вызываю второй экземпляр..., @pitchbent