Динамическое (автоматическое, программное) создание имени объекта класса в ардуино. Как?

123ksn
Offline
Зарегистрирован: 24.11.2014
Возможно я неправильно сформулировал вопрос, поэтому опишу УСЛОВНУЮ задачу для решения которой надо знать ответ на вопрос.
1)Точно известно, что "черный ящик" - это ардуино УНО.
2)К этому черному ящику подключены неизвестно сколько и неизвестно какие датчики, но есть основание полагать, что это датчики температуры из серии DS, например DS18S20, и датчики влажности из серии DHT
3)Прикасаться руками к чему-либо нельзя. Есть только компьютер, подключенный к ардуино.
 
Задача. 
1) Определить к каким выводам ардуино подключены датчики
2)В качестве доказательства предъявить данные от этих датчиков
 
Алгоритм решение в "классическом" виде выглядит так
(обязательные действия, типа подключить библиотеку, пропущены)
 
создаем объекты, например для OneWire и используем методы, предоставляемые библиотекой
for (byte i=2; i<количества_выводов; i++){
OneWire (ds+i)(i);

....

(ds+i)(i).reset;
....
Serial.print("на выводе N=");
Serial.print("i");
Serial.println("датчик. ROM=");

}//конец цикла
Надеюсь понятно, что это только грубая концепция. "Гвоздь" этого кода невозможная строка 2. Тогда как без С++?
Здесь есть какой-то намек "Классы и объекты в Arduino" http://robotday.ru/2015/04/12/классы-и-объекты-в-arduino/ , но я не могу его расширить для решения представленного вопроса.
 
123ksn
Offline
Зарегистрирован: 24.11.2014

Ой, первый пост редактировать нельзя. Прошу прощения за допущенные грамматические и синтаксические ошибки.

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

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

#define AMOUNT_OF_INPUTS  3

OneWire * ds[AMOUNT_OF_INPUTS];

for (byte i=2; i<AMOUNT_OF_INPUTS; i++){
ds[i] = new OneWire(i);

....

ds[i]->reset();
....
Serial.print("на выводе N=");
Serial.print("i");
Serial.println("датчик. ROM=");

}//конец цикла

 

Logik
Offline
Зарегистрирован: 05.08.2014

Чета както плохо. Переменная i это таки индекс в массиве или номер пина? Еще наверно освобождать обекты может быть нужно, если на пине не датчик.  А воще я может шо не понял. Мутный ответ на мутный вопрос.

SunX
SunX аватар
Offline
Зарегистрирован: 04.10.2014

Logik пишет:

Чета както плохо. Переменная i это таки индекс в массиве или номер пина? Еще наверно освобождать обекты может быть нужно, если на пине не датчик.  А воще я может шо не понял. Мутный ответ на мутный вопрос.

И то и другое. Освобождать память конечно стоит, но это, как я понимаю - чисто тестовая программа, которая в итоге покажет, есть-ли где-нибудь W1-устройства или нет. Наверное это можно сделать и покрасивее, но и такое должно прокатить (если памяти хватит).

SunX
SunX аватар
Offline
Зарегистрирован: 04.10.2014

Кстати вот, немного улучшенная, на мой взгляд, версия:

#define AMOUNT_OF_INPUTS  16

OneWire * ds;

for (byte i=2; i<AMOUNT_OF_INPUTS; i++){
ds = new OneWire(i);

....

ds->reset();
....
Serial.print("на выводе N=");
Serial.print(i);
Serial.println("датчик. ROM=");
...
delete ds;
}//конец цикла

В силу того, что нам на потом это все запоминать нет необходимости - в итоге можно обойтись только одним указателем, в итоге потратится меньше памяти и прочее.

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

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

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

1)Огромное спасибо за конструктивный подход и предложеное решение. Думаю Вы все поняли правильно.

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

SunX пишет:

Logik пишет:

Чета както плохо. Переменная i это таки индекс в массиве или номер пина? Еще наверно освобождать обекты может быть нужно, если на пине не датчик.  А воще я может шо не понял. Мутный ответ на мутный вопрос.

И то и другое. Освобождать память конечно стоит, но это, как я понимаю - чисто тестовая программа, которая в итоге покажет, есть-ли где-нибудь W1-устройства или нет. Наверное это можно сделать и покрасивее, но и такое должно прокатить (если памяти хватит).

SunX, и Вам огромное спасибо. Если можно, напишите еще код освобождения памяти. И дайте пояснение к фразе "если памяти хватит". Я понял, что Ваш краивый код использует много памяти, но какой? И сколько?

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

123ksn пишет:

SunX, и Вам огромное спасибо. Если можно, напишите еще код освобождения памяти.

Дык ... он же у него в 16 строке!

Только имейте в виду, решение SunХ применимо только если эти объекты больше ни для чего не нужны. А если они нужны ещё после этого цикла - то надо моё использовать.

 

SunX
SunX аватар
Offline
Зарегистрирован: 04.10.2014

Оперативной памяти, в которой создаются динамические объекты. В C++ для удаления объекта используется

delete ...

например

delete ds[i];

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

С П А С И Б О ! ! ! Вечером буду творчески осваивать.