РЕШЕНО Проблема в передаче аналогового пина в класс и запись её в переменную.

Тема в разделе "Arduino & Shields", создана пользователем DizMoral, 22 май 2023.

  1. DizMoral

    DizMoral Нуб

    Приветствую, форумчане! Разбирался я, значит, с ООП в этом вашем arduino wiring и столкнулся с очевидной и даже глупой проблемой. С записью номера аналогового пина в int переменную, как оказалось, проблем вообще нет, как и с прямой передачей переменной в analogRead вне класса. Но как только я передаю номер в класс и присваиваю его в приватную переменную
    инкапсуляция - наше всё
    , то всё идет не так как ожидалось.
    В функции get_current_temp() я просто возвращаю данные, которые должны были приходить с аналогового пина и просто преобразую в градусы по цельсию при помощи простой формулы, но, видимо, контроллер вместо аналогового пина подставляет совершенно левый пин, который и выдаёт попугаев:

    Хз чё делать, собственно, именно по этому я прошу помощи у всех вас.


    Код (C++):

    #define STANDS 1

    // Хз почему через классы. Мб, потому что захотелось. Да-да-да, ага,
    // нужно было классы по файлам отдельным раскидать, но мне как-то лень.
    // Да и что вы мне сделаете? Я вообще в другом городе.
    class FanControl {
      public:
        FanControl(int pin){
           _pin = pin;
           pinMode(_pin, OUTPUT);
        }

        void cool() {
           digitalWrite(_pin, HIGH);
        }

        void stop() {
          digitalWrite(_pin, LOW);
        }
      private:
          int _pin;
    };

    class TempSensor{
      public:
        TempSensor(int pin, float temp = 22.0){
            _pin = pin;
            _temperature = temp;
            pinMode(_pin, INPUT);
        }

        float get_current_temp(){    
            return (analogRead(_pin)*5.0/1024.0-0.5)*100; // формула расчета температуры для термистора TMP36
        }

        void set_temp(float temp){
            _temperature = temp;
        }

        bool need_to_cool() {
          float cur_temp = get_current_temp();
          if (cur_temp > _temperature) {
            return true;
          }
          return false;
        }
      private:
          int _pin;
          int _sensor_type;
          float _temperature;
    };

    // Зато теперь можно родить дофига тестовых стендов! Классно, не так ли?
    // Примечание: количество кондеев должно совпадать с количеством термометров.
    // (Вы же не будете ставить несколько кондеев на один стенд, правда?..)

    // фанаты
    FanControl fans[STANDS] = {(11)};

    // датчики температуры (неожиданно)
    TempSensor temp_sensors[STANDS] = {(A0, 25)};

    void setup()
    {
        Serial.begin(9600);
    }

    void loop()
    {
        Serial.println(temp_sensors[0].get_current_temp());
    }
     
     
    Последнее редактирование: 22 май 2023
  2. User248

    User248 Гик

    А если убрать круглые скобки отсюда:
    Код (C++):
    // фанаты
    FanControl fans[STANDS] = {(11)};

    // датчики температуры (неожиданно)
    TempSensor temp_sensors[STANDS] = {(A0, 25)};
     
  3. DizMoral

    DizMoral Нуб

    В круглых скобках передаются параметры в конструктор, хотя, грех не попробовать)
     
  4. DizMoral

    DizMoral Нуб

    Как ожидалось, не сработало. Хотя сама проблема капец странная. Мб это "особенность" вайринга, которую мы никогда не сможем понять...
     
  5. User248

    User248 Гик

    Тогда заменить круглые скобки на фигурные. Странно, что с круглыми скобками вообще собирается.
     
    DizMoral нравится это.
  6. DizMoral

    DizMoral Нуб

    Нет друг, ты, кажется неправильно понял. С синтаксисом всё норм. Всё компилируется и заводится. Проблема в том, что analogRead() начал чудить в функции get_current_temp(), выдавая значения с левого порта.
    Кстати, приложу ссылку на проект в тинкеркаде
     
  7. User248

    User248 Гик

    Ну ты попробуй всё же. Наверно я уже что-то проверил и говорю поэтому.
     
    DizMoral нравится это.
  8. DizMoral

    DizMoral Нуб

    Bruh. Не могу поверить, но это действительно сработало. Почему вообще здесь создание объекта класса в массиве такое неочевидное? Вопрос, думаю, риторический. Бред какой-то. Спасибо за помощь!