Использование в классе другого объекта (или как это правильно назвать я не зн)
- Войдите на сайт для отправки комментариев
Добрый день
Прошу потратить пару минут Вашего времени на помощь мне: необходимо поправить код чтоб можно было использовать в моем классе другой объект (внешний).
Исходные данные - ЕСП8266, расширитель портов 23017. Соединил, сканером портов расширитель нашелся на адресе 0x21. Задача управлять пинами расширителя 23017 через объекты класса. вот мой код:
#include <Wire.h> #include "Adafruit_MCP23017.h" Adafruit_MCP23017 mcp; byte pin1 =2; class myAir { public: myAir( uint8_t pin ) { _pin=pin; pinMode(_pin, OUTPUT); }; void Start () { digitalWrite(_pin , _relayLevel); Serial.println("Включено"); } void Stop () { digitalWrite(_pin, !_relayLevel); Serial.println("Выключено"); } private: uint8_t _pin; //пин двигателя bool _relayLevel=LOW; }; myAir test(pin1); void setup() { // initialize digital pin LED_BUILTIN as an output. mcp.begin(1); Serial.begin(115200); Serial.println ("Запуск"); } // the loop function runs over and over again forever void loop() { test.Start(); delay(2000); // wait test.Stop(); delay(2000); // wait }
При таком коде, очевидно что мигает светодиодом сама ЕСП8266 на пине 2. А надо чтоб управлялся пин 2 на расширителе. Для этого вроде как необходимо класс немного подправить, в моем понятии вот так:
class myAir { public: myAir( uint8_t pin ) { _pin=pin; mcp.pinMode(_pin, OUTPUT); }; void Start () { mcp.digitalWrite(_pin , _relayLevel); Serial.println("Включено"); } void Stop () { mcp.digitalWrite(_pin, !_relayLevel); Serial.println("Выключено"); } private: uint8_t _pin; //пин двигателя bool _relayLevel=LOW; };
т.е. вызвать в моем классе объект mcp с методами pinMode и digitalWrite. Но при этом код конечно компиллируется, но вешается по ватчдогу и уходит в ребут. Ясно, что что-то сделано не так, но как именно использвать объект mcp в классе не знаю по причине скудности ума )
Буду оч признателен за помощь.
Спасибо
ссылку на библиотеку мультиплексора давайте - напишу как сделать. если кто-то другой не обьяснит
Это стандартная библиотека из Arduino IDE, пошукал у себя на винте нашлось что-то похожее судя по названию. залил себе в гугльдиск, вот https://drive.google.com/file/d/1Loj4Ut-bp1AtuC2V2ASJwcGN2Q6DBXS-/view?usp=sharing ссылка
вот так
УРАААА, работает!
Спасибо тебе, добрый B707!
Три дня убито мною зря, читаны форумы и мануалы, узнал про укзатели (звездочки и амперсанды), но так и не понял как оно все работает. В вашем коде кое-что понятно, но вот
т.е звездочка после имени библиотеки не понятно почему. я бы ее поставил после mcp_ptr ). ну а про -> я уже не говорю )
Еще раз спасибо
В вашем коде кое-что понятно, но вот
т.е звездочка после имени библиотеки не понятно почему
это не имя библиотеки, а имя класса. Мы передаем конструктору класса указатель на обьект мультиплексора, чтобы его можно было использовать методах класса. Как следствие, раз это указатель - к мультиплексору приходится образаться не через точку, а через стрелку
Дак это... Передай по ссылке объект, будут точечки вместо стрелочек.
а это как бы надо было реализовать? что-то типа &Adafruit mcp?
А почитать куда анперсент совать? )
А почитать куда анперсент совать? )
Туда неприятно :(
Это смотря куда «туда».
А "туда" это "куда", позвольте поинтересоваться ?
Подскажите литературу, чтоб при этом была доступна для понимания средним умом?
я почитал про классы, научился с помощью их создавать и управлять объектами и весьма удобно как оказалось и кода гораздо меньше (объем скетча при этом не мерял). но вот про ссылки и указатели, разыменовыватели и прочее - начитался везде понемногу, ничерта не понял, в голове каша. так и живу )
Ну по Си классика - Керниган и Ритчи.
По Си++ - Шилдт.