Страница 1 из 1
Оптимизация кода под несколько датчиков ds18b20
Добавлено: 06 мар 2017, 23:44
Сергей Интереснов
Добрый день, all,
Столкнулся с задачей когда подключается от 4 до 8 датчиков на разные порты. Почему так- потому что при какой либо проблеме с датчиком, он легко заменяется без поиска адреса датчика, а портов на меге достаточно для решения задачи. Решение Эдуарда использовать прерывание как counter красиво, но вот незадача при добавлении датчиков в лоб код становится громоздким и напрашивается вынести опрос в функцию. Но вот как функции передать задачу опрашивать датчики с разных шин? Забиваются ли в массив разные объекты класса onewire?
Re: Оптимизация кода под несколько датчиков ds18b20
Добавлено: 07 мар 2017, 00:00
Эдуард
Здравствуйте!
С объектами класса можно работать через указатели.
Код: Выделить всё
#include <OneWire.h>
OneWire sens1(2);
OneWire sens2(3);
OneWire sens3(4);
OneWire * psens1 = &sens1;
OneWire * psens2 = &sens2;
OneWire * psens3 = &sens3;
void setup() {
}
void loop() {
psens1->reset(); // сброс шины 1-Wire
psens1->write(0xCC, 1); // пропуск ROM
psens1->write(0x44, 1); // инициализация измерения
// ...........
}
Вы можете передавать функции указатель на объект OneWire.
Код: Выделить всё
#include <OneWire.h>
OneWire sens1(2);
OneWire sens2(3);
OneWire sens3(4);
OneWire * psens1 = &sens1;
OneWire * psens2 = &sens2;
OneWire * psens3 = &sens3;
void setup() {
}
void loop() {
sensDS(psens1);
sensDS(psens2);
sensDS(psens3);
}
void sensDS(OneWire * psens) {
psens->reset(); // сброс шины 1-Wire
psens->write(0xCC, 1); // пропуск ROM
psens->write(0x44, 1); // инициализация измерения
// ...........
}
Можно создать динамические объекты.
Код: Выделить всё
OneWire * psens1 = new OneWire(2);
OneWire * psens2 = new OneWire(3);
OneWire * psens3 = new OneWire(4);
Re: Оптимизация кода под несколько датчиков ds18b20
Добавлено: 07 мар 2017, 08:18
Сергей Интереснов
Спс Эдуард:) Про динамически объекты почитаю. Пробел. По ссылкам еще раз проштудирую Ваш урок. Правда рождается еще вопрос. Переменная temp. Можно ли ее привязать к объекту класса чтоб на выходе функции получать результат?
Re: Оптимизация кода под несколько датчиков ds18b20
Добавлено: 07 мар 2017, 10:14
Эдуард
Да конечно. Методы класса это функции и они могут возвращать значения.
Re: Оптимизация кода под несколько датчиков ds18b20
Добавлено: 07 мар 2017, 22:01
Сергей Интереснов
При использовании прерываний на 483 такте функция начинает забивать массив из 8 байт. При этом разбивает это действие на такты дабы не завесить остальные процессы. В моем случае заполнение 6 массивов единовременно скажется не лучшим образом на быстродействии алгоритма. Существует ли возможность привязать массив к объекту класса и заполнять его постепенно. Иными словами 483 такт заполняем первый байт массива каждого из датчиков. 484 такт 2 байт массива каждого датчика. Динамические объекты здесь безсмысленны на мой взгляд, так как алгоритм постоянно ориентируется на хранимые показания датчиков для принятия решения по relayshield.
Re: Оптимизация кода под несколько датчиков ds18b20
Добавлено: 07 мар 2017, 22:15
Эдуард
А почему вы не хотите распределить операции работы с датчиками по интервалам.У вас есть цикл из 50 отрезков по 20 мс с общим временем 1 секунда. В первом интервале запускаете измерение первого датчика, во втором интервале - второго датчика, и так все датчики. Ждете время, необходимое для завершения измерения и считываете данные датчиков. Например, в 42 интервале - первый датчик, в 43 - второй и т.д. А в интервале можете вызывать функцию, которой передавать указатель на объект-датчик. Неважно на статический объект или динамический.
Re: Оптимизация кода под несколько датчиков ds18b20
Добавлено: 07 мар 2017, 22:39
Сергей Интереснов
Да как вариант думал размазать задачу по коду. Но когда новичек ищешь варианты красивее. Опыта то не хватает. По Вашему ответу понимаю, что невозможно обратиться вроде sensds::tempbuff[8].
Re: Оптимизация кода под несколько датчиков ds18b20
Добавлено: 08 мар 2017, 07:50
Сергей Интереснов
Задача была сделать универсальную функцию для обработки датчиков. Внутри функции все раскладывалось по интервалам. Хотел и массив внутри функции разложить по интервалам.