Использование в классе другого объекта (или как это правильно назвать я не зн)

papant
Offline
Зарегистрирован: 27.04.2016

Добрый день

Прошу потратить пару минут Вашего времени на помощь мне: необходимо поправить код чтоб можно было использовать в моем классе другой объект (внешний).
Исходные данные - ЕСП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 в классе не знаю по причине скудности ума )

Буду оч признателен за помощь. 

Спасибо

b707
Offline
Зарегистрирован: 26.05.2017

ссылку на библиотеку мультиплексора давайте - напишу как сделать. если кто-то другой не обьяснит

papant
Offline
Зарегистрирован: 27.04.2016

Это стандартная библиотека из Arduino IDE, пошукал у себя на винте нашлось что-то похожее судя по названию. залил себе в гугльдиск, вот https://drive.google.com/file/d/1Loj4Ut-bp1AtuC2V2ASJwcGN2Q6DBXS-/view?usp=sharing ссылка

b707
Offline
Зарегистрирован: 26.05.2017

вот так

#include <Wire.h>
#include "Adafruit_MCP23017.h"
Adafruit_MCP23017 mcp;

byte pin1 =2;

class myAir {

  public:
     myAir( uint8_t pin,  Adafruit_MCP23017* mcp_ptr) {
       _pin=pin;
       _mcp = mcp_ptr;
       
     };
    void init() {
       _mcp->pinMode(_pin, OUTPUT);
    };
    void Start ()  {
       _mcp->digitalWrite(_pin , _relayLevel);
       Serial.println("Включено");
     }
    void Stop ()  {
      _mcp->digitalWrite(_pin,  !_relayLevel);
       Serial.println("Выключено");
      }
    private:
    Adafruit_MCP23017* _mcp;
    uint8_t _pin;       //пин двигателя
    bool _relayLevel=LOW;
};

myAir test(pin1, &mcp);

void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  mcp.begin(1);
  test.init(); // вызывать после mcp.begin()
  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 
}

 

papant
Offline
Зарегистрирован: 27.04.2016

УРАААА, работает!
Спасибо тебе, добрый B707!

Три дня убито мною зря, читаны форумы и мануалы, узнал про укзатели (звездочки и амперсанды), но так и не понял как оно все работает. В вашем коде кое-что понятно, но вот 

myAir( uint8_t pin,  Adafruit_MCP23017* mcp_ptr)

т.е звездочка после имени библиотеки не понятно почему. я бы ее поставил после mcp_ptr ). ну а про -> я уже не говорю )

Еще раз спасибо 

 

b707
Offline
Зарегистрирован: 26.05.2017

papant пишет:

В вашем коде кое-что понятно, но вот 

myAir( uint8_t pin,  Adafruit_MCP23017* mcp_ptr)

т.е звездочка после имени библиотеки не понятно почему

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Дак это... Передай по ссылке объект, будут точечки вместо стрелочек.

papant
Offline
Зарегистрирован: 27.04.2016

а это как бы надо было реализовать? что-то типа &Adafruit mcp?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А почитать куда анперсент совать? )

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

BOOM пишет:

А почитать куда анперсент совать? )

Туда неприятно :(

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Это смотря куда «туда». 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

А "туда" это "куда", позвольте поинтересоваться ?

papant
Offline
Зарегистрирован: 27.04.2016

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ну по Си классика - Керниган и Ритчи.

По Си++ - Шилдт.