Чтение Номера Пина Из Конфига
- Войдите на сайт для отправки комментариев
Доброго времени суток, уважаемые!
Вопрос в следующем - возможно ли из конфига прочесть номера пинов, заполнить их каким то образом в массив и уже после этого стартовать даллас и вывод температуры на экран?
Судя по моим попыткам, это не совсем возможно, может кто то знает как можно сделать?
У меня есть файл в нем построчно записаны номера пинов на датчики
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, потому как в объекте уже я так понял объявлены пустые пины и если мы их и читаем из карты и переписываем массив пинов ничего не изменится. Какие идеи?
так задай заранее значения
Мне заранее не надо, у меня все лежит в конфиге, поэтому я читаю номера пинов из файла, чтобы в случае чего можно было только поправить номера пинов и не лезти в исходники, перекинув датчик на другой пин
спасибо, все получилось вот так...только одна проблема - вывод завис на одном значении температуры - считалось первое значение и все, висит на нем..
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); }С указателями работаете нормально. Висит не из-за них. Тут мне трудно говорить, во-первых скетч неполный, во-вторых я не знаю этой библиотеки. Например, как часто можно читать значения? Вы в строках 45-47 читаете дважды подряд безо всякой паузы. Я бы считал один раз в переменную, а уж её бы анализировал в if и печатал бы. (тоже про строки 48-50). Но, повтоярю, я не знаю этой библиотек и мне трудно говорить.
Попробуйте поставить отладочную печать после строки 57 и в функции ReadTemperature одну печать в начале, а вторую в конце. Тогда Вы по крайней мере локализуете место в котором она у Вас залипла. Станет понятнее куда рыть дальше.
С указателями работаете нормально. Висит не из-за них. Тут мне трудно говорить, во-первых скетч неполный, во-вторых я не знаю этой библиотеки. Например, как часто можно читать значения? Вы в строках 45-47 читаете дважды подряд безо всякой паузы. Я бы считал один раз в переменную, а уж её бы анализировал в if и печатал бы. (тоже про строки 48-50). Но, повтоярю, я не знаю этой библиотек и мне трудно говорить.
Попробуйте поставить отладочную печать после строки 57 и в функции ReadTemperature одну печать в начале, а вторую в конце. Тогда Вы по крайней мере локализуете место в котором она у Вас залипла. Станет понятнее куда рыть дальше.
Благодарю!
Понял, попробую как вы написали
С переменными вряд ли залипает без задержки, потому как это возможно когда на одной шине висит 2 датчика, то необходимо delay прописать, у меня же датчики на разных пинах и созданы 2 разных объекта под них. Хотя можно и с переменными попробовать, посмотрим.
Нет-нет, Вы меня не поняли. Меня смутило не то, что Вы часто читаете с разных пинов, а то, что дважды подряд читаете с одного и того же пина (строки 48 и 50, например). Понимаете?
KorPaEv, это очень убогая библа для DS. Она для начинающих. Ни с чем другим её лучше не сочетать, -возможны глюки. На форуме сто раз обсуждали как работать просто через Oneware и таймер.
Нет-нет, Вы меня не поняли. Меня смутило не то, что Вы часто читаете с разных пинов, а то, что дважды подряд читаете с одного и того же пина (строки 48 и 50, например). Понимаете?
Понимаю, лучше попробовать в переменную было записать, но это не помогло.
Ошибку нашел. Как и написано ниже:
KorPaEv, это очень убогая библа для DS. Она для начинающих. Ни с чем другим её лучше не сочетать, -возможны глюки. На форуме сто раз обсуждали как работать просто через Oneware и таймер.
Функция запроса к датчику не отрабатывается по таймеру.
В общем таймер не работает с этой библиотекой.
А таймер мне все же нужен. Поэтому, видимо, придется через OneWire читать.