Не работает класс внутри loop()

Тема в разделе "Arduino & Shields", создана пользователем risele, 1 фев 2017.

  1. risele

    risele Нерд

    Пишу программу с использованием классов.
    в Setup создаю объект и могу с ним работать (мигал светодиодом в цикле), но вот в loop объект не передается.


    код программы:
    Код (C++):

    class OwenClass
    {
    int adress;
    };

    void setup()
    {
      OwenClass Reactor;
      Reactor.adress=1;
      pinMode(13,OUTPUT);
    }

    void loop()
        digitalWrite(13,Reactor.adress);
        Reactor.adress=!Reactor.adress;
        delay(300);
    }
    ошибка 'Reactor' was not declared in this scope
     
    Последнее редактирование: 1 фев 2017
  2. risele

    risele Нерд

    Вот такой код работает


    Код (C++):

    class OwenClass
    {
    int adress;
    };

    void setup()
    {
      OwenClass Reactor;
      Reactor.adress=1;
      pinMode(13,OUTPUT);

      for (int i=0;i<100;i++)
      {
        digitalWrite(13,Reactor.adress);
        Reactor.adress=!Reactor.adress;
        delay(300);
      }
    }

    void loop()
    {
     
    }
     
  3. rkit

    rkit Гуру

    Так вы в другой функции экземпляр декларируете, да еще и на стеке.
     
    Последнее редактирование: 1 фев 2017
  4. risele

    risele Нерд

    А, тьфу ты. надо декларировать до setup, но все параметры задавать в setup, верно?
     
  5. rkit

    rkit Гуру

    Не знаю. Смотря что вы сделать собрались. Обычно поля инициализируются в теле класса, или в конструкторе.
     
  6. risele

    risele Нерд

    ну, в общем, мои костыли заработали. спасибо!)
     
  7. qwone

    qwone Гик

    Код (C++):
    class OwenClass {
      public:
        bool adress;
    };
    OwenClass Reactor; //<---поставить
    void setup() {
      //  OwenClass Reactor; <---убрать
      Reactor.adress = 1;
      pinMode(13, OUTPUT);
    }

    void loop(){
    digitalWrite(13, Reactor.adress);
    Reactor.adress = ! Reactor.adress;
    delay(300);
    }
     
    Tomasina нравится это.
  8. risele

    risele Нерд

    так и сделал.
     
  9. qwone

    qwone Гик

    Вот подкину пример для размышления
    Код (C++):
    /* Class_do_btn.ino
      #1 кнопка ->2
      #2 кнопка ->3
      #3 кнопка ->4
      Принцип кода:нажал на кнопку , отправилось сообщение в сериал
    */

    //#1 кнопка 1
    #include "Cl_do_btn.h"
    const byte btn1_pin = 2;
    Cl_do_btn Do_btm1; // создать
    void func_1() {
      Serial.println("Press Bottom 1");
    }
    //#2 кнопка 2
    const byte btn2_pin = 3;
    Cl_do_btn Do_btm2; // создать
    void func_2() {
      Serial.println("Press Bottom 2");
    }
    //#3 кнопка 3
    const byte btn3_pin = 4;
    Cl_do_btn Do_btm3; // создать
    void func_3() {
      Serial.println("Press Bottom 3");
    }
    void setup() {
      Serial.begin(9600);
      //#1 кнопка 1
      Do_btm1.setup(btn1_pin);
      //#2 кнопка 2
      Do_btm2.setup(btn2_pin);
      //#3 кнопка 3
      Do_btm3.setup(btn3_pin);
    }
    void loop() {
      //#1 кнопка 1
      Do_btm1.loop(& func_1  );
      //#2 кнопка 2
      Do_btm2.loop(& func_2  );
      //#3 кнопка 3
      Do_btm3.loop(& func_3  );
    }
    Код (C++):
    /*Cl_do_btn.cpp
    */

    #include "Arduino.h"
    #include "Cl_do_btn.h"
    Cl_do_btn::Cl_do_btn() {
    }
    void Cl_do_btn::setup(byte _pin) {
      btn_pin = _pin;
      pinMode(btn_pin, INPUT_PULLUP);// подключить кнопку 1 с подтяжкой
      btn = digitalRead(btn_pin) ; // прочитать реальное значение на выводе
    }
    void Cl_do_btn::loop(void (* _func_1)()) {
      if (! bounce_btn && btn != digitalRead(btn_pin)) { // если прошел фронт изм на выводн
        bounce_btn = 1;                                 // выставить флаг
        past = millis();                         // сделать временую засветку
      }
      else if ( bounce_btn && millis() - past >= 5 ) { // если прошло антидребезговое время
        bounce_btn = 0;      // то снять флаг
        btn_old = btn ;
        btn = digitalRead(btn_pin) ; // прочитать реальное значение на выводе
        if (btn_old && ! btn) _func_1()  ;
      }
    }
    Код (C++):
    /*Cl_do_btn.h
    */

    #ifndef Cl_do_btn_h
    #define Cl_do_btn_h

    #include "Arduino.h"
    class Cl_do_btn {
      public:
        Cl_do_btn();
        void setup(byte _pin);
        void loop(void (* _func_1)());
      private:
        byte btn_pin ;
        bool btn, btn_old;
        bool bounce_btn = 0; // антидребезговый флаг
        uint32_t past = 0 ;
    };
    #endif //Cl_do_btn_h