@@ -225,7 +225,7 @@ enum class FanCheck : uint_least8_t {
225
225
*
226
226
* @returns a TestError noerror, extruderFan, printFan or swappedFan.
227
227
*/
228
- static FanCheck lcd_selftest_fan_auto (int _fan);
228
+ static FanCheck lcd_selftest_fan_auto (uint8_t _fan);
229
229
#endif // FANCHECK
230
230
231
231
#ifdef PAT9125
@@ -6655,15 +6655,15 @@ bool lcd_selftest()
6655
6655
_progress = lcd_selftest_screen (TestScreen::ExtruderFan, _progress, 3 , true , 2000 );
6656
6656
#if (defined(FANCHECK) && defined(TACH_0))
6657
6657
switch (lcd_selftest_fan_auto (0 )){ // check extruder Fan
6658
- case FanCheck::ExtruderFan :
6659
- _result = false ;
6660
- break ;
6661
- case FanCheck::SwappedFan :
6662
- _swapped_fan = true ;
6663
- // FALLTHRU
6664
- default :
6665
- _result = true ;
6666
- break ;
6658
+ case FanCheck::SwappedFan :
6659
+ _swapped_fan = true ; // swapped is merely a hint (checked later)
6660
+ // FALLTHRU
6661
+ case FanCheck::Success :
6662
+ _result = true ;
6663
+ break ;
6664
+ default :
6665
+ _result = false ;
6666
+ break ;
6667
6667
}
6668
6668
#else // defined(TACH_0)
6669
6669
_result = lcd_selftest_manual_fan_check (0 , false );
@@ -6677,17 +6677,17 @@ bool lcd_selftest()
6677
6677
{
6678
6678
_progress = lcd_selftest_screen (TestScreen::PrintFan, _progress, 3 , true , 2000 );
6679
6679
#if (defined(FANCHECK) && defined(TACH_1))
6680
- switch (lcd_selftest_fan_auto (1 )){ // check print fan
6681
- case FanCheck::PrintFan :
6682
- _result = false ;
6683
- break ;
6684
- case FanCheck::SwappedFan :
6685
- _swapped_fan = true ;
6686
- // FALLTHRU
6687
- default :
6688
- _result = true ;
6689
- break ;
6690
- }
6680
+ switch (lcd_selftest_fan_auto (1 )){ // check print fan
6681
+ case FanCheck::SwappedFan :
6682
+ _swapped_fan = true ; // swapped is merely a hint (checked later)
6683
+ // FALLTHRU
6684
+ case FanCheck::Success :
6685
+ _result = true ;
6686
+ break ;
6687
+ default :
6688
+ _result = false ;
6689
+ break ;
6690
+ }
6691
6691
#else // defined(TACH_1)
6692
6692
_result = lcd_selftest_manual_fan_check (1 , false );
6693
6693
#endif // defined(TACH_1)
@@ -7571,90 +7571,72 @@ static bool lcd_selftest_manual_fan_check(int _fan, bool check_opposite,
7571
7571
}
7572
7572
7573
7573
#ifdef FANCHECK
7574
- static FanCheck lcd_selftest_fan_auto (int _fan)
7575
- {
7576
- switch (_fan) {
7577
- case 0 :
7578
- fanSpeed = 0 ;
7579
- manage_heater (); // turn off fan
7580
- setExtruderAutoFanState (3 ); // extruder fan
7574
+ // Set print fan speed
7575
+ static void lcd_selftest_setfan (uint8_t speed) {
7576
+ // set the fan speed
7577
+ fanSpeed = speed;
7581
7578
#ifdef FAN_SOFT_PWM
7582
- extruder_autofan_last_check = _millis ();
7583
- fan_measuring = true ;
7584
- #endif // FAN_SOFT_PWM
7585
- _delay (2000 );
7586
- setExtruderAutoFanState (0 ); // extruder fan
7587
- manage_heater (); // count average fan speed from 2s delay and turn off fans
7579
+ fanSpeedSoftPwm = speed;
7580
+ #endif
7581
+ manage_heater ();
7582
+ }
7588
7583
7589
- puts_P (PSTR (" Test 1:" ));
7590
- printf_P (PSTR (" Print fan speed: %d\n " ), fan_speed[1 ]);
7591
- printf_P (PSTR (" Extr fan speed: %d\n " ), fan_speed[0 ]);
7584
+ // Wait for the specified number of seconds while displaying some single-character indicator on the
7585
+ // screen coordinate col/row, then perform fan measurement
7586
+ static void lcd_selftest_measure_fans (uint8_t delay, uint8_t col, uint8_t row) {
7587
+ // spin-up delay
7588
+ static char symbols[] = {' -' , ' |' };
7589
+ static_assert (1000 / sizeof (symbols) * sizeof (symbols) == 1000 );
7590
+ while (delay--) {
7591
+ for (uint8_t i = 0 ; i != sizeof (symbols); ++i) {
7592
+ lcd_putc_at (col, row, symbols[i]);
7593
+ delay_keep_alive (1000 / sizeof (symbols));
7594
+ }
7595
+ }
7592
7596
7593
- if (fan_speed[0 ] < 20 ) { // < 1200 RPM would mean either a faulty Noctua or Altfan
7594
- return FanCheck::ExtruderFan;
7595
- }
7596
- #ifdef FAN_SOFT_PWM
7597
- else if (fan_speed[0 ] > 50 ) { // printerFan is faster
7598
- return FanCheck::SwappedFan;
7599
- }
7600
- break ;
7597
+ #ifdef FANCHECK
7598
+ extruder_autofan_last_check = _millis ();
7601
7599
#endif
7600
+ fan_measuring = true ;
7601
+ while (fan_measuring) {
7602
+ delay_keep_alive (100 );
7603
+ }
7602
7604
7603
- case 1 :
7604
- // will it work with Thotend > 50 C ?
7605
- #ifdef FAN_SOFT_PWM
7606
- fanSpeed = 255 ;
7607
- fanSpeedSoftPwm = 255 ;
7608
- extruder_autofan_last_check = _millis (); // store time when measurement starts
7609
- fan_measuring = true ; // start fan measuring, rest is on manage_heater
7610
- #else // FAN_SOFT_PWM
7611
- fanSpeed = 150 ; // print fan
7612
- #endif // FAN_SOFT_PWM
7613
- for (uint8_t i = 0 ; i < 5 ; i++) {
7614
- delay_keep_alive (1000 );
7615
- lcd_putc_at (18 , 3 , ' -' );
7616
- delay_keep_alive (1000 );
7617
- lcd_putc_at (18 , 3 , ' |' );
7618
- }
7619
- fanSpeed = 0 ;
7605
+ gcode_M123 ();
7606
+ }
7620
7607
7621
- #ifdef FAN_SOFT_PWM
7622
- fanSpeedSoftPwm = 0 ;
7623
- #else // FAN_SOFT_PWM
7624
- manage_heater (); // turn off fan
7625
- manage_inactivity (true ); // to turn off print fan
7626
- #endif // FAN_SOFT_PWM
7627
- puts_P (PSTR (" Test 2:" ));
7628
- printf_P (PSTR (" Print fan speed: %d\n " ), fan_speed[1 ]);
7629
- printf_P (PSTR (" Extr fan speed: %d\n " ), fan_speed[0 ]);
7630
- if (!fan_speed[1 ]) {
7631
- return FanCheck::PrintFan;
7632
- }
7608
+ static FanCheck lcd_selftest_fan_auto (uint8_t _fan)
7609
+ {
7610
+ // speed threshold to differentiate between extruder and print fan
7611
+ static const int printFanThr = FANCHECK_AUTO_PRINT_FAN_THRS; // >= FANCHECK_AUTO_PRINT_FAN_THRS RPS
7633
7612
7634
- #ifdef FAN_SOFT_PWM
7635
- fanSpeed = 80 ;
7636
- fanSpeedSoftPwm = 80 ;
7637
-
7638
- for (uint8_t i = 0 ; i < 5 ; i++) {
7639
- delay_keep_alive (1000 );
7640
- lcd_putc_at (18 , 3 , ' -' );
7641
- delay_keep_alive (1000 );
7642
- lcd_putc_at (18 , 3 , ' |' );
7643
- }
7644
- fanSpeed = 0 ;
7613
+ // speed threshold to mark a fan as failed
7614
+ static const int failThr = FANCHECK_AUTO_FAIL_THRS; // < FANCHECK_AUTO_FAIL_THRS RPM would mean either a faulty Noctua, Altfan or print fan
7645
7615
7646
- // noctua speed is between 17 and 24, turbine more then 30
7647
- if (fan_speed[1 ] < 30 ) {
7648
- return FanCheck::SwappedFan;
7616
+ switch (_fan) {
7617
+ case 0 :
7618
+ setExtruderAutoFanState (3 ); // extruder fan
7619
+ lcd_selftest_setfan (0 ); // print fan off
7620
+ lcd_selftest_measure_fans (2 , 18 , 2 );
7621
+ setExtruderAutoFanState (0 ); // extruder fan off
7622
+ if (fan_speed[0 ] < failThr) {
7623
+ return FanCheck::ExtruderFan;
7649
7624
}
7650
- #else
7651
- // fan is spinning, but measured RPM are too low for print fan, it must
7652
- // be left extruder fan
7653
- else if (fan_speed[1 ] < 34 ) {
7625
+ if (fan_speed[0 ] >= printFanThr ) {
7654
7626
return FanCheck::SwappedFan;
7655
7627
}
7656
- #endif // FAN_SOFT_PWM
7657
7628
break ;
7629
+
7630
+ case 1 :
7631
+ lcd_selftest_setfan (255 );
7632
+ lcd_selftest_measure_fans (5 , 18 , 3 );
7633
+ lcd_selftest_setfan (0 );
7634
+ if (fan_speed[1 ] < failThr) {
7635
+ return FanCheck::PrintFan;
7636
+ }
7637
+ if (fan_speed[1 ] < printFanThr) {
7638
+ return FanCheck::SwappedFan;
7639
+ }
7658
7640
}
7659
7641
return FanCheck::Success;
7660
7642
}
0 commit comments