Оптимизация кода под несколько датчиков ds18b20

Вопросы по средствам измерения температуры
Сергей Интереснов
Сообщения: 5
Зарегистрирован: 06 мар 2017, 23:22

Оптимизация кода под несколько датчиков ds18b20

Сообщение Сергей Интереснов » 06 мар 2017, 23:44

Добрый день, all,
Столкнулся с задачей когда подключается от 4 до 8 датчиков на разные порты. Почему так- потому что при какой либо проблеме с датчиком, он легко заменяется без поиска адреса датчика, а портов на меге достаточно для решения задачи. Решение Эдуарда использовать прерывание как counter красиво, но вот незадача при добавлении датчиков в лоб код становится громоздким и напрашивается вынести опрос в функцию. Но вот как функции передать задачу опрашивать датчики с разных шин? Забиваются ли в массив разные объекты класса onewire?


Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

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);

Сергей Интереснов
Сообщения: 5
Зарегистрирован: 06 мар 2017, 23:22

Re: Оптимизация кода под несколько датчиков ds18b20

Сообщение Сергей Интереснов » 07 мар 2017, 08:18

Спс Эдуард:) Про динамически объекты почитаю. Пробел. По ссылкам еще раз проштудирую Ваш урок. Правда рождается еще вопрос. Переменная temp. Можно ли ее привязать к объекту класса чтоб на выходе функции получать результат?

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Оптимизация кода под несколько датчиков ds18b20

Сообщение Эдуард » 07 мар 2017, 10:14

Да конечно. Методы класса это функции и они могут возвращать значения.

Сергей Интереснов
Сообщения: 5
Зарегистрирован: 06 мар 2017, 23:22

Re: Оптимизация кода под несколько датчиков ds18b20

Сообщение Сергей Интереснов » 07 мар 2017, 22:01

При использовании прерываний на 483 такте функция начинает забивать массив из 8 байт. При этом разбивает это действие на такты дабы не завесить остальные процессы. В моем случае заполнение 6 массивов единовременно скажется не лучшим образом на быстродействии алгоритма. Существует ли возможность привязать массив к объекту класса и заполнять его постепенно. Иными словами 483 такт заполняем первый байт массива каждого из датчиков. 484 такт 2 байт массива каждого датчика. Динамические объекты здесь безсмысленны на мой взгляд, так как алгоритм постоянно ориентируется на хранимые показания датчиков для принятия решения по relayshield.

Эдуард
Администратор
Сообщения: 484
Зарегистрирован: 30 окт 2016, 20:53

Re: Оптимизация кода под несколько датчиков ds18b20

Сообщение Эдуард » 07 мар 2017, 22:15

А почему вы не хотите распределить операции работы с датчиками по интервалам.У вас есть цикл из 50 отрезков по 20 мс с общим временем 1 секунда. В первом интервале запускаете измерение первого датчика, во втором интервале - второго датчика, и так все датчики. Ждете время, необходимое для завершения измерения и считываете данные датчиков. Например, в 42 интервале - первый датчик, в 43 - второй и т.д. А в интервале можете вызывать функцию, которой передавать указатель на объект-датчик. Неважно на статический объект или динамический.

Сергей Интереснов
Сообщения: 5
Зарегистрирован: 06 мар 2017, 23:22

Re: Оптимизация кода под несколько датчиков ds18b20

Сообщение Сергей Интереснов » 07 мар 2017, 22:39

Да как вариант думал размазать задачу по коду. Но когда новичек ищешь варианты красивее. Опыта то не хватает. По Вашему ответу понимаю, что невозможно обратиться вроде sensds::tempbuff[8].

Сергей Интереснов
Сообщения: 5
Зарегистрирован: 06 мар 2017, 23:22

Re: Оптимизация кода под несколько датчиков ds18b20

Сообщение Сергей Интереснов » 08 мар 2017, 07:50

Задача была сделать универсальную функцию для обработки датчиков. Внутри функции все раскладывалось по интервалам. Хотел и массив внутри функции разложить по интервалам.


Вернуться в «Датчики температуры»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя