Масив датчиков OneWire
- Войдите на сайт для отправки комментариев
Вс, 05/06/2016 - 23:38
Всем здрасти!
Подскажите пожалуйста можно ли как то объявить датчики в OneWire не в виде объектов, а в виде масива объектов?
То есть обычно так:
OneWire sensorTemperature1(1); OneWire sensorTemperature2(2); OneWire sensorTemperature3(3);
А хотелось бы что то типа масива, что бы можно было крутить цикл опроса датчиков или написать общую функцию. В библиотеке ДаласТемператур есть подобное, но он не работает:
int oneWirePins[]={3,7};//OneWire DS18x20 temperature sensors on these wires const int oneWirePinsCount=sizeof(oneWirePins)/sizeof(int); OneWire ds18x20[oneWirePinsCount]; DallasTemperature sensor[oneWirePinsCount]; .... DeviceAddress deviceAddress; for (int i=0; i<oneWirePinsCount; i++) {; ds18x20[i].setPin(oneWirePins[i]); sensor[i].setOneWire(&ds18x20[i]); sensor[i].begin(); if (sensor[i].getAddress(deviceAddress, 0)) sensor[i].setResolution(deviceAddress, 12); }
Простите, но, боюсь, я не понял проблемы. Что мешает просто "по рабоче-крестьянски" объявить массив? Примерно так:
В чём засада-то?
Простите, но, боюсь, я не понял проблемы. Что мешает просто "по рабоче-крестьянски" объявить массив? Примерно так:
В чём засада-то?
это не то, что нужно ему...
есму нужен массив адресов и по каждому адресу тогда можно обращатся к элементу... я в субботу начал делать для даласс температурных датчиков... будет отдельный класс с автоматическим опросом, только когда доделаю - не знаю, сейчас немного другое переделываю пока нашел, думаю к выходным будет готово...
кстати вопрос: можно делать массив состоящий из структур? если без указателей и приведения типов... простой способ работает?
это не то, что нужно ему...
есму нужен массив адресов и по каждому адресу тогда можно обращатся к элементу...
Вполне возможно, я же говорю, что я не понял проблемы. Просто в примере он явно хотел массив OneWire'ов, вот я и показал как это описать.
можно делать массив состоящий из структур? если без указателей и приведения типов... простой способ работает?
Ну, я же описал массив экземпляров класса в этом же топике? А структура - она тоже класс. Так что делайте, кто Вам не даёт. Никаких проблем.
Спасибо за ответы, но тут ещё дальше вопросы, в принципе я попробую всё таки написать класс для датчиков, но в образовательных целях инетересно...
Как быть в этой ситуации?
Ну и что? Адрес сам по себе это одномерный массив. Ваш двумерный массив - это массив одномерных массивов (т.е. адресов). Ещё раз, Ваш вумерный массив на самом деле "одномерный массив одномерных массивов". Поэтому когда Вам нужен адрес, Вы берёте элемент одномерного "массива массивов". Этот элемент есть одномерный массив - адрес.
ЕвгенийП, а можете написать вашу мысль в коде? Исправить эту строку как надо.
sensorTemperature[j].select(addresSensorTemperature1[j]);
Если писать так, то он думает что я даю ему всего лишь ячейку масива под номером j.
Стоп! У меня адрес byte, а в примерах нашёл ещё типа такого:
DeviceAddress Thermometer1; Вот это тоже легко можно в масив загнать.
DeviceAddress встроен в язык, или он часть OneWire или DalasTemperature?
Стоп! У меня адрес byte, а в примерах нашёл ещё типа такого:
DeviceAddress Thermometer1; Вот это тоже легко можно в масив загнать.
DeviceAddress встроен в язык, или он часть OneWire или DalasTemperature?
я тебе это и предложил в третем посту :)
этот адрес - массив из 8 байт если меня склероз не подводит
я сейчас с мониторчиком доразберусь и займусь именно тем чего ты хочешь...
DeviceAddress встроен в язык, или он часть OneWire или DalasTemperature?
Определён в OneWire как массив из 8 байтов.
Или у меня не тот OneWire или его там нет, но нашёл в библиотеке Даласа - typedef uint8_t DeviceAddress[8];
А просто так выдаёт ошибку
sketch_jun01a:10: error: 'DeviceAddress' does not name a type
DeviceAddress Thermometer1;
^
exit status 1
'DeviceAddress' does not name a type
Ну, значит я ошибся - в далласе.
А ошибки не будет, если включить #include <DallasTemperature.h>
Не помогает, что то её не нравится #include <DallasTemperature.h>, взял просто добавил себе typedef uint8_t DeviceAddress[8];
По сути начало ругаться после этой строки: sensorTemperature[count].select(addresSensorTemperature[count]);
ВОт что у меня сейчас и не работает:
И дурная привычка у IDE на разные ошибки выдавать только:
collect2.exe: error: ld returned 5 exit status
exit status 1
Ошибка компиляции для платы Arduino Nano.
Даже если стоит ПОДРОБНО.
Ещё вопросик, оказывается и сообщал датчику, что у меня паразитное питание (
sensorTemperature[count].write(0x44, 1);
), а по факту у меня норм питание и датчики висит на 3 проводах.
Показания выдавал правдивые, это нормально?
С ошибкой "collect2.exe: error: ld returned 5 exit status" мой косяк, вылечилось полной переустановкой и уделением библиотек.
Подскажите пожалуйста, переписываю библиотеку Даласа под себя и просто набираюсь опыта, имею вот что:
в обычной либе OneWire это единичный объект, а я ему получается перадаю масив таких объектов, причём если я правильно понимаю, то не указывая ему квадратных скобок я даю указатель на первый элемент. Вобщем он ругается
В принципе либа Даласа не работает по это же причине, конструктор не может принять масив объектов.
Подскажите как поправить.
Ну, я же показывал Вам в посте №1 выше как объявить массив объектов и вызвать конструкторы. Там были объекты типа OneWire, ну а сейчас Вам нужны объекты типа DeviceAddress. Ну точно также как там объявите массив и вызывайте конструкторы в инициализаторе.
Понимаю что пост был более года назад, всеравно напишу свой вопрос здесь, потому что иду к своей цели своей тропинкой, в свободное от работы семьи время : 0)
ковыряю сейчас библиотеку OneWire , мне нужно обратится к конкретному датчику DS18B20 по его адресу,
вставляю в myWire.select(addrArray) адрес датчика показывает температуру - 127.
http://www.pjrc.com/teensy/td_libs_OneWire.html -тут пишут myWire.select(addrArray) это команда выбора устройства по адресу
адрес в 0х пишу
в скобках массив адресов написано но массив по синтаксису в квкадратных скобках
подскажите как правильно обратится
подскажите как правильно
Правильно посмотреть в текст библиотеки. Открываем и смотрим
т.е., функция принимает один параметр - массив из восьми байтов.
точно, один ваер ведь последовательный интерфейс, и поэтому байты через цикл вводятся, спасибо дошло
только не пойму что записывает 8 строчка, ром не может ведь выбиратся 8 раз
подскажите, плиз
Так она же ВНЕ цикла и исполняется 1 раз. Цикл находится в строке 10.
спасибо
Это я осилил и успешно применяю. Но стал другой вопрос, как инициализировать двухмерный массив, типа такого...
уже нашёл ответ:
в сто пицотый раз про датчики температуры даллас. С ними часто бывают глюки, особенно если пользователь малоопытный. Будь то delay (750) в библиотеке даллас, который с ростом опыта начинает раздражать, или будь то некорректные -127 или 85 градусов показывает. Предлагаю на обозрение взаимодействие с датчиками следующим образом (см скетч). Из всех способов, которые я пробовал, так меньше всего глюков. Потому что проверяется контрольная сумма данных от датчика, и если она некорректна, данные этого конкретного измерения не учитываются. Задержки в виде delay при измерениях отсутствуют.
Также температуры и адреса датчиков находятся в двумерном массиве, так удобнее с ними работать. Особенно если температур, а значит и датчиков, много. Названия температур лежат в прогмем, чтобы ОЗУ не занимали.
Может кому будет полезно, ну и критика тоже приветствуется.