Не могу разобраться, как в цикле "for" применить метод ".readTemp()" по очереди к каждому датчику температуры (sens'0', sens'1', ... , sens'n'). Нужно ли использовать указатели? Прошу помочь именно с этим куском кода, не обращая внимания на общую его ущербность.
По задумке программа считывает значение температуры с термопары через преобразователь MAX6675, и, в зависимости от значения, выводит сигнал на адресную светодиодную ленту.
По задумке программа считывает значение температуры с термопары через преобразователь 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));
}
}