Чтение Номера Пина Из Конфига

KorPaEv
Offline
Зарегистрирован: 24.11.2014

Доброго времени суток, уважаемые!
Вопрос в следующем - возможно ли из конфига прочесть номера пинов, заполнить их каким то образом в массив и уже после этого стартовать даллас и вывод температуры на экран?
Судя по моим попыткам, это не совсем возможно, может кто то знает как можно сделать?

У меня есть файл в нем построчно записаны номера пинов на датчики
4
5

Я делаю следующее - до инициализации железки объявляю сам объект, в этом и проблема, когда объявляешь, то пины уже записываются из пустого, еще пока, массива, а дальше когда я переписываю массив и стартую даллас, то ничего не меняется...

Вот код

byte dallasSensors[2] = {0}; //Пины температурных датчиков
OneWire oneWireOne(dallasSensors[0]); //1 датчик температуры
OneWire oneWireTwo(dallasSensors[1]); //2 датчик температуры
DallasTemperature sensorsOne(&oneWireOne);
DallasTemperature sensorsTwo(&oneWireTwo);

//инициализация
void setup(void)
{
Serial.begin(9600);
dallasSensors[0] = 4; //НАПРИМЕР ТУТ Я ПРОЧИТАЛ ЭТИ ДАННЫЕ С КАРТЫ ПАМЯТИ И ЗАПИСАЛ В МАССИВ
dallasSensors[1] = 5;//НАПРИМЕР ТУТ Я ПРОЧИТАЛ ЭТИ ДАННЫЕ С КАРТЫ ПАМЯТИ И ЗАПИСАЛ В МАССИВ
//Стартуем даллас
sensorsOne.begin();
sensorsTwo.begin();
}
//главный цикл
void loop(void)
{
sensorsOne.requestTemperatures();
sensorsTwo.requestTemperatures();
if (sensorsOne.getTempCByIndex(0) == DEVICE_DISCONNECTED_C) //если датчик отключен
Serial.println("sensor disable");
else Serial.println(sensorsOne.getTempCByIndex(0));
if (sensorsTwo.getTempCByIndex(0) == DEVICE_DISCONNECTED_C) //если датчик отключен
Serial.println("sensor disable");
else Serial.println(sensorsTwo.getTempCByIndex(0));
delay(3000);
}

Соответственно ничего не выводится на экран кроме sensor disable, потому как в объекте уже я так понял объявлены пустые пины и если мы их и читаем из карты и переписываем массив пинов ничего не изменится. Какие идеи?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

так задай заранее значения

KorPaEv
Offline
Зарегистрирован: 24.11.2014

Мне заранее не надо, у меня все лежит в конфиге, поэтому я читаю номера пинов из файла, чтобы в случае чего можно было только поправить номера пинов и не лезти в исходники, перекинув датчик на другой пин

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
KorPaEv 
 
если Вам нужно инициализировать объекты датчиков после чтения конфига, так и делайте это! Зачем Вы их инициализируете в строках 4 и 5?
 
Не знаете как? Ну, там по-разному можно. Самый простой способ - использовать указатели.
 
Вместо строки 4 пишете:
 
DallasTemperature * sensorsOne;
 
Далее, как только узнали (прочитали из конфига) правильный пин (пусть он у вас в переменной pravPin) тут же пишете
 
sensorsOne = new DallasTemperature (pravPin);
 
После этого объектом можно пользоваться, только везде вместо нотации с точкой нужно использовать нотацию с "->". Например, вместо 
 
sensorsOne.getTempCByIndex(0)
 
следует писать
 
sensorsOne->getTempCByIndex(0)
 
и всё будет окей.
 
Ну, и для второго датчика, разумеется, всё также.
KorPaEv
Offline
Зарегистрирован: 24.11.2014

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

OneWire *oneWireOne; //1 датчик температуры
OneWire *oneWireTwo; //2 датчик температуры

// Создаем экземпляр далласа
DallasTemperature *sensorsOne;
DallasTemperature *sensorsTwo;

//инициализация
void setup(void)
{
   Serial.begin(9600);
  InitSD(); //инициализация карты памяти
  ReadConfFile(); //Читаем файл конфига
 
  oneWireOne = new OneWire(dallasSensors[0]);
  oneWireTwo = new OneWire(dallasSensors[1]);
  
  sensorsOne = new DallasTemperature(oneWireOne);
  sensorsTwo = new DallasTemperature(oneWireTwo);
 
  //Стартуем даллас
  sensorsOne->begin();
  sensorsTwo->begin();
  
  //Инициализация таймера
  t.every(5000, TimerAction);
}

//Обработчик таймера
void TimerAction()
{
  GetTemperature();
}

//Получаем температуру с далласа
void GetTemperature()
{
  sensorsOne->requestTemperatures();
  sensorsTwo->requestTemperatures();
}

void ReadTemperature()
{
 
  if (sensorsOne->getTempCByIndex(0) == DEVICE_DISCONNECTED_C) //если датчик отключен
    Serial.println("sensor disable");
  else Serial.println(sensorsOne->getTempCByIndex(0));
  if (sensorsTwo->getTempCByIndex(0) == DEVICE_DISCONNECTED_C) //если датчик отключен
    Serial.println("sensor disable");
  else Serial.println(sensorsTwo->getTempCByIndex(0));
 }

//главный цикл
void loop(void)
{
  ReadTemperature();
  delay(3000);
}

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

С указателями работаете нормально. Висит не из-за них. Тут мне трудно говорить, во-первых скетч неполный, во-вторых я не знаю этой библиотеки. Например, как часто можно читать значения? Вы в строках 45-47 читаете дважды подряд безо всякой паузы. Я бы считал один раз в переменную, а уж её бы анализировал в if и печатал бы. (тоже про строки 48-50). Но, повтоярю, я не знаю этой библиотек и мне трудно говорить.

Попробуйте поставить отладочную печать после строки 57 и в функции ReadTemperature одну печать в начале, а вторую в конце. Тогда Вы по крайней мере локализуете место в котором она у Вас залипла. Станет понятнее куда рыть дальше.

KorPaEv
Offline
Зарегистрирован: 24.11.2014

ЕвгенийП пишет:

С указателями работаете нормально. Висит не из-за них. Тут мне трудно говорить, во-первых скетч неполный, во-вторых я не знаю этой библиотеки. Например, как часто можно читать значения? Вы в строках 45-47 читаете дважды подряд безо всякой паузы. Я бы считал один раз в переменную, а уж её бы анализировал в if и печатал бы. (тоже про строки 48-50). Но, повтоярю, я не знаю этой библиотек и мне трудно говорить.

Попробуйте поставить отладочную печать после строки 57 и в функции ReadTemperature одну печать в начале, а вторую в конце. Тогда Вы по крайней мере локализуете место в котором она у Вас залипла. Станет понятнее куда рыть дальше.

Благодарю!

Понял, попробую как вы написали

С переменными вряд ли залипает без задержки, потому как это возможно когда на одной шине висит 2 датчика, то необходимо delay прописать, у меня же датчики на разных пинах и созданы 2 разных объекта под них. Хотя можно и с переменными попробовать, посмотрим.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Нет-нет, Вы меня не поняли. Меня смутило не то, что Вы часто читаете с разных пинов, а то, что дважды подряд читаете с одного и того же пина (строки 48 и 50, например). Понимаете?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

KorPaEv, это очень убогая библа для DS. Она для начинающих.  Ни с чем другим её лучше не сочетать, -возможны глюки. На форуме сто раз обсуждали как работать просто через Oneware и таймер.

KorPaEv
Offline
Зарегистрирован: 24.11.2014

ЕвгенийП пишет:

Нет-нет, Вы меня не поняли. Меня смутило не то, что Вы часто читаете с разных пинов, а то, что дважды подряд читаете с одного и того же пина (строки 48 и 50, например). Понимаете?

Понимаю, лучше попробовать в переменную было записать, но это не помогло.

Ошибку нашел. Как и написано ниже:

dimax пишет:

KorPaEv, это очень убогая библа для DS. Она для начинающих.  Ни с чем другим её лучше не сочетать, -возможны глюки. На форуме сто раз обсуждали как работать просто через Oneware и таймер.

Функция запроса к датчику не отрабатывается по таймеру.

В общем таймер не работает с этой библиотекой.

А таймер мне все же нужен. Поэтому, видимо, придется через OneWire читать.