ARDUINO Как применить метод .getTemp() в цикле "for" по очереди к каждому объекту из библиотеки GyverMAX6675?

Navern

✩✩✩✩✩✩✩
22 Апр 2022
1
0
Не могу разобраться, как в цикле "for" применить метод ".readTemp()" по очереди к каждому датчику температуры (sens'0', sens'1', ... , sens'n'). Нужно ли использовать указатели? Прошу помочь именно с этим куском кода, не обращая внимания на общую его ущербность.

По задумке программа считывает значение температуры с термопары через преобразователь MAX6675, и, в зависимости от значения, выводит сигнал на адресную светодиодную ленту.

C++:
#define STRIP_PIN 2       // пин ленты
#define NUMPISTONS 8      // кол-во цилиндров
#define CLK_PIN 13        // тактирующий выход
#define DATA_PIN 12       // шина данных на датчики
#define CS_PIN0 10        // выводы chip select на датчики
#define CS_PIN1 9
#define CS_PIN2 8
#define CS_PIN3 7
#define CS_PIN4 6
#define CS_PIN5 5
#define CS_PIN6 4
#define CS_PIN7 3

#define COLOR_DEBTH 3
#include <microLED.h>
#include <GyverMAX6675.h>

microLED<NUMPISTONS, STRIP_PIN, MLED_NO_CLOCK, LED_WS2812, ORDER_GRB, CLI_AVER> strip;

GyverMAX6675<CLK_PIN, DATA_PIN, CS_PIN0> sens0;
GyverMAX6675<CLK_PIN, DATA_PIN, CS_PIN1> sens1;
GyverMAX6675<CLK_PIN, DATA_PIN, CS_PIN2> sens2;
GyverMAX6675<CLK_PIN, DATA_PIN, CS_PIN3> sens3;
GyverMAX6675<CLK_PIN, DATA_PIN, CS_PIN4> sens4;
GyverMAX6675<CLK_PIN, DATA_PIN, CS_PIN5> sens5;
GyverMAX6675<CLK_PIN, DATA_PIN, CS_PIN6> sens6;
GyverMAX6675<CLK_PIN, DATA_PIN, CS_PIN7> sens7;

byte thermo_sensors[8] = {sens0, sens1, sens2, sens3, sens4, sens5, sens6, sens7};

uint32_t fps = 0;

void setup() {
  strip.setBrightness(60);
}

void loop() {
  if (millis() - fps >= 30) { // частота обновления ленты
    fps = millis();
    exhaust_temp();
    strip.show();   // вывод
  }
}

void exhaust_temp() {
  static byte tempSpan = 600;  // диапазон температур
  static uint32_t tmr;         // таймер
  static bool flag1;           // флаг для мигания раз в 4 цикла
  static bool flag2;           // флаг для быстрого мигания
  static byte counter = 0;

  if (millis() - tmr >= 100) { // таймер для мигания светодиодами
    tmr = millis();
    flag2 = !flag2;
    counter++;
    if (counter >= 4) {
      counter = 0;
      flag1 = true;
    }
    else flag1 = false;
  }

  for (int i = 0; i < NUMPISTONS; i++) { //

    // мигание светодиодом по флагу №1 на граничных значениях температуры (<20% или >80% от заданного диапазона) при удачном чтении
    if ((thermo_sensors[i].readTemp()) && (thermo_sensors[i].getTemp() <= tempSpan * 0.2 || thermo_sensors[i].getTemp() >= tempSpan * 0.8) && (flag1))
      strip.set(i, mRGB(0, 0, 0));

    // частое мигание синим цветом по флагу №2 при неудачном чтении (обрыв термопары или датчика)
    else if ((thermo_sensors[i].readTemp()) = false && (flag2))
      strip.set(i, mRGB(0, 0, 255));

    // вывод цвета по значению температуры (0 красный, 1023 синий)
    else strip.set(i, mWheel(thermo_sensors[i].getTemp() / tempSpan * 1024));
  }
}
 

rkit

★★★✩✩✩✩
5 Фев 2021
508
127
Никак. Библиотека для этого не спроектирована.
 

Kir

★✩✩✩✩✩✩
28 Мар 2020
69
16
@Navern,
как возможный вариант:
/* Общий интерфейс */
struct tempSensor {
    virtual float getTemp()    = 0;
    virtual int   getTempInt() = 0;
    virtual bool  readTemp()   = 0;   
};


/* реализация интерфейса как обертка над GyverMAX6675 */
template<typename T>
class gyverSensWrapper : public tempSensor {
public:
    virtual float getTemp()    { return inst.getTemp();    }
    virtual int   getTempInt() { return inst.getTempInt(); }
    virtual bool  readTemp()   { return inst.readTemp();   }   

    gyverSensWrapper() : inst() {}
private:
    T inst;
};


/* создание экземпляров теперь делается вот так */
gyverSensWrapper<GyverMAX6675<CLK_PIN, DATA_PIN, CS_PIN0> > sens0;
gyverSensWrapper<GyverMAX6675<CLK_PIN, DATA_PIN, CS_PIN1> > sens1;
gyverSensWrapper<GyverMAX6675<CLK_PIN, DATA_PIN, CS_PIN2> > sens2;
gyverSensWrapper<GyverMAX6675<CLK_PIN, DATA_PIN, CS_PIN3> > sens3;
gyverSensWrapper<GyverMAX6675<CLK_PIN, DATA_PIN, CS_PIN4> > sens4;
gyverSensWrapper<GyverMAX6675<CLK_PIN, DATA_PIN, CS_PIN5> > sens5;
gyverSensWrapper<GyverMAX6675<CLK_PIN, DATA_PIN, CS_PIN6> > sens6;
gyverSensWrapper<GyverMAX6675<CLK_PIN, DATA_PIN, CS_PIN7> > sens7;


/* теперь реализации можно собрать в массив указателей на интерфейс */
static tempSensor* sens[] = {
    &sens0, &sens1, &sens2, &sens3, &sens4, &sens5, &sens6, &sens7
};


/* использование */
/* получение значения из sens0 */
float tempValue = sens[0]->getTemp();
 
  • Лойс +1
Реакции: kostyamat