Динамическое (автоматическое, программное) создание имени объекта класса в ардуино. Как?
- Войдите на сайт для отправки комментариев
Чт, 17/09/2015 - 14:54
Возможно я неправильно сформулировал вопрос, поэтому опишу УСЛОВНУЮ задачу для решения которой надо знать ответ на вопрос.
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/ , но я не могу его расширить для решения представленного вопроса.
Ой, первый пост редактировать нельзя. Прошу прощения за допущенные грамматические и синтаксические ошибки.
Боюсь, что не до конца понял вопрос, но рискну предложить решение - если бред, то поясните почему и тогда я, возможно, лучше пойму вопрос.
#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="); }//конец циклаЧета както плохо. Переменная i это таки индекс в массиве или номер пина? Еще наверно освобождать обекты может быть нужно, если на пине не датчик. А воще я может шо не понял. Мутный ответ на мутный вопрос.
Чета както плохо. Переменная i это таки индекс в массиве или номер пина? Еще наверно освобождать обекты может быть нужно, если на пине не датчик. А воще я может шо не понял. Мутный ответ на мутный вопрос.
И то и другое. Освобождать память конечно стоит, но это, как я понимаю - чисто тестовая программа, которая в итоге покажет, есть-ли где-нибудь W1-устройства или нет. Наверное это можно сделать и покрасивее, но и такое должно прокатить (если памяти хватит).
Кстати вот, немного улучшенная, на мой взгляд, версия:
#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; }//конец циклаВ силу того, что нам на потом это все запоминать нет необходимости - в итоге можно обойтись только одним указателем, в итоге потратится меньше памяти и прочее.
Боюсь, что не до конца понял вопрос, но рискну предложить решение - если бред, то поясните почему и тогда я, возможно, лучше пойму вопрос.
1)Огромное спасибо за конструктивный подход и предложеное решение. Думаю Вы все поняли правильно.
Чета както плохо. Переменная i это таки индекс в массиве или номер пина? Еще наверно освобождать обекты может быть нужно, если на пине не датчик. А воще я может шо не понял. Мутный ответ на мутный вопрос.
И то и другое. Освобождать память конечно стоит, но это, как я понимаю - чисто тестовая программа, которая в итоге покажет, есть-ли где-нибудь W1-устройства или нет. Наверное это можно сделать и покрасивее, но и такое должно прокатить (если памяти хватит).
SunX, и Вам огромное спасибо. Если можно, напишите еще код освобождения памяти. И дайте пояснение к фразе "если памяти хватит". Я понял, что Ваш краивый код использует много памяти, но какой? И сколько?
SunX, и Вам огромное спасибо. Если можно, напишите еще код освобождения памяти.
Только имейте в виду, решение SunХ применимо только если эти объекты больше ни для чего не нужны. А если они нужны ещё после этого цикла - то надо моё использовать.
Оперативной памяти, в которой создаются динамические объекты. В C++ для удаления объекта используется
delete ...
например
delete ds[i];
С П А С И Б О ! ! ! Вечером буду творчески осваивать.