diff --git a/Marlin/temperature.cpp b/Marlin/temperature.cpp index ea3a9a91f2..1244a55b1c 100644 --- a/Marlin/temperature.cpp +++ b/Marlin/temperature.cpp @@ -472,8 +472,8 @@ int Temperature::getHeaterPower(int heater) { #if HAS_AUTO_FAN void Temperature::checkExtruderAutoFans() { - constexpr int8_t fanPin[] = { E0_AUTO_FAN_PIN, E1_AUTO_FAN_PIN, E2_AUTO_FAN_PIN, E3_AUTO_FAN_PIN, E4_AUTO_FAN_PIN }; - constexpr int fanBit[] = { + static const int8_t fanPin[] PROGMEM = { E0_AUTO_FAN_PIN, E1_AUTO_FAN_PIN, E2_AUTO_FAN_PIN, E3_AUTO_FAN_PIN, E4_AUTO_FAN_PIN }; + static const uint8_t fanBit[] PROGMEM = { 0, AUTO_1_IS_0 ? 0 : 1, AUTO_2_IS_0 ? 0 : AUTO_2_IS_1 ? 1 : 2, @@ -482,20 +482,20 @@ int Temperature::getHeaterPower(int heater) { }; uint8_t fanState = 0; - HOTEND_LOOP() { + HOTEND_LOOP() if (current_temperature[e] > EXTRUDER_AUTO_FAN_TEMPERATURE) - SBI(fanState, fanBit[e]); - } + SBI(fanState, pgm_read_byte(&fanBit[e])); uint8_t fanDone = 0; for (uint8_t f = 0; f < COUNT(fanPin); f++) { - int8_t pin = fanPin[f]; - if (pin >= 0 && !TEST(fanDone, fanBit[f])) { - uint8_t newFanSpeed = TEST(fanState, fanBit[f]) ? EXTRUDER_AUTO_FAN_SPEED : 0; + int8_t pin = pgm_read_byte(&fanPin[f]); + const uint8_t bit = pgm_read_byte(&fanBit[f]); + if (pin >= 0 && !TEST(fanDone, bit)) { + uint8_t newFanSpeed = TEST(fanState, bit) ? EXTRUDER_AUTO_FAN_SPEED : 0; // this idiom allows both digital and PWM fan outputs (see M42 handling). digitalWrite(pin, newFanSpeed); analogWrite(pin, newFanSpeed); - SBI(fanDone, fanBit[f]); + SBI(fanDone, bit); } } }