From 2d701ab8802cc2020dcc4af4e03d12e1edd81f55 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 12 Mar 2021 07:42:30 -0600 Subject: [PATCH] NEXTION_TFT and support files MarlinFirmware/Marlin#21324 --- config/default/Configuration.h | 8 + .../examples/3DFabXYZ/Migbot/Configuration.h | 8 + .../ADIMLab/Gantry v1/Configuration.h | 8 + .../ADIMLab/Gantry v2/Configuration.h | 8 + .../AlephObjects/TAZ4/Configuration.h | 8 + .../Alfawise/U20-bltouch/Configuration.h | 8 + config/examples/Alfawise/U20/Configuration.h | 8 + .../AliExpress/CL-260/Configuration.h | 8 + .../AliExpress/UM2pExt/Configuration.h | 8 + config/examples/Anet/A2/Configuration.h | 8 + config/examples/Anet/A2plus/Configuration.h | 8 + config/examples/Anet/A6/Configuration.h | 8 + config/examples/Anet/A8/Configuration.h | 8 + config/examples/Anet/A8plus/Configuration.h | 8 + config/examples/Anet/A9/Configuration.h | 8 + config/examples/Anet/E10/Configuration.h | 8 + .../Anet/E16/BTT SKR 1.3/Configuration.h | 8 + .../examples/Anet/E16/Stock/Configuration.h | 8 + config/examples/Anet/ET4+/Configuration.h | 8 + config/examples/Anet/ET4-Pro/Configuration.h | 8 + config/examples/Anet/ET4/Configuration.h | 8 + config/examples/Anet/ET4X/Configuration.h | 8 + config/examples/Anet/ET5-Pro/Configuration.h | 8 + config/examples/Anet/ET5/Configuration.h | 8 + config/examples/Anet/ET5X/Configuration.h | 8 + .../examples/AnyCubic/Chiron/Configuration.h | 8 + .../Mega Zero/Anycubic V1/Configuration.h | 8 + .../Configuration.h | 8 + .../examples/AnyCubic/i3 Mega/Configuration.h | 8 + config/examples/AnyCubic/i3/Configuration.h | 8 + config/examples/ArmEd/Configuration.h | 8 + .../examples/Artillery/Genius/Configuration.h | 8 + .../Artillery/Sidewinder X1/Configuration.h | 8 + .../Configuration.h | 8 + config/examples/Azteeg/X5GT/Configuration.h | 8 + .../BIBO/TouchX/cyclops/Configuration.h | 8 + .../BIBO/TouchX/default/Configuration.h | 8 + .../examples/BIQU/B1-BLTouch/Configuration.h | 8 + config/examples/BIQU/B1/Configuration.h | 8 + config/examples/BQ/Hephestos/Configuration.h | 8 + .../examples/BQ/Hephestos_2/Configuration.h | 8 + config/examples/BQ/WITBOX/Configuration.h | 8 + .../i3 2560 Rev A/no probe/Configuration.h | 8 + config/examples/Cartesio/Configuration.h | 8 + .../examples/Copymaster3D/300/Configuration.h | 8 + .../examples/Copymaster3D/400/Configuration.h | 8 + .../examples/Copymaster3D/500/Configuration.h | 8 + .../CR-10 Mini/CrealityV1/Configuration.h | 8 + .../CR-10 Mini/MEEB-3DP/Configuration.h | 8 + .../CR-10 S4/CrealityV1/Configuration.h | 8 + .../CR-10 S5/CrealityV1/Configuration.h | 8 + .../Creality/CR-10 V2/Configuration.h | 8 + .../Configuration.h | 8 + .../Creality/CR-10/CrealityV1/Configuration.h | 8 + .../Configuration.h | 8 + .../Configuration.h | 8 + .../CR-10S/CrealityV1/Configuration.h | 8 + .../Creality/CR-20 Pro/Configuration.h | 8 + .../examples/Creality/CR-20/Configuration.h | 8 + .../examples/Creality/CR-6 SE/Configuration.h | 8 + config/examples/Creality/CR-8/Configuration.h | 8 + .../examples/Creality/Ender-2/Configuration.h | 8 + .../Configuration.h | 8 + .../Configuration.h | 8 + .../Configuration.h | 8 + .../Ender-3 Pro/CrealityV1/Configuration.h | 8 + .../Ender-3 Pro/CrealityV422/Configuration.h | 8 + .../Ender-3 Pro/CrealityV427/Configuration.h | 8 + .../Creality/Ender-3 V2/Configuration.h | 8 + .../2-into-1 Hotend/Configuration.h | 8 + .../Dual Z/Configuration.h | 8 + .../Single Extruder/Configuration.h | 8 + .../Configuration.h | 8 + .../Configuration.h | 8 + .../Configuration.h | 8 + .../Configuration.h | 8 + .../Ender-3/CrealityV1/Configuration.h | 8 + .../Ender-3/CrealityV422/Configuration.h | 8 + .../Ender-3/CrealityV427/Configuration.h | 8 + .../BLTouch/Configuration.h | 8 + .../FYSETC Cheetah 1.2/base/Configuration.h | 8 + .../FYSETC Cheetah/BLTouch/Configuration.h | 8 + .../FYSETC Cheetah/base/Configuration.h | 8 + .../Creality/Ender-3/MEEB-3DP/Configuration.h | 8 + .../Ender-3/MKS Robin E3 1.0/Configuration.h | 8 + .../Ender-3/MKS Robin E3P/Configuration.h | 8 + .../examples/Creality/Ender-4/Configuration.h | 8 + .../Creality/Ender-5 Plus/Configuration.h | 8 + .../Configuration.h | 8 + .../BigTreeTech SKR E3 Turbo/Configuration.h | 8 + .../Configuration.h | 8 + .../Ender-5 Pro/CrealityV1/Configuration.h | 8 + .../Ender-5 Pro/CrealityV422/Configuration.h | 8 + .../Ender-5 Pro/CrealityV427/Configuration.h | 8 + .../Configuration.h | 8 + .../Configuration.h | 8 + .../BigTreeTech SKR E3 Turbo/Configuration.h | 8 + .../Configuration.h | 8 + .../Configuration.h | 8 + .../Ender-5/CrealityV1/Configuration.h | 8 + .../Ender-5/CrealityV427/Configuration.h | 8 + .../examples/Creality/Ender-6/Configuration.h | 8 + .../Dagoma/Disco Ultimate/Configuration.h | 8 + .../examples/Daycom/3DP-100/Configuration.h | 8 + .../Imprimante multifonction/Configuration.h | 8 + config/examples/Einstart-S/Configuration.h | 8 + .../Thinker V2 board/stock/Configuration.h | 8 + config/examples/FYSETC/AIO_II/Configuration.h | 8 + config/examples/FYSETC/F6_13/Configuration.h | 8 + config/examples/FYSETC/S6/Configuration.h | 8 + config/examples/Felix/DUAL/Configuration.h | 8 + config/examples/Felix/Single/Configuration.h | 8 + .../FlashForge/Creator 2X/Configuration.h | 8 + .../FlashForge/CreatorPro/Configuration.h | 8 + .../examples/FlyingBear/P905H/Configuration.h | 8 + .../FolgerTech/i3-2020/Configuration.h | 8 + .../examples/Formbot/Raptor/Configuration.h | 8 + .../examples/Formbot/T_Rex_2+/Configuration.h | 8 + .../examples/Formbot/T_Rex_3/Configuration.h | 8 + config/examples/Geeetech/A10/Configuration.h | 8 + config/examples/Geeetech/A10D/Configuration.h | 8 + config/examples/Geeetech/A10M/Configuration.h | 8 + config/examples/Geeetech/A10T/Configuration.h | 8 + config/examples/Geeetech/A20/Configuration.h | 8 + config/examples/Geeetech/A20M/Configuration.h | 8 + config/examples/Geeetech/A20T/Configuration.h | 8 + config/examples/Geeetech/A30/Configuration.h | 8 + config/examples/Geeetech/D200/Configuration.h | 8 + .../Geeetech/Duplicator5/Configuration.h | 8 + config/examples/Geeetech/E180/Configuration.h | 8 + .../examples/Geeetech/GT2560/Configuration.h | 8 + .../Geeetech/I3_Pro_X-GT2560/Configuration.h | 8 + config/examples/Geeetech/M201/Configuration.h | 8 + .../Geeetech/MeCreator2/Configuration.h | 8 + .../Geeetech/Me_creator/Configuration.h | 8 + .../Geeetech/Me_ducer/Configuration.h | 8 + .../Geeetech/PI3A PRO/Configuration.h | 8 + .../Prusa i3 Pro B/bltouch/Configuration.h | 8 + .../Prusa i3 Pro B/noprobe/Configuration.h | 8 + .../Geeetech/Prusa i3 Pro C/Configuration.h | 8 + .../Geeetech/Prusa i3 Pro W/Configuration.h | 8 + config/examples/HMS434/Configuration.h | 8 + .../examples/Infitary/i3-M508/Configuration.h | 8 + .../Intamsys/FunmatHT 4988/Configuration.h | 8 + config/examples/JGAurora/A1/Configuration.h | 8 + config/examples/JGAurora/A3/Configuration.h | 8 + config/examples/JGAurora/A5/Configuration.h | 8 + config/examples/JGAurora/A5S/Configuration.h | 8 + .../examples/JGAurora/Magic/Configuration.h | 8 + config/examples/Kingroon/KP3/Configuration.h | 8 + config/examples/Labists/ET4/Configuration.h | 8 + config/examples/MBot/Cube/Configuration.h | 8 + .../MakerFarm/Pegasus 12/Configuration.h | 8 + config/examples/MakerParts/Configuration.h | 8 + config/examples/Malyan/M150/Configuration.h | 8 + config/examples/Malyan/M200/Configuration.h | 8 + .../Micromake/C1/basic/Configuration.h | 8 + .../Micromake/C1/enhanced/Configuration.h | 8 + config/examples/Mks/Robin/Configuration.h | 8 + .../examples/Mks/Robin_Lite3/Configuration.h | 8 + config/examples/Mks/Robin_Pro/Configuration.h | 8 + config/examples/Mks/Sbase/Configuration.h | 8 + config/examples/Modix/Big60/Configuration.h | 8 + config/examples/Nextion/Configuration.h | 2720 ++++++++++++ config/examples/Nextion/Configuration_adv.h | 3842 +++++++++++++++++ .../Nextion/HMI/Marlin4Nextion.HMI.zip | Bin 0 -> 10681280 bytes .../HMI/Marlin4Nextion_Enhanced.tft.zip | Bin 0 -> 3221967 bytes .../HMI/Marlin4Nextion_Intelligent.tft.zip | Bin 0 -> 3653372 bytes config/examples/Ortur 4/Configuration.h | 8 + .../Printrbot/PrintrboardG2/Configuration.h | 8 + .../Simple Metal RevD/Configuration.h | 8 + .../MK3S-BigTreeTech-BTT002/Configuration.h | 8 + config/examples/Qidi/Qidi 1/Configuration.h | 8 + config/examples/Raiscube/A8r/Configuration.h | 8 + .../examples/RapideLite/RL200/Configuration.h | 8 + .../examples/Renkforce/RF100/Configuration.h | 8 + .../Renkforce/RF100XL/Configuration.h | 8 + .../Renkforce/RF100v2/Configuration.h | 8 + .../examples/RepRapPro/Huxley/Configuration.h | 8 + .../RepRapWorld/Megatronics/Configuration.h | 8 + config/examples/RigidBot/Configuration.h | 8 + config/examples/Robo3D/R1+/Configuration.h | 8 + .../examples/SCARA/MP_SCARA/Configuration.h | 8 + config/examples/SCARA/Morgan/Configuration.h | 8 + .../STM32/Black_STM32F407VET6/Configuration.h | 8 + .../STM32/STM32F103RE/Configuration.h | 8 + config/examples/STM32/STM32F4/Configuration.h | 8 + config/examples/Sanguinololu/Configuration.h | 8 + config/examples/Sovol/SV-01/Configuration.h | 8 + .../examples/TPARA/AXEL_TPARA/Configuration.h | 8 + .../Tevo/Michelangelo/Configuration.h | 8 + config/examples/Tevo/Nereus/Configuration.h | 8 + .../Tevo/Tarantula Pro/Configuration.h | 8 + .../Tornado/V1 (MKS Base)/Configuration.h | 8 + .../Tornado/V2 (MKS GEN-L)/Configuration.h | 8 + config/examples/TheBorg/Configuration.h | 8 + config/examples/TinyBoy2/Configuration.h | 8 + config/examples/Tronxy/X1/Configuration.h | 8 + config/examples/Tronxy/X3A/Configuration.h | 8 + config/examples/Tronxy/X5S-2E/Configuration.h | 8 + config/examples/Tronxy/X5S/Configuration.h | 8 + config/examples/Tronxy/X5SA/Configuration.h | 8 + config/examples/Tronxy/XY100/Configuration.h | 8 + .../Two Trees/BlueR Plus/Configuration.h | 8 + .../Two Trees/BlueR/BlueR V1/Configuration.h | 8 + .../Two Trees/BlueR/BlueR V2/Configuration.h | 8 + .../Two Trees/BlueR/BlueR V3/Configuration.h | 8 + .../Sapphire Plus V2/Configuration.h | 8 + .../Two Trees/Sapphire Pro/Configuration.h | 8 + .../UltiMachine/Archim1/Configuration.h | 8 + .../UltiMachine/Archim2/Configuration.h | 8 + config/examples/VORONDesign/Configuration.h | 8 + .../examples/Velleman/K8200/Configuration.h | 8 + .../Velleman/K8400/Dual-head/Configuration.h | 8 + .../K8400/Single-head/Configuration.h | 8 + .../examples/WASP/PowerWASP/Configuration.h | 8 + .../Wanhao/Duplicator 4S/Configuration.h | 8 + .../Wanhao/Duplicator 6/Configuration.h | 8 + .../Wanhao/Duplicator i3 2.1/Configuration.h | 8 + .../Wanhao/Duplicator i3 Mini/Configuration.h | 8 + config/examples/Weistek/wt150/Configuration.h | 8 + .../examples/Zonestar/P802M/Configuration.h | 8 + .../Configuration.h | 8 + .../Kossel Linear Plus/Configuration.h | 8 + .../delta/Anycubic/Kossel/Configuration.h | 8 + .../delta/Anycubic/Predator/Configuration.h | 8 + .../delta/Dreammaker/Overlord/Configuration.h | 8 + .../Dreammaker/Overlord_Pro/Configuration.h | 8 + .../delta/FLSUN/Q5-nano_v1/Configuration.h | 8 + .../delta/FLSUN/Q5-nano_v2/Configuration.h | 8 + .../examples/delta/FLSUN/QQ-S/Configuration.h | 8 + .../delta/FLSUN/QQS-Pro/Configuration.h | 8 + .../FLSUN/auto_calibrate/Configuration.h | 8 + .../delta/FLSUN/kossel/Configuration.h | 8 + .../delta/FLSUN/kossel_mini/Configuration.h | 8 + .../delta/Geeetech/G2/Configuration.h | 8 + .../delta/Geeetech/G2Pro/Configuration.h | 8 + .../delta/Geeetech/G2S/Configuration.h | 8 + .../delta/Geeetech/G2SPro/Configuration.h | 8 + .../Geeetech/Rostock 301/Configuration.h | 8 + .../delta/Hatchbox_Alpha/Configuration.h | 8 + .../examples/delta/MKS/SBASE/Configuration.h | 8 + .../delta/Malyan M300/Configuration.h | 8 + .../delta/Tevo Little Monster/Configuration.h | 8 + config/examples/delta/generic/Configuration.h | 8 + .../delta/kossel_clear/Configuration.h | 8 + .../delta/kossel_mini/Configuration.h | 8 + .../examples/delta/kossel_pro/Configuration.h | 8 + .../examples/delta/kossel_xl/Configuration.h | 8 + .../examples/gCreate/gMax1.5+/Configuration.h | 8 + config/examples/makibox/Configuration.h | 8 + config/examples/tvrrug/Round2/Configuration.h | 8 + 252 files changed, 8538 insertions(+) create mode 100644 config/examples/Nextion/Configuration.h create mode 100644 config/examples/Nextion/Configuration_adv.h create mode 100644 config/examples/Nextion/HMI/Marlin4Nextion.HMI.zip create mode 100644 config/examples/Nextion/HMI/Marlin4Nextion_Enhanced.tft.zip create mode 100644 config/examples/Nextion/HMI/Marlin4Nextion_Intelligent.tft.zip diff --git a/config/default/Configuration.h b/config/default/Configuration.h index 96f99a0571..314e537cdd 100644 --- a/config/default/Configuration.h +++ b/config/default/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/3DFabXYZ/Migbot/Configuration.h b/config/examples/3DFabXYZ/Migbot/Configuration.h index 5b21fa9dc5..3202fb437b 100644 --- a/config/examples/3DFabXYZ/Migbot/Configuration.h +++ b/config/examples/3DFabXYZ/Migbot/Configuration.h @@ -2429,6 +2429,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/ADIMLab/Gantry v1/Configuration.h b/config/examples/ADIMLab/Gantry v1/Configuration.h index 8db71acb0b..b5ceb70d19 100644 --- a/config/examples/ADIMLab/Gantry v1/Configuration.h +++ b/config/examples/ADIMLab/Gantry v1/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/ADIMLab/Gantry v2/Configuration.h b/config/examples/ADIMLab/Gantry v2/Configuration.h index ac4b0dc20a..62f2521578 100644 --- a/config/examples/ADIMLab/Gantry v2/Configuration.h +++ b/config/examples/ADIMLab/Gantry v2/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/AlephObjects/TAZ4/Configuration.h b/config/examples/AlephObjects/TAZ4/Configuration.h index 841afe313c..eede7474a7 100644 --- a/config/examples/AlephObjects/TAZ4/Configuration.h +++ b/config/examples/AlephObjects/TAZ4/Configuration.h @@ -2408,6 +2408,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Alfawise/U20-bltouch/Configuration.h b/config/examples/Alfawise/U20-bltouch/Configuration.h index 9e26a389c0..c51bf55c9f 100644 --- a/config/examples/Alfawise/U20-bltouch/Configuration.h +++ b/config/examples/Alfawise/U20-bltouch/Configuration.h @@ -2467,6 +2467,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Alfawise/U20/Configuration.h b/config/examples/Alfawise/U20/Configuration.h index c54776a6c9..48d5c317d1 100644 --- a/config/examples/Alfawise/U20/Configuration.h +++ b/config/examples/Alfawise/U20/Configuration.h @@ -2469,6 +2469,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/AliExpress/CL-260/Configuration.h b/config/examples/AliExpress/CL-260/Configuration.h index 7d777b258a..b0c1770af3 100644 --- a/config/examples/AliExpress/CL-260/Configuration.h +++ b/config/examples/AliExpress/CL-260/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/AliExpress/UM2pExt/Configuration.h b/config/examples/AliExpress/UM2pExt/Configuration.h index 42eee8e35f..7b55bae4fe 100644 --- a/config/examples/AliExpress/UM2pExt/Configuration.h +++ b/config/examples/AliExpress/UM2pExt/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Anet/A2/Configuration.h b/config/examples/Anet/A2/Configuration.h index 83ce6bc74c..ae4a09f27f 100644 --- a/config/examples/Anet/A2/Configuration.h +++ b/config/examples/Anet/A2/Configuration.h @@ -2399,6 +2399,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Anet/A2plus/Configuration.h b/config/examples/Anet/A2plus/Configuration.h index 2ef9cbf178..71f8e9f62e 100644 --- a/config/examples/Anet/A2plus/Configuration.h +++ b/config/examples/Anet/A2plus/Configuration.h @@ -2399,6 +2399,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Anet/A6/Configuration.h b/config/examples/Anet/A6/Configuration.h index 5547850351..35489b3aca 100644 --- a/config/examples/Anet/A6/Configuration.h +++ b/config/examples/Anet/A6/Configuration.h @@ -2489,6 +2489,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Anet/A8/Configuration.h b/config/examples/Anet/A8/Configuration.h index 6afd0051fb..3e9d9ab9c8 100644 --- a/config/examples/Anet/A8/Configuration.h +++ b/config/examples/Anet/A8/Configuration.h @@ -2402,6 +2402,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Anet/A8plus/Configuration.h b/config/examples/Anet/A8plus/Configuration.h index bd32285421..fba5c9e0b9 100644 --- a/config/examples/Anet/A8plus/Configuration.h +++ b/config/examples/Anet/A8plus/Configuration.h @@ -2402,6 +2402,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Anet/A9/Configuration.h b/config/examples/Anet/A9/Configuration.h index 47254b7e4a..e2efac0b28 100644 --- a/config/examples/Anet/A9/Configuration.h +++ b/config/examples/Anet/A9/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Anet/E10/Configuration.h b/config/examples/Anet/E10/Configuration.h index b9b82508ed..a22e3be2f7 100644 --- a/config/examples/Anet/E10/Configuration.h +++ b/config/examples/Anet/E10/Configuration.h @@ -2400,6 +2400,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Anet/E16/BTT SKR 1.3/Configuration.h b/config/examples/Anet/E16/BTT SKR 1.3/Configuration.h index 76692d9f79..ef0cbdecfc 100644 --- a/config/examples/Anet/E16/BTT SKR 1.3/Configuration.h +++ b/config/examples/Anet/E16/BTT SKR 1.3/Configuration.h @@ -2399,6 +2399,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Anet/E16/Stock/Configuration.h b/config/examples/Anet/E16/Stock/Configuration.h index 9278578511..81d563de37 100644 --- a/config/examples/Anet/E16/Stock/Configuration.h +++ b/config/examples/Anet/E16/Stock/Configuration.h @@ -2399,6 +2399,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Anet/ET4+/Configuration.h b/config/examples/Anet/ET4+/Configuration.h index 3f82168478..8362d9d580 100644 --- a/config/examples/Anet/ET4+/Configuration.h +++ b/config/examples/Anet/ET4+/Configuration.h @@ -2409,6 +2409,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Anet/ET4-Pro/Configuration.h b/config/examples/Anet/ET4-Pro/Configuration.h index bdc130f117..25151dcda7 100644 --- a/config/examples/Anet/ET4-Pro/Configuration.h +++ b/config/examples/Anet/ET4-Pro/Configuration.h @@ -2409,6 +2409,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Anet/ET4/Configuration.h b/config/examples/Anet/ET4/Configuration.h index d575ec7dd7..2778c684af 100644 --- a/config/examples/Anet/ET4/Configuration.h +++ b/config/examples/Anet/ET4/Configuration.h @@ -2409,6 +2409,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Anet/ET4X/Configuration.h b/config/examples/Anet/ET4X/Configuration.h index fb67a0f282..f64655355d 100644 --- a/config/examples/Anet/ET4X/Configuration.h +++ b/config/examples/Anet/ET4X/Configuration.h @@ -2409,6 +2409,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Anet/ET5-Pro/Configuration.h b/config/examples/Anet/ET5-Pro/Configuration.h index ecfac02637..0280ba4c70 100644 --- a/config/examples/Anet/ET5-Pro/Configuration.h +++ b/config/examples/Anet/ET5-Pro/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Anet/ET5/Configuration.h b/config/examples/Anet/ET5/Configuration.h index fa3e48c032..88f123d022 100644 --- a/config/examples/Anet/ET5/Configuration.h +++ b/config/examples/Anet/ET5/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Anet/ET5X/Configuration.h b/config/examples/Anet/ET5X/Configuration.h index 15f7754538..1d05e0d0e4 100644 --- a/config/examples/Anet/ET5X/Configuration.h +++ b/config/examples/Anet/ET5X/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/AnyCubic/Chiron/Configuration.h b/config/examples/AnyCubic/Chiron/Configuration.h index eeea258104..bc84ac9c08 100644 --- a/config/examples/AnyCubic/Chiron/Configuration.h +++ b/config/examples/AnyCubic/Chiron/Configuration.h @@ -2401,6 +2401,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/AnyCubic/Mega Zero/Anycubic V1/Configuration.h b/config/examples/AnyCubic/Mega Zero/Anycubic V1/Configuration.h index 26604ed7f4..4bde2a3d9e 100644 --- a/config/examples/AnyCubic/Mega Zero/Anycubic V1/Configuration.h +++ b/config/examples/AnyCubic/Mega Zero/Anycubic V1/Configuration.h @@ -2399,6 +2399,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/AnyCubic/Mega Zero/BigTreeTech SKR Mini MZ V1.0/Configuration.h b/config/examples/AnyCubic/Mega Zero/BigTreeTech SKR Mini MZ V1.0/Configuration.h index 2f35ac36e7..7eb4326a3b 100644 --- a/config/examples/AnyCubic/Mega Zero/BigTreeTech SKR Mini MZ V1.0/Configuration.h +++ b/config/examples/AnyCubic/Mega Zero/BigTreeTech SKR Mini MZ V1.0/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/AnyCubic/i3 Mega/Configuration.h b/config/examples/AnyCubic/i3 Mega/Configuration.h index 0490a879ff..e3611c5df4 100644 --- a/config/examples/AnyCubic/i3 Mega/Configuration.h +++ b/config/examples/AnyCubic/i3 Mega/Configuration.h @@ -2417,6 +2417,14 @@ #define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/AnyCubic/i3/Configuration.h b/config/examples/AnyCubic/i3/Configuration.h index 19a84bf0bf..390cd23672 100644 --- a/config/examples/AnyCubic/i3/Configuration.h +++ b/config/examples/AnyCubic/i3/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/ArmEd/Configuration.h b/config/examples/ArmEd/Configuration.h index 4c2912cb55..c521b79c38 100644 --- a/config/examples/ArmEd/Configuration.h +++ b/config/examples/ArmEd/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Artillery/Genius/Configuration.h b/config/examples/Artillery/Genius/Configuration.h index 8e3172318f..f2d28572f1 100644 --- a/config/examples/Artillery/Genius/Configuration.h +++ b/config/examples/Artillery/Genius/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Artillery/Sidewinder X1/Configuration.h b/config/examples/Artillery/Sidewinder X1/Configuration.h index e7021723d3..056c307775 100644 --- a/config/examples/Artillery/Sidewinder X1/Configuration.h +++ b/config/examples/Artillery/Sidewinder X1/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Artillery/Sidewinder X1_0.9_degree_BMG_E3D_V6/Configuration.h b/config/examples/Artillery/Sidewinder X1_0.9_degree_BMG_E3D_V6/Configuration.h index aaa755e1fc..36e6164513 100644 --- a/config/examples/Artillery/Sidewinder X1_0.9_degree_BMG_E3D_V6/Configuration.h +++ b/config/examples/Artillery/Sidewinder X1_0.9_degree_BMG_E3D_V6/Configuration.h @@ -2413,6 +2413,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Azteeg/X5GT/Configuration.h b/config/examples/Azteeg/X5GT/Configuration.h index fa5d035caa..5ebb77269b 100644 --- a/config/examples/Azteeg/X5GT/Configuration.h +++ b/config/examples/Azteeg/X5GT/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/BIBO/TouchX/cyclops/Configuration.h b/config/examples/BIBO/TouchX/cyclops/Configuration.h index 2474ab1641..e7e00c5102 100644 --- a/config/examples/BIBO/TouchX/cyclops/Configuration.h +++ b/config/examples/BIBO/TouchX/cyclops/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/BIBO/TouchX/default/Configuration.h b/config/examples/BIBO/TouchX/default/Configuration.h index 1080bff800..56bff51967 100644 --- a/config/examples/BIBO/TouchX/default/Configuration.h +++ b/config/examples/BIBO/TouchX/default/Configuration.h @@ -2351,6 +2351,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/BIQU/B1-BLTouch/Configuration.h b/config/examples/BIQU/B1-BLTouch/Configuration.h index 97e01e4abe..a52bf97db5 100644 --- a/config/examples/BIQU/B1-BLTouch/Configuration.h +++ b/config/examples/BIQU/B1-BLTouch/Configuration.h @@ -2403,6 +2403,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/BIQU/B1/Configuration.h b/config/examples/BIQU/B1/Configuration.h index 307836a3ea..1e9a263dbf 100644 --- a/config/examples/BIQU/B1/Configuration.h +++ b/config/examples/BIQU/B1/Configuration.h @@ -2403,6 +2403,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/BQ/Hephestos/Configuration.h b/config/examples/BQ/Hephestos/Configuration.h index 4c8b2999e9..0fac8fdb3b 100644 --- a/config/examples/BQ/Hephestos/Configuration.h +++ b/config/examples/BQ/Hephestos/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/BQ/Hephestos_2/Configuration.h b/config/examples/BQ/Hephestos_2/Configuration.h index 6e6ecc9368..544cac6e0e 100644 --- a/config/examples/BQ/Hephestos_2/Configuration.h +++ b/config/examples/BQ/Hephestos_2/Configuration.h @@ -2411,6 +2411,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/BQ/WITBOX/Configuration.h b/config/examples/BQ/WITBOX/Configuration.h index e9b9666e83..6ad4471496 100644 --- a/config/examples/BQ/WITBOX/Configuration.h +++ b/config/examples/BQ/WITBOX/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/CTC/i3 2560 Rev A/no probe/Configuration.h b/config/examples/CTC/i3 2560 Rev A/no probe/Configuration.h index 87b318a556..e680cf6ba5 100644 --- a/config/examples/CTC/i3 2560 Rev A/no probe/Configuration.h +++ b/config/examples/CTC/i3 2560 Rev A/no probe/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Cartesio/Configuration.h b/config/examples/Cartesio/Configuration.h index 97c5687de6..eeea461fa2 100644 --- a/config/examples/Cartesio/Configuration.h +++ b/config/examples/Cartesio/Configuration.h @@ -2413,6 +2413,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Copymaster3D/300/Configuration.h b/config/examples/Copymaster3D/300/Configuration.h index c49813d149..00e5d3d7d7 100644 --- a/config/examples/Copymaster3D/300/Configuration.h +++ b/config/examples/Copymaster3D/300/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Copymaster3D/400/Configuration.h b/config/examples/Copymaster3D/400/Configuration.h index ac28ebf8d3..ab91aa8407 100644 --- a/config/examples/Copymaster3D/400/Configuration.h +++ b/config/examples/Copymaster3D/400/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Copymaster3D/500/Configuration.h b/config/examples/Copymaster3D/500/Configuration.h index 50dba7270f..13aba29d3c 100644 --- a/config/examples/Copymaster3D/500/Configuration.h +++ b/config/examples/Copymaster3D/500/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/CR-10 Mini/CrealityV1/Configuration.h b/config/examples/Creality/CR-10 Mini/CrealityV1/Configuration.h index b6fd1646be..7bcc57789b 100644 --- a/config/examples/Creality/CR-10 Mini/CrealityV1/Configuration.h +++ b/config/examples/Creality/CR-10 Mini/CrealityV1/Configuration.h @@ -2406,6 +2406,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/CR-10 Mini/MEEB-3DP/Configuration.h b/config/examples/Creality/CR-10 Mini/MEEB-3DP/Configuration.h index 50c920e239..bacfefd812 100644 --- a/config/examples/Creality/CR-10 Mini/MEEB-3DP/Configuration.h +++ b/config/examples/Creality/CR-10 Mini/MEEB-3DP/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/CR-10 S4/CrealityV1/Configuration.h b/config/examples/Creality/CR-10 S4/CrealityV1/Configuration.h index 64a6ed3465..2923f210b5 100644 --- a/config/examples/Creality/CR-10 S4/CrealityV1/Configuration.h +++ b/config/examples/Creality/CR-10 S4/CrealityV1/Configuration.h @@ -2412,6 +2412,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/CR-10 S5/CrealityV1/Configuration.h b/config/examples/Creality/CR-10 S5/CrealityV1/Configuration.h index 96a21324c4..f896ba599b 100644 --- a/config/examples/Creality/CR-10 S5/CrealityV1/Configuration.h +++ b/config/examples/Creality/CR-10 S5/CrealityV1/Configuration.h @@ -2400,6 +2400,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/CR-10 V2/Configuration.h b/config/examples/Creality/CR-10 V2/Configuration.h index 2fd3836769..e58fabdbb8 100644 --- a/config/examples/Creality/CR-10 V2/Configuration.h +++ b/config/examples/Creality/CR-10 V2/Configuration.h @@ -2425,6 +2425,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/CR-10/BigTreeTech SKR Mini E3 2.0/Configuration.h b/config/examples/Creality/CR-10/BigTreeTech SKR Mini E3 2.0/Configuration.h index b0f4ac921c..784e5832c0 100644 --- a/config/examples/Creality/CR-10/BigTreeTech SKR Mini E3 2.0/Configuration.h +++ b/config/examples/Creality/CR-10/BigTreeTech SKR Mini E3 2.0/Configuration.h @@ -2408,6 +2408,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/CR-10/CrealityV1/Configuration.h b/config/examples/Creality/CR-10/CrealityV1/Configuration.h index ae92387e2c..c2ada7cbb7 100644 --- a/config/examples/Creality/CR-10/CrealityV1/Configuration.h +++ b/config/examples/Creality/CR-10/CrealityV1/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/CR-10S/BigTreeTech SKR 1.4 Turbo TMC2209/Configuration.h b/config/examples/Creality/CR-10S/BigTreeTech SKR 1.4 Turbo TMC2209/Configuration.h index 2292ce37df..77fe3703fb 100644 --- a/config/examples/Creality/CR-10S/BigTreeTech SKR 1.4 Turbo TMC2209/Configuration.h +++ b/config/examples/Creality/CR-10S/BigTreeTech SKR 1.4 Turbo TMC2209/Configuration.h @@ -2409,6 +2409,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/CR-10S/BigTreeTech SKR Mini E3 2.0/Configuration.h b/config/examples/Creality/CR-10S/BigTreeTech SKR Mini E3 2.0/Configuration.h index 0c5cf8fb25..cbc05e9c98 100644 --- a/config/examples/Creality/CR-10S/BigTreeTech SKR Mini E3 2.0/Configuration.h +++ b/config/examples/Creality/CR-10S/BigTreeTech SKR Mini E3 2.0/Configuration.h @@ -2410,6 +2410,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/CR-10S/CrealityV1/Configuration.h b/config/examples/Creality/CR-10S/CrealityV1/Configuration.h index 7f5a6456e8..0039629619 100644 --- a/config/examples/Creality/CR-10S/CrealityV1/Configuration.h +++ b/config/examples/Creality/CR-10S/CrealityV1/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/CR-20 Pro/Configuration.h b/config/examples/Creality/CR-20 Pro/Configuration.h index 99e29f7051..67d1298f4f 100644 --- a/config/examples/Creality/CR-20 Pro/Configuration.h +++ b/config/examples/Creality/CR-20 Pro/Configuration.h @@ -2403,6 +2403,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/CR-20/Configuration.h b/config/examples/Creality/CR-20/Configuration.h index 9871e066db..5fa7ed8ca7 100644 --- a/config/examples/Creality/CR-20/Configuration.h +++ b/config/examples/Creality/CR-20/Configuration.h @@ -2403,6 +2403,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/CR-6 SE/Configuration.h b/config/examples/Creality/CR-6 SE/Configuration.h index 67a8f26f13..08f692e5aa 100644 --- a/config/examples/Creality/CR-6 SE/Configuration.h +++ b/config/examples/Creality/CR-6 SE/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/CR-8/Configuration.h b/config/examples/Creality/CR-8/Configuration.h index 537291c16c..360723ab3b 100644 --- a/config/examples/Creality/CR-8/Configuration.h +++ b/config/examples/Creality/CR-8/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-2/Configuration.h b/config/examples/Creality/Ender-2/Configuration.h index 99ee56cb94..6dc65622a7 100644 --- a/config/examples/Creality/Ender-2/Configuration.h +++ b/config/examples/Creality/Ender-2/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-3 Pro/BigTreeTech SKR Mini E3 1.0/Configuration.h b/config/examples/Creality/Ender-3 Pro/BigTreeTech SKR Mini E3 1.0/Configuration.h index dc57c77853..d5ebcf6980 100644 --- a/config/examples/Creality/Ender-3 Pro/BigTreeTech SKR Mini E3 1.0/Configuration.h +++ b/config/examples/Creality/Ender-3 Pro/BigTreeTech SKR Mini E3 1.0/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-3 Pro/BigTreeTech SKR Mini E3 1.2/Configuration.h b/config/examples/Creality/Ender-3 Pro/BigTreeTech SKR Mini E3 1.2/Configuration.h index a2e161ddfa..8119956c23 100644 --- a/config/examples/Creality/Ender-3 Pro/BigTreeTech SKR Mini E3 1.2/Configuration.h +++ b/config/examples/Creality/Ender-3 Pro/BigTreeTech SKR Mini E3 1.2/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-3 Pro/BigTreeTech SKR Mini E3 2.0/Configuration.h b/config/examples/Creality/Ender-3 Pro/BigTreeTech SKR Mini E3 2.0/Configuration.h index 9f7951ff07..7a777cc4a9 100644 --- a/config/examples/Creality/Ender-3 Pro/BigTreeTech SKR Mini E3 2.0/Configuration.h +++ b/config/examples/Creality/Ender-3 Pro/BigTreeTech SKR Mini E3 2.0/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-3 Pro/CrealityV1/Configuration.h b/config/examples/Creality/Ender-3 Pro/CrealityV1/Configuration.h index 515172661b..21664cabf5 100644 --- a/config/examples/Creality/Ender-3 Pro/CrealityV1/Configuration.h +++ b/config/examples/Creality/Ender-3 Pro/CrealityV1/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-3 Pro/CrealityV422/Configuration.h b/config/examples/Creality/Ender-3 Pro/CrealityV422/Configuration.h index 1a7530a6ef..4a7ca07728 100644 --- a/config/examples/Creality/Ender-3 Pro/CrealityV422/Configuration.h +++ b/config/examples/Creality/Ender-3 Pro/CrealityV422/Configuration.h @@ -2404,6 +2404,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-3 Pro/CrealityV427/Configuration.h b/config/examples/Creality/Ender-3 Pro/CrealityV427/Configuration.h index bd6c9fcd2f..e9bb3da92e 100644 --- a/config/examples/Creality/Ender-3 Pro/CrealityV427/Configuration.h +++ b/config/examples/Creality/Ender-3 Pro/CrealityV427/Configuration.h @@ -2401,6 +2401,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-3 V2/Configuration.h b/config/examples/Creality/Ender-3 V2/Configuration.h index 8e16120075..23395d9b1b 100644 --- a/config/examples/Creality/Ender-3 V2/Configuration.h +++ b/config/examples/Creality/Ender-3 V2/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-3/BigTreeTech SKR E3 Turbo/2-into-1 Hotend/Configuration.h b/config/examples/Creality/Ender-3/BigTreeTech SKR E3 Turbo/2-into-1 Hotend/Configuration.h index bbe59a91ad..4f2a013dde 100644 --- a/config/examples/Creality/Ender-3/BigTreeTech SKR E3 Turbo/2-into-1 Hotend/Configuration.h +++ b/config/examples/Creality/Ender-3/BigTreeTech SKR E3 Turbo/2-into-1 Hotend/Configuration.h @@ -2396,6 +2396,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-3/BigTreeTech SKR E3 Turbo/Dual Z/Configuration.h b/config/examples/Creality/Ender-3/BigTreeTech SKR E3 Turbo/Dual Z/Configuration.h index e7d4063a30..06def5d757 100644 --- a/config/examples/Creality/Ender-3/BigTreeTech SKR E3 Turbo/Dual Z/Configuration.h +++ b/config/examples/Creality/Ender-3/BigTreeTech SKR E3 Turbo/Dual Z/Configuration.h @@ -2396,6 +2396,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-3/BigTreeTech SKR E3 Turbo/Single Extruder/Configuration.h b/config/examples/Creality/Ender-3/BigTreeTech SKR E3 Turbo/Single Extruder/Configuration.h index 26a95d2d97..e9333f1bb2 100644 --- a/config/examples/Creality/Ender-3/BigTreeTech SKR E3 Turbo/Single Extruder/Configuration.h +++ b/config/examples/Creality/Ender-3/BigTreeTech SKR E3 Turbo/Single Extruder/Configuration.h @@ -2396,6 +2396,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-3/BigTreeTech SKR E3-DIP V1.1/Configuration.h b/config/examples/Creality/Ender-3/BigTreeTech SKR E3-DIP V1.1/Configuration.h index dc11378db9..5548709354 100644 --- a/config/examples/Creality/Ender-3/BigTreeTech SKR E3-DIP V1.1/Configuration.h +++ b/config/examples/Creality/Ender-3/BigTreeTech SKR E3-DIP V1.1/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-3/BigTreeTech SKR Mini E3 1.0/Configuration.h b/config/examples/Creality/Ender-3/BigTreeTech SKR Mini E3 1.0/Configuration.h index 1f45ae9033..d5b2eca56f 100644 --- a/config/examples/Creality/Ender-3/BigTreeTech SKR Mini E3 1.0/Configuration.h +++ b/config/examples/Creality/Ender-3/BigTreeTech SKR Mini E3 1.0/Configuration.h @@ -2396,6 +2396,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-3/BigTreeTech SKR Mini E3 1.2/Configuration.h b/config/examples/Creality/Ender-3/BigTreeTech SKR Mini E3 1.2/Configuration.h index 17a9660b30..a4a35e16fb 100644 --- a/config/examples/Creality/Ender-3/BigTreeTech SKR Mini E3 1.2/Configuration.h +++ b/config/examples/Creality/Ender-3/BigTreeTech SKR Mini E3 1.2/Configuration.h @@ -2396,6 +2396,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-3/BigTreeTech SKR Mini E3 2.0/Configuration.h b/config/examples/Creality/Ender-3/BigTreeTech SKR Mini E3 2.0/Configuration.h index 3f6fafb41d..309da920fd 100644 --- a/config/examples/Creality/Ender-3/BigTreeTech SKR Mini E3 2.0/Configuration.h +++ b/config/examples/Creality/Ender-3/BigTreeTech SKR Mini E3 2.0/Configuration.h @@ -2396,6 +2396,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-3/CrealityV1/Configuration.h b/config/examples/Creality/Ender-3/CrealityV1/Configuration.h index 92bf793b91..b14dffba4e 100644 --- a/config/examples/Creality/Ender-3/CrealityV1/Configuration.h +++ b/config/examples/Creality/Ender-3/CrealityV1/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-3/CrealityV422/Configuration.h b/config/examples/Creality/Ender-3/CrealityV422/Configuration.h index 4e2b636f26..c4a95f8df6 100644 --- a/config/examples/Creality/Ender-3/CrealityV422/Configuration.h +++ b/config/examples/Creality/Ender-3/CrealityV422/Configuration.h @@ -2346,6 +2346,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-3/CrealityV427/Configuration.h b/config/examples/Creality/Ender-3/CrealityV427/Configuration.h index f1ccfac6a4..da52fd1e37 100644 --- a/config/examples/Creality/Ender-3/CrealityV427/Configuration.h +++ b/config/examples/Creality/Ender-3/CrealityV427/Configuration.h @@ -2407,6 +2407,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-3/FYSETC Cheetah 1.2/BLTouch/Configuration.h b/config/examples/Creality/Ender-3/FYSETC Cheetah 1.2/BLTouch/Configuration.h index ed154dcc99..7b454706f8 100644 --- a/config/examples/Creality/Ender-3/FYSETC Cheetah 1.2/BLTouch/Configuration.h +++ b/config/examples/Creality/Ender-3/FYSETC Cheetah 1.2/BLTouch/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-3/FYSETC Cheetah 1.2/base/Configuration.h b/config/examples/Creality/Ender-3/FYSETC Cheetah 1.2/base/Configuration.h index f082ff51b9..8ef9cc7b37 100644 --- a/config/examples/Creality/Ender-3/FYSETC Cheetah 1.2/base/Configuration.h +++ b/config/examples/Creality/Ender-3/FYSETC Cheetah 1.2/base/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-3/FYSETC Cheetah/BLTouch/Configuration.h b/config/examples/Creality/Ender-3/FYSETC Cheetah/BLTouch/Configuration.h index 7bade762b8..4e8e49bebc 100644 --- a/config/examples/Creality/Ender-3/FYSETC Cheetah/BLTouch/Configuration.h +++ b/config/examples/Creality/Ender-3/FYSETC Cheetah/BLTouch/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-3/FYSETC Cheetah/base/Configuration.h b/config/examples/Creality/Ender-3/FYSETC Cheetah/base/Configuration.h index 104e913f0d..138d9b50be 100644 --- a/config/examples/Creality/Ender-3/FYSETC Cheetah/base/Configuration.h +++ b/config/examples/Creality/Ender-3/FYSETC Cheetah/base/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-3/MEEB-3DP/Configuration.h b/config/examples/Creality/Ender-3/MEEB-3DP/Configuration.h index 3b1a5d2290..eafc449e89 100644 --- a/config/examples/Creality/Ender-3/MEEB-3DP/Configuration.h +++ b/config/examples/Creality/Ender-3/MEEB-3DP/Configuration.h @@ -2403,6 +2403,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-3/MKS Robin E3 1.0/Configuration.h b/config/examples/Creality/Ender-3/MKS Robin E3 1.0/Configuration.h index cb936c2edb..528c5cdfe0 100644 --- a/config/examples/Creality/Ender-3/MKS Robin E3 1.0/Configuration.h +++ b/config/examples/Creality/Ender-3/MKS Robin E3 1.0/Configuration.h @@ -2396,6 +2396,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-3/MKS Robin E3P/Configuration.h b/config/examples/Creality/Ender-3/MKS Robin E3P/Configuration.h index af7ba7d258..48198cdaed 100644 --- a/config/examples/Creality/Ender-3/MKS Robin E3P/Configuration.h +++ b/config/examples/Creality/Ender-3/MKS Robin E3P/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-4/Configuration.h b/config/examples/Creality/Ender-4/Configuration.h index f357f683f2..05a72c076f 100644 --- a/config/examples/Creality/Ender-4/Configuration.h +++ b/config/examples/Creality/Ender-4/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-5 Plus/Configuration.h b/config/examples/Creality/Ender-5 Plus/Configuration.h index ab070e2b85..2aabb6701c 100644 --- a/config/examples/Creality/Ender-5 Plus/Configuration.h +++ b/config/examples/Creality/Ender-5 Plus/Configuration.h @@ -2411,6 +2411,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-5 Pro/BigTreeTech SKR E3 Turbo with BLTouch/Configuration.h b/config/examples/Creality/Ender-5 Pro/BigTreeTech SKR E3 Turbo with BLTouch/Configuration.h index db8b9dd0db..e109c35303 100644 --- a/config/examples/Creality/Ender-5 Pro/BigTreeTech SKR E3 Turbo with BLTouch/Configuration.h +++ b/config/examples/Creality/Ender-5 Pro/BigTreeTech SKR E3 Turbo with BLTouch/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-5 Pro/BigTreeTech SKR E3 Turbo/Configuration.h b/config/examples/Creality/Ender-5 Pro/BigTreeTech SKR E3 Turbo/Configuration.h index a9ac8129b9..d55bd00ae0 100644 --- a/config/examples/Creality/Ender-5 Pro/BigTreeTech SKR E3 Turbo/Configuration.h +++ b/config/examples/Creality/Ender-5 Pro/BigTreeTech SKR E3 Turbo/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-5 Pro/BigTreeTech SKR Mini E3 1.2/Configuration.h b/config/examples/Creality/Ender-5 Pro/BigTreeTech SKR Mini E3 1.2/Configuration.h index 84a15b7c71..8ca7f1881e 100644 --- a/config/examples/Creality/Ender-5 Pro/BigTreeTech SKR Mini E3 1.2/Configuration.h +++ b/config/examples/Creality/Ender-5 Pro/BigTreeTech SKR Mini E3 1.2/Configuration.h @@ -2368,6 +2368,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-5 Pro/CrealityV1/Configuration.h b/config/examples/Creality/Ender-5 Pro/CrealityV1/Configuration.h index f66e2aeb61..6f8ef0d0a9 100644 --- a/config/examples/Creality/Ender-5 Pro/CrealityV1/Configuration.h +++ b/config/examples/Creality/Ender-5 Pro/CrealityV1/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-5 Pro/CrealityV422/Configuration.h b/config/examples/Creality/Ender-5 Pro/CrealityV422/Configuration.h index 2a05fdf70a..ba6cfe9146 100644 --- a/config/examples/Creality/Ender-5 Pro/CrealityV422/Configuration.h +++ b/config/examples/Creality/Ender-5 Pro/CrealityV422/Configuration.h @@ -2401,6 +2401,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-5 Pro/CrealityV427/Configuration.h b/config/examples/Creality/Ender-5 Pro/CrealityV427/Configuration.h index 1e8696f9b3..6176d31fbf 100644 --- a/config/examples/Creality/Ender-5 Pro/CrealityV427/Configuration.h +++ b/config/examples/Creality/Ender-5 Pro/CrealityV427/Configuration.h @@ -2401,6 +2401,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-5/BigTreeTech SKR 1.4 Turbo (TMC2209)/Configuration.h b/config/examples/Creality/Ender-5/BigTreeTech SKR 1.4 Turbo (TMC2209)/Configuration.h index 7d820eb109..0af08b3305 100644 --- a/config/examples/Creality/Ender-5/BigTreeTech SKR 1.4 Turbo (TMC2209)/Configuration.h +++ b/config/examples/Creality/Ender-5/BigTreeTech SKR 1.4 Turbo (TMC2209)/Configuration.h @@ -2427,6 +2427,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-5/BigTreeTech SKR E3 Turbo with BLTouch/Configuration.h b/config/examples/Creality/Ender-5/BigTreeTech SKR E3 Turbo with BLTouch/Configuration.h index 5ca91ae10b..ae74982092 100644 --- a/config/examples/Creality/Ender-5/BigTreeTech SKR E3 Turbo with BLTouch/Configuration.h +++ b/config/examples/Creality/Ender-5/BigTreeTech SKR E3 Turbo with BLTouch/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-5/BigTreeTech SKR E3 Turbo/Configuration.h b/config/examples/Creality/Ender-5/BigTreeTech SKR E3 Turbo/Configuration.h index fe3060b45e..0e53ac60ab 100644 --- a/config/examples/Creality/Ender-5/BigTreeTech SKR E3 Turbo/Configuration.h +++ b/config/examples/Creality/Ender-5/BigTreeTech SKR E3 Turbo/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-5/BigTreeTech SKR Mini E3 1.2/Configuration.h b/config/examples/Creality/Ender-5/BigTreeTech SKR Mini E3 1.2/Configuration.h index 2cfc0b25dc..9eff73be75 100644 --- a/config/examples/Creality/Ender-5/BigTreeTech SKR Mini E3 1.2/Configuration.h +++ b/config/examples/Creality/Ender-5/BigTreeTech SKR Mini E3 1.2/Configuration.h @@ -2396,6 +2396,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-5/BigTreeTech SKR Mini E3 2.0/Configuration.h b/config/examples/Creality/Ender-5/BigTreeTech SKR Mini E3 2.0/Configuration.h index 5d77e2ec0f..7d8b8c692c 100644 --- a/config/examples/Creality/Ender-5/BigTreeTech SKR Mini E3 2.0/Configuration.h +++ b/config/examples/Creality/Ender-5/BigTreeTech SKR Mini E3 2.0/Configuration.h @@ -2396,6 +2396,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-5/CrealityV1/Configuration.h b/config/examples/Creality/Ender-5/CrealityV1/Configuration.h index a03d5ca24a..85d0d97820 100644 --- a/config/examples/Creality/Ender-5/CrealityV1/Configuration.h +++ b/config/examples/Creality/Ender-5/CrealityV1/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-5/CrealityV427/Configuration.h b/config/examples/Creality/Ender-5/CrealityV427/Configuration.h index cc0eddcb3b..8a9a01e785 100644 --- a/config/examples/Creality/Ender-5/CrealityV427/Configuration.h +++ b/config/examples/Creality/Ender-5/CrealityV427/Configuration.h @@ -2401,6 +2401,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Creality/Ender-6/Configuration.h b/config/examples/Creality/Ender-6/Configuration.h index 00ee5ae2e6..d0fd335634 100644 --- a/config/examples/Creality/Ender-6/Configuration.h +++ b/config/examples/Creality/Ender-6/Configuration.h @@ -2408,6 +2408,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Dagoma/Disco Ultimate/Configuration.h b/config/examples/Dagoma/Disco Ultimate/Configuration.h index 35b07c5b88..7730dad4b5 100644 --- a/config/examples/Dagoma/Disco Ultimate/Configuration.h +++ b/config/examples/Dagoma/Disco Ultimate/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Daycom/3DP-100/Configuration.h b/config/examples/Daycom/3DP-100/Configuration.h index 288c0c3454..dc1d9d19a2 100644 --- a/config/examples/Daycom/3DP-100/Configuration.h +++ b/config/examples/Daycom/3DP-100/Configuration.h @@ -2400,6 +2400,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/EXP3D/Imprimante multifonction/Configuration.h b/config/examples/EXP3D/Imprimante multifonction/Configuration.h index da295f0d79..47d4709dce 100644 --- a/config/examples/EXP3D/Imprimante multifonction/Configuration.h +++ b/config/examples/EXP3D/Imprimante multifonction/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Einstart-S/Configuration.h b/config/examples/Einstart-S/Configuration.h index 5cfc27133c..693a679b83 100644 --- a/config/examples/Einstart-S/Configuration.h +++ b/config/examples/Einstart-S/Configuration.h @@ -2402,6 +2402,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Eryone/Thinker SE/Thinker V2 board/stock/Configuration.h b/config/examples/Eryone/Thinker SE/Thinker V2 board/stock/Configuration.h index 0ba066a186..9110a699cf 100644 --- a/config/examples/Eryone/Thinker SE/Thinker V2 board/stock/Configuration.h +++ b/config/examples/Eryone/Thinker SE/Thinker V2 board/stock/Configuration.h @@ -2416,6 +2416,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/FYSETC/AIO_II/Configuration.h b/config/examples/FYSETC/AIO_II/Configuration.h index 08dca74549..030a6eeff3 100644 --- a/config/examples/FYSETC/AIO_II/Configuration.h +++ b/config/examples/FYSETC/AIO_II/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/FYSETC/F6_13/Configuration.h b/config/examples/FYSETC/F6_13/Configuration.h index da6a3d0237..1f347eaf82 100644 --- a/config/examples/FYSETC/F6_13/Configuration.h +++ b/config/examples/FYSETC/F6_13/Configuration.h @@ -2399,6 +2399,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/FYSETC/S6/Configuration.h b/config/examples/FYSETC/S6/Configuration.h index a13a70acd4..79a35c98fd 100644 --- a/config/examples/FYSETC/S6/Configuration.h +++ b/config/examples/FYSETC/S6/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Felix/DUAL/Configuration.h b/config/examples/Felix/DUAL/Configuration.h index ec4dc1532b..6433b9b1f8 100644 --- a/config/examples/Felix/DUAL/Configuration.h +++ b/config/examples/Felix/DUAL/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Felix/Single/Configuration.h b/config/examples/Felix/Single/Configuration.h index 79658e7b59..0768a5ba9f 100644 --- a/config/examples/Felix/Single/Configuration.h +++ b/config/examples/Felix/Single/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/FlashForge/Creator 2X/Configuration.h b/config/examples/FlashForge/Creator 2X/Configuration.h index fdb451e9ea..2d3626e38b 100644 --- a/config/examples/FlashForge/Creator 2X/Configuration.h +++ b/config/examples/FlashForge/Creator 2X/Configuration.h @@ -2399,6 +2399,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/FlashForge/CreatorPro/Configuration.h b/config/examples/FlashForge/CreatorPro/Configuration.h index 7a9b3b1e61..3a38c2a4fc 100644 --- a/config/examples/FlashForge/CreatorPro/Configuration.h +++ b/config/examples/FlashForge/CreatorPro/Configuration.h @@ -2399,6 +2399,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/FlyingBear/P905H/Configuration.h b/config/examples/FlyingBear/P905H/Configuration.h index ff78489e52..a300825b1d 100644 --- a/config/examples/FlyingBear/P905H/Configuration.h +++ b/config/examples/FlyingBear/P905H/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/FolgerTech/i3-2020/Configuration.h b/config/examples/FolgerTech/i3-2020/Configuration.h index 56e34b8c66..12bfa99750 100644 --- a/config/examples/FolgerTech/i3-2020/Configuration.h +++ b/config/examples/FolgerTech/i3-2020/Configuration.h @@ -2399,6 +2399,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Formbot/Raptor/Configuration.h b/config/examples/Formbot/Raptor/Configuration.h index 25a68ec666..4743faedf0 100644 --- a/config/examples/Formbot/Raptor/Configuration.h +++ b/config/examples/Formbot/Raptor/Configuration.h @@ -2508,6 +2508,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Formbot/T_Rex_2+/Configuration.h b/config/examples/Formbot/T_Rex_2+/Configuration.h index f2c87e0f4c..467d138c5f 100644 --- a/config/examples/Formbot/T_Rex_2+/Configuration.h +++ b/config/examples/Formbot/T_Rex_2+/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Formbot/T_Rex_3/Configuration.h b/config/examples/Formbot/T_Rex_3/Configuration.h index dbdc337259..7a45cbf576 100644 --- a/config/examples/Formbot/T_Rex_3/Configuration.h +++ b/config/examples/Formbot/T_Rex_3/Configuration.h @@ -2413,6 +2413,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Geeetech/A10/Configuration.h b/config/examples/Geeetech/A10/Configuration.h index 70f56df596..2874177e94 100644 --- a/config/examples/Geeetech/A10/Configuration.h +++ b/config/examples/Geeetech/A10/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Geeetech/A10D/Configuration.h b/config/examples/Geeetech/A10D/Configuration.h index 8151923c28..4c84cab9e1 100644 --- a/config/examples/Geeetech/A10D/Configuration.h +++ b/config/examples/Geeetech/A10D/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Geeetech/A10M/Configuration.h b/config/examples/Geeetech/A10M/Configuration.h index b408f1c81b..0908a2085c 100644 --- a/config/examples/Geeetech/A10M/Configuration.h +++ b/config/examples/Geeetech/A10M/Configuration.h @@ -2399,6 +2399,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Geeetech/A10T/Configuration.h b/config/examples/Geeetech/A10T/Configuration.h index 97a348baf5..821087f6be 100644 --- a/config/examples/Geeetech/A10T/Configuration.h +++ b/config/examples/Geeetech/A10T/Configuration.h @@ -2400,6 +2400,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Geeetech/A20/Configuration.h b/config/examples/Geeetech/A20/Configuration.h index 681cf5e448..35128d9d17 100644 --- a/config/examples/Geeetech/A20/Configuration.h +++ b/config/examples/Geeetech/A20/Configuration.h @@ -2401,6 +2401,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Geeetech/A20M/Configuration.h b/config/examples/Geeetech/A20M/Configuration.h index 50bf076603..87f59adf5d 100644 --- a/config/examples/Geeetech/A20M/Configuration.h +++ b/config/examples/Geeetech/A20M/Configuration.h @@ -2402,6 +2402,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Geeetech/A20T/Configuration.h b/config/examples/Geeetech/A20T/Configuration.h index dc78afa94e..550ed767ed 100644 --- a/config/examples/Geeetech/A20T/Configuration.h +++ b/config/examples/Geeetech/A20T/Configuration.h @@ -2403,6 +2403,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Geeetech/A30/Configuration.h b/config/examples/Geeetech/A30/Configuration.h index 5dc6d26867..13cd33d569 100644 --- a/config/examples/Geeetech/A30/Configuration.h +++ b/config/examples/Geeetech/A30/Configuration.h @@ -2400,6 +2400,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Geeetech/D200/Configuration.h b/config/examples/Geeetech/D200/Configuration.h index 91f5323624..fe60cadcab 100644 --- a/config/examples/Geeetech/D200/Configuration.h +++ b/config/examples/Geeetech/D200/Configuration.h @@ -2400,6 +2400,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Geeetech/Duplicator5/Configuration.h b/config/examples/Geeetech/Duplicator5/Configuration.h index 35346c232e..a85de39b52 100644 --- a/config/examples/Geeetech/Duplicator5/Configuration.h +++ b/config/examples/Geeetech/Duplicator5/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Geeetech/E180/Configuration.h b/config/examples/Geeetech/E180/Configuration.h index be175a5344..d99df2664e 100644 --- a/config/examples/Geeetech/E180/Configuration.h +++ b/config/examples/Geeetech/E180/Configuration.h @@ -2401,6 +2401,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Geeetech/GT2560/Configuration.h b/config/examples/Geeetech/GT2560/Configuration.h index 09d8caf194..febbb544e6 100644 --- a/config/examples/Geeetech/GT2560/Configuration.h +++ b/config/examples/Geeetech/GT2560/Configuration.h @@ -2402,6 +2402,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Geeetech/I3_Pro_X-GT2560/Configuration.h b/config/examples/Geeetech/I3_Pro_X-GT2560/Configuration.h index 03bc8ff175..9a63793481 100644 --- a/config/examples/Geeetech/I3_Pro_X-GT2560/Configuration.h +++ b/config/examples/Geeetech/I3_Pro_X-GT2560/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Geeetech/M201/Configuration.h b/config/examples/Geeetech/M201/Configuration.h index ce3bce3fd3..4fbb3cd5de 100644 --- a/config/examples/Geeetech/M201/Configuration.h +++ b/config/examples/Geeetech/M201/Configuration.h @@ -2400,6 +2400,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Geeetech/MeCreator2/Configuration.h b/config/examples/Geeetech/MeCreator2/Configuration.h index ba8c1811cd..24d0bd3bcd 100644 --- a/config/examples/Geeetech/MeCreator2/Configuration.h +++ b/config/examples/Geeetech/MeCreator2/Configuration.h @@ -2396,6 +2396,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Geeetech/Me_creator/Configuration.h b/config/examples/Geeetech/Me_creator/Configuration.h index cf11407ffa..60a214517b 100644 --- a/config/examples/Geeetech/Me_creator/Configuration.h +++ b/config/examples/Geeetech/Me_creator/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Geeetech/Me_ducer/Configuration.h b/config/examples/Geeetech/Me_ducer/Configuration.h index 9b30299d3e..c4c0b36b27 100644 --- a/config/examples/Geeetech/Me_ducer/Configuration.h +++ b/config/examples/Geeetech/Me_ducer/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Geeetech/PI3A PRO/Configuration.h b/config/examples/Geeetech/PI3A PRO/Configuration.h index 090eeaa10e..713856b898 100644 --- a/config/examples/Geeetech/PI3A PRO/Configuration.h +++ b/config/examples/Geeetech/PI3A PRO/Configuration.h @@ -2407,6 +2407,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h b/config/examples/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h index 708e06761a..c8da8743f3 100644 --- a/config/examples/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h +++ b/config/examples/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h @@ -2408,6 +2408,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h b/config/examples/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h index a82d09c9b9..6ef49724b0 100644 --- a/config/examples/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h +++ b/config/examples/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h @@ -2407,6 +2407,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Geeetech/Prusa i3 Pro C/Configuration.h b/config/examples/Geeetech/Prusa i3 Pro C/Configuration.h index 9bbdf18c0f..eff5314f51 100644 --- a/config/examples/Geeetech/Prusa i3 Pro C/Configuration.h +++ b/config/examples/Geeetech/Prusa i3 Pro C/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Geeetech/Prusa i3 Pro W/Configuration.h b/config/examples/Geeetech/Prusa i3 Pro W/Configuration.h index 93418ae639..9409129cb5 100644 --- a/config/examples/Geeetech/Prusa i3 Pro W/Configuration.h +++ b/config/examples/Geeetech/Prusa i3 Pro W/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/HMS434/Configuration.h b/config/examples/HMS434/Configuration.h index ee0146e0f3..e481bc2bad 100644 --- a/config/examples/HMS434/Configuration.h +++ b/config/examples/HMS434/Configuration.h @@ -2394,6 +2394,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Infitary/i3-M508/Configuration.h b/config/examples/Infitary/i3-M508/Configuration.h index 2ff8812e9d..1958ffc03b 100644 --- a/config/examples/Infitary/i3-M508/Configuration.h +++ b/config/examples/Infitary/i3-M508/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Intamsys/FunmatHT 4988/Configuration.h b/config/examples/Intamsys/FunmatHT 4988/Configuration.h index 4810f48abd..996c7154d1 100644 --- a/config/examples/Intamsys/FunmatHT 4988/Configuration.h +++ b/config/examples/Intamsys/FunmatHT 4988/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/JGAurora/A1/Configuration.h b/config/examples/JGAurora/A1/Configuration.h index 0ee0988d8c..144fd2aa63 100644 --- a/config/examples/JGAurora/A1/Configuration.h +++ b/config/examples/JGAurora/A1/Configuration.h @@ -2402,6 +2402,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/JGAurora/A3/Configuration.h b/config/examples/JGAurora/A3/Configuration.h index 5f898df37a..633cffd6bb 100644 --- a/config/examples/JGAurora/A3/Configuration.h +++ b/config/examples/JGAurora/A3/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/JGAurora/A5/Configuration.h b/config/examples/JGAurora/A5/Configuration.h index 147161c683..ff89e3228e 100644 --- a/config/examples/JGAurora/A5/Configuration.h +++ b/config/examples/JGAurora/A5/Configuration.h @@ -2405,6 +2405,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/JGAurora/A5S/Configuration.h b/config/examples/JGAurora/A5S/Configuration.h index f37d9b0a38..9895572012 100644 --- a/config/examples/JGAurora/A5S/Configuration.h +++ b/config/examples/JGAurora/A5S/Configuration.h @@ -2402,6 +2402,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/JGAurora/Magic/Configuration.h b/config/examples/JGAurora/Magic/Configuration.h index 4f6bfff570..a9f4dcd03b 100644 --- a/config/examples/JGAurora/Magic/Configuration.h +++ b/config/examples/JGAurora/Magic/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Kingroon/KP3/Configuration.h b/config/examples/Kingroon/KP3/Configuration.h index 440c3e258b..3d86f13aaf 100644 --- a/config/examples/Kingroon/KP3/Configuration.h +++ b/config/examples/Kingroon/KP3/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Labists/ET4/Configuration.h b/config/examples/Labists/ET4/Configuration.h index 6f1b141542..d6c1e4d986 100644 --- a/config/examples/Labists/ET4/Configuration.h +++ b/config/examples/Labists/ET4/Configuration.h @@ -2409,6 +2409,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/MBot/Cube/Configuration.h b/config/examples/MBot/Cube/Configuration.h index 52ce2d5b0f..355d5e0d6b 100644 --- a/config/examples/MBot/Cube/Configuration.h +++ b/config/examples/MBot/Cube/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/MakerFarm/Pegasus 12/Configuration.h b/config/examples/MakerFarm/Pegasus 12/Configuration.h index 826fbdc784..da866ff9e2 100644 --- a/config/examples/MakerFarm/Pegasus 12/Configuration.h +++ b/config/examples/MakerFarm/Pegasus 12/Configuration.h @@ -2403,6 +2403,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/MakerParts/Configuration.h b/config/examples/MakerParts/Configuration.h index 3f110f6e87..a145b6020a 100644 --- a/config/examples/MakerParts/Configuration.h +++ b/config/examples/MakerParts/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Malyan/M150/Configuration.h b/config/examples/Malyan/M150/Configuration.h index f2f5a0df04..106c41f0fb 100644 --- a/config/examples/Malyan/M150/Configuration.h +++ b/config/examples/Malyan/M150/Configuration.h @@ -2425,6 +2425,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Malyan/M200/Configuration.h b/config/examples/Malyan/M200/Configuration.h index 5dff32852f..d697fb8c63 100644 --- a/config/examples/Malyan/M200/Configuration.h +++ b/config/examples/Malyan/M200/Configuration.h @@ -2403,6 +2403,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Micromake/C1/basic/Configuration.h b/config/examples/Micromake/C1/basic/Configuration.h index 6f6bd0e852..9ce8d29347 100644 --- a/config/examples/Micromake/C1/basic/Configuration.h +++ b/config/examples/Micromake/C1/basic/Configuration.h @@ -2401,6 +2401,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Micromake/C1/enhanced/Configuration.h b/config/examples/Micromake/C1/enhanced/Configuration.h index 53431d2ded..e40f5734ee 100644 --- a/config/examples/Micromake/C1/enhanced/Configuration.h +++ b/config/examples/Micromake/C1/enhanced/Configuration.h @@ -2401,6 +2401,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Mks/Robin/Configuration.h b/config/examples/Mks/Robin/Configuration.h index 70c9c8d0e1..13146ab54f 100644 --- a/config/examples/Mks/Robin/Configuration.h +++ b/config/examples/Mks/Robin/Configuration.h @@ -2398,6 +2398,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Mks/Robin_Lite3/Configuration.h b/config/examples/Mks/Robin_Lite3/Configuration.h index 259252da8f..bf0e4f1a19 100644 --- a/config/examples/Mks/Robin_Lite3/Configuration.h +++ b/config/examples/Mks/Robin_Lite3/Configuration.h @@ -2404,6 +2404,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Mks/Robin_Pro/Configuration.h b/config/examples/Mks/Robin_Pro/Configuration.h index e3973883ab..f69a9a1a78 100644 --- a/config/examples/Mks/Robin_Pro/Configuration.h +++ b/config/examples/Mks/Robin_Pro/Configuration.h @@ -2399,6 +2399,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Mks/Sbase/Configuration.h b/config/examples/Mks/Sbase/Configuration.h index 9ea4dc0fcb..b48dc70480 100644 --- a/config/examples/Mks/Sbase/Configuration.h +++ b/config/examples/Mks/Sbase/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Modix/Big60/Configuration.h b/config/examples/Modix/Big60/Configuration.h index 9ff544b520..6071d1bf37 100644 --- a/config/examples/Modix/Big60/Configuration.h +++ b/config/examples/Modix/Big60/Configuration.h @@ -2397,6 +2397,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/config/examples/Nextion/Configuration.h b/config/examples/Nextion/Configuration.h new file mode 100644 index 0000000000..2f9cdddb15 --- /dev/null +++ b/config/examples/Nextion/Configuration.h @@ -0,0 +1,2720 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Configuration.h + * + * Basic settings such as: + * + * - Type of electronics + * - Type of temperature sensor + * - Printer geometry + * - Endstop configuration + * - LCD controller + * - Extra features + * + * Advanced settings can be found in Configuration_adv.h + */ +#define CONFIGURATION_H_VERSION 020008 + +//=========================================================================== +//============================= Getting Started ============================= +//=========================================================================== + +/** + * Here are some useful links to help get your machine configured and calibrated: + * + * Example Configs: https://github.com/MarlinFirmware/Configurations/branches/all + * + * Průša Calculator: https://blog.prusaprinters.org/calculator_3416/ + * + * Calibration Guides: https://reprap.org/wiki/Calibration + * https://reprap.org/wiki/Triffid_Hunter%27s_Calibration_Guide + * https://sites.google.com/site/repraplogphase/calibration-of-your-reprap + * https://youtu.be/wAL9d7FgInk + * + * Calibration Objects: https://www.thingiverse.com/thing:5573 + * https://www.thingiverse.com/thing:1278865 + */ + +//=========================================================================== +//========================== DELTA / SCARA / TPARA ========================== +//=========================================================================== +// +// Download configurations from the link above and customize for your machine. +// Examples are located in config/examples/delta, .../SCARA, and .../TPARA. +// +//=========================================================================== + +// @section info + +// Author info of this build printed to the host during boot and M115 +#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. +//#define CUSTOM_VERSION_FILE Version.h // Path from the root directory (no quotes) + +/** + * *** VENDORS PLEASE READ *** + * + * Marlin allows you to add a custom boot image for Graphical LCDs. + * With this option Marlin will first show your custom screen followed + * by the standard Marlin logo with version number and web URL. + * + * We encourage you to take advantage of this new feature and we also + * respectfully request that you retain the unmodified Marlin boot screen. + */ + +// Show the Marlin bootscreen on startup. ** ENABLE FOR PRODUCTION ** +#define SHOW_BOOTSCREEN + +// Show the bitmap in Marlin/_Bootscreen.h on startup. +//#define SHOW_CUSTOM_BOOTSCREEN + +// Show the bitmap in Marlin/_Statusscreen.h on the status screen. +//#define CUSTOM_STATUS_SCREEN_IMAGE + +// @section machine + +/** + * Select the serial port on the board to use for communication with the host. + * This allows the connection of wireless adapters (for instance) to non-default port pins. + * Serial port -1 is the USB emulated serial port, if available. + * Note: The first serial port (-1 or 0) will always be used by the Arduino bootloader. + * + * :[-1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +#define SERIAL_PORT 0 + +/** + * Select a secondary serial port on the board to use for communication with the host. + * Currently Ethernet (-2) is only supported on Teensy 4.1 boards. + * :[-2, -1, 0, 1, 2, 3, 4, 5, 6, 7] + */ +//#define SERIAL_PORT_2 -1 + +/** + * This setting determines the communication speed of the printer. + * + * 250000 works in most cases, but you might try a lower speed if + * you commonly experience drop-outs during host printing. + * You may try up to 1000000 to speed up SD file transfer. + * + * :[2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000] + */ +#define BAUDRATE 250000 + +// Enable the Bluetooth serial interface on AT90USB devices +//#define BLUETOOTH + +// Choose the name from boards.h that matches your setup +#ifndef MOTHERBOARD + #define MOTHERBOARD BOARD_RAMPS_14_EFB +#endif + +// Name displayed in the LCD "Ready" message and Info menu +//#define CUSTOM_MACHINE_NAME "3D Printer" + +// Printer's unique ID, used by some programs to differentiate between machines. +// Choose your own or use a service like https://www.uuidgenerator.net/version4 +//#define MACHINE_UUID "00000000-0000-0000-0000-000000000000" + +// @section extruder + +// This defines the number of extruders +// :[0, 1, 2, 3, 4, 5, 6, 7, 8] +#define EXTRUDERS 1 + +// Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc. +#define DEFAULT_NOMINAL_FILAMENT_DIA 1.75 + +// For Cyclops or any "multi-extruder" that shares a single nozzle. +//#define SINGLENOZZLE + +// Save and restore temperature and fan speed on tool-change. +// Set standby for the unselected tool with M104/106/109 T... +#if ENABLED(SINGLENOZZLE) + //#define SINGLENOZZLE_STANDBY_TEMP + //#define SINGLENOZZLE_STANDBY_FAN +#endif + +/** + * Multi-Material Unit + * Set to one of these predefined models: + * + * PRUSA_MMU1 : Průša MMU1 (The "multiplexer" version) + * PRUSA_MMU2 : Průša MMU2 + * PRUSA_MMU2S : Průša MMU2S (Requires MK3S extruder with motion sensor, EXTRUDERS = 5) + * SMUFF_EMU_MMU2 : Technik Gegg SMuFF (Průša MMU2 emulation mode) + * SMUFF_EMU_MMU2S : Technik Gegg SMuFF (Průša MMU2S emulation mode) + * + * Requires NOZZLE_PARK_FEATURE to park print head in case MMU unit fails. + * See additional options in Configuration_adv.h. + */ +//#define MMU_MODEL PRUSA_MMU2 + +// A dual extruder that uses a single stepper motor +//#define SWITCHING_EXTRUDER +#if ENABLED(SWITCHING_EXTRUDER) + #define SWITCHING_EXTRUDER_SERVO_NR 0 + #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3] + #if EXTRUDERS > 3 + #define SWITCHING_EXTRUDER_E23_SERVO_NR 1 + #endif +#endif + +// A dual-nozzle that uses a servomotor to raise/lower one (or both) of the nozzles +//#define SWITCHING_NOZZLE +#if ENABLED(SWITCHING_NOZZLE) + #define SWITCHING_NOZZLE_SERVO_NR 0 + //#define SWITCHING_NOZZLE_E1_SERVO_NR 1 // If two servos are used, the index of the second + #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // Angles for E0, E1 (single servo) or lowered/raised (dual servo) +#endif + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a solenoid docking mechanism. Requires SOL1_PIN and SOL2_PIN. + */ +//#define PARKING_EXTRUDER + +/** + * Two separate X-carriages with extruders that connect to a moving part + * via a magnetic docking mechanism using movements and no solenoid + * + * project : https://www.thingiverse.com/thing:3080893 + * movements : https://youtu.be/0xCEiG9VS3k + * https://youtu.be/Bqbcs0CU2FE + */ +//#define MAGNETIC_PARKING_EXTRUDER + +#if EITHER(PARKING_EXTRUDER, MAGNETIC_PARKING_EXTRUDER) + + #define PARKING_EXTRUDER_PARKING_X { -78, 184 } // X positions for parking the extruders + #define PARKING_EXTRUDER_GRAB_DISTANCE 1 // (mm) Distance to move beyond the parking point to grab the extruder + //#define MANUAL_SOLENOID_CONTROL // Manual control of docking solenoids with M380 S / M381 + + #if ENABLED(PARKING_EXTRUDER) + + #define PARKING_EXTRUDER_SOLENOIDS_INVERT // If enabled, the solenoid is NOT magnetized with applied voltage + #define PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE LOW // LOW or HIGH pin signal energizes the coil + #define PARKING_EXTRUDER_SOLENOIDS_DELAY 250 // (ms) Delay for magnetic field. No delay if 0 or not defined. + //#define MANUAL_SOLENOID_CONTROL // Manual control of docking solenoids with M380 S / M381 + + #elif ENABLED(MAGNETIC_PARKING_EXTRUDER) + + #define MPE_FAST_SPEED 9000 // (mm/min) Speed for travel before last distance point + #define MPE_SLOW_SPEED 4500 // (mm/min) Speed for last distance travel to park and couple + #define MPE_TRAVEL_DISTANCE 10 // (mm) Last distance point + #define MPE_COMPENSATION 0 // Offset Compensation -1 , 0 , 1 (multiplier) only for coupling + + #endif + +#endif + +/** + * Switching Toolhead + * + * Support for swappable and dockable toolheads, such as + * the E3D Tool Changer. Toolheads are locked with a servo. + */ +//#define SWITCHING_TOOLHEAD + +/** + * Magnetic Switching Toolhead + * + * Support swappable and dockable toolheads with a magnetic + * docking mechanism using movement and no servo. + */ +//#define MAGNETIC_SWITCHING_TOOLHEAD + +/** + * Electromagnetic Switching Toolhead + * + * Parking for CoreXY / HBot kinematics. + * Toolheads are parked at one edge and held with an electromagnet. + * Supports more than 2 Toolheads. See https://youtu.be/JolbsAKTKf4 + */ +//#define ELECTROMAGNETIC_SWITCHING_TOOLHEAD + +#if ANY(SWITCHING_TOOLHEAD, MAGNETIC_SWITCHING_TOOLHEAD, ELECTROMAGNETIC_SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_Y_POS 235 // (mm) Y position of the toolhead dock + #define SWITCHING_TOOLHEAD_Y_SECURITY 10 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_Y_CLEAR 60 // (mm) Minimum distance from dock for unobstructed X axis + #define SWITCHING_TOOLHEAD_X_POS { 215, 0 } // (mm) X positions for parking the extruders + #if ENABLED(SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_SERVO_NR 2 // Index of the servo connector + #define SWITCHING_TOOLHEAD_SERVO_ANGLES { 0, 180 } // (degrees) Angles for Lock, Unlock + #elif ENABLED(MAGNETIC_SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_Y_RELEASE 5 // (mm) Security distance Y axis + #define SWITCHING_TOOLHEAD_X_SECURITY { 90, 150 } // (mm) Security distance X axis (T0,T1) + //#define PRIME_BEFORE_REMOVE // Prime the nozzle before release from the dock + #if ENABLED(PRIME_BEFORE_REMOVE) + #define SWITCHING_TOOLHEAD_PRIME_MM 20 // (mm) Extruder prime length + #define SWITCHING_TOOLHEAD_RETRACT_MM 10 // (mm) Retract after priming length + #define SWITCHING_TOOLHEAD_PRIME_FEEDRATE 300 // (mm/min) Extruder prime feedrate + #define SWITCHING_TOOLHEAD_RETRACT_FEEDRATE 2400 // (mm/min) Extruder retract feedrate + #endif + #elif ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD) + #define SWITCHING_TOOLHEAD_Z_HOP 2 // (mm) Z raise for switching + #endif +#endif + +/** + * "Mixing Extruder" + * - Adds G-codes M163 and M164 to set and "commit" the current mix factors. + * - Extends the stepping routines to move multiple steppers in proportion to the mix. + * - Optional support for Repetier Firmware's 'M164 S' supporting virtual tools. + * - This implementation supports up to two mixing extruders. + * - Enable DIRECT_MIXING_IN_G1 for M165 and mixing in G1 (from Pia Taubert's reference implementation). + */ +//#define MIXING_EXTRUDER +#if ENABLED(MIXING_EXTRUDER) + #define MIXING_STEPPERS 2 // Number of steppers in your mixing extruder + #define MIXING_VIRTUAL_TOOLS 16 // Use the Virtual Tool method with M163 and M164 + //#define DIRECT_MIXING_IN_G1 // Allow ABCDHI mix factors in G1 movement commands + //#define GRADIENT_MIX // Support for gradient mixing with M166 and LCD + #if ENABLED(GRADIENT_MIX) + //#define GRADIENT_VTOOL // Add M166 T to use a V-tool index as a Gradient alias + #endif +#endif + +// Offset of the extruders (uncomment if using more than one and relying on firmware to position when changing). +// The offset has to be X=0, Y=0 for the extruder 0 hotend (default extruder). +// For the other hotends it is their distance from the extruder 0 hotend. +//#define HOTEND_OFFSET_X { 0.0, 20.00 } // (mm) relative X-offset for each nozzle +//#define HOTEND_OFFSET_Y { 0.0, 5.00 } // (mm) relative Y-offset for each nozzle +//#define HOTEND_OFFSET_Z { 0.0, 0.00 } // (mm) relative Z-offset for each nozzle + +// @section machine + +/** + * Power Supply Control + * + * Enable and connect the power supply to the PS_ON_PIN. + * Specify whether the power supply is active HIGH or active LOW. + */ +//#define PSU_CONTROL +//#define PSU_NAME "Power Supply" + +#if ENABLED(PSU_CONTROL) + #define PSU_ACTIVE_STATE LOW // Set 'LOW' for ATX, 'HIGH' for X-Box + + //#define PSU_DEFAULT_OFF // Keep power off until enabled directly with M80 + //#define PSU_POWERUP_DELAY 250 // (ms) Delay for the PSU to warm up to full power + + //#define PSU_POWERUP_GCODE "M355 S1" // G-code to run after power-on (e.g., case light on) + //#define PSU_POWEROFF_GCODE "M355 S0" // G-code to run before power-off (e.g., case light off) + + //#define AUTO_POWER_CONTROL // Enable automatic control of the PS_ON pin + #if ENABLED(AUTO_POWER_CONTROL) + #define AUTO_POWER_FANS // Turn on PSU if fans need power + #define AUTO_POWER_E_FANS + #define AUTO_POWER_CONTROLLERFAN + #define AUTO_POWER_CHAMBER_FAN + #define AUTO_POWER_COOLER_FAN + //#define AUTO_POWER_E_TEMP 50 // (°C) Turn on PSU if any extruder is over this temperature + //#define AUTO_POWER_CHAMBER_TEMP 30 // (°C) Turn on PSU if the chamber is over this temperature + //#define AUTO_POWER_COOLER_TEMP 26 // (°C) Turn on PSU if the cooler is over this temperature + #define POWER_TIMEOUT 30 // (s) Turn off power if the machine is idle for this duration + //#define POWER_OFF_DELAY 60 // (s) Delay of poweroff after M81 command. Useful to let fans run for extra time. + #endif +#endif + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== +// @section temperature + +/** + * --NORMAL IS 4.7kohm PULLUP!-- 1kohm pullup can be used on hotend sensor, using correct resistor and table + * + * Temperature sensors available: + * + * -5 : PT100 / PT1000 with MAX31865 (only for sensors 0-1) + * -3 : thermocouple with MAX31855 (only for sensors 0-1) + * -2 : thermocouple with MAX6675 (only for sensors 0-1) + * -4 : thermocouple with AD8495 + * -1 : thermocouple with AD595 + * 0 : not used + * 1 : 100k thermistor - best choice for EPCOS 100k (4.7k pullup) + * 331 : (3.3V scaled thermistor 1 table for MEGA) + * 332 : (3.3V scaled thermistor 1 table for DUE) + * 2 : 200k thermistor - ATC Semitec 204GT-2 (4.7k pullup) + * 202 : 200k thermistor - Copymaster 3D + * 3 : Mendel-parts thermistor (4.7k pullup) + * 4 : 10k thermistor !! do not use it for a hotend. It gives bad resolution at high temp. !! + * 5 : 100K thermistor - ATC Semitec 104GT-2/104NT-4-R025H42G (Used in ParCan, J-Head, and E3D) (4.7k pullup) + * 501 : 100K Zonestar (Tronxy X3A) Thermistor + * 502 : 100K Zonestar Thermistor used by hot bed in Zonestar Průša P802M + * 512 : 100k RPW-Ultra hotend thermistor (4.7k pullup) + * 6 : 100k EPCOS - Not as accurate as table 1 (created using a fluke thermocouple) (4.7k pullup) + * 7 : 100k Honeywell thermistor 135-104LAG-J01 (4.7k pullup) + * 71 : 100k Honeywell thermistor 135-104LAF-J01 (4.7k pullup) + * 8 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) + * 9 : 100k GE Sensing AL03006-58.2K-97-G1 (4.7k pullup) + * 10 : 100k RS thermistor 198-961 (4.7k pullup) + * 11 : 100k beta 3950 1% thermistor (Used in Keenovo AC silicone mats and most Wanhao i3 machines) (4.7k pullup) + * 12 : 100k 0603 SMD Vishay NTCS0603E3104FXT (4.7k pullup) (calibrated for Makibox hot bed) + * 13 : 100k Hisens 3950 1% up to 300°C for hotend "Simple ONE " & "Hotend "All In ONE" + * 15 : 100k thermistor calibration for JGAurora A5 hotend + * 18 : ATC Semitec 204GT-2 (4.7k pullup) Dagoma.Fr - MKS_Base_DKU001327 + * 20 : Pt100 with circuit in the Ultimainboard V2.x with mainboard ADC reference voltage = INA826 amplifier-board supply voltage. + * NOTES: (1) Must use an ADC input with no pullup. (2) Some INA826 amplifiers are unreliable at 3.3V so consider using sensor 147, 110, or 21. + * 21 : Pt100 with circuit in the Ultimainboard V2.x with 3.3v ADC reference voltage (STM32, LPC176x....) and 5V INA826 amplifier board supply. + * NOTE: ADC pins are not 5V tolerant. Not recommended because it's possible to damage the CPU by going over 500°C. + * 22 : 100k (hotend) with 4.7k pullup to 3.3V and 220R to analog input (as in GTM32 Pro vB) + * 23 : 100k (bed) with 4.7k pullup to 3.3v and 220R to analog input (as in GTM32 Pro vB) + * 30 : Kis3d Silicone heating mat 200W/300W with 6mm precision cast plate (EN AW 5083) NTC100K / B3950 (4.7k pullup) + * 201 : Pt100 with circuit in Overlord, similar to Ultimainboard V2.x + * 60 : 100k Maker's Tool Works Kapton Bed Thermistor beta=3950 + * 61 : 100k Formbot / Vivedino 3950 350C thermistor 4.7k pullup + * 66 : 4.7M High Temperature thermistor from Dyze Design + * 67 : 450C thermistor from SliceEngineering + * 70 : the 100K thermistor found in the bq Hephestos 2 + * 75 : 100k Generic Silicon Heat Pad with NTC 100K MGB18-104F39050L32 thermistor + * 99 : 100k thermistor with a 10K pull-up resistor (found on some Wanhao i3 machines) + * + * 1k ohm pullup tables - This is atypical, and requires changing out the 4.7k pullup for 1k. + * (but gives greater accuracy and more stable PID) + * 51 : 100k thermistor - EPCOS (1k pullup) + * 52 : 200k thermistor - ATC Semitec 204GT-2 (1k pullup) + * 55 : 100k thermistor - ATC Semitec 104GT-2 (Used in ParCan & J-Head) (1k pullup) + * + * 1047 : Pt1000 with 4k7 pullup (E3D) + * 1010 : Pt1000 with 1k pullup (non standard) + * 147 : Pt100 with 4k7 pullup + * 110 : Pt100 with 1k pullup (non standard) + * + * 1000 : Custom - Specify parameters in Configuration_adv.h + * + * Use these for Testing or Development purposes. NEVER for production machine. + * 998 : Dummy Table that ALWAYS reads 25°C or the temperature defined below. + * 999 : Dummy Table that ALWAYS reads 100°C or the temperature defined below. + */ +#define TEMP_SENSOR_0 1 +#define TEMP_SENSOR_1 0 +#define TEMP_SENSOR_2 0 +#define TEMP_SENSOR_3 0 +#define TEMP_SENSOR_4 0 +#define TEMP_SENSOR_5 0 +#define TEMP_SENSOR_6 0 +#define TEMP_SENSOR_7 0 +#define TEMP_SENSOR_BED 0 +#define TEMP_SENSOR_PROBE 0 +#define TEMP_SENSOR_CHAMBER 0 +#define TEMP_SENSOR_COOLER 0 + +// Dummy thermistor constant temperature readings, for use with 998 and 999 +#define DUMMY_THERMISTOR_998_VALUE 25 +#define DUMMY_THERMISTOR_999_VALUE 100 + +// Resistor values when using MAX31865 sensors (-5) on TEMP_SENSOR_0 / 1 +//#define MAX31865_SENSOR_OHMS_0 100 // (Ω) Typically 100 or 1000 (PT100 or PT1000) +//#define MAX31865_CALIBRATION_OHMS_0 430 // (Ω) Typically 430 for AdaFruit PT100; 4300 for AdaFruit PT1000 +//#define MAX31865_SENSOR_OHMS_1 100 +//#define MAX31865_CALIBRATION_OHMS_1 430 + +// Use temp sensor 1 as a redundant sensor with sensor 0. If the readings +// from the two sensors differ too much the print will be aborted. +//#define TEMP_SENSOR_1_AS_REDUNDANT +#define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 + +#define TEMP_RESIDENCY_TIME 10 // (seconds) Time to wait for hotend to "settle" in M109 +#define TEMP_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer +#define TEMP_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target + +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) Time to wait for bed to "settle" in M190 +#define TEMP_BED_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer +#define TEMP_BED_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target + +#define TEMP_CHAMBER_RESIDENCY_TIME 10 // (seconds) Time to wait for chamber to "settle" in M191 +#define TEMP_CHAMBER_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer +#define TEMP_CHAMBER_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target + +// Below this temperature the heater will be switched off +// because it probably indicates a broken thermistor wire. +#define HEATER_0_MINTEMP 5 +#define HEATER_1_MINTEMP 5 +#define HEATER_2_MINTEMP 5 +#define HEATER_3_MINTEMP 5 +#define HEATER_4_MINTEMP 5 +#define HEATER_5_MINTEMP 5 +#define HEATER_6_MINTEMP 5 +#define HEATER_7_MINTEMP 5 +#define BED_MINTEMP 5 +#define CHAMBER_MINTEMP 5 + +// Above this temperature the heater will be switched off. +// This can protect components from overheating, but NOT from shorts and failures. +// (Use MINTEMP for thermistor short/failure protection.) +#define HEATER_0_MAXTEMP 275 +#define HEATER_1_MAXTEMP 275 +#define HEATER_2_MAXTEMP 275 +#define HEATER_3_MAXTEMP 275 +#define HEATER_4_MAXTEMP 275 +#define HEATER_5_MAXTEMP 275 +#define HEATER_6_MAXTEMP 275 +#define HEATER_7_MAXTEMP 275 +#define BED_MAXTEMP 150 +#define CHAMBER_MAXTEMP 60 + +/** + * Thermal Overshoot + * During heatup (and printing) the temperature can often "overshoot" the target by many degrees + * (especially before PID tuning). Setting the target temperature too close to MAXTEMP guarantees + * a MAXTEMP shutdown! Use these values to forbid temperatures being set too close to MAXTEMP. + */ +#define HOTEND_OVERSHOOT 15 // (°C) Forbid temperatures over MAXTEMP - OVERSHOOT +#define BED_OVERSHOOT 10 // (°C) Forbid temperatures over MAXTEMP - OVERSHOOT + +//=========================================================================== +//============================= PID Settings ================================ +//=========================================================================== +// PID Tuning Guide here: https://reprap.org/wiki/PID_Tuning + +// Comment the following line to disable PID and enable bang-bang. +#define PIDTEMP +#define BANG_MAX 255 // Limits current to nozzle while in bang-bang mode; 255=full current +#define PID_MAX BANG_MAX // Limits current to nozzle while PID is active (see PID_FUNCTIONAL_RANGE below); 255=full current +#define PID_K1 0.95 // Smoothing factor within any PID loop + +#if ENABLED(PIDTEMP) + //#define PID_EDIT_MENU // Add PID editing to the "Advanced Settings" menu. (~700 bytes of PROGMEM) + //#define PID_AUTOTUNE_MENU // Add PID auto-tuning to the "Advanced Settings" menu. (~250 bytes of PROGMEM) + //#define PID_PARAMS_PER_HOTEND // Uses separate PID parameters for each extruder (useful for mismatched extruders) + // Set/get with gcode: M301 E[extruder number, 0-2] + + #if ENABLED(PID_PARAMS_PER_HOTEND) + // Specify between 1 and HOTENDS values per array. + // If fewer than EXTRUDER values are provided, the last element will be repeated. + #define DEFAULT_Kp_LIST { 22.20, 22.20 } + #define DEFAULT_Ki_LIST { 1.08, 1.08 } + #define DEFAULT_Kd_LIST { 114.00, 114.00 } + #else + #define DEFAULT_Kp 22.20 + #define DEFAULT_Ki 1.08 + #define DEFAULT_Kd 114.00 + #endif +#endif // PIDTEMP + +//=========================================================================== +//====================== PID > Bed Temperature Control ====================== +//=========================================================================== + +/** + * PID Bed Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and BED_LIMIT_SWITCHING will enable hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 250W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use bed PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPBED + +//#define BED_LIMIT_SWITCHING + +/** + * Max Bed Power + * Applies to all forms of bed control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the bed that acts like a divider + * so don't use it unless you are OK with PWM on your bed. (See the comment on enabling PIDTEMPBED) + */ +#define MAX_BED_POWER 255 // limits duty cycle to bed; 255=full current + +#if ENABLED(PIDTEMPBED) + //#define MIN_BED_POWER 0 + //#define PID_BED_DEBUG // Sends debug data to the serial port. + + // 120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+) + // from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10) + #define DEFAULT_bedKp 10.00 + #define DEFAULT_bedKi .023 + #define DEFAULT_bedKd 305.4 + + // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. +#endif // PIDTEMPBED + +//=========================================================================== +//==================== PID > Chamber Temperature Control ==================== +//=========================================================================== + +/** + * PID Chamber Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and CHAMBER_LIMIT_SWITCHING will enable + * hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 200W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use chamber PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPCHAMBER +//#define CHAMBER_LIMIT_SWITCHING + +/** + * Max Chamber Power + * Applies to all forms of chamber control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the chamber heater that acts like a divider + * so don't use it unless you are OK with PWM on your heater. (See the comment on enabling PIDTEMPCHAMBER) + */ +#define MAX_CHAMBER_POWER 255 // limits duty cycle to chamber heater; 255=full current + +#if ENABLED(PIDTEMPCHAMBER) + #define MIN_CHAMBER_POWER 0 + //#define PID_CHAMBER_DEBUG // Sends debug data to the serial port. + + // Lasko "MyHeat Personal Heater" (200w) modified with a Fotek SSR-10DA to control only the heating element + // and placed inside the small Creality printer enclosure tent. + // + #define DEFAULT_chamberKp 37.04 + #define DEFAULT_chamberKi 1.40 + #define DEFAULT_chamberKd 655.17 + // M309 P37.04 I1.04 D655.17 + + // FIND YOUR OWN: "M303 E-2 C8 S50" to run autotune on the chamber at 50 degreesC for 8 cycles. +#endif // PIDTEMPCHAMBER + +#if ANY(PIDTEMP, PIDTEMPBED, PIDTEMPCHAMBER) + //#define PID_DEBUG // Sends debug data to the serial port. Use 'M303 D' to toggle activation. + //#define PID_OPENLOOP // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX + //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay + #define PID_FUNCTIONAL_RANGE 10 // If the temperature difference between the target temperature and the actual temperature + // is more than PID_FUNCTIONAL_RANGE then the PID will be shut off and the heater will be set to min/max. +#endif + +// @section extruder + +/** + * Prevent extrusion if the temperature is below EXTRUDE_MINTEMP. + * Add M302 to set the minimum extrusion temperature and/or turn + * cold extrusion prevention on and off. + * + * *** IT IS HIGHLY RECOMMENDED TO LEAVE THIS OPTION ENABLED! *** + */ +#define PREVENT_COLD_EXTRUSION +#define EXTRUDE_MINTEMP 170 + +/** + * Prevent a single extrusion longer than EXTRUDE_MAXLENGTH. + * Note: For Bowden Extruders make this large enough to allow load/unload. + */ +#define PREVENT_LENGTHY_EXTRUDE +#define EXTRUDE_MAXLENGTH 200 + +//=========================================================================== +//======================== Thermal Runaway Protection ======================= +//=========================================================================== + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * If you get "Thermal Runaway" or "Heating failed" errors the + * details can be tuned in Configuration_adv.h + */ + +#define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders +#define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed +#define THERMAL_PROTECTION_CHAMBER // Enable thermal protection for the heated chamber +#define THERMAL_PROTECTION_COOLER // Enable thermal protection for the laser cooling + +//=========================================================================== +//============================= Mechanical Settings ========================= +//=========================================================================== + +// @section machine + +// Enable one of the options below for CoreXY, CoreXZ, or CoreYZ kinematics, +// either in the usual order or reversed +//#define COREXY +//#define COREXZ +//#define COREYZ +//#define COREYX +//#define COREZX +//#define COREZY +//#define MARKFORGED_XY // MarkForged. See https://reprap.org/forum/read.php?152,504042 + +//=========================================================================== +//============================== Endstop Settings =========================== +//=========================================================================== + +// @section homing + +// Specify here all the endstop connectors that are connected to any endstop or probe. +// Almost all printers will be using one per axis. Probes will use one or more of the +// extra connectors. Leave undefined any used for non-endstop and non-probe purposes. +#define USE_XMIN_PLUG +#define USE_YMIN_PLUG +#define USE_ZMIN_PLUG +//#define USE_XMAX_PLUG +//#define USE_YMAX_PLUG +//#define USE_ZMAX_PLUG + +// Enable pullup for all endstops to prevent a floating state +#define ENDSTOPPULLUPS +#if DISABLED(ENDSTOPPULLUPS) + // Disable ENDSTOPPULLUPS to set pullups individually + //#define ENDSTOPPULLUP_XMAX + //#define ENDSTOPPULLUP_YMAX + //#define ENDSTOPPULLUP_ZMAX + //#define ENDSTOPPULLUP_XMIN + //#define ENDSTOPPULLUP_YMIN + //#define ENDSTOPPULLUP_ZMIN + //#define ENDSTOPPULLUP_ZMIN_PROBE +#endif + +// Enable pulldown for all endstops to prevent a floating state +//#define ENDSTOPPULLDOWNS +#if DISABLED(ENDSTOPPULLDOWNS) + // Disable ENDSTOPPULLDOWNS to set pulldowns individually + //#define ENDSTOPPULLDOWN_XMAX + //#define ENDSTOPPULLDOWN_YMAX + //#define ENDSTOPPULLDOWN_ZMAX + //#define ENDSTOPPULLDOWN_XMIN + //#define ENDSTOPPULLDOWN_YMIN + //#define ENDSTOPPULLDOWN_ZMIN + //#define ENDSTOPPULLDOWN_ZMIN_PROBE +#endif + +// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). +#define X_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define Y_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define Z_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define X_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define Y_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define Z_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop. +#define Z_MIN_PROBE_ENDSTOP_INVERTING false // Set to true to invert the logic of the probe. + +/** + * Stepper Drivers + * + * These settings allow Marlin to tune stepper driver timing and enable advanced options for + * stepper drivers that support them. You may also override timing options in Configuration_adv.h. + * + * A4988 is assumed for unspecified drivers. + * + * Use TMC2208/TMC2208_STANDALONE for TMC2225 drivers and TMC2209/TMC2209_STANDALONE for TMC2226 drivers. + * + * Options: A4988, A5984, DRV8825, LV8729, L6470, L6474, POWERSTEP01, + * TB6560, TB6600, TMC2100, + * TMC2130, TMC2130_STANDALONE, TMC2160, TMC2160_STANDALONE, + * TMC2208, TMC2208_STANDALONE, TMC2209, TMC2209_STANDALONE, + * TMC26X, TMC26X_STANDALONE, TMC2660, TMC2660_STANDALONE, + * TMC5130, TMC5130_STANDALONE, TMC5160, TMC5160_STANDALONE + * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'L6474', 'POWERSTEP01', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2160', 'TMC2160_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC2209', 'TMC2209_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE'] + */ +#define X_DRIVER_TYPE A4988 +#define Y_DRIVER_TYPE A4988 +#define Z_DRIVER_TYPE A4988 +//#define X2_DRIVER_TYPE A4988 +//#define Y2_DRIVER_TYPE A4988 +//#define Z2_DRIVER_TYPE A4988 +//#define Z3_DRIVER_TYPE A4988 +//#define Z4_DRIVER_TYPE A4988 +#define E0_DRIVER_TYPE A4988 +//#define E1_DRIVER_TYPE A4988 +//#define E2_DRIVER_TYPE A4988 +//#define E3_DRIVER_TYPE A4988 +//#define E4_DRIVER_TYPE A4988 +//#define E5_DRIVER_TYPE A4988 +//#define E6_DRIVER_TYPE A4988 +//#define E7_DRIVER_TYPE A4988 + +// Enable this feature if all enabled endstop pins are interrupt-capable. +// This will remove the need to poll the interrupt pins, saving many CPU cycles. +//#define ENDSTOP_INTERRUPTS_FEATURE + +/** + * Endstop Noise Threshold + * + * Enable if your probe or endstops falsely trigger due to noise. + * + * - Higher values may affect repeatability or accuracy of some bed probes. + * - To fix noise install a 100nF ceramic capacitor in parallel with the switch. + * - This feature is not required for common micro-switches mounted on PCBs + * based on the Makerbot design, which already have the 100nF capacitor. + * + * :[2,3,4,5,6,7] + */ +//#define ENDSTOP_NOISE_THRESHOLD 2 + +// Check for stuck or disconnected endstops during homing moves. +//#define DETECT_BROKEN_ENDSTOP + +//============================================================================= +//============================== Movement Settings ============================ +//============================================================================= +// @section motion + +/** + * Default Settings + * + * These settings can be reset by M502 + * + * Note that if EEPROM is enabled, saved values will override these. + */ + +/** + * With this option each E stepper can have its own factors for the + * following movement settings. If fewer factors are given than the + * total number of extruders, the last value applies to the rest. + */ +#define DISTINCT_E_FACTORS + +/** + * Default Axis Steps Per Unit (steps/mm) + * Override with M92 + * X, Y, Z, E0 [, E1[, E2...]] + */ +#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 500 } + +/** + * Default Max Feed Rate (mm/s) + * Override with M203 + * X, Y, Z, E0 [, E1[, E2...]] + */ +#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 } + +//#define LIMITED_MAX_FR_EDITING // Limit edit via M203 or LCD to DEFAULT_MAX_FEEDRATE * 2 +#if ENABLED(LIMITED_MAX_FR_EDITING) + #define MAX_FEEDRATE_EDIT_VALUES { 600, 600, 10, 50 } // ...or, set your own edit limits +#endif + +/** + * Default Max Acceleration (change/s) change = mm/s + * (Maximum start speed for accelerated moves) + * Override with M201 + * X, Y, Z, E0 [, E1[, E2...]] + */ +#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 } + +//#define LIMITED_MAX_ACCEL_EDITING // Limit edit via M201 or LCD to DEFAULT_MAX_ACCELERATION * 2 +#if ENABLED(LIMITED_MAX_ACCEL_EDITING) + #define MAX_ACCEL_EDIT_VALUES { 6000, 6000, 200, 20000 } // ...or, set your own edit limits +#endif + +/** + * Default Acceleration (change/s) change = mm/s + * Override with M204 + * + * M204 P Acceleration + * M204 R Retract Acceleration + * M204 T Travel Acceleration + */ +#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves +#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts +#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves + +/** + * Default Jerk limits (mm/s) + * Override with M205 X Y Z E + * + * "Jerk" specifies the minimum speed change that requires acceleration. + * When changing speed and direction, if the difference is less than the + * value set here, it may happen instantaneously. + */ +//#define CLASSIC_JERK +#if ENABLED(CLASSIC_JERK) + #define DEFAULT_XJERK 10.0 + #define DEFAULT_YJERK 10.0 + #define DEFAULT_ZJERK 0.3 + + //#define TRAVEL_EXTRA_XYJERK 0.0 // Additional jerk allowance for all travel moves + + //#define LIMITED_JERK_EDITING // Limit edit via M205 or LCD to DEFAULT_aJERK * 2 + #if ENABLED(LIMITED_JERK_EDITING) + #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits + #endif +#endif + +#define DEFAULT_EJERK 5.0 // May be used by Linear Advance + +/** + * Junction Deviation Factor + * + * See: + * https://reprap.org/forum/read.php?1,739819 + * https://blog.kyneticcnc.com/2018/10/computing-junction-deviation-for-marlin.html + */ +#if DISABLED(CLASSIC_JERK) + #define JUNCTION_DEVIATION_MM 0.013 // (mm) Distance from real junction edge + #define JD_HANDLE_SMALL_SEGMENTS // Use curvature estimation instead of just the junction angle + // for small segments (< 1mm) with large junction angles (> 135°). +#endif + +/** + * S-Curve Acceleration + * + * This option eliminates vibration during printing by fitting a Bézier + * curve to move acceleration, producing much smoother direction changes. + * + * See https://github.com/synthetos/TinyG/wiki/Jerk-Controlled-Motion-Explained + */ +//#define S_CURVE_ACCELERATION + +//=========================================================================== +//============================= Z Probe Options ============================= +//=========================================================================== +// @section probes + +// +// See https://marlinfw.org/docs/configuration/probes.html +// + +/** + * Enable this option for a probe connected to the Z-MIN pin. + * The probe replaces the Z-MIN endstop and is used for Z homing. + * (Automatically enables USE_PROBE_FOR_Z_HOMING.) + */ +#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN + +// Force the use of the probe for Z-axis homing +//#define USE_PROBE_FOR_Z_HOMING + +/** + * Z_MIN_PROBE_PIN + * + * Define this pin if the probe is not connected to Z_MIN_PIN. + * If not defined the default pin for the selected MOTHERBOARD + * will be used. Most of the time the default is what you want. + * + * - The simplest option is to use a free endstop connector. + * - Use 5V for powered (usually inductive) sensors. + * + * - RAMPS 1.3/1.4 boards may use the 5V, GND, and Aux4->D32 pin: + * - For simple switches connect... + * - normally-closed switches to GND and D32. + * - normally-open switches to 5V and D32. + */ +//#define Z_MIN_PROBE_PIN 32 // Pin 32 is the RAMPS default + +/** + * Probe Type + * + * Allen Key Probes, Servo Probes, Z-Sled Probes, FIX_MOUNTED_PROBE, etc. + * Activate one of these to use Auto Bed Leveling below. + */ + +/** + * The "Manual Probe" provides a means to do "Auto" Bed Leveling without a probe. + * Use G29 repeatedly, adjusting the Z height at each point with movement commands + * or (with LCD_BED_LEVELING) the LCD controller. + */ +//#define PROBE_MANUALLY +//#define MANUAL_PROBE_START_Z 0.2 + +/** + * A Fix-Mounted Probe either doesn't deploy or needs manual deployment. + * (e.g., an inductive probe or a nozzle-based probe-switch.) + */ +//#define FIX_MOUNTED_PROBE + +/** + * Use the nozzle as the probe, with the hotend + * assembly attached to a sensitive strain gauge. + */ +//#define STRAIN_GAUGE_PROBE + +/** + * Use the nozzle as the probe, as with a conductive + * nozzle system or a piezo-electric smart effector. + */ +//#define NOZZLE_AS_PROBE + +/** + * Z Servo Probe, such as an endstop switch on a rotating arm. + */ +//#define Z_PROBE_SERVO_NR 0 // Defaults to SERVO 0 connector. +//#define Z_SERVO_ANGLES { 70, 0 } // Z Servo Deploy and Stow angles + +/** + * The BLTouch probe uses a Hall effect sensor and emulates a servo. + */ +//#define BLTOUCH + +/** + * Touch-MI Probe by hotends.fr + * + * This probe is deployed and activated by moving the X-axis to a magnet at the edge of the bed. + * By default, the magnet is assumed to be on the left and activated by a home. If the magnet is + * on the right, enable and set TOUCH_MI_DEPLOY_XPOS to the deploy position. + * + * Also requires: BABYSTEPPING, BABYSTEP_ZPROBE_OFFSET, Z_SAFE_HOMING, + * and a minimum Z_HOMING_HEIGHT of 10. + */ +//#define TOUCH_MI_PROBE +#if ENABLED(TOUCH_MI_PROBE) + #define TOUCH_MI_RETRACT_Z 0.5 // Height at which the probe retracts + //#define TOUCH_MI_DEPLOY_XPOS (X_MAX_BED + 2) // For a magnet on the right side of the bed + //#define TOUCH_MI_MANUAL_DEPLOY // For manual deploy (LCD menu) +#endif + +// A probe that is deployed and stowed with a solenoid pin (SOL1_PIN) +//#define SOLENOID_PROBE + +// A sled-mounted probe like those designed by Charles Bell. +//#define Z_PROBE_SLED +//#define SLED_DOCKING_OFFSET 5 // The extra distance the X axis must travel to pickup the sled. 0 should be fine but you can push it further if you'd like. + +// A probe deployed by moving the x-axis, such as the Wilson II's rack-and-pinion probe designed by Marty Rice. +//#define RACK_AND_PINION_PROBE +#if ENABLED(RACK_AND_PINION_PROBE) + #define Z_PROBE_DEPLOY_X X_MIN_POS + #define Z_PROBE_RETRACT_X X_MAX_POS +#endif + +// Duet Smart Effector (for delta printers) - https://bit.ly/2ul5U7J +// When the pin is defined you can use M672 to set/reset the probe sensivity. +//#define DUET_SMART_EFFECTOR +#if ENABLED(DUET_SMART_EFFECTOR) + #define SMART_EFFECTOR_MOD_PIN -1 // Connect a GPIO pin to the Smart Effector MOD pin +#endif + +/** + * Use StallGuard2 to probe the bed with the nozzle. + * Requires stallGuard-capable Trinamic stepper drivers. + * CAUTION: This can damage machines with Z lead screws. + * Take extreme care when setting up this feature. + */ +//#define SENSORLESS_PROBING + +// +// For Z_PROBE_ALLEN_KEY see the Delta example configurations. +// + +/** + * Nozzle-to-Probe offsets { X, Y, Z } + * + * X and Y offset + * Use a caliper or ruler to measure the distance from the tip of + * the Nozzle to the center-point of the Probe in the X and Y axes. + * + * Z offset + * - For the Z offset use your best known value and adjust at runtime. + * - Common probes trigger below the nozzle and have negative values for Z offset. + * - Probes triggering above the nozzle height are uncommon but do exist. When using + * probes such as this, carefully set Z_CLEARANCE_DEPLOY_PROBE and Z_CLEARANCE_BETWEEN_PROBES + * to avoid collisions during probing. + * + * Tune and Adjust + * - Probe Offsets can be tuned at runtime with 'M851', LCD menus, babystepping, etc. + * - PROBE_OFFSET_WIZARD (configuration_adv.h) can be used for setting the Z offset. + * + * Assuming the typical work area orientation: + * - Probe to RIGHT of the Nozzle has a Positive X offset + * - Probe to LEFT of the Nozzle has a Negative X offset + * - Probe in BACK of the Nozzle has a Positive Y offset + * - Probe in FRONT of the Nozzle has a Negative Y offset + * + * Some examples: + * #define NOZZLE_TO_PROBE_OFFSET { 10, 10, -1 } // Example "1" + * #define NOZZLE_TO_PROBE_OFFSET {-10, 5, -1 } // Example "2" + * #define NOZZLE_TO_PROBE_OFFSET { 5, -5, -1 } // Example "3" + * #define NOZZLE_TO_PROBE_OFFSET {-15,-10, -1 } // Example "4" + * + * +-- BACK ---+ + * | [+] | + * L | 1 | R <-- Example "1" (right+, back+) + * E | 2 | I <-- Example "2" ( left-, back+) + * F |[-] N [+]| G <-- Nozzle + * T | 3 | H <-- Example "3" (right+, front-) + * | 4 | T <-- Example "4" ( left-, front-) + * | [-] | + * O-- FRONT --+ + */ +#define NOZZLE_TO_PROBE_OFFSET { 10, 10, 0 } + +// Most probes should stay away from the edges of the bed, but +// with NOZZLE_AS_PROBE this can be negative for a wider probing area. +#define PROBING_MARGIN 10 + +// X and Y axis travel speed (mm/min) between probes +#define XY_PROBE_FEEDRATE (133*60) + +// Feedrate (mm/min) for the first approach when double-probing (MULTIPLE_PROBING == 2) +#define Z_PROBE_FEEDRATE_FAST (4*60) + +// Feedrate (mm/min) for the "accurate" probe of each point +#define Z_PROBE_FEEDRATE_SLOW (Z_PROBE_FEEDRATE_FAST / 2) + +/** + * Probe Activation Switch + * A switch indicating proper deployment, or an optical + * switch triggered when the carriage is near the bed. + */ +//#define PROBE_ACTIVATION_SWITCH +#if ENABLED(PROBE_ACTIVATION_SWITCH) + #define PROBE_ACTIVATION_SWITCH_STATE LOW // State indicating probe is active + //#define PROBE_ACTIVATION_SWITCH_PIN PC6 // Override default pin +#endif + +/** + * Tare Probe (determine zero-point) prior to each probe. + * Useful for a strain gauge or piezo sensor that needs to factor out + * elements such as cables pulling on the carriage. + */ +//#define PROBE_TARE +#if ENABLED(PROBE_TARE) + #define PROBE_TARE_TIME 200 // (ms) Time to hold tare pin + #define PROBE_TARE_DELAY 200 // (ms) Delay after tare before + #define PROBE_TARE_STATE HIGH // State to write pin for tare + //#define PROBE_TARE_PIN PA5 // Override default pin + #if ENABLED(PROBE_ACTIVATION_SWITCH) + //#define PROBE_TARE_ONLY_WHILE_INACTIVE // Fail to tare/probe if PROBE_ACTIVATION_SWITCH is active + #endif +#endif + +/** + * Multiple Probing + * + * You may get improved results by probing 2 or more times. + * With EXTRA_PROBING the more atypical reading(s) will be disregarded. + * + * A total of 2 does fast/slow probes with a weighted average. + * A total of 3 or more adds more slow probes, taking the average. + */ +//#define MULTIPLE_PROBING 2 +//#define EXTRA_PROBING 1 + +/** + * Z probes require clearance when deploying, stowing, and moving between + * probe points to avoid hitting the bed and other hardware. + * Servo-mounted probes require extra space for the arm to rotate. + * Inductive probes need space to keep from triggering early. + * + * Use these settings to specify the distance (mm) to raise the probe (or + * lower the bed). The values set here apply over and above any (negative) + * probe Z Offset set with NOZZLE_TO_PROBE_OFFSET, M851, or the LCD. + * Only integer values >= 1 are valid here. + * + * Example: `M851 Z-5` with a CLEARANCE of 4 => 9mm from bed to nozzle. + * But: `M851 Z+1` with a CLEARANCE of 2 => 2mm from bed to nozzle. + */ +#define Z_CLEARANCE_DEPLOY_PROBE 10 // Z Clearance for Deploy/Stow +#define Z_CLEARANCE_BETWEEN_PROBES 5 // Z Clearance between probe points +#define Z_CLEARANCE_MULTI_PROBE 5 // Z Clearance between multiple probes +//#define Z_AFTER_PROBING 5 // Z position after probing is done + +#define Z_PROBE_LOW_POINT -2 // Farthest distance below the trigger-point to go before stopping + +// For M851 give a range for adjusting the Z probe offset +#define Z_PROBE_OFFSET_RANGE_MIN -20 +#define Z_PROBE_OFFSET_RANGE_MAX 20 + +// Enable the M48 repeatability test to test probe accuracy +//#define Z_MIN_PROBE_REPEATABILITY_TEST + +// Before deploy/stow pause for user confirmation +//#define PAUSE_BEFORE_DEPLOY_STOW +#if ENABLED(PAUSE_BEFORE_DEPLOY_STOW) + //#define PAUSE_PROBE_DEPLOY_WHEN_TRIGGERED // For Manual Deploy Allenkey Probe +#endif + +/** + * Enable one or more of the following if probing seems unreliable. + * Heaters and/or fans can be disabled during probing to minimize electrical + * noise. A delay can also be added to allow noise and vibration to settle. + * These options are most useful for the BLTouch probe, but may also improve + * readings with inductive probes and piezo sensors. + */ +//#define PROBING_HEATERS_OFF // Turn heaters off when probing +#if ENABLED(PROBING_HEATERS_OFF) + //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) + //#define WAIT_FOR_HOTEND // Wait for hotend to heat back up between probes (to improve accuracy & prevent cold extrude) +#endif +//#define PROBING_FANS_OFF // Turn fans off when probing +//#define PROBING_STEPPERS_OFF // Turn steppers off (unless needed to hold position) when probing +//#define DELAY_BEFORE_PROBING 200 // (ms) To prevent vibrations from triggering piezo sensors + +// Require minimum nozzle and/or bed temperature for probing +//#define PREHEAT_BEFORE_PROBING +#if ENABLED(PREHEAT_BEFORE_PROBING) + #define PROBING_NOZZLE_TEMP 120 // (°C) Only applies to E0 at this time + #define PROBING_BED_TEMP 50 +#endif + +// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1 +// :{ 0:'Low', 1:'High' } +#define X_ENABLE_ON 0 +#define Y_ENABLE_ON 0 +#define Z_ENABLE_ON 0 +#define E_ENABLE_ON 0 // For all extruders + +// Disable axis steppers immediately when they're not being stepped. +// WARNING: When motors turn off there is a chance of losing position accuracy! +#define DISABLE_X false +#define DISABLE_Y false +#define DISABLE_Z false + +// Turn off the display blinking that warns about possible accuracy reduction +//#define DISABLE_REDUCED_ACCURACY_WARNING + +// @section extruder + +#define DISABLE_E false // Disable the extruder when not stepping +#define DISABLE_INACTIVE_EXTRUDER // Keep only the active extruder enabled + +// @section machine + +// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. +#define INVERT_X_DIR false +#define INVERT_Y_DIR true +#define INVERT_Z_DIR false + +// @section extruder + +// For direct drive extruder v9 set to true, for geared extruder set to false. +#define INVERT_E0_DIR false +#define INVERT_E1_DIR false +#define INVERT_E2_DIR false +#define INVERT_E3_DIR false +#define INVERT_E4_DIR false +#define INVERT_E5_DIR false +#define INVERT_E6_DIR false +#define INVERT_E7_DIR false + +// @section homing + +//#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed. Also enable HOME_AFTER_DEACTIVATE for extra safety. +//#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated. Also enable NO_MOTION_BEFORE_HOMING for extra safety. + +/** + * Set Z_IDLE_HEIGHT if the Z-Axis moves on its own when steppers are disabled. + * - Use a low value (i.e., Z_MIN_POS) if the nozzle falls down to the bed. + * - Use a large value (i.e., Z_MAX_POS) if the bed falls down, away from the nozzle. + */ +//#define Z_IDLE_HEIGHT Z_HOME_POS + +//#define Z_HOMING_HEIGHT 4 // (mm) Minimal Z height before homing (G28) for Z clearance above the bed, clamps, ... + // Be sure to have this much clearance over your Z_MAX_POS to prevent grinding. + +//#define Z_AFTER_HOMING 10 // (mm) Height to move to after homing Z + +// Direction of endstops when homing; 1=MAX, -1=MIN +// :[-1,1] +#define X_HOME_DIR -1 +#define Y_HOME_DIR -1 +#define Z_HOME_DIR -1 + +// @section machine + +// The size of the print bed +#define X_BED_SIZE 200 +#define Y_BED_SIZE 200 + +// Travel limits (mm) after homing, corresponding to endstop positions. +#define X_MIN_POS 0 +#define Y_MIN_POS 0 +#define Z_MIN_POS 0 +#define X_MAX_POS X_BED_SIZE +#define Y_MAX_POS Y_BED_SIZE +#define Z_MAX_POS 200 + +/** + * Software Endstops + * + * - Prevent moves outside the set machine bounds. + * - Individual axes can be disabled, if desired. + * - X and Y only apply to Cartesian robots. + * - Use 'M211' to set software endstops on/off or report current state + */ + +// Min software endstops constrain movement within minimum coordinate bounds +#define MIN_SOFTWARE_ENDSTOPS +#if ENABLED(MIN_SOFTWARE_ENDSTOPS) + #define MIN_SOFTWARE_ENDSTOP_X + #define MIN_SOFTWARE_ENDSTOP_Y + #define MIN_SOFTWARE_ENDSTOP_Z +#endif + +// Max software endstops constrain movement within maximum coordinate bounds +#define MAX_SOFTWARE_ENDSTOPS +#if ENABLED(MAX_SOFTWARE_ENDSTOPS) + #define MAX_SOFTWARE_ENDSTOP_X + #define MAX_SOFTWARE_ENDSTOP_Y + #define MAX_SOFTWARE_ENDSTOP_Z +#endif + +#if EITHER(MIN_SOFTWARE_ENDSTOPS, MAX_SOFTWARE_ENDSTOPS) + //#define SOFT_ENDSTOPS_MENU_ITEM // Enable/Disable software endstops from the LCD +#endif + +/** + * Filament Runout Sensors + * Mechanical or opto endstops are used to check for the presence of filament. + * + * IMPORTANT: Runout will only trigger if Marlin is aware that a print job is running. + * Marlin knows a print job is running when: + * 1. Running a print job from media started with M24. + * 2. The Print Job Timer has been started with M75. + * 3. The heaters were turned on and PRINTJOB_TIMER_AUTOSTART is enabled. + * + * RAMPS-based boards use SERVO3_PIN for the first runout sensor. + * For other boards you may need to define FIL_RUNOUT_PIN, FIL_RUNOUT2_PIN, etc. + */ +//#define FILAMENT_RUNOUT_SENSOR +#if ENABLED(FILAMENT_RUNOUT_SENSOR) + #define FIL_RUNOUT_ENABLED_DEFAULT true // Enable the sensor on startup. Override with M412 followed by M500. + #define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each. + + #define FIL_RUNOUT_STATE LOW // Pin state indicating that filament is NOT present. + #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. + //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + //#define WATCH_ALL_RUNOUT_SENSORS // Execute runout script on any triggering sensor, not only for the active extruder. + // This is automatically enabled for MIXING_EXTRUDERs. + + // Override individually if the runout sensors vary + //#define FIL_RUNOUT1_STATE LOW + //#define FIL_RUNOUT1_PULLUP + //#define FIL_RUNOUT1_PULLDOWN + + //#define FIL_RUNOUT2_STATE LOW + //#define FIL_RUNOUT2_PULLUP + //#define FIL_RUNOUT2_PULLDOWN + + //#define FIL_RUNOUT3_STATE LOW + //#define FIL_RUNOUT3_PULLUP + //#define FIL_RUNOUT3_PULLDOWN + + //#define FIL_RUNOUT4_STATE LOW + //#define FIL_RUNOUT4_PULLUP + //#define FIL_RUNOUT4_PULLDOWN + + //#define FIL_RUNOUT5_STATE LOW + //#define FIL_RUNOUT5_PULLUP + //#define FIL_RUNOUT5_PULLDOWN + + //#define FIL_RUNOUT6_STATE LOW + //#define FIL_RUNOUT6_PULLUP + //#define FIL_RUNOUT6_PULLDOWN + + //#define FIL_RUNOUT7_STATE LOW + //#define FIL_RUNOUT7_PULLUP + //#define FIL_RUNOUT7_PULLDOWN + + //#define FIL_RUNOUT8_STATE LOW + //#define FIL_RUNOUT8_PULLUP + //#define FIL_RUNOUT8_PULLDOWN + + // Commands to execute on filament runout. + // With multiple runout sensors use the %c placeholder for the current tool in commands (e.g., "M600 T%c") + // NOTE: After 'M412 H1' the host handles filament runout and this script does not apply. + #define FILAMENT_RUNOUT_SCRIPT "M600" + + // After a runout is detected, continue printing this length of filament + // before executing the runout script. Useful for a sensor at the end of + // a feed tube. Requires 4 bytes SRAM per sensor, plus 4 bytes overhead. + //#define FILAMENT_RUNOUT_DISTANCE_MM 25 + + #ifdef FILAMENT_RUNOUT_DISTANCE_MM + // Enable this option to use an encoder disc that toggles the runout pin + // as the filament moves. (Be sure to set FILAMENT_RUNOUT_DISTANCE_MM + // large enough to avoid false positives.) + //#define FILAMENT_MOTION_SENSOR + #endif +#endif + +//=========================================================================== +//=============================== Bed Leveling ============================== +//=========================================================================== +// @section calibrate + +/** + * Choose one of the options below to enable G29 Bed Leveling. The parameters + * and behavior of G29 will change depending on your selection. + * + * If using a Probe for Z Homing, enable Z_SAFE_HOMING also! + * + * - AUTO_BED_LEVELING_3POINT + * Probe 3 arbitrary points on the bed (that aren't collinear) + * You specify the XY coordinates of all 3 points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_LINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a single tilted plane. Best for a flat bed. + * + * - AUTO_BED_LEVELING_BILINEAR + * Probe several points in a grid. + * You specify the rectangle and the density of sample points. + * The result is a mesh, best for large or uneven beds. + * + * - AUTO_BED_LEVELING_UBL (Unified Bed Leveling) + * A comprehensive bed leveling system combining the features and benefits + * of other systems. UBL also includes integrated Mesh Generation, Mesh + * Validation and Mesh Editing systems. + * + * - MESH_BED_LEVELING + * Probe a grid manually + * The result is a mesh, suitable for large or uneven beds. (See BILINEAR.) + * For machines without a probe, Mesh Bed Leveling provides a method to perform + * leveling in steps so you can manually adjust the Z height at each grid-point. + * With an LCD controller the process is guided step-by-step. + */ +//#define AUTO_BED_LEVELING_3POINT +//#define AUTO_BED_LEVELING_LINEAR +//#define AUTO_BED_LEVELING_BILINEAR +//#define AUTO_BED_LEVELING_UBL +//#define MESH_BED_LEVELING + +/** + * Normally G28 leaves leveling disabled on completion. Enable one of + * these options to restore the prior leveling state or to always enable + * leveling immediately after G28. + */ +//#define RESTORE_LEVELING_AFTER_G28 +//#define ENABLE_LEVELING_AFTER_G28 + +/** + * Auto-leveling needs preheating + */ +//#define PREHEAT_BEFORE_LEVELING +#if ENABLED(PREHEAT_BEFORE_LEVELING) + #define LEVELING_NOZZLE_TEMP 120 // (°C) Only applies to E0 at this time + #define LEVELING_BED_TEMP 50 +#endif + +/** + * Enable detailed logging of G28, G29, M48, etc. + * Turn on with the command 'M111 S32'. + * NOTE: Requires a lot of PROGMEM! + */ +//#define DEBUG_LEVELING_FEATURE + +#if ANY(MESH_BED_LEVELING, AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_UBL) + // Gradually reduce leveling correction until a set height is reached, + // at which point movement will be level to the machine's XY plane. + // The height can be set with M420 Z + #define ENABLE_LEVELING_FADE_HEIGHT + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + #define DEFAULT_LEVELING_FADE_HEIGHT 10.0 // (mm) Default fade height. + #endif + + // For Cartesian machines, instead of dividing moves on mesh boundaries, + // split up moves into short segments like a Delta. This follows the + // contours of the bed more closely than edge-to-edge straight moves. + #define SEGMENT_LEVELED_MOVES + #define LEVELED_SEGMENT_LENGTH 5.0 // (mm) Length of all segments (except the last one) + + /** + * Enable the G26 Mesh Validation Pattern tool. + */ + //#define G26_MESH_VALIDATION + #if ENABLED(G26_MESH_VALIDATION) + #define MESH_TEST_NOZZLE_SIZE 0.4 // (mm) Diameter of primary nozzle. + #define MESH_TEST_LAYER_HEIGHT 0.2 // (mm) Default layer height for G26. + #define MESH_TEST_HOTEND_TEMP 205 // (°C) Default nozzle temperature for G26. + #define MESH_TEST_BED_TEMP 60 // (°C) Default bed temperature for G26. + #define G26_XY_FEEDRATE 20 // (mm/s) Feedrate for G26 XY moves. + #define G26_XY_FEEDRATE_TRAVEL 100 // (mm/s) Feedrate for G26 XY travel moves. + #define G26_RETRACT_MULTIPLIER 1.0 // G26 Q (retraction) used by default between mesh test elements. + #endif + +#endif + +#if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR) + + // Set the number of grid points per dimension. + #define GRID_MAX_POINTS_X 3 + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + // Probe along the Y axis, advancing X after each column + //#define PROBE_Y_FIRST + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + // Beyond the probed grid, continue the implied tilt? + // Default is to maintain the height of the nearest edge. + //#define EXTRAPOLATE_BEYOND_GRID + + // + // Experimental Subdivision of the grid by Catmull-Rom method. + // Synthesizes intermediate points to produce a more detailed mesh. + // + //#define ABL_BILINEAR_SUBDIVISION + #if ENABLED(ABL_BILINEAR_SUBDIVISION) + // Number of subdivisions between probe points + #define BILINEAR_SUBDIVISIONS 3 + #endif + + #endif + +#elif ENABLED(AUTO_BED_LEVELING_UBL) + + //=========================================================================== + //========================= Unified Bed Leveling ============================ + //=========================================================================== + + //#define MESH_EDIT_GFX_OVERLAY // Display a graphics overlay while editing the mesh + + #define MESH_INSET 1 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle + #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 + + //#define UBL_Z_RAISE_WHEN_OFF_MESH 2.5 // When the nozzle is off the mesh, this value is used + // as the Z-Height correction value. + +#elif ENABLED(MESH_BED_LEVELING) + + //=========================================================================== + //=================================== Mesh ================================== + //=========================================================================== + + #define MESH_INSET 10 // Set Mesh bounds as an inset region of the bed + #define GRID_MAX_POINTS_X 3 // Don't use more than 7 points per axis, implementation limited. + #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + + //#define MESH_G28_REST_ORIGIN // After homing all axes ('G28' or 'G28 XYZ') rest Z at Z_MIN_POS + +#endif // BED_LEVELING + +/** + * Add a bed leveling sub-menu for ABL or MBL. + * Include a guided procedure if manual probing is enabled. + */ +//#define LCD_BED_LEVELING + +#if ENABLED(LCD_BED_LEVELING) + #define MESH_EDIT_Z_STEP 0.025 // (mm) Step size while manually probing Z axis. + #define LCD_PROBE_Z_RANGE 4 // (mm) Z Range centered on Z_MIN_POS for LCD Z adjustment + //#define MESH_EDIT_MENU // Add a menu to edit mesh points +#endif + +// Add a menu item to move between bed corners for manual bed adjustment +//#define LEVEL_BED_CORNERS + +#if ENABLED(LEVEL_BED_CORNERS) + #define LEVEL_CORNERS_INSET_LFRB { 30, 30, 30, 30 } // (mm) Left, Front, Right, Back insets + #define LEVEL_CORNERS_HEIGHT 0.0 // (mm) Z height of nozzle at leveling points + #define LEVEL_CORNERS_Z_HOP 4.0 // (mm) Z height of nozzle between leveling points + //#define LEVEL_CENTER_TOO // Move to the center after the last corner + //#define LEVEL_CORNERS_USE_PROBE + #if ENABLED(LEVEL_CORNERS_USE_PROBE) + #define LEVEL_CORNERS_PROBE_TOLERANCE 0.1 + #define LEVEL_CORNERS_VERIFY_RAISED // After adjustment triggers the probe, re-probe to verify + //#define LEVEL_CORNERS_AUDIO_FEEDBACK + #endif + + /** + * Corner Leveling Order + * + * Set 2 or 4 points. When 2 points are given, the 3rd is the center of the opposite edge. + * + * LF Left-Front RF Right-Front + * LB Left-Back RB Right-Back + * + * Examples: + * + * Default {LF,RB,LB,RF} {LF,RF} {LB,LF} + * LB --------- RB LB --------- RB LB --------- RB LB --------- RB + * | 4 3 | | 3 2 | | <3> | | 1 | + * | | | | | | | <3>| + * | 1 2 | | 1 4 | | 1 2 | | 2 | + * LF --------- RF LF --------- RF LF --------- RF LF --------- RF + */ + #define LEVEL_CORNERS_LEVELING_ORDER { LF, RF, RB, LB } +#endif + +/** + * Commands to execute at the end of G29 probing. + * Useful to retract or move the Z probe out of the way. + */ +//#define Z_PROBE_END_SCRIPT "G1 Z10 F12000\nG1 X15 Y330\nG1 Z0.5\nG1 Z10" + +// @section homing + +// The center of the bed is at (X=0, Y=0) +//#define BED_CENTER_AT_0_0 + +// Manually set the home position. Leave these undefined for automatic settings. +// For DELTA this is the top-center of the Cartesian print volume. +//#define MANUAL_X_HOME_POS 0 +//#define MANUAL_Y_HOME_POS 0 +//#define MANUAL_Z_HOME_POS 0 + +// Use "Z Safe Homing" to avoid homing with a Z probe outside the bed area. +// +// With this feature enabled: +// +// - Allow Z homing only after X and Y homing AND stepper drivers still enabled. +// - If stepper drivers time out, it will need X and Y homing again before Z homing. +// - Move the Z probe (or nozzle) to a defined XY point before Z Homing. +// - Prevent Z homing when the Z probe is outside bed area. +// +//#define Z_SAFE_HOMING + +#if ENABLED(Z_SAFE_HOMING) + #define Z_SAFE_HOMING_X_POINT X_CENTER // X point for Z homing + #define Z_SAFE_HOMING_Y_POINT Y_CENTER // Y point for Z homing +#endif + +// Homing speeds (mm/min) +#define HOMING_FEEDRATE_MM_M { (50*60), (50*60), (4*60) } + +// Validate that endstops are triggered on homing moves +#define VALIDATE_HOMING_ENDSTOPS + +// @section calibrate + +/** + * Bed Skew Compensation + * + * This feature corrects for misalignment in the XYZ axes. + * + * Take the following steps to get the bed skew in the XY plane: + * 1. Print a test square (e.g., https://www.thingiverse.com/thing:2563185) + * 2. For XY_DIAG_AC measure the diagonal A to C + * 3. For XY_DIAG_BD measure the diagonal B to D + * 4. For XY_SIDE_AD measure the edge A to D + * + * Marlin automatically computes skew factors from these measurements. + * Skew factors may also be computed and set manually: + * + * - Compute AB : SQRT(2*AC*AC+2*BD*BD-4*AD*AD)/2 + * - XY_SKEW_FACTOR : TAN(PI/2-ACOS((AC*AC-AB*AB-AD*AD)/(2*AB*AD))) + * + * If desired, follow the same procedure for XZ and YZ. + * Use these diagrams for reference: + * + * Y Z Z + * ^ B-------C ^ B-------C ^ B-------C + * | / / | / / | / / + * | / / | / / | / / + * | A-------D | A-------D | A-------D + * +-------------->X +-------------->X +-------------->Y + * XY_SKEW_FACTOR XZ_SKEW_FACTOR YZ_SKEW_FACTOR + */ +//#define SKEW_CORRECTION + +#if ENABLED(SKEW_CORRECTION) + // Input all length measurements here: + #define XY_DIAG_AC 282.8427124746 + #define XY_DIAG_BD 282.8427124746 + #define XY_SIDE_AD 200 + + // Or, set the default skew factors directly here + // to override the above measurements: + #define XY_SKEW_FACTOR 0.0 + + //#define SKEW_CORRECTION_FOR_Z + #if ENABLED(SKEW_CORRECTION_FOR_Z) + #define XZ_DIAG_AC 282.8427124746 + #define XZ_DIAG_BD 282.8427124746 + #define YZ_DIAG_AC 282.8427124746 + #define YZ_DIAG_BD 282.8427124746 + #define YZ_SIDE_AD 200 + #define XZ_SKEW_FACTOR 0.0 + #define YZ_SKEW_FACTOR 0.0 + #endif + + // Enable this option for M852 to set skew at runtime + //#define SKEW_CORRECTION_GCODE +#endif + +//============================================================================= +//============================= Additional Features =========================== +//============================================================================= + +// @section extras + +/** + * EEPROM + * + * Persistent storage to preserve configurable settings across reboots. + * + * M500 - Store settings to EEPROM. + * M501 - Read settings from EEPROM. (i.e., Throw away unsaved changes) + * M502 - Revert settings to "factory" defaults. (Follow with M500 to init the EEPROM.) + */ +#define EEPROM_SETTINGS // Persistent storage with M500 and M501 +//#define DISABLE_M503 // Saves ~2700 bytes of PROGMEM. Disable for release! +#define EEPROM_CHITCHAT // Give feedback on EEPROM commands. Disable to save PROGMEM. +#define EEPROM_BOOT_SILENT // Keep M503 quiet and only give errors during first load +#if ENABLED(EEPROM_SETTINGS) + //#define EEPROM_AUTO_INIT // Init EEPROM automatically on any errors. +#endif + +// +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. +#define BUSY_WHILE_HEATING // Some hosts require "busy" messages even during heating + +// +// G20/G21 Inch mode support +// +//#define INCH_MODE_SUPPORT + +// +// M149 Set temperature units support +// +//#define TEMPERATURE_UNITS_SUPPORT + +// @section temperature + +// +// Preheat Constants - Up to 5 are supported without changes +// +#define PREHEAT_1_LABEL "PLA" +#define PREHEAT_1_TEMP_HOTEND 180 +#define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_TEMP_CHAMBER 35 +#define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 + +#define PREHEAT_2_LABEL "ABS" +#define PREHEAT_2_TEMP_HOTEND 240 +#define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_TEMP_CHAMBER 35 +#define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 + +/** + * Nozzle Park + * + * Park the nozzle at the given XYZ position on idle or G27. + * + * The "P" parameter controls the action applied to the Z axis: + * + * P0 (Default) If Z is below park Z raise the nozzle. + * P1 Raise the nozzle always to Z-park height. + * P2 Raise the nozzle by Z-park amount, limited to Z_MAX_POS. + */ +#define NOZZLE_PARK_FEATURE + +#if ENABLED(NOZZLE_PARK_FEATURE) + // Specify a park position as { X, Y, Z_raise } + #define NOZZLE_PARK_POINT { (X_MIN_POS + 10), (Y_MAX_POS - 10), 20 } + //#define NOZZLE_PARK_X_ONLY // X move only is required to park + //#define NOZZLE_PARK_Y_ONLY // Y move only is required to park + #define NOZZLE_PARK_Z_RAISE_MIN 2 // (mm) Always raise Z by at least this distance + #define NOZZLE_PARK_XY_FEEDRATE 100 // (mm/s) X and Y axes feedrate (also used for delta Z axis) + #define NOZZLE_PARK_Z_FEEDRATE 5 // (mm/s) Z axis feedrate (not used for delta printers) +#endif + +/** + * Clean Nozzle Feature -- EXPERIMENTAL + * + * Adds the G12 command to perform a nozzle cleaning process. + * + * Parameters: + * P Pattern + * S Strokes / Repetitions + * T Triangles (P1 only) + * + * Patterns: + * P0 Straight line (default). This process requires a sponge type material + * at a fixed bed location. "S" specifies strokes (i.e. back-forth motions) + * between the start / end points. + * + * P1 Zig-zag pattern between (X0, Y0) and (X1, Y1), "T" specifies the + * number of zig-zag triangles to do. "S" defines the number of strokes. + * Zig-zags are done in whichever is the narrower dimension. + * For example, "G12 P1 S1 T3" will execute: + * + * -- + * | (X0, Y1) | /\ /\ /\ | (X1, Y1) + * | | / \ / \ / \ | + * A | | / \ / \ / \ | + * | | / \ / \ / \ | + * | (X0, Y0) | / \/ \/ \ | (X1, Y0) + * -- +--------------------------------+ + * |________|_________|_________| + * T1 T2 T3 + * + * P2 Circular pattern with middle at NOZZLE_CLEAN_CIRCLE_MIDDLE. + * "R" specifies the radius. "S" specifies the stroke count. + * Before starting, the nozzle moves to NOZZLE_CLEAN_START_POINT. + * + * Caveats: The ending Z should be the same as starting Z. + * Attention: EXPERIMENTAL. G-code arguments may change. + */ +//#define NOZZLE_CLEAN_FEATURE + +#if ENABLED(NOZZLE_CLEAN_FEATURE) + // Default number of pattern repetitions + #define NOZZLE_CLEAN_STROKES 12 + + // Default number of triangles + #define NOZZLE_CLEAN_TRIANGLES 3 + + // Specify positions for each tool as { { X, Y, Z }, { X, Y, Z } } + // Dual hotend system may use { { -20, (Y_BED_SIZE / 2), (Z_MIN_POS + 1) }, { 420, (Y_BED_SIZE / 2), (Z_MIN_POS + 1) }} + #define NOZZLE_CLEAN_START_POINT { { 30, 30, (Z_MIN_POS + 1) } } + #define NOZZLE_CLEAN_END_POINT { { 100, 60, (Z_MIN_POS + 1) } } + + // Circular pattern radius + #define NOZZLE_CLEAN_CIRCLE_RADIUS 6.5 + // Circular pattern circle fragments number + #define NOZZLE_CLEAN_CIRCLE_FN 10 + // Middle point of circle + #define NOZZLE_CLEAN_CIRCLE_MIDDLE NOZZLE_CLEAN_START_POINT + + // Move the nozzle to the initial position after cleaning + #define NOZZLE_CLEAN_GOBACK + + // For a purge/clean station that's always at the gantry height (thus no Z move) + //#define NOZZLE_CLEAN_NO_Z + + // For a purge/clean station mounted on the X axis + //#define NOZZLE_CLEAN_NO_Y + + // Require a minimum hotend temperature for cleaning + #define NOZZLE_CLEAN_MIN_TEMP 170 + //#define NOZZLE_CLEAN_HEATUP // Heat up the nozzle instead of skipping wipe + + // Explicit wipe G-code script applies to a G12 with no arguments. + //#define WIPE_SEQUENCE_COMMANDS "G1 X-17 Y25 Z10 F4000\nG1 Z1\nM114\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 X-17 Y25\nG1 X-17 Y95\nG1 Z15\nM400\nG0 X-10.0 Y-9.0" + +#endif + +/** + * Print Job Timer + * + * Automatically start and stop the print job timer on M104/M109/M190. + * + * M104 (hotend, no wait) - high temp = none, low temp = stop timer + * M109 (hotend, wait) - high temp = start timer, low temp = stop timer + * M190 (bed, wait) - high temp = start timer, low temp = none + * + * The timer can also be controlled with the following commands: + * + * M75 - Start the print job timer + * M76 - Pause the print job timer + * M77 - Stop the print job timer + */ +#define PRINTJOB_TIMER_AUTOSTART + +/** + * Print Counter + * + * Track statistical data such as: + * + * - Total print jobs + * - Total successful print jobs + * - Total failed print jobs + * - Total time printing + * + * View the current statistics with M78. + */ +#define PRINTCOUNTER +#if ENABLED(PRINTCOUNTER) + #define PRINTCOUNTER_SAVE_INTERVAL 60 // (minutes) EEPROM save interval during print +#endif + +/** + * Password + * + * Set a numerical password for the printer which can be requested: + * + * - When the printer boots up + * - Upon opening the 'Print from Media' Menu + * - When SD printing is completed or aborted + * + * The following G-codes can be used: + * + * M510 - Lock Printer. Blocks all commands except M511. + * M511 - Unlock Printer. + * M512 - Set, Change and Remove Password. + * + * If you forget the password and get locked out you'll need to re-flash + * the firmware with the feature disabled, reset EEPROM, and (optionally) + * re-flash the firmware again with this feature enabled. + */ +//#define PASSWORD_FEATURE +#if ENABLED(PASSWORD_FEATURE) + #define PASSWORD_LENGTH 4 // (#) Number of digits (1-9). 3 or 4 is recommended + #define PASSWORD_ON_STARTUP + #define PASSWORD_UNLOCK_GCODE // Unlock with the M511 P command. Disable to prevent brute-force attack. + #define PASSWORD_CHANGE_GCODE // Change the password with M512 P S. + //#define PASSWORD_ON_SD_PRINT_MENU // This does not prevent gcodes from running + //#define PASSWORD_AFTER_SD_PRINT_END + //#define PASSWORD_AFTER_SD_PRINT_ABORT + //#include "Configuration_Secure.h" // External file with PASSWORD_DEFAULT_VALUE +#endif + +//============================================================================= +//============================= LCD and SD support ============================ +//============================================================================= + +// @section lcd + +/** + * LCD LANGUAGE + * + * Select the language to display on the LCD. These languages are available: + * + * en, an, bg, ca, cz, da, de, el, el_gr, es, eu, fi, fr, gl, hr, hu, it, + * jp_kana, ko_KR, nl, pl, pt, pt_br, ro, ru, sk, sv, tr, uk, vi, zh_CN, zh_TW + * + * :{ 'en':'English', 'an':'Aragonese', 'bg':'Bulgarian', 'ca':'Catalan', 'cz':'Czech', 'da':'Danish', 'de':'German', 'el':'Greek', 'el_gr':'Greek (Greece)', 'es':'Spanish', 'eu':'Basque-Euskera', 'fi':'Finnish', 'fr':'French', 'gl':'Galician', 'hr':'Croatian', 'hu':'Hungarian', 'it':'Italian', 'jp_kana':'Japanese', 'ko_KR':'Korean (South Korea)', 'nl':'Dutch', 'pl':'Polish', 'pt':'Portuguese', 'pt_br':'Portuguese (Brazilian)', 'ro':'Romanian', 'ru':'Russian', 'sk':'Slovak', 'sv':'Swedish', 'tr':'Turkish', 'uk':'Ukrainian', 'vi':'Vietnamese', 'zh_CN':'Chinese (Simplified)', 'zh_TW':'Chinese (Traditional)' } + */ +#define LCD_LANGUAGE en + +/** + * LCD Character Set + * + * Note: This option is NOT applicable to Graphical Displays. + * + * All character-based LCDs provide ASCII plus one of these + * language extensions: + * + * - JAPANESE ... the most common + * - WESTERN ... with more accented characters + * - CYRILLIC ... for the Russian language + * + * To determine the language extension installed on your controller: + * + * - Compile and upload with LCD_LANGUAGE set to 'test' + * - Click the controller to view the LCD menu + * - The LCD will display Japanese, Western, or Cyrillic text + * + * See https://marlinfw.org/docs/development/lcd_language.html + * + * :['JAPANESE', 'WESTERN', 'CYRILLIC'] + */ +#define DISPLAY_CHARSET_HD44780 JAPANESE + +/** + * Info Screen Style (0:Classic, 1:Průša) + * + * :[0:'Classic', 1:'Průša'] + */ +#define LCD_INFO_SCREEN_STYLE 0 + +/** + * SD CARD + * + * SD Card support is disabled by default. If your controller has an SD slot, + * you must uncomment the following option or it won't work. + */ +#define SDSUPPORT + +/** + * SD CARD: ENABLE CRC + * + * Use CRC checks and retries on the SD communication. + */ +//#define SD_CHECK_AND_RETRY + +/** + * LCD Menu Items + * + * Disable all menus and only display the Status Screen, or + * just remove some extraneous menu items to recover space. + */ +//#define NO_LCD_MENUS +//#define SLIM_LCD_MENUS + +// +// ENCODER SETTINGS +// +// This option overrides the default number of encoder pulses needed to +// produce one step. Should be increased for high-resolution encoders. +// +//#define ENCODER_PULSES_PER_STEP 4 + +// +// Use this option to override the number of step signals required to +// move between next/prev menu items. +// +//#define ENCODER_STEPS_PER_MENU_ITEM 1 + +/** + * Encoder Direction Options + * + * Test your encoder's behavior first with both options disabled. + * + * Reversed Value Edit and Menu Nav? Enable REVERSE_ENCODER_DIRECTION. + * Reversed Menu Navigation only? Enable REVERSE_MENU_DIRECTION. + * Reversed Value Editing only? Enable BOTH options. + */ + +// +// This option reverses the encoder direction everywhere. +// +// Set this option if CLOCKWISE causes values to DECREASE +// +//#define REVERSE_ENCODER_DIRECTION + +// +// This option reverses the encoder direction for navigating LCD menus. +// +// If CLOCKWISE normally moves DOWN this makes it go UP. +// If CLOCKWISE normally moves UP this makes it go DOWN. +// +//#define REVERSE_MENU_DIRECTION + +// +// This option reverses the encoder direction for Select Screen. +// +// If CLOCKWISE normally moves LEFT this makes it go RIGHT. +// If CLOCKWISE normally moves RIGHT this makes it go LEFT. +// +//#define REVERSE_SELECT_DIRECTION + +// +// Individual Axis Homing +// +// Add individual axis homing items (Home X, Home Y, and Home Z) to the LCD menu. +// +//#define INDIVIDUAL_AXIS_HOMING_MENU + +// +// SPEAKER/BUZZER +// +// If you have a speaker that can produce tones, enable it here. +// By default Marlin assumes you have a buzzer with a fixed frequency. +// +//#define SPEAKER + +// +// The duration and frequency for the UI feedback sound. +// Set these to 0 to disable audio feedback in the LCD menus. +// +// Note: Test audio output with the G-Code: +// M300 S P +// +//#define LCD_FEEDBACK_FREQUENCY_DURATION_MS 2 +//#define LCD_FEEDBACK_FREQUENCY_HZ 5000 + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//======================== (Character-based LCDs) ========================= +//============================================================================= + +// +// RepRapDiscount Smart Controller. +// https://reprap.org/wiki/RepRapDiscount_Smart_Controller +// +// Note: Usually sold with a white PCB. +// +//#define REPRAP_DISCOUNT_SMART_CONTROLLER + +// +// GT2560 (YHCB2004) LCD Display +// +// Requires Testato, Koepel softwarewire library and +// Andriy Golovnya's LiquidCrystal_AIP31068 library. +// +//#define YHCB2004 + +// +// Original RADDS LCD Display+Encoder+SDCardReader +// http://doku.radds.org/dokumentation/lcd-display/ +// +//#define RADDS_DISPLAY + +// +// ULTIMAKER Controller. +// +//#define ULTIMAKERCONTROLLER + +// +// ULTIPANEL as seen on Thingiverse. +// +//#define ULTIPANEL + +// +// PanelOne from T3P3 (via RAMPS 1.4 AUX2/AUX3) +// https://reprap.org/wiki/PanelOne +// +//#define PANEL_ONE + +// +// GADGETS3D G3D LCD/SD Controller +// https://reprap.org/wiki/RAMPS_1.3/1.4_GADGETS3D_Shield_with_Panel +// +// Note: Usually sold with a blue PCB. +// +//#define G3D_PANEL + +// +// RigidBot Panel V1.0 +// http://www.inventapart.com/ +// +//#define RIGIDBOT_PANEL + +// +// Makeboard 3D Printer Parts 3D Printer Mini Display 1602 Mini Controller +// https://www.aliexpress.com/item/32765887917.html +// +//#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 + +// +// ANET and Tronxy 20x4 Controller +// +//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + // This LCD is known to be susceptible to electrical interference + // which scrambles the display. Pressing any button clears it up. + // This is a LCD2004 display with 5 analog buttons. + +// +// Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. +// +//#define ULTRA_LCD + +//============================================================================= +//======================== LCD / Controller Selection ========================= +//===================== (I2C and Shift-Register LCDs) ===================== +//============================================================================= + +// +// CONTROLLER TYPE: I2C +// +// Note: These controllers require the installation of Arduino's LiquidCrystal_I2C +// library. For more info: https://github.com/kiyoshigawa/LiquidCrystal_I2C +// + +// +// Elefu RA Board Control Panel +// http://www.elefu.com/index.php?route=product/product&product_id=53 +// +//#define RA_CONTROL_PANEL + +// +// Sainsmart (YwRobot) LCD Displays +// +// These require F.Malpartida's LiquidCrystal_I2C library +// https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home +// +//#define LCD_SAINSMART_I2C_1602 +//#define LCD_SAINSMART_I2C_2004 + +// +// Generic LCM1602 LCD adapter +// +//#define LCM1602 + +// +// PANELOLU2 LCD with status LEDs, +// separate encoder and click inputs. +// +// Note: This controller requires Arduino's LiquidTWI2 library v1.2.3 or later. +// For more info: https://github.com/lincomatic/LiquidTWI2 +// +// Note: The PANELOLU2 encoder click input can either be directly connected to +// a pin (if BTN_ENC defined to != -1) or read through I2C (when BTN_ENC == -1). +// +//#define LCD_I2C_PANELOLU2 + +// +// Panucatt VIKI LCD with status LEDs, +// integrated click & L/R/U/D buttons, separate encoder inputs. +// +//#define LCD_I2C_VIKI + +// +// CONTROLLER TYPE: Shift register panels +// + +// +// 2-wire Non-latching LCD SR from https://goo.gl/aJJ4sH +// LCD configuration: https://reprap.org/wiki/SAV_3D_LCD +// +//#define SAV_3DLCD + +// +// 3-wire SR LCD with strobe using 74HC4094 +// https://github.com/mikeshub/SailfishLCD +// Uses the code directly from Sailfish +// +//#define FF_INTERFACEBOARD + +// +// TFT GLCD Panel with Marlin UI +// Panel connected to main board by SPI or I2C interface. +// See https://github.com/Serhiy-K/TFTGLCDAdapter +// +//#define TFTGLCD_PANEL_SPI +//#define TFTGLCD_PANEL_I2C + +//============================================================================= +//======================= LCD / Controller Selection ======================= +//========================= (Graphical LCDs) ======================== +//============================================================================= + +// +// CONTROLLER TYPE: Graphical 128x64 (DOGM) +// +// IMPORTANT: The U8glib library is required for Graphical Display! +// https://github.com/olikraus/U8glib_Arduino +// +// NOTE: If the LCD is unresponsive you may need to reverse the plugs. +// + +// +// RepRapDiscount FULL GRAPHIC Smart Controller +// https://reprap.org/wiki/RepRapDiscount_Full_Graphic_Smart_Controller +// +//#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER + +// +// ReprapWorld Graphical LCD +// https://reprapworld.com/?products_details&products_id/1218 +// +//#define REPRAPWORLD_GRAPHICAL_LCD + +// +// Activate one of these if you have a Panucatt Devices +// Viki 2.0 or mini Viki with Graphic LCD +// https://www.panucatt.com +// +//#define VIKI2 +//#define miniVIKI + +// +// MakerLab Mini Panel with graphic +// controller and SD support - https://reprap.org/wiki/Mini_panel +// +//#define MINIPANEL + +// +// MaKr3d Makr-Panel with graphic controller and SD support. +// https://reprap.org/wiki/MaKr3d_MaKrPanel +// +//#define MAKRPANEL + +// +// Adafruit ST7565 Full Graphic Controller. +// https://github.com/eboston/Adafruit-ST7565-Full-Graphic-Controller/ +// +//#define ELB_FULL_GRAPHIC_CONTROLLER + +// +// BQ LCD Smart Controller shipped by +// default with the BQ Hephestos 2 and Witbox 2. +// +//#define BQ_LCD_SMART_CONTROLLER + +// +// Cartesio UI +// http://mauk.cc/webshop/cartesio-shop/electronics/user-interface +// +//#define CARTESIO_UI + +// +// LCD for Melzi Card with Graphical LCD +// +//#define LCD_FOR_MELZI + +// +// Original Ulticontroller from Ultimaker 2 printer with SSD1309 I2C display and encoder +// https://github.com/Ultimaker/Ultimaker2/tree/master/1249_Ulticontroller_Board_(x1) +// +//#define ULTI_CONTROLLER + +// +// MKS MINI12864 with graphic controller and SD support +// https://reprap.org/wiki/MKS_MINI_12864 +// +//#define MKS_MINI_12864 + +// +// MKS LCD12864A/B with graphic controller and SD support. Follows MKS_MINI_12864 pinout. +// https://www.aliexpress.com/item/33018110072.html +// +//#define MKS_LCD12864 + +// +// FYSETC variant of the MINI12864 graphic controller with SD support +// https://wiki.fysetc.com/Mini12864_Panel/ +// +//#define FYSETC_MINI_12864_X_X // Type C/D/E/F. No tunable RGB Backlight by default +//#define FYSETC_MINI_12864_1_2 // Type C/D/E/F. Simple RGB Backlight (always on) +//#define FYSETC_MINI_12864_2_0 // Type A/B. Discreet RGB Backlight +//#define FYSETC_MINI_12864_2_1 // Type A/B. NeoPixel RGB Backlight +//#define FYSETC_GENERIC_12864_1_1 // Larger display with basic ON/OFF backlight. + +// +// Factory display for Creality CR-10 +// https://www.aliexpress.com/item/32833148327.html +// +// This is RAMPS-compatible using a single 10-pin connector. +// (For CR-10 owners who want to replace the Melzi Creality board but retain the display) +// +//#define CR10_STOCKDISPLAY + +// +// Ender-2 OEM display, a variant of the MKS_MINI_12864 +// +//#define ENDER2_STOCKDISPLAY + +// +// ANET and Tronxy Graphical Controller +// +// Anet 128x64 full graphics lcd with rotary encoder as used on Anet A6 +// A clone of the RepRapDiscount full graphics display but with +// different pins/wiring (see pins_ANET_10.h). Enable one of these. +// +//#define ANET_FULL_GRAPHICS_LCD +//#define ANET_FULL_GRAPHICS_LCD_ALT_WIRING + +// +// AZSMZ 12864 LCD with SD +// https://www.aliexpress.com/item/32837222770.html +// +//#define AZSMZ_12864 + +// +// Silvergate GLCD controller +// https://github.com/android444/Silvergate +// +//#define SILVER_GATE_GLCD_CONTROLLER + +//============================================================================= +//============================== OLED Displays ============================== +//============================================================================= + +// +// SSD1306 OLED full graphics generic display +// +//#define U8GLIB_SSD1306 + +// +// SAV OLEd LCD module support using either SSD1306 or SH1106 based LCD modules +// +//#define SAV_3DGLCD +#if ENABLED(SAV_3DGLCD) + #define U8GLIB_SSD1306 + //#define U8GLIB_SH1106 +#endif + +// +// TinyBoy2 128x64 OLED / Encoder Panel +// +//#define OLED_PANEL_TINYBOY2 + +// +// MKS OLED 1.3" 128×64 FULL GRAPHICS CONTROLLER +// https://reprap.org/wiki/MKS_12864OLED +// +// Tiny, but very sharp OLED display +// +//#define MKS_12864OLED // Uses the SH1106 controller (default) +//#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller + +// +// Zonestar OLED 128×64 FULL GRAPHICS CONTROLLER +// +//#define ZONESTAR_12864LCD // Graphical (DOGM) with ST7920 controller +//#define ZONESTAR_12864OLED // 1.3" OLED with SH1106 controller (default) +//#define ZONESTAR_12864OLED_SSD1306 // 0.96" OLED with SSD1306 controller + +// +// Einstart S OLED SSD1306 +// +//#define U8GLIB_SH1106_EINSTART + +// +// Overlord OLED display/controller with i2c buzzer and LEDs +// +//#define OVERLORD_OLED + +// +// FYSETC OLED 2.42" 128×64 FULL GRAPHICS CONTROLLER with WS2812 RGB +// Where to find : https://www.aliexpress.com/item/4000345255731.html +//#define FYSETC_242_OLED_12864 // Uses the SSD1309 controller + +//============================================================================= +//========================== Extensible UI Displays =========================== +//============================================================================= + +// +// DGUS Touch Display with DWIN OS. (Choose one.) +// ORIGIN : https://www.aliexpress.com/item/32993409517.html +// FYSETC : https://www.aliexpress.com/item/32961471929.html +// +//#define DGUS_LCD_UI_ORIGIN +//#define DGUS_LCD_UI_FYSETC +//#define DGUS_LCD_UI_HIPRECY +//#define DGUS_LCD_UI_MKS + +// +// CR-6 OEM touch screen. A DWIN display with touch. +// +//#define DWIN_CREALITY_TOUCHLCD + +// +// Touch-screen LCD for Malyan M200/M300 printers +// +//#define MALYAN_LCD +#if ENABLED(MALYAN_LCD) + #define LCD_SERIAL_PORT 1 // Default is 1 for Malyan M200 +#endif + +// +// Touch UI for FTDI EVE (FT800/FT810) displays +// See Configuration_adv.h for all configuration options. +// +//#define TOUCH_UI_FTDI_EVE + +// +// Touch-screen LCD for Anycubic printers +// +//#define ANYCUBIC_LCD_I3MEGA +//#define ANYCUBIC_LCD_CHIRON +#if EITHER(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) + #define LCD_SERIAL_PORT 3 // Default is 3 for Anycubic + //#define ANYCUBIC_LCD_DEBUG +#endif + +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 +#endif + +// +// Third-party or vendor-customized controller interfaces. +// Sources should be installed in 'src/lcd/extui'. +// +//#define EXTENSIBLE_UI + +#if ENABLED(EXTENSIBLE_UI) + //#define EXTUI_LOCAL_BEEPER // Enables use of local Beeper pin with external display +#endif + +//============================================================================= +//=============================== Graphical TFTs ============================== +//============================================================================= + +/** + * Specific TFT Model Presets. Enable one of the following options + * or enable TFT_GENERIC and set sub-options. + */ + +// +// 480x320, 3.5", SPI Display From MKS +// Normally used in MKS Robin Nano V2 +// +//#define MKS_TS35_V2_0 + +// +// 320x240, 2.4", FSMC Display From MKS +// Normally used in MKS Robin Nano V1.2 +// +//#define MKS_ROBIN_TFT24 + +// +// 320x240, 2.8", FSMC Display From MKS +// Normally used in MKS Robin Nano V1.2 +// +//#define MKS_ROBIN_TFT28 + +// +// 320x240, 3.2", FSMC Display From MKS +// Normally used in MKS Robin Nano V1.2 +// +//#define MKS_ROBIN_TFT32 + +// +// 480x320, 3.5", FSMC Display From MKS +// Normally used in MKS Robin Nano V1.2 +// +//#define MKS_ROBIN_TFT35 + +// +// 480x272, 4.3", FSMC Display From MKS +// +//#define MKS_ROBIN_TFT43 + +// +// 320x240, 3.2", FSMC Display From MKS +// Normally used in MKS Robin +// +//#define MKS_ROBIN_TFT_V1_1R + +// +// 480x320, 3.5", FSMC Stock Display from TronxXY +// +//#define TFT_TRONXY_X5SA + +// +// 480x320, 3.5", FSMC Stock Display from AnyCubic +// +//#define ANYCUBIC_TFT35 + +// +// 320x240, 2.8", FSMC Stock Display from Longer/Alfawise +// +//#define LONGER_LK_TFT28 + +// +// 320x240, 2.8", FSMC Stock Display from ET4 +// +//#define ANET_ET4_TFT28 + +// +// 480x320, 3.5", FSMC Stock Display from ET5 +// +//#define ANET_ET5_TFT35 + +// +// Generic TFT with detailed options +// +//#define TFT_GENERIC +#if ENABLED(TFT_GENERIC) + // :[ 'AUTO', 'ST7735', 'ST7789', 'ST7796', 'R61505', 'ILI9328', 'ILI9341', 'ILI9488' ] + #define TFT_DRIVER AUTO + + // Interface. Enable one of the following options: + //#define TFT_INTERFACE_FSMC + //#define TFT_INTERFACE_SPI + + // TFT Resolution. Enable one of the following options: + //#define TFT_RES_320x240 + //#define TFT_RES_480x272 + //#define TFT_RES_480x320 +#endif + +/** + * TFT UI - User Interface Selection. Enable one of the following options: + * + * TFT_CLASSIC_UI - Emulated DOGM - 128x64 Upscaled + * TFT_COLOR_UI - Marlin Default Menus, Touch Friendly, using full TFT capabilities + * TFT_LVGL_UI - A Modern UI using LVGL + * + * For LVGL_UI also copy the 'assets' folder from the build directory to the + * root of your SD card, together with the compiled firmware. + */ +//#define TFT_CLASSIC_UI +//#define TFT_COLOR_UI +//#define TFT_LVGL_UI + +#if ENABLED(TFT_LVGL_UI) + //#define MKS_WIFI_MODULE // MKS WiFi module +#endif + +/** + * TFT Rotation. Set to one of the following values: + * + * TFT_ROTATE_90, TFT_ROTATE_90_MIRROR_X, TFT_ROTATE_90_MIRROR_Y, + * TFT_ROTATE_180, TFT_ROTATE_180_MIRROR_X, TFT_ROTATE_180_MIRROR_Y, + * TFT_ROTATE_270, TFT_ROTATE_270_MIRROR_X, TFT_ROTATE_270_MIRROR_Y, + * TFT_MIRROR_X, TFT_MIRROR_Y, TFT_NO_ROTATION + */ +//#define TFT_ROTATION TFT_NO_ROTATION + +//============================================================================= +//============================ Other Controllers ============================ +//============================================================================= + +// +// Ender-3 v2 OEM display. A DWIN display with Rotary Encoder. +// +//#define DWIN_CREALITY_LCD + +// +// ADS7843/XPT2046 ADC Touchscreen such as ILI9341 2.8 +// +//#define TOUCH_SCREEN +#if ENABLED(TOUCH_SCREEN) + #define BUTTON_DELAY_EDIT 50 // (ms) Button repeat delay for edit screens + #define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus + + #define TOUCH_SCREEN_CALIBRATION + + //#define TOUCH_CALIBRATION_X 12316 + //#define TOUCH_CALIBRATION_Y -8981 + //#define TOUCH_OFFSET_X -43 + //#define TOUCH_OFFSET_Y 257 + //#define TOUCH_ORIENTATION TOUCH_LANDSCAPE + + #if BOTH(TOUCH_SCREEN_CALIBRATION, EEPROM_SETTINGS) + #define TOUCH_CALIBRATION_AUTO_SAVE // Auto save successful calibration values to EEPROM + #endif + + #if ENABLED(TFT_COLOR_UI) + //#define SINGLE_TOUCH_NAVIGATION + #endif +#endif + +// +// RepRapWorld REPRAPWORLD_KEYPAD v1.1 +// https://reprapworld.com/products/electronics/ramps/keypad_v1_0_fully_assembled/ +// +//#define REPRAPWORLD_KEYPAD +//#define REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 // (mm) Distance to move per key-press + +//============================================================================= +//=============================== Extra Features ============================== +//============================================================================= + +// @section extras + +// Set number of user-controlled fans. Disable to use all board-defined fans. +// :[1,2,3,4,5,6,7,8] +//#define NUM_M106_FANS 1 + +// Increase the FAN PWM frequency. Removes the PWM noise but increases heating in the FET/Arduino +//#define FAST_PWM_FAN + +// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency +// which is not as annoying as with the hardware PWM. On the other hand, if this frequency +// is too low, you should also increment SOFT_PWM_SCALE. +//#define FAN_SOFT_PWM + +// Incrementing this by 1 will double the software PWM frequency, +// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. +// However, control resolution will be halved for each increment; +// at zero value, there are 128 effective control positions. +// :[0,1,2,3,4,5,6,7] +#define SOFT_PWM_SCALE 0 + +// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can +// be used to mitigate the associated resolution loss. If enabled, +// some of the PWM cycles are stretched so on average the desired +// duty cycle is attained. +//#define SOFT_PWM_DITHER + +// Temperature status LEDs that display the hotend and bed temperature. +// If all hotends, bed temperature, and target temperature are under 54C +// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +//#define TEMP_STAT_LEDS + +// Support for the BariCUDA Paste Extruder +//#define BARICUDA + +// Support for BlinkM/CyzRgb +//#define BLINKM + +// Support for PCA9632 PWM LED driver +//#define PCA9632 + +// Support for PCA9533 PWM LED driver +//#define PCA9533 + +/** + * RGB LED / LED Strip Control + * + * Enable support for an RGB LED connected to 5V digital pins, or + * an RGB Strip connected to MOSFETs controlled by digital pins. + * + * Adds the M150 command to set the LED (or LED strip) color. + * If pins are PWM capable (e.g., 4, 5, 6, 11) then a range of + * luminance values can be set from 0 to 255. + * For NeoPixel LED an overall brightness parameter is also available. + * + * *** CAUTION *** + * LED Strips require a MOSFET Chip between PWM lines and LEDs, + * as the Arduino cannot handle the current the LEDs will require. + * Failure to follow this precaution can destroy your Arduino! + * NOTE: A separate 5V power supply is required! The NeoPixel LED needs + * more current than the Arduino 5V linear regulator can produce. + * *** CAUTION *** + * + * LED Type. Enable only one of the following two options. + */ +//#define RGB_LED +//#define RGBW_LED + +#if EITHER(RGB_LED, RGBW_LED) + //#define RGB_LED_R_PIN 34 + //#define RGB_LED_G_PIN 43 + //#define RGB_LED_B_PIN 35 + //#define RGB_LED_W_PIN -1 +#endif + +// Support for Adafruit NeoPixel LED driver +//#define NEOPIXEL_LED +#if ENABLED(NEOPIXEL_LED) + #define NEOPIXEL_TYPE NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) + #define NEOPIXEL_PIN 4 // LED driving pin + //#define NEOPIXEL2_TYPE NEOPIXEL_TYPE + //#define NEOPIXEL2_PIN 5 + #define NEOPIXEL_PIXELS 30 // Number of LEDs in the strip. (Longest strip when NEOPIXEL2_SEPARATE is disabled.) + #define NEOPIXEL_IS_SEQUENTIAL // Sequential display for temperature change - LED by LED. Disable to change all LEDs at once. + #define NEOPIXEL_BRIGHTNESS 127 // Initial brightness (0-255) + //#define NEOPIXEL_STARTUP_TEST // Cycle through colors at startup + + // Support for second Adafruit NeoPixel LED driver controlled with M150 S1 ... + //#define NEOPIXEL2_SEPARATE + #if ENABLED(NEOPIXEL2_SEPARATE) + #define NEOPIXEL2_PIXELS 15 // Number of LEDs in the second strip + #define NEOPIXEL2_BRIGHTNESS 127 // Initial brightness (0-255) + #define NEOPIXEL2_STARTUP_TEST // Cycle through colors at startup + #else + //#define NEOPIXEL2_INSERIES // Default behavior is NeoPixel 2 in parallel + #endif + + // Use a single NeoPixel LED for static (background) lighting + //#define NEOPIXEL_BKGD_LED_INDEX 0 // Index of the LED to use + //#define NEOPIXEL_BKGD_COLOR { 255, 255, 255, 0 } // R, G, B, W + //#define NEOPIXEL_BKGD_ALWAYS_ON // Keep the backlight on when other NeoPixels are off +#endif + +/** + * Printer Event LEDs + * + * During printing, the LEDs will reflect the printer status: + * + * - Gradually change from blue to violet as the heated bed gets to target temp + * - Gradually change from violet to red as the hotend gets to temperature + * - Change to white to illuminate work surface + * - Change to green once print has finished + * - Turn off after the print has finished and the user has pushed a button + */ +#if ANY(BLINKM, RGB_LED, RGBW_LED, PCA9632, PCA9533, NEOPIXEL_LED) + #define PRINTER_EVENT_LEDS +#endif + +/** + * Number of servos + * + * For some servo-related options NUM_SERVOS will be set automatically. + * Set this manually if there are extra servos needing manual control. + * Set to 0 to turn off servo support. + */ +//#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command + +// (ms) Delay before the next move will start, to give the servo time to reach its target angle. +// 300ms is a good value but you can try less delay. +// If the servo can't reach the requested position, increase it. +#define SERVO_DELAY { 300 } + +// Only power servos during movement, otherwise leave off to prevent jitter +//#define DEACTIVATE_SERVOS_AFTER_MOVE + +// Edit servo angles with M281 and save to EEPROM with M500 +//#define EDITABLE_SERVO_ANGLES diff --git a/config/examples/Nextion/Configuration_adv.h b/config/examples/Nextion/Configuration_adv.h new file mode 100644 index 0000000000..decbedb0e8 --- /dev/null +++ b/config/examples/Nextion/Configuration_adv.h @@ -0,0 +1,3842 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +/** + * Configuration_adv.h + * + * Advanced settings. + * Only change these if you know exactly what you're doing. + * Some of these settings can damage your printer if improperly set! + * + * Basic settings can be found in Configuration.h + */ +#define CONFIGURATION_ADV_H_VERSION 020008 + +//=========================================================================== +//============================= Thermal Settings ============================ +//=========================================================================== +// @section temperature + +/** + * Thermocouple sensors are quite sensitive to noise. Any noise induced in + * the sensor wires, such as by stepper motor wires run in parallel to them, + * may result in the thermocouple sensor reporting spurious errors. This + * value is the number of errors which can occur in a row before the error + * is reported. This allows us to ignore intermittent error conditions while + * still detecting an actual failure, which should result in a continuous + * stream of errors from the sensor. + * + * Set this value to 0 to fail on the first error to occur. + */ +#define THERMOCOUPLE_MAX_ERRORS 15 + +// +// Custom Thermistor 1000 parameters +// +#if TEMP_SENSOR_0 == 1000 + #define HOTEND0_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND0_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND0_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_1 == 1000 + #define HOTEND1_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND1_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND1_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_2 == 1000 + #define HOTEND2_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND2_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND2_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_3 == 1000 + #define HOTEND3_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND3_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND3_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_4 == 1000 + #define HOTEND4_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND4_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND4_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_5 == 1000 + #define HOTEND5_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND5_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND5_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_6 == 1000 + #define HOTEND6_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND6_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND6_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_7 == 1000 + #define HOTEND7_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define HOTEND7_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define HOTEND7_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_BED == 1000 + #define BED_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define BED_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define BED_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_CHAMBER == 1000 + #define CHAMBER_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define CHAMBER_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define CHAMBER_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_COOLER == 1000 + #define COOLER_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define COOLER_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define COOLER_BETA 3950 // Beta value +#endif + +#if TEMP_SENSOR_PROBE == 1000 + #define PROBE_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define PROBE_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define PROBE_BETA 3950 // Beta value +#endif + +// +// Hephestos 2 24V heated bed upgrade kit. +// https://store.bq.com/en/heated-bed-kit-hephestos2 +// +//#define HEPHESTOS2_HEATED_BED_KIT +#if ENABLED(HEPHESTOS2_HEATED_BED_KIT) + #undef TEMP_SENSOR_BED + #define TEMP_SENSOR_BED 70 + #define HEATER_BED_INVERTING true +#endif + +// +// Heated Bed Bang-Bang options +// +#if DISABLED(PIDTEMPBED) + #define BED_CHECK_INTERVAL 5000 // (ms) Interval between checks in bang-bang control + #if ENABLED(BED_LIMIT_SWITCHING) + #define BED_HYSTERESIS 2 // (°C) Only set the relevant heater state when ABS(T-target) > BED_HYSTERESIS + #endif +#endif + +// +// Heated Chamber options +// +#if DISABLED(PIDTEMPCHAMBER) + #define CHAMBER_CHECK_INTERVAL 5000 // (ms) Interval between checks in bang-bang control + #if ENABLED(CHAMBER_LIMIT_SWITCHING) + #define CHAMBER_HYSTERESIS 2 // (°C) Only set the relevant heater state when ABS(T-target) > CHAMBER_HYSTERESIS + #endif +#endif + +#if TEMP_SENSOR_CHAMBER + //#define HEATER_CHAMBER_PIN P2_04 // Required heater on/off pin (example: SKR 1.4 Turbo HE1 plug) + //#define HEATER_CHAMBER_INVERTING false + //#define FAN1_PIN -1 // Remove the fan signal on pin P2_04 (example: SKR 1.4 Turbo HE1 plug) + + //#define CHAMBER_FAN // Enable a fan on the chamber + #if ENABLED(CHAMBER_FAN) + #define CHAMBER_FAN_MODE 2 // Fan control mode: 0=Static; 1=Linear increase when temp is higher than target; 2=V-shaped curve. + #if CHAMBER_FAN_MODE == 0 + #define CHAMBER_FAN_BASE 255 // Chamber fan PWM (0-255) + #elif CHAMBER_FAN_MODE == 1 + #define CHAMBER_FAN_BASE 128 // Base chamber fan PWM (0-255); turns on when chamber temperature is above the target + #define CHAMBER_FAN_FACTOR 25 // PWM increase per °C above target + #elif CHAMBER_FAN_MODE == 2 + #define CHAMBER_FAN_BASE 128 // Minimum chamber fan PWM (0-255) + #define CHAMBER_FAN_FACTOR 25 // PWM increase per °C difference from target + #endif + #endif + + //#define CHAMBER_VENT // Enable a servo-controlled vent on the chamber + #if ENABLED(CHAMBER_VENT) + #define CHAMBER_VENT_SERVO_NR 1 // Index of the vent servo + #define HIGH_EXCESS_HEAT_LIMIT 5 // How much above target temp to consider there is excess heat in the chamber + #define LOW_EXCESS_HEAT_LIMIT 3 + #define MIN_COOLING_SLOPE_TIME_CHAMBER_VENT 20 + #define MIN_COOLING_SLOPE_DEG_CHAMBER_VENT 1.5 + #endif +#endif + +// +// Laser Cooler options +// +#if TEMP_SENSOR_COOLER + #define COOLER_MINTEMP 8 // (°C) + #define COOLER_MAXTEMP 26 // (°C) + #define COOLER_DEFAULT_TEMP 16 // (°C) + #define TEMP_COOLER_HYSTERESIS 1 // (°C) Temperature proximity considered "close enough" to the target + #define COOLER_PIN 8 // Laser cooler on/off pin used to control power to the cooling element e.g. TEC, External chiller via relay + #define COOLER_INVERTING false + #define TEMP_COOLER_PIN 15 // Laser/Cooler temperature sensor pin. ADC is required. + #define COOLER_FAN // Enable a fan on the cooler, Fan# 0,1,2,3 etc. + #define COOLER_FAN_INDEX 0 // FAN number 0, 1, 2 etc. e.g. + #if ENABLED(COOLER_FAN) + #define COOLER_FAN_BASE 100 // Base Cooler fan PWM (0-255); turns on when Cooler temperature is above the target + #define COOLER_FAN_FACTOR 25 // PWM increase per °C above target + #endif +#endif + +/** + * Thermal Protection provides additional protection to your printer from damage + * and fire. Marlin always includes safe min and max temperature ranges which + * protect against a broken or disconnected thermistor wire. + * + * The issue: If a thermistor falls out, it will report the much lower + * temperature of the air in the room, and the the firmware will keep + * the heater on. + * + * The solution: Once the temperature reaches the target, start observing. + * If the temperature stays too far below the target (hysteresis) for too + * long (period), the firmware will halt the machine as a safety precaution. + * + * If you get false positives for "Thermal Runaway", increase + * THERMAL_PROTECTION_HYSTERESIS and/or THERMAL_PROTECTION_PERIOD + */ +#if ENABLED(THERMAL_PROTECTION_HOTENDS) + #define THERMAL_PROTECTION_PERIOD 40 // Seconds + #define THERMAL_PROTECTION_HYSTERESIS 4 // Degrees Celsius + + //#define ADAPTIVE_FAN_SLOWING // Slow part cooling fan if temperature drops + #if BOTH(ADAPTIVE_FAN_SLOWING, PIDTEMP) + //#define NO_FAN_SLOWING_IN_PID_TUNING // Don't slow fan speed during M303 + #endif + + /** + * Whenever an M104, M109, or M303 increases the target temperature, the + * firmware will wait for the WATCH_TEMP_PERIOD to expire. If the temperature + * hasn't increased by WATCH_TEMP_INCREASE degrees, the machine is halted and + * requires a hard reset. This test restarts with any M104/M109/M303, but only + * if the current temperature is far enough below the target for a reliable + * test. + * + * If you get false positives for "Heating failed", increase WATCH_TEMP_PERIOD + * and/or decrease WATCH_TEMP_INCREASE. WATCH_TEMP_INCREASE should not be set + * below 2. + */ + #define WATCH_TEMP_PERIOD 20 // Seconds + #define WATCH_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the bed are just as above for hotends. + */ +#if ENABLED(THERMAL_PROTECTION_BED) + #define THERMAL_PROTECTION_BED_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_BED_HYSTERESIS 2 // Degrees Celsius + + /** + * As described above, except for the bed (M140/M190/M303). + */ + #define WATCH_BED_TEMP_PERIOD 60 // Seconds + #define WATCH_BED_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the heated chamber. + */ +#if ENABLED(THERMAL_PROTECTION_CHAMBER) + #define THERMAL_PROTECTION_CHAMBER_PERIOD 20 // Seconds + #define THERMAL_PROTECTION_CHAMBER_HYSTERESIS 2 // Degrees Celsius + + /** + * Heated chamber watch settings (M141/M191). + */ + #define WATCH_CHAMBER_TEMP_PERIOD 60 // Seconds + #define WATCH_CHAMBER_TEMP_INCREASE 2 // Degrees Celsius +#endif + +/** + * Thermal Protection parameters for the laser cooler. + */ +#if ENABLED(THERMAL_PROTECTION_COOLER) + #define THERMAL_PROTECTION_COOLER_PERIOD 10 // Seconds + #define THERMAL_PROTECTION_COOLER_HYSTERESIS 3 // Degrees Celsius + + /** + * Laser cooling watch settings (M143/M193). + */ + #define WATCH_COOLER_TEMP_PERIOD 60 // Seconds + #define WATCH_COOLER_TEMP_INCREASE 3 // Degrees Celsius +#endif + +#if ENABLED(PIDTEMP) + // Add an experimental additional term to the heater power, proportional to the extrusion speed. + // A well-chosen Kc value should add just enough power to melt the increased material volume. + //#define PID_EXTRUSION_SCALING + #if ENABLED(PID_EXTRUSION_SCALING) + #define DEFAULT_Kc (100) // heating power = Kc * e_speed + #define LPQ_MAX_LEN 50 + #endif + + /** + * Add an experimental additional term to the heater power, proportional to the fan speed. + * A well-chosen Kf value should add just enough power to compensate for power-loss from the cooling fan. + * You can either just add a constant compensation with the DEFAULT_Kf value + * or follow the instruction below to get speed-dependent compensation. + * + * Constant compensation (use only with fanspeeds of 0% and 100%) + * --------------------------------------------------------------------- + * A good starting point for the Kf-value comes from the calculation: + * kf = (power_fan * eff_fan) / power_heater * 255 + * where eff_fan is between 0.0 and 1.0, based on fan-efficiency and airflow to the nozzle / heater. + * + * Example: + * Heater: 40W, Fan: 0.1A * 24V = 2.4W, eff_fan = 0.8 + * Kf = (2.4W * 0.8) / 40W * 255 = 12.24 + * + * Fan-speed dependent compensation + * -------------------------------- + * 1. To find a good Kf value, set the hotend temperature, wait for it to settle, and enable the fan (100%). + * Make sure PID_FAN_SCALING_LIN_FACTOR is 0 and PID_FAN_SCALING_ALTERNATIVE_DEFINITION is not enabled. + * If you see the temperature drop repeat the test, increasing the Kf value slowly, until the temperature + * drop goes away. If the temperature overshoots after enabling the fan, the Kf value is too big. + * 2. Note the Kf-value for fan-speed at 100% + * 3. Determine a good value for PID_FAN_SCALING_MIN_SPEED, which is around the speed, where the fan starts moving. + * 4. Repeat step 1. and 2. for this fan speed. + * 5. Enable PID_FAN_SCALING_ALTERNATIVE_DEFINITION and enter the two identified Kf-values in + * PID_FAN_SCALING_AT_FULL_SPEED and PID_FAN_SCALING_AT_MIN_SPEED. Enter the minimum speed in PID_FAN_SCALING_MIN_SPEED + */ + //#define PID_FAN_SCALING + #if ENABLED(PID_FAN_SCALING) + //#define PID_FAN_SCALING_ALTERNATIVE_DEFINITION + #if ENABLED(PID_FAN_SCALING_ALTERNATIVE_DEFINITION) + // The alternative definition is used for an easier configuration. + // Just figure out Kf at fullspeed (255) and PID_FAN_SCALING_MIN_SPEED. + // DEFAULT_Kf and PID_FAN_SCALING_LIN_FACTOR are calculated accordingly. + + #define PID_FAN_SCALING_AT_FULL_SPEED 13.0 //=PID_FAN_SCALING_LIN_FACTOR*255+DEFAULT_Kf + #define PID_FAN_SCALING_AT_MIN_SPEED 6.0 //=PID_FAN_SCALING_LIN_FACTOR*PID_FAN_SCALING_MIN_SPEED+DEFAULT_Kf + #define PID_FAN_SCALING_MIN_SPEED 10.0 // Minimum fan speed at which to enable PID_FAN_SCALING + + #define DEFAULT_Kf (255.0*PID_FAN_SCALING_AT_MIN_SPEED-PID_FAN_SCALING_AT_FULL_SPEED*PID_FAN_SCALING_MIN_SPEED)/(255.0-PID_FAN_SCALING_MIN_SPEED) + #define PID_FAN_SCALING_LIN_FACTOR (PID_FAN_SCALING_AT_FULL_SPEED-DEFAULT_Kf)/255.0 + + #else + #define PID_FAN_SCALING_LIN_FACTOR (0) // Power loss due to cooling = Kf * (fan_speed) + #define DEFAULT_Kf 10 // A constant value added to the PID-tuner + #define PID_FAN_SCALING_MIN_SPEED 10 // Minimum fan speed at which to enable PID_FAN_SCALING + #endif + #endif +#endif + +/** + * Automatic Temperature Mode + * + * Dynamically adjust the hotend target temperature based on planned E moves. + * + * (Contrast with PID_EXTRUSION_SCALING, which tracks E movement and adjusts PID + * behavior using an additional kC value.) + * + * Autotemp is calculated by (mintemp + factor * mm_per_sec), capped to maxtemp. + * + * Enable Autotemp Mode with M104/M109 F S B. + * Disable by sending M104/M109 with no F parameter (or F0 with AUTOTEMP_PROPORTIONAL). + */ +#define AUTOTEMP +#if ENABLED(AUTOTEMP) + #define AUTOTEMP_OLDWEIGHT 0.98 + // Turn on AUTOTEMP on M104/M109 by default using proportions set here + //#define AUTOTEMP_PROPORTIONAL + #if ENABLED(AUTOTEMP_PROPORTIONAL) + #define AUTOTEMP_MIN_P 0 // (°C) Added to the target temperature + #define AUTOTEMP_MAX_P 5 // (°C) Added to the target temperature + #define AUTOTEMP_FACTOR_P 1 // Apply this F parameter by default (overridden by M104/M109 F) + #endif +#endif + +// Show Temperature ADC value +// Enable for M105 to include ADC values read from temperature sensors. +//#define SHOW_TEMP_ADC_VALUES + +/** + * High Temperature Thermistor Support + * + * Thermistors able to support high temperature tend to have a hard time getting + * good readings at room and lower temperatures. This means TEMP_SENSOR_X_RAW_LO_TEMP + * will probably be caught when the heating element first turns on during the + * preheating process, which will trigger a min_temp_error as a safety measure + * and force stop everything. + * To circumvent this limitation, we allow for a preheat time (during which, + * min_temp_error won't be triggered) and add a min_temp buffer to handle + * aberrant readings. + * + * If you want to enable this feature for your hotend thermistor(s) + * uncomment and set values > 0 in the constants below + */ + +// The number of consecutive low temperature errors that can occur +// before a min_temp_error is triggered. (Shouldn't be more than 10.) +//#define MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED 0 + +// The number of milliseconds a hotend will preheat before starting to check +// the temperature. This value should NOT be set to the time it takes the +// hot end to reach the target temperature, but the time it takes to reach +// the minimum temperature your thermistor can read. The lower the better/safer. +// This shouldn't need to be more than 30 seconds (30000) +//#define MILLISECONDS_PREHEAT_TIME 0 + +// @section extruder + +// Extruder runout prevention. +// If the machine is idle and the temperature over MINTEMP +// then extrude some filament every couple of SECONDS. +//#define EXTRUDER_RUNOUT_PREVENT +#if ENABLED(EXTRUDER_RUNOUT_PREVENT) + #define EXTRUDER_RUNOUT_MINTEMP 190 + #define EXTRUDER_RUNOUT_SECONDS 30 + #define EXTRUDER_RUNOUT_SPEED 1500 // (mm/min) + #define EXTRUDER_RUNOUT_EXTRUDE 5 // (mm) +#endif + +/** + * Hotend Idle Timeout + * Prevent filament in the nozzle from charring and causing a critical jam. + */ +//#define HOTEND_IDLE_TIMEOUT +#if ENABLED(HOTEND_IDLE_TIMEOUT) + #define HOTEND_IDLE_TIMEOUT_SEC (5*60) // (seconds) Time without extruder movement to trigger protection + #define HOTEND_IDLE_MIN_TRIGGER 180 // (°C) Minimum temperature to enable hotend protection + #define HOTEND_IDLE_NOZZLE_TARGET 0 // (°C) Safe temperature for the nozzle after timeout + #define HOTEND_IDLE_BED_TARGET 0 // (°C) Safe temperature for the bed after timeout +#endif + +// @section temperature + +// Calibration for AD595 / AD8495 sensor to adjust temperature measurements. +// The final temperature is calculated as (measuredTemp * GAIN) + OFFSET. +#define TEMP_SENSOR_AD595_OFFSET 0.0 +#define TEMP_SENSOR_AD595_GAIN 1.0 +#define TEMP_SENSOR_AD8495_OFFSET 0.0 +#define TEMP_SENSOR_AD8495_GAIN 1.0 + +/** + * Controller Fan + * To cool down the stepper drivers and MOSFETs. + * + * The fan turns on automatically whenever any driver is enabled and turns + * off (or reduces to idle speed) shortly after drivers are turned off. + */ +//#define USE_CONTROLLER_FAN +#if ENABLED(USE_CONTROLLER_FAN) + //#define CONTROLLER_FAN_PIN -1 // Set a custom pin for the controller fan + //#define CONTROLLER_FAN_USE_Z_ONLY // With this option only the Z axis is considered + //#define CONTROLLER_FAN_IGNORE_Z // Ignore Z stepper. Useful when stepper timeout is disabled. + #define CONTROLLERFAN_SPEED_MIN 0 // (0-255) Minimum speed. (If set below this value the fan is turned off.) + #define CONTROLLERFAN_SPEED_ACTIVE 255 // (0-255) Active speed, used when any motor is enabled + #define CONTROLLERFAN_SPEED_IDLE 0 // (0-255) Idle speed, used when motors are disabled + #define CONTROLLERFAN_IDLE_TIME 60 // (seconds) Extra time to keep the fan running after disabling motors + //#define CONTROLLER_FAN_EDITABLE // Enable M710 configurable settings + #if ENABLED(CONTROLLER_FAN_EDITABLE) + #define CONTROLLER_FAN_MENU // Enable the Controller Fan submenu + #endif +#endif + +// When first starting the main fan, run it at full speed for the +// given number of milliseconds. This gets the fan spinning reliably +// before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) +//#define FAN_KICKSTART_TIME 100 + +// Some coolers may require a non-zero "off" state. +//#define FAN_OFF_PWM 1 + +/** + * PWM Fan Scaling + * + * Define the min/max speeds for PWM fans (as set with M106). + * + * With these options the M106 0-255 value range is scaled to a subset + * to ensure that the fan has enough power to spin, or to run lower + * current fans with higher current. (e.g., 5V/12V fans with 12V/24V) + * Value 0 always turns off the fan. + * + * Define one or both of these to override the default 0-255 range. + */ +//#define FAN_MIN_PWM 50 +//#define FAN_MAX_PWM 128 + +/** + * FAST PWM FAN Settings + * + * Use to change the FAST FAN PWM frequency (if enabled in Configuration.h) + * Combinations of PWM Modes, prescale values and TOP resolutions are used internally to produce a + * frequency as close as possible to the desired frequency. + * + * FAST_PWM_FAN_FREQUENCY [undefined by default] + * Set this to your desired frequency. + * If left undefined this defaults to F = F_CPU/(2*255*1) + * i.e., F = 31.4kHz on 16MHz microcontrollers or F = 39.2kHz on 20MHz microcontrollers. + * These defaults are the same as with the old FAST_PWM_FAN implementation - no migration is required + * NOTE: Setting very low frequencies (< 10 Hz) may result in unexpected timer behavior. + * + * USE_OCR2A_AS_TOP [undefined by default] + * Boards that use TIMER2 for PWM have limitations resulting in only a few possible frequencies on TIMER2: + * 16MHz MCUs: [62.5KHz, 31.4KHz (default), 7.8KHz, 3.92KHz, 1.95KHz, 977Hz, 488Hz, 244Hz, 60Hz, 122Hz, 30Hz] + * 20MHz MCUs: [78.1KHz, 39.2KHz (default), 9.77KHz, 4.9KHz, 2.44KHz, 1.22KHz, 610Hz, 305Hz, 153Hz, 76Hz, 38Hz] + * A greater range can be achieved by enabling USE_OCR2A_AS_TOP. But note that this option blocks the use of + * PWM on pin OC2A. Only use this option if you don't need PWM on 0C2A. (Check your schematic.) + * USE_OCR2A_AS_TOP sacrifices duty cycle control resolution to achieve this broader range of frequencies. + */ +#if ENABLED(FAST_PWM_FAN) + //#define FAST_PWM_FAN_FREQUENCY 31400 + //#define USE_OCR2A_AS_TOP +#endif + +// @section extruder + +/** + * Extruder cooling fans + * + * Extruder auto fans automatically turn on when their extruders' + * temperatures go above EXTRUDER_AUTO_FAN_TEMPERATURE. + * + * Your board's pins file specifies the recommended pins. Override those here + * or set to -1 to disable completely. + * + * Multiple extruders can be assigned to the same pin in which case + * the fan will turn on when any selected extruder is above the threshold. + */ +#define E0_AUTO_FAN_PIN -1 +#define E1_AUTO_FAN_PIN -1 +#define E2_AUTO_FAN_PIN -1 +#define E3_AUTO_FAN_PIN -1 +#define E4_AUTO_FAN_PIN -1 +#define E5_AUTO_FAN_PIN -1 +#define E6_AUTO_FAN_PIN -1 +#define E7_AUTO_FAN_PIN -1 +#define CHAMBER_AUTO_FAN_PIN -1 +#define COOLER_AUTO_FAN_PIN -1 +#define COOLER_FAN_PIN -1 + +#define EXTRUDER_AUTO_FAN_TEMPERATURE 50 +#define EXTRUDER_AUTO_FAN_SPEED 255 // 255 == full speed +#define CHAMBER_AUTO_FAN_TEMPERATURE 30 +#define CHAMBER_AUTO_FAN_SPEED 255 +#define COOLER_AUTO_FAN_TEMPERATURE 18 +#define COOLER_AUTO_FAN_SPEED 255 + +/** + * Part-Cooling Fan Multiplexer + * + * This feature allows you to digitally multiplex the fan output. + * The multiplexer is automatically switched at tool-change. + * Set FANMUX[012]_PINs below for up to 2, 4, or 8 multiplexed fans. + */ +#define FANMUX0_PIN -1 +#define FANMUX1_PIN -1 +#define FANMUX2_PIN -1 + +/** + * M355 Case Light on-off / brightness + */ +//#define CASE_LIGHT_ENABLE +#if ENABLED(CASE_LIGHT_ENABLE) + //#define CASE_LIGHT_PIN 4 // Override the default pin if needed + #define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW + #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on + #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. + //#define CASE_LIGHT_MAX_PWM 128 // Limit PWM duty cycle (0-255) + //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu + #if ENABLED(NEOPIXEL_LED) + //#define CASE_LIGHT_USE_NEOPIXEL // Use NeoPixel LED as case light + #endif + #if EITHER(RGB_LED, RGBW_LED) + //#define CASE_LIGHT_USE_RGB_LED // Use RGB / RGBW LED as case light + #endif + #if EITHER(CASE_LIGHT_USE_NEOPIXEL, CASE_LIGHT_USE_RGB_LED) + #define CASE_LIGHT_DEFAULT_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif +#endif + +// @section homing + +// If you want endstops to stay on (by default) even when not homing +// enable this option. Override at any time with M120, M121. +//#define ENDSTOPS_ALWAYS_ON_DEFAULT + +// @section extras + +//#define Z_LATE_ENABLE // Enable Z the last moment. Needed if your Z driver overheats. + +// Employ an external closed loop controller. Override pins here if needed. +//#define EXTERNAL_CLOSED_LOOP_CONTROLLER +#if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + //#define CLOSED_LOOP_ENABLE_PIN -1 + //#define CLOSED_LOOP_MOVE_COMPLETE_PIN -1 +#endif + +/** + * Dual Steppers / Dual Endstops + * + * This section will allow you to use extra E drivers to drive a second motor for X, Y, or Z axes. + * + * For example, set X_DUAL_STEPPER_DRIVERS setting to use a second motor. If the motors need to + * spin in opposite directions set INVERT_X2_VS_X_DIR. If the second motor needs its own endstop + * set X_DUAL_ENDSTOPS. This can adjust for "racking." Use X2_USE_ENDSTOP to set the endstop plug + * that should be used for the second endstop. Extra endstops will appear in the output of 'M119'. + * + * Use X_DUAL_ENDSTOP_ADJUSTMENT to adjust for mechanical imperfection. After homing both motors + * this offset is applied to the X2 motor. To find the offset home the X axis, and measure the error + * in X2. Dual endstop offsets can be set at runtime with 'M666 X Y Z'. + */ + +//#define X_DUAL_STEPPER_DRIVERS +#if ENABLED(X_DUAL_STEPPER_DRIVERS) + //#define INVERT_X2_VS_X_DIR // Enable if X2 direction signal is opposite to X + //#define X_DUAL_ENDSTOPS + #if ENABLED(X_DUAL_ENDSTOPS) + #define X2_USE_ENDSTOP _XMAX_ + #define X2_ENDSTOP_ADJUSTMENT 0 + #endif +#endif + +//#define Y_DUAL_STEPPER_DRIVERS +#if ENABLED(Y_DUAL_STEPPER_DRIVERS) + //#define INVERT_Y2_VS_Y_DIR // Enable if Y2 direction signal is opposite to Y + //#define Y_DUAL_ENDSTOPS + #if ENABLED(Y_DUAL_ENDSTOPS) + #define Y2_USE_ENDSTOP _YMAX_ + #define Y2_ENDSTOP_ADJUSTMENT 0 + #endif +#endif + +// +// For Z set the number of stepper drivers +// +#define NUM_Z_STEPPER_DRIVERS 1 // (1-4) Z options change based on how many + +#if NUM_Z_STEPPER_DRIVERS > 1 + // Enable if Z motor direction signals are the opposite of Z1 + //#define INVERT_Z2_VS_Z_DIR + //#define INVERT_Z3_VS_Z_DIR + //#define INVERT_Z4_VS_Z_DIR + + //#define Z_MULTI_ENDSTOPS + #if ENABLED(Z_MULTI_ENDSTOPS) + #define Z2_USE_ENDSTOP _XMAX_ + #define Z2_ENDSTOP_ADJUSTMENT 0 + #if NUM_Z_STEPPER_DRIVERS >= 3 + #define Z3_USE_ENDSTOP _YMAX_ + #define Z3_ENDSTOP_ADJUSTMENT 0 + #endif + #if NUM_Z_STEPPER_DRIVERS >= 4 + #define Z4_USE_ENDSTOP _ZMAX_ + #define Z4_ENDSTOP_ADJUSTMENT 0 + #endif + #endif +#endif + +/** + * Dual X Carriage + * + * This setup has two X carriages that can move independently, each with its own hotend. + * The carriages can be used to print an object with two colors or materials, or in + * "duplication mode" it can print two identical or X-mirrored objects simultaneously. + * The inactive carriage is parked automatically to prevent oozing. + * X1 is the left carriage, X2 the right. They park and home at opposite ends of the X axis. + * By default the X2 stepper is assigned to the first unused E plug on the board. + * + * The following Dual X Carriage modes can be selected with M605 S: + * + * 0 : (FULL_CONTROL) The slicer has full control over both X-carriages and can achieve optimal travel + * results as long as it supports dual X-carriages. (M605 S0) + * + * 1 : (AUTO_PARK) The firmware automatically parks and unparks the X-carriages on tool-change so + * that additional slicer support is not required. (M605 S1) + * + * 2 : (DUPLICATION) The firmware moves the second X-carriage and extruder in synchronization with + * the first X-carriage and extruder, to print 2 copies of the same object at the same time. + * Set the constant X-offset and temperature differential with M605 S2 X[offs] R[deg] and + * follow with M605 S2 to initiate duplicated movement. + * + * 3 : (MIRRORED) Formbot/Vivedino-inspired mirrored mode in which the second extruder duplicates + * the movement of the first except the second extruder is reversed in the X axis. + * Set the initial X offset and temperature differential with M605 S2 X[offs] R[deg] and + * follow with M605 S3 to initiate mirrored movement. + */ +//#define DUAL_X_CARRIAGE +#if ENABLED(DUAL_X_CARRIAGE) + #define X1_MIN_POS X_MIN_POS // Set to X_MIN_POS + #define X1_MAX_POS X_BED_SIZE // Set a maximum so the first X-carriage can't hit the parked second X-carriage + #define X2_MIN_POS 80 // Set a minimum to ensure the second X-carriage can't hit the parked first X-carriage + #define X2_MAX_POS 353 // Set this to the distance between toolheads when both heads are homed + #define X2_HOME_DIR 1 // Set to 1. The second X-carriage always homes to the maximum endstop position + #define X2_HOME_POS X2_MAX_POS // Default X2 home position. Set to X2_MAX_POS. + // However: In this mode the HOTEND_OFFSET_X value for the second extruder provides a software + // override for X2_HOME_POS. This also allow recalibration of the distance between the two endstops + // without modifying the firmware (through the "M218 T1 X???" command). + // Remember: you should set the second extruder x-offset to 0 in your slicer. + + // This is the default power-up mode which can be later using M605. + #define DEFAULT_DUAL_X_CARRIAGE_MODE DXC_AUTO_PARK_MODE + + // Default x offset in duplication mode (typically set to half print bed width) + #define DEFAULT_DUPLICATION_X_OFFSET 100 + + // Default action to execute following M605 mode change commands. Typically G28X to apply new mode. + //#define EVENT_GCODE_IDEX_AFTER_MODECHANGE "G28X" +#endif + +// Activate a solenoid on the active extruder with M380. Disable all with M381. +// Define SOL0_PIN, SOL1_PIN, etc., for each extruder that has a solenoid. +//#define EXT_SOLENOID + +// @section homing + +/** + * Homing Procedure + * Homing (G28) does an indefinite move towards the endstops to establish + * the position of the toolhead relative to the workspace. + */ + +//#define SENSORLESS_BACKOFF_MM { 2, 2 } // (mm) Backoff from endstops before sensorless homing + +#define HOMING_BUMP_MM { 5, 5, 2 } // (mm) Backoff from endstops after first bump +#define HOMING_BUMP_DIVISOR { 2, 2, 4 } // Re-Bump Speed Divisor (Divides the Homing Feedrate) + +//#define HOMING_BACKOFF_POST_MM { 2, 2, 2 } // (mm) Backoff from endstops after homing + +//#define QUICK_HOME // If G28 contains XY do a diagonal move first +//#define HOME_Y_BEFORE_X // If G28 contains XY home Y before X +//#define HOME_Z_FIRST // Home Z first. Requires a Z-MIN endstop (not a probe). +//#define CODEPENDENT_XY_HOMING // If X/Y can't home without homing Y/X first + +// @section bltouch + +#if ENABLED(BLTOUCH) + /** + * Either: Use the defaults (recommended) or: For special purposes, use the following DEFINES + * Do not activate settings that the probe might not understand. Clones might misunderstand + * advanced commands. + * + * Note: If the probe is not deploying, do a "Reset" and "Self-Test" and then check the + * wiring of the BROWN, RED and ORANGE wires. + * + * Note: If the trigger signal of your probe is not being recognized, it has been very often + * because the BLACK and WHITE wires needed to be swapped. They are not "interchangeable" + * like they would be with a real switch. So please check the wiring first. + * + * Settings for all BLTouch and clone probes: + */ + + // Safety: The probe needs time to recognize the command. + // Minimum command delay (ms). Enable and increase if needed. + //#define BLTOUCH_DELAY 500 + + /** + * Settings for BLTOUCH Classic 1.2, 1.3 or BLTouch Smart 1.0, 2.0, 2.2, 3.0, 3.1, and most clones: + */ + + // Feature: Switch into SW mode after a deploy. It makes the output pulse longer. Can be useful + // in special cases, like noisy or filtered input configurations. + //#define BLTOUCH_FORCE_SW_MODE + + /** + * Settings for BLTouch Smart 3.0 and 3.1 + * Summary: + * - Voltage modes: 5V and OD (open drain - "logic voltage free") output modes + * - High-Speed mode + * - Disable LCD voltage options + */ + + /** + * Danger: Don't activate 5V mode unless attached to a 5V-tolerant controller! + * V3.0 or 3.1: Set default mode to 5V mode at Marlin startup. + * If disabled, OD mode is the hard-coded default on 3.0 + * On startup, Marlin will compare its eeprom to this value. If the selected mode + * differs, a mode set eeprom write will be completed at initialization. + * Use the option below to force an eeprom write to a V3.1 probe regardless. + */ + //#define BLTOUCH_SET_5V_MODE + + /** + * Safety: Activate if connecting a probe with an unknown voltage mode. + * V3.0: Set a probe into mode selected above at Marlin startup. Required for 5V mode on 3.0 + * V3.1: Force a probe with unknown mode into selected mode at Marlin startup ( = Probe EEPROM write ) + * To preserve the life of the probe, use this once then turn it off and re-flash. + */ + //#define BLTOUCH_FORCE_MODE_SET + + /** + * Use "HIGH SPEED" mode for probing. + * Danger: Disable if your probe sometimes fails. Only suitable for stable well-adjusted systems. + * This feature was designed for Deltabots with very fast Z moves; however, higher speed Cartesians + * might be able to use it. If the machine can't raise Z fast enough the BLTouch may go into ALARM. + */ + //#define BLTOUCH_HS_MODE + + // Safety: Enable voltage mode settings in the LCD menu. + //#define BLTOUCH_LCD_VOLTAGE_MENU + +#endif // BLTOUCH + +// @section extras + +/** + * Z Steppers Auto-Alignment + * Add the G34 command to align multiple Z steppers using a bed probe. + */ +//#define Z_STEPPER_AUTO_ALIGN +#if ENABLED(Z_STEPPER_AUTO_ALIGN) + // Define probe X and Y positions for Z1, Z2 [, Z3 [, Z4]] + // If not defined, probe limits will be used. + // Override with 'M422 S X Y' + //#define Z_STEPPER_ALIGN_XY { { 10, 190 }, { 100, 10 }, { 190, 190 } } + + /** + * Orientation for the automatically-calculated probe positions. + * Override Z stepper align points with 'M422 S X Y' + * + * 2 Steppers: (0) (1) + * | | 2 | + * | 1 2 | | + * | | 1 | + * + * 3 Steppers: (0) (1) (2) (3) + * | 3 | 1 | 2 1 | 2 | + * | | 3 | | 3 | + * | 1 2 | 2 | 3 | 1 | + * + * 4 Steppers: (0) (1) (2) (3) + * | 4 3 | 1 4 | 2 1 | 3 2 | + * | | | | | + * | 1 2 | 2 3 | 3 4 | 4 1 | + */ + #ifndef Z_STEPPER_ALIGN_XY + //#define Z_STEPPERS_ORIENTATION 0 + #endif + + // Provide Z stepper positions for more rapid convergence in bed alignment. + // Requires triple stepper drivers (i.e., set NUM_Z_STEPPER_DRIVERS to 3) + //#define Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS + #if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) + // Define Stepper XY positions for Z1, Z2, Z3 corresponding to + // the Z screw positions in the bed carriage. + // Define one position per Z stepper in stepper driver order. + #define Z_STEPPER_ALIGN_STEPPER_XY { { 210.7, 102.5 }, { 152.6, 220.0 }, { 94.5, 102.5 } } + #else + // Amplification factor. Used to scale the correction step up or down in case + // the stepper (spindle) position is farther out than the test point. + #define Z_STEPPER_ALIGN_AMP 1.0 // Use a value > 1.0 NOTE: This may cause instability! + #endif + + // On a 300mm bed a 5% grade would give a misalignment of ~1.5cm + #define G34_MAX_GRADE 5 // (%) Maximum incline that G34 will handle + #define Z_STEPPER_ALIGN_ITERATIONS 5 // Number of iterations to apply during alignment + #define Z_STEPPER_ALIGN_ACC 0.02 // Stop iterating early if the accuracy is better than this + #define RESTORE_LEVELING_AFTER_G34 // Restore leveling after G34 is done? + // After G34, re-home Z (G28 Z) or just calculate it from the last probe heights? + // Re-homing might be more precise in reproducing the actual 'G28 Z' homing height, especially on an uneven bed. + #define HOME_AFTER_G34 +#endif + +// +// Add the G35 command to read bed corners to help adjust screws. Requires a bed probe. +// +//#define ASSISTED_TRAMMING +#if ENABLED(ASSISTED_TRAMMING) + + // Define positions for probe points. + #define TRAMMING_POINT_XY { { 20, 20 }, { 180, 20 }, { 180, 180 }, { 20, 180 } } + + // Define position names for probe points. + #define TRAMMING_POINT_NAME_1 "Front-Left" + #define TRAMMING_POINT_NAME_2 "Front-Right" + #define TRAMMING_POINT_NAME_3 "Back-Right" + #define TRAMMING_POINT_NAME_4 "Back-Left" + + #define RESTORE_LEVELING_AFTER_G35 // Enable to restore leveling setup after operation + //#define REPORT_TRAMMING_MM // Report Z deviation (mm) for each point relative to the first + + //#define ASSISTED_TRAMMING_WIZARD // Add a Tramming Wizard to the LCD menu + + //#define ASSISTED_TRAMMING_WAIT_POSITION { X_CENTER, Y_CENTER, 30 } // Move the nozzle out of the way for adjustment + + /** + * Screw thread: + * M3: 30 = Clockwise, 31 = Counter-Clockwise + * M4: 40 = Clockwise, 41 = Counter-Clockwise + * M5: 50 = Clockwise, 51 = Counter-Clockwise + */ + #define TRAMMING_SCREW_THREAD 30 + +#endif + +// @section motion + +#define AXIS_RELATIVE_MODES { false, false, false, false } + +// Add a Duplicate option for well-separated conjoined nozzles +//#define MULTI_NOZZLE_DUPLICATION + +// By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. +#define INVERT_X_STEP_PIN false +#define INVERT_Y_STEP_PIN false +#define INVERT_Z_STEP_PIN false +#define INVERT_E_STEP_PIN false + +/** + * Idle Stepper Shutdown + * Set DISABLE_INACTIVE_? 'true' to shut down axis steppers after an idle period. + * The Deactive Time can be overridden with M18 and M84. Set to 0 for No Timeout. + */ +#define DEFAULT_STEPPER_DEACTIVE_TIME 120 +#define DISABLE_INACTIVE_X true +#define DISABLE_INACTIVE_Y true +#define DISABLE_INACTIVE_Z true // Set 'false' if the nozzle could fall onto your printed part! +#define DISABLE_INACTIVE_E true + +// Default Minimum Feedrates for printing and travel moves +#define DEFAULT_MINIMUMFEEDRATE 0.0 // (mm/s) Minimum feedrate. Set with M205 S. +#define DEFAULT_MINTRAVELFEEDRATE 0.0 // (mm/s) Minimum travel feedrate. Set with M205 T. + +// Minimum time that a segment needs to take as the buffer gets emptied +#define DEFAULT_MINSEGMENTTIME 20000 // (µs) Set with M205 B. + +// Slow down the machine if the lookahead buffer is (by default) half full. +// Increase the slowdown divisor for larger buffer sizes. +#define SLOWDOWN +#if ENABLED(SLOWDOWN) + #define SLOWDOWN_DIVISOR 2 +#endif + +/** + * XY Frequency limit + * Reduce resonance by limiting the frequency of small zigzag infill moves. + * See https://hydraraptor.blogspot.com/2010/12/frequency-limit.html + * Use M201 F G to change limits at runtime. + */ +//#define XY_FREQUENCY_LIMIT 10 // (Hz) Maximum frequency of small zigzag infill moves. Set with M201 F. +#ifdef XY_FREQUENCY_LIMIT + #define XY_FREQUENCY_MIN_PERCENT 5 // (percent) Minimum FR percentage to apply. Set with M201 G. +#endif + +// Minimum planner junction speed. Sets the default minimum speed the planner plans for at the end +// of the buffer and all stops. This should not be much greater than zero and should only be changed +// if unwanted behavior is observed on a user's machine when running at very slow speeds. +#define MINIMUM_PLANNER_SPEED 0.05 // (mm/s) + +// +// Backlash Compensation +// Adds extra movement to axes on direction-changes to account for backlash. +// +//#define BACKLASH_COMPENSATION +#if ENABLED(BACKLASH_COMPENSATION) + // Define values for backlash distance and correction. + // If BACKLASH_GCODE is enabled these values are the defaults. + #define BACKLASH_DISTANCE_MM { 0, 0, 0 } // (mm) + #define BACKLASH_CORRECTION 0.0 // 0.0 = no correction; 1.0 = full correction + + // Set BACKLASH_SMOOTHING_MM to spread backlash correction over multiple segments + // to reduce print artifacts. (Enabling this is costly in memory and computation!) + //#define BACKLASH_SMOOTHING_MM 3 // (mm) + + // Add runtime configuration and tuning of backlash values (M425) + //#define BACKLASH_GCODE + + #if ENABLED(BACKLASH_GCODE) + // Measure the Z backlash when probing (G29) and set with "M425 Z" + #define MEASURE_BACKLASH_WHEN_PROBING + + #if ENABLED(MEASURE_BACKLASH_WHEN_PROBING) + // When measuring, the probe will move up to BACKLASH_MEASUREMENT_LIMIT + // mm away from point of contact in BACKLASH_MEASUREMENT_RESOLUTION + // increments while checking for the contact to be broken. + #define BACKLASH_MEASUREMENT_LIMIT 0.5 // (mm) + #define BACKLASH_MEASUREMENT_RESOLUTION 0.005 // (mm) + #define BACKLASH_MEASUREMENT_FEEDRATE Z_PROBE_FEEDRATE_SLOW // (mm/min) + #endif + #endif +#endif + +/** + * Automatic backlash, position and hotend offset calibration + * + * Enable G425 to run automatic calibration using an electrically- + * conductive cube, bolt, or washer mounted on the bed. + * + * G425 uses the probe to touch the top and sides of the calibration object + * on the bed and measures and/or correct positional offsets, axis backlash + * and hotend offsets. + * + * Note: HOTEND_OFFSET and CALIBRATION_OBJECT_CENTER must be set to within + * ±5mm of true values for G425 to succeed. + */ +//#define CALIBRATION_GCODE +#if ENABLED(CALIBRATION_GCODE) + + //#define CALIBRATION_SCRIPT_PRE "M117 Starting Auto-Calibration\nT0\nG28\nG12\nM117 Calibrating..." + //#define CALIBRATION_SCRIPT_POST "M500\nM117 Calibration data saved" + + #define CALIBRATION_MEASUREMENT_RESOLUTION 0.01 // mm + + #define CALIBRATION_FEEDRATE_SLOW 60 // mm/min + #define CALIBRATION_FEEDRATE_FAST 1200 // mm/min + #define CALIBRATION_FEEDRATE_TRAVEL 3000 // mm/min + + // The following parameters refer to the conical section of the nozzle tip. + #define CALIBRATION_NOZZLE_TIP_HEIGHT 1.0 // mm + #define CALIBRATION_NOZZLE_OUTER_DIAMETER 2.0 // mm + + // Uncomment to enable reporting (required for "G425 V", but consumes PROGMEM). + //#define CALIBRATION_REPORTING + + // The true location and dimension the cube/bolt/washer on the bed. + #define CALIBRATION_OBJECT_CENTER { 264.0, -22.0, -2.0 } // mm + #define CALIBRATION_OBJECT_DIMENSIONS { 10.0, 10.0, 10.0 } // mm + + // Comment out any sides which are unreachable by the probe. For best + // auto-calibration results, all sides must be reachable. + #define CALIBRATION_MEASURE_RIGHT + #define CALIBRATION_MEASURE_FRONT + #define CALIBRATION_MEASURE_LEFT + #define CALIBRATION_MEASURE_BACK + + // Probing at the exact top center only works if the center is flat. If + // probing on a screwhead or hollow washer, probe near the edges. + //#define CALIBRATION_MEASURE_AT_TOP_EDGES + + // Define the pin to read during calibration + #ifndef CALIBRATION_PIN + //#define CALIBRATION_PIN -1 // Define here to override the default pin + #define CALIBRATION_PIN_INVERTING false // Set to true to invert the custom pin + //#define CALIBRATION_PIN_PULLDOWN + #define CALIBRATION_PIN_PULLUP + #endif +#endif + +/** + * Adaptive Step Smoothing increases the resolution of multi-axis moves, particularly at step frequencies + * below 1kHz (for AVR) or 10kHz (for ARM), where aliasing between axes in multi-axis moves causes audible + * vibration and surface artifacts. The algorithm adapts to provide the best possible step smoothing at the + * lowest stepping frequencies. + */ +//#define ADAPTIVE_STEP_SMOOTHING + +/** + * Custom Microstepping + * Override as-needed for your setup. Up to 3 MS pins are supported. + */ +//#define MICROSTEP1 LOW,LOW,LOW +//#define MICROSTEP2 HIGH,LOW,LOW +//#define MICROSTEP4 LOW,HIGH,LOW +//#define MICROSTEP8 HIGH,HIGH,LOW +//#define MICROSTEP16 LOW,LOW,HIGH +//#define MICROSTEP32 HIGH,LOW,HIGH + +// Microstep settings (Requires a board with pins named X_MS1, X_MS2, etc.) +#define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] + +/** + * @section stepper motor current + * + * Some boards have a means of setting the stepper motor current via firmware. + * + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 + * + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + */ +//#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps +//#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) +//#define DAC_MOTOR_CURRENT_DEFAULT { 70, 80, 90, 80 } // Default drive percent - X, Y, Z, E axis + +/** + * I2C-based DIGIPOTs (e.g., Azteeg X3 Pro) + */ +//#define DIGIPOT_MCP4018 // Requires https://github.com/felias-fogg/SlowSoftI2CMaster +//#define DIGIPOT_MCP4451 +#if EITHER(DIGIPOT_MCP4018, DIGIPOT_MCP4451) + #define DIGIPOT_I2C_NUM_CHANNELS 8 // 5DPRINT:4 AZTEEG_X3_PRO:8 MKS_SBASE:5 MIGHTYBOARD_REVE:5 + + // Actual motor currents in Amps. The number of entries must match DIGIPOT_I2C_NUM_CHANNELS. + // These correspond to the physical drivers, so be mindful if the order is changed. + #define DIGIPOT_I2C_MOTOR_CURRENTS { 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 } // AZTEEG_X3_PRO + + //#define DIGIPOT_USE_RAW_VALUES // Use DIGIPOT_MOTOR_CURRENT raw wiper values (instead of A4988 motor currents) + + /** + * Common slave addresses: + * + * A (A shifted) B (B shifted) IC + * Smoothie 0x2C (0x58) 0x2D (0x5A) MCP4451 + * AZTEEG_X3_PRO 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI 0x2C (0x58) 0x2E (0x5C) MCP4451 + * AZTEEG_X5_MINI_WIFI 0x58 0x5C MCP4451 + * MIGHTYBOARD_REVE 0x2F (0x5E) MCP4018 + */ + //#define DIGIPOT_I2C_ADDRESS_A 0x2C // Unshifted slave address for first DIGIPOT + //#define DIGIPOT_I2C_ADDRESS_B 0x2D // Unshifted slave address for second DIGIPOT +#endif + +//=========================================================================== +//=============================Additional Features=========================== +//=========================================================================== + +// @section lcd + +#if EITHER(IS_ULTIPANEL, EXTENSIBLE_UI) + #define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 2*60 } // (mm/min) Feedrates for manual moves along X, Y, Z, E from panel + #define FINE_MANUAL_MOVE 0.025 // (mm) Smallest manual move (< 0.1mm) applying to Z on most machines + #if IS_ULTIPANEL + #define MANUAL_E_MOVES_RELATIVE // Display extruder move distance rather than "position" + #define ULTIPANEL_FEEDMULTIPLY // Encoder sets the feedrate multiplier on the Status Screen + #endif +#endif + +// Change values more rapidly when the encoder is rotated faster +#define ENCODER_RATE_MULTIPLIER +#if ENABLED(ENCODER_RATE_MULTIPLIER) + #define ENCODER_10X_STEPS_PER_SEC 30 // (steps/s) Encoder rate for 10x speed + #define ENCODER_100X_STEPS_PER_SEC 80 // (steps/s) Encoder rate for 100x speed +#endif + +// Play a beep when the feedrate is changed from the Status Screen +//#define BEEP_ON_FEEDRATE_CHANGE +#if ENABLED(BEEP_ON_FEEDRATE_CHANGE) + #define FEEDRATE_CHANGE_BEEP_DURATION 10 + #define FEEDRATE_CHANGE_BEEP_FREQUENCY 440 +#endif + +#if HAS_LCD_MENU + + // Add Probe Z Offset calibration to the Z Probe Offsets menu + #if HAS_BED_PROBE + //#define PROBE_OFFSET_WIZARD + #if ENABLED(PROBE_OFFSET_WIZARD) + // + // Enable to init the Probe Z-Offset when starting the Wizard. + // Use a height slightly above the estimated nozzle-to-probe Z offset. + // For example, with an offset of -5, consider a starting height of -4. + // + //#define PROBE_OFFSET_WIZARD_START_Z -4.0 + + // Set a convenient position to do the calibration (probing point and nozzle/bed-distance) + //#define PROBE_OFFSET_WIZARD_XY_POS { X_CENTER, Y_CENTER } + #endif + #endif + + // Include a page of printer information in the LCD Main Menu + //#define LCD_INFO_MENU + #if ENABLED(LCD_INFO_MENU) + //#define LCD_PRINTER_INFO_IS_BOOTSCREEN // Show bootscreen(s) instead of Printer Info pages + #endif + + // BACK menu items keep the highlight at the top + //#define TURBO_BACK_MENU_ITEM + + // Add a mute option to the LCD menu + //#define SOUND_MENU_ITEM + + /** + * LED Control Menu + * Add LED Control to the LCD menu + */ + //#define LED_CONTROL_MENU + #if ENABLED(LED_CONTROL_MENU) + #define LED_COLOR_PRESETS // Enable the Preset Color menu option + //#define NEO2_COLOR_PRESETS // Enable a second NeoPixel Preset Color menu option + #if ENABLED(LED_COLOR_PRESETS) + #define LED_USER_PRESET_RED 255 // User defined RED value + #define LED_USER_PRESET_GREEN 128 // User defined GREEN value + #define LED_USER_PRESET_BLUE 0 // User defined BLUE value + #define LED_USER_PRESET_WHITE 255 // User defined WHITE value + #define LED_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define LED_USER_PRESET_STARTUP // Have the printer display the user preset color on startup + #endif + #if ENABLED(NEO2_COLOR_PRESETS) + #define NEO2_USER_PRESET_RED 255 // User defined RED value + #define NEO2_USER_PRESET_GREEN 128 // User defined GREEN value + #define NEO2_USER_PRESET_BLUE 0 // User defined BLUE value + #define NEO2_USER_PRESET_WHITE 255 // User defined WHITE value + #define NEO2_USER_PRESET_BRIGHTNESS 255 // User defined intensity + //#define NEO2_USER_PRESET_STARTUP // Have the printer display the user preset color on startup for the second strip + #endif + #endif + + // Insert a menu for preheating at the top level to allow for quick access + //#define PREHEAT_SHORTCUT_MENU_ITEM + +#endif // HAS_LCD_MENU + +#if HAS_DISPLAY + // The timeout (in ms) to return to the status screen from sub-menus + //#define LCD_TIMEOUT_TO_STATUS 15000 + + #if ENABLED(SHOW_BOOTSCREEN) + #define BOOTSCREEN_TIMEOUT 4000 // (ms) Total Duration to display the boot screen(s) + #if EITHER(HAS_MARLINUI_U8GLIB, TFT_COLOR_UI) + #define BOOT_MARLIN_LOGO_SMALL // Show a smaller Marlin logo on the Boot Screen (saving lots of flash) + #endif + #endif + + // Scroll a longer status message into view + //#define STATUS_MESSAGE_SCROLLING + + // On the Info Screen, display XY with one decimal place when possible + //#define LCD_DECIMAL_SMALL_XY + + // Add an 'M73' G-code to set the current percentage + #define LCD_SET_PROGRESS_MANUALLY + + // Show the E position (filament used) during printing + //#define LCD_SHOW_E_TOTAL +#endif + +#if EITHER(SDSUPPORT, LCD_SET_PROGRESS_MANUALLY) && ANY(HAS_MARLINUI_U8GLIB, HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL, EXTENSIBLE_UI) + #define SHOW_REMAINING_TIME // Display estimated time to completion + #if ENABLED(SHOW_REMAINING_TIME) + #define USE_M73_REMAINING_TIME // Use remaining time from M73 command instead of estimation + //#define ROTATE_PROGRESS_DISPLAY // Display (P)rogress, (E)lapsed, and (R)emaining time + #endif + + #if EITHER(HAS_MARLINUI_U8GLIB, EXTENSIBLE_UI) + //#define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits + #endif + + #if EITHER(HAS_MARLINUI_HD44780, IS_TFTGLCD_PANEL) + //#define LCD_PROGRESS_BAR // Show a progress bar on HD44780 LCDs for SD printing + #if ENABLED(LCD_PROGRESS_BAR) + #define PROGRESS_BAR_BAR_TIME 2000 // (ms) Amount of time to show the bar + #define PROGRESS_BAR_MSG_TIME 3000 // (ms) Amount of time to show the status message + #define PROGRESS_MSG_EXPIRE 0 // (ms) Amount of time to retain the status message (0=forever) + //#define PROGRESS_MSG_ONCE // Show the message for MSG_TIME then clear it + //#define LCD_PROGRESS_BAR_TEST // Add a menu item to test the progress bar + #endif + #endif +#endif + +#if ENABLED(SDSUPPORT) + /** + * SD Card SPI Speed + * May be required to resolve "volume init" errors. + * + * Enable and set to SPI_HALF_SPEED, SPI_QUARTER_SPEED, or SPI_EIGHTH_SPEED + * otherwise full speed will be applied. + * + * :['SPI_HALF_SPEED', 'SPI_QUARTER_SPEED', 'SPI_EIGHTH_SPEED'] + */ + //#define SD_SPI_SPEED SPI_HALF_SPEED + + // The standard SD detect circuit reads LOW when media is inserted and HIGH when empty. + // Enable this option and set to HIGH if your SD cards are incorrectly detected. + //#define SD_DETECT_STATE HIGH + + //#define SD_IGNORE_AT_STARTUP // Don't mount the SD card when starting up + //#define SDCARD_READONLY // Read-only SD card (to save over 2K of flash) + + //#define GCODE_REPEAT_MARKERS // Enable G-code M808 to set repeat markers and do looping + + #define SD_PROCEDURE_DEPTH 1 // Increase if you need more nested M32 calls + + #define SD_FINISHED_STEPPERRELEASE true // Disable steppers when SD Print is finished + #define SD_FINISHED_RELEASECOMMAND "M84" // Use "M84XYE" to keep Z enabled so your bed stays in place + + // Reverse SD sort to show "more recent" files first, according to the card's FAT. + // Since the FAT gets out of order with usage, SDCARD_SORT_ALPHA is recommended. + #define SDCARD_RATHERRECENTFIRST + + #define SD_MENU_CONFIRM_START // Confirm the selected SD file before printing + + //#define NO_SD_AUTOSTART // Remove auto#.g file support completely to save some Flash, SRAM + //#define MENU_ADDAUTOSTART // Add a menu option to run auto#.g files + + //#define BROWSE_MEDIA_ON_INSERT // Open the file browser when media is inserted + + #define EVENT_GCODE_SD_ABORT "G28XY" // G-code to run on SD Abort Print (e.g., "G28XY" or "G27") + + #if ENABLED(PRINTER_EVENT_LEDS) + #define PE_LEDS_COMPLETED_TIME (30*60) // (seconds) Time to keep the LED "done" color before restoring normal illumination + #endif + + /** + * Continue after Power-Loss (Creality3D) + * + * Store the current state to the SD Card at the start of each layer + * during SD printing. If the recovery file is found at boot time, present + * an option on the LCD screen to continue the print from the last-known + * point in the file. + */ + //#define POWER_LOSS_RECOVERY + #if ENABLED(POWER_LOSS_RECOVERY) + #define PLR_ENABLED_DEFAULT false // Power Loss Recovery enabled by default. (Set with 'M413 Sn' & M500) + //#define BACKUP_POWER_SUPPLY // Backup power / UPS to move the steppers on power loss + //#define POWER_LOSS_ZRAISE 2 // (mm) Z axis raise on resume (on power loss with UPS) + //#define POWER_LOSS_PIN 44 // Pin to detect power loss. Set to -1 to disable default pin on boards without module. + //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss + //#define POWER_LOSS_PULLUP // Set pullup / pulldown as appropriate for your sensor + //#define POWER_LOSS_PULLDOWN + //#define POWER_LOSS_PURGE_LEN 20 // (mm) Length of filament to purge on resume + //#define POWER_LOSS_RETRACT_LEN 10 // (mm) Length of filament to retract on fail. Requires backup power. + + // Without a POWER_LOSS_PIN the following option helps reduce wear on the SD card, + // especially with "vase mode" printing. Set too high and vases cannot be continued. + #define POWER_LOSS_MIN_Z_CHANGE 0.05 // (mm) Minimum Z change before saving power-loss data + + // Enable if Z homing is needed for proper recovery. 99.9% of the time this should be disabled! + //#define POWER_LOSS_RECOVER_ZHOME + #if ENABLED(POWER_LOSS_RECOVER_ZHOME) + //#define POWER_LOSS_ZHOME_POS { 0, 0 } // Safe XY position to home Z while avoiding objects on the bed + #endif + #endif + + /** + * Sort SD file listings in alphabetical order. + * + * With this option enabled, items on SD cards will be sorted + * by name for easier navigation. + * + * By default... + * + * - Use the slowest -but safest- method for sorting. + * - Folders are sorted to the top. + * - The sort key is statically allocated. + * - No added G-code (M34) support. + * - 40 item sorting limit. (Items after the first 40 are unsorted.) + * + * SD sorting uses static allocation (as set by SDSORT_LIMIT), allowing the + * compiler to calculate the worst-case usage and throw an error if the SRAM + * limit is exceeded. + * + * - SDSORT_USES_RAM provides faster sorting via a static directory buffer. + * - SDSORT_USES_STACK does the same, but uses a local stack-based buffer. + * - SDSORT_CACHE_NAMES will retain the sorted file listing in RAM. (Expensive!) + * - SDSORT_DYNAMIC_RAM only uses RAM when the SD menu is visible. (Use with caution!) + */ + //#define SDCARD_SORT_ALPHA + + // SD Card Sorting options + #if ENABLED(SDCARD_SORT_ALPHA) + #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). Costs 27 bytes each. + #define FOLDER_SORTING -1 // -1=above 0=none 1=below + #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 G-code. + #define SDSORT_USES_RAM false // Pre-allocate a static array for faster pre-sorting. + #define SDSORT_USES_STACK false // Prefer the stack for pre-sorting to give back some SRAM. (Negated by next 2 options.) + #define SDSORT_CACHE_NAMES false // Keep sorted items in RAM longer for speedy performance. Most expensive option. + #define SDSORT_DYNAMIC_RAM false // Use dynamic allocation (within SD menus). Least expensive option. Set SDSORT_LIMIT before use! + #define SDSORT_CACHE_VFATS 2 // Maximum number of 13-byte VFAT entries to use for sorting. + // Note: Only affects SCROLL_LONG_FILENAMES with SDSORT_CACHE_NAMES but not SDSORT_DYNAMIC_RAM. + #endif + + // Allow international symbols in long filenames. To display correctly, the + // LCD's font must contain the characters. Check your selected LCD language. + //#define UTF_FILENAME_SUPPORT + + // This allows hosts to request long names for files and folders with M33 + //#define LONG_FILENAME_HOST_SUPPORT + + // Enable this option to scroll long filenames in the SD card menu + //#define SCROLL_LONG_FILENAMES + + // Leave the heaters on after Stop Print (not recommended!) + //#define SD_ABORT_NO_COOLDOWN + + /** + * This option allows you to abort SD printing when any endstop is triggered. + * This feature must be enabled with "M540 S1" or from the LCD menu. + * To have any effect, endstops must be enabled during SD printing. + */ + //#define SD_ABORT_ON_ENDSTOP_HIT + + /** + * This option makes it easier to print the same SD Card file again. + * On print completion the LCD Menu will open with the file selected. + * You can just click to start the print, or navigate elsewhere. + */ + //#define SD_REPRINT_LAST_SELECTED_FILE + + /** + * Auto-report SdCard status with M27 S + */ + //#define AUTO_REPORT_SD_STATUS + + /** + * Support for USB thumb drives using an Arduino USB Host Shield or + * equivalent MAX3421E breakout board. The USB thumb drive will appear + * to Marlin as an SD card. + * + * The MAX3421E can be assigned the same pins as the SD card reader, with + * the following pin mapping: + * + * SCLK, MOSI, MISO --> SCLK, MOSI, MISO + * INT --> SD_DETECT_PIN [1] + * SS --> SDSS + * + * [1] On AVR an interrupt-capable pin is best for UHS3 compatibility. + */ + //#define USB_FLASH_DRIVE_SUPPORT + #if ENABLED(USB_FLASH_DRIVE_SUPPORT) + /** + * USB Host Shield Library + * + * - UHS2 uses no interrupts and has been production-tested + * on a LulzBot TAZ Pro with a 32-bit Archim board. + * + * - UHS3 is newer code with better USB compatibility. But it + * is less tested and is known to interfere with Servos. + * [1] This requires USB_INTR_PIN to be interrupt-capable. + */ + //#define USE_UHS2_USB + //#define USE_UHS3_USB + + /** + * Native USB Host supported by some boards (USB OTG) + */ + //#define USE_OTG_USB_HOST + + #if DISABLED(USE_OTG_USB_HOST) + #define USB_CS_PIN SDSS + #define USB_INTR_PIN SD_DETECT_PIN + #endif + #endif + + /** + * When using a bootloader that supports SD-Firmware-Flashing, + * add a menu item to activate SD-FW-Update on the next reboot. + * + * Requires ATMEGA2560 (Arduino Mega) + * + * Tested with this bootloader: + * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560 + */ + //#define SD_FIRMWARE_UPDATE + #if ENABLED(SD_FIRMWARE_UPDATE) + #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF + #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0 + #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF + #endif + + // Add an optimized binary file transfer mode, initiated with 'M28 B1' + //#define BINARY_FILE_TRANSFER + + /** + * Set this option to one of the following (or the board's defaults apply): + * + * LCD - Use the SD drive in the external LCD controller. + * ONBOARD - Use the SD drive on the control board. + * CUSTOM_CABLE - Use a custom cable to access the SD (as defined in a pins file). + * + * :[ 'LCD', 'ONBOARD', 'CUSTOM_CABLE' ] + */ + #define SDCARD_CONNECTION ONBOARD + + // Enable if SD detect is rendered useless (e.g., by using an SD extender) + //#define NO_SD_DETECT + +#endif // SDSUPPORT + +/** + * By default an onboard SD card reader may be shared as a USB mass- + * storage device. This option hides the SD card from the host PC. + */ +//#define NO_SD_HOST_DRIVE // Disable SD Card access over USB (for security). + +/** + * Additional options for Graphical Displays + * + * Use the optimizations here to improve printing performance, + * which can be adversely affected by graphical display drawing, + * especially when doing several short moves, and when printing + * on DELTA and SCARA machines. + * + * Some of these options may result in the display lagging behind + * controller events, as there is a trade-off between reliable + * printing performance versus fast display updates. + */ +#if HAS_MARLINUI_U8GLIB + // Show SD percentage next to the progress bar + //#define DOGM_SD_PERCENT + + // Save many cycles by drawing a hollow frame or no frame on the Info Screen + //#define XYZ_NO_FRAME + #define XYZ_HOLLOW_FRAME + + // Enable to save many cycles by drawing a hollow frame on Menu Screens + #define MENU_HOLLOW_FRAME + + // A bigger font is available for edit items. Costs 3120 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_BIG_EDIT_FONT + + // A smaller font may be used on the Info Screen. Costs 2434 bytes of PROGMEM. + // Western only. Not available for Cyrillic, Kana, Turkish, Greek, or Chinese. + //#define USE_SMALL_INFOFONT + + // Swap the CW/CCW indicators in the graphics overlay + //#define OVERLAY_GFX_REVERSE + + /** + * ST7920-based LCDs can emulate a 16 x 4 character display using + * the ST7920 character-generator for very fast screen updates. + * Enable LIGHTWEIGHT_UI to use this special display mode. + * + * Since LIGHTWEIGHT_UI has limited space, the position and status + * message occupy the same line. Set STATUS_EXPIRE_SECONDS to the + * length of time to display the status message before clearing. + * + * Set STATUS_EXPIRE_SECONDS to zero to never clear the status. + * This will prevent position updates from being displayed. + */ + #if ENABLED(U8GLIB_ST7920) + // Enable this option and reduce the value to optimize screen updates. + // The normal delay is 10µs. Use the lowest value that still gives a reliable display. + //#define DOGM_SPI_DELAY_US 5 + + //#define LIGHTWEIGHT_UI + #if ENABLED(LIGHTWEIGHT_UI) + #define STATUS_EXPIRE_SECONDS 20 + #endif + #endif + + /** + * Status (Info) Screen customizations + * These options may affect code size and screen render time. + * Custom status screens can forcibly override these settings. + */ + //#define STATUS_COMBINE_HEATERS // Use combined heater images instead of separate ones + //#define STATUS_HOTEND_NUMBERLESS // Use plain hotend icons instead of numbered ones (with 2+ hotends) + #define STATUS_HOTEND_INVERTED // Show solid nozzle bitmaps when heating (Requires STATUS_HOTEND_ANIM) + #define STATUS_HOTEND_ANIM // Use a second bitmap to indicate hotend heating + #define STATUS_BED_ANIM // Use a second bitmap to indicate bed heating + #define STATUS_CHAMBER_ANIM // Use a second bitmap to indicate chamber heating + //#define STATUS_CUTTER_ANIM // Use a second bitmap to indicate spindle / laser active + //#define STATUS_COOLER_ANIM // Use a second bitmap to indicate laser cooling + //#define STATUS_ALT_BED_BITMAP // Use the alternative bed bitmap + //#define STATUS_ALT_FAN_BITMAP // Use the alternative fan bitmap + //#define STATUS_FAN_FRAMES 3 // :[0,1,2,3,4] Number of fan animation frames + //#define STATUS_HEAT_PERCENT // Show heating in a progress bar + //#define BOOT_MARLIN_LOGO_ANIMATED // Animated Marlin logo. Costs ~‭3260 (or ~940) bytes of PROGMEM. + + // Frivolous Game Options + //#define MARLIN_BRICKOUT + //#define MARLIN_INVADERS + //#define MARLIN_SNAKE + //#define GAMES_EASTER_EGG // Add extra blank lines above the "Games" sub-menu + +#endif // HAS_MARLINUI_U8GLIB + +// +// Additional options for DGUS / DWIN displays +// +#if HAS_DGUS_LCD + #define LCD_SERIAL_PORT 3 + #define LCD_BAUDRATE 115200 + + #define DGUS_RX_BUFFER_SIZE 128 + #define DGUS_TX_BUFFER_SIZE 48 + //#define SERIAL_STATS_RX_BUFFER_OVERRUNS // Fix Rx overrun situation (Currently only for AVR) + + #define DGUS_UPDATE_INTERVAL_MS 500 // (ms) Interval between automatic screen updates + + #if ANY(DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_MKS, DGUS_LCD_UI_HIPRECY) + #define DGUS_PRINT_FILENAME // Display the filename during printing + #define DGUS_PREHEAT_UI // Display a preheat screen during heatup + + #if EITHER(DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_MKS) + //#define DGUS_UI_MOVE_DIS_OPTION // Disabled by default for FYSETC and MKS + #else + #define DGUS_UI_MOVE_DIS_OPTION // Enabled by default for UI_HIPRECY + #endif + + #define DGUS_FILAMENT_LOADUNLOAD + #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + #define DGUS_FILAMENT_PURGE_LENGTH 10 + #define DGUS_FILAMENT_LOAD_LENGTH_PER_TIME 0.5 // (mm) Adjust in proportion to DGUS_UPDATE_INTERVAL_MS + #endif + + #define DGUS_UI_WAITING // Show a "waiting" screen between some screens + #if ENABLED(DGUS_UI_WAITING) + #define DGUS_UI_WAITING_STATUS 10 + #define DGUS_UI_WAITING_STATUS_PERIOD 8 // Increase to slower waiting status looping + #endif + #endif +#endif // HAS_DGUS_LCD + +// +// Specify additional languages for the UI. Default specified by LCD_LANGUAGE. +// +#if ANY(DOGLCD, TFT_COLOR_UI, TOUCH_UI_FTDI_EVE) + //#define LCD_LANGUAGE_2 fr + //#define LCD_LANGUAGE_3 de + //#define LCD_LANGUAGE_4 es + //#define LCD_LANGUAGE_5 it + #ifdef LCD_LANGUAGE_2 + //#define LCD_LANGUAGE_AUTO_SAVE // Automatically save language to EEPROM on change + #endif +#endif + +// +// Touch UI for the FTDI Embedded Video Engine (EVE) +// +#if ENABLED(TOUCH_UI_FTDI_EVE) + // Display board used + //#define LCD_FTDI_VM800B35A // FTDI 3.5" with FT800 (320x240) + //#define LCD_4DSYSTEMS_4DLCD_FT843 // 4D Systems 4.3" (480x272) + //#define LCD_HAOYU_FT800CB // Haoyu with 4.3" or 5" (480x272) + //#define LCD_HAOYU_FT810CB // Haoyu with 5" (800x480) + //#define LCD_ALEPHOBJECTS_CLCD_UI // Aleph Objects Color LCD UI + //#define LCD_FYSETC_TFT81050 // FYSETC with 5" (800x480) + //#define LCD_EVE3_50G // Matrix Orbital 5.0", 800x480, BT815 + //#define LCD_EVE2_50G // Matrix Orbital 5.0", 800x480, FT813 + + // Correct the resolution if not using the stock TFT panel. + //#define TOUCH_UI_320x240 + //#define TOUCH_UI_480x272 + //#define TOUCH_UI_800x480 + + // Mappings for boards with a standard RepRapDiscount Display connector + //#define AO_EXP1_PINMAP // AlephObjects CLCD UI EXP1 mapping + //#define AO_EXP2_PINMAP // AlephObjects CLCD UI EXP2 mapping + //#define CR10_TFT_PINMAP // Rudolph Riedel's CR10 pin mapping + //#define S6_TFT_PINMAP // FYSETC S6 pin mapping + //#define F6_TFT_PINMAP // FYSETC F6 pin mapping + + //#define OTHER_PIN_LAYOUT // Define pins manually below + #if ENABLED(OTHER_PIN_LAYOUT) + // Pins for CS and MOD_RESET (PD) must be chosen + #define CLCD_MOD_RESET 9 + #define CLCD_SPI_CS 10 + + // If using software SPI, specify pins for SCLK, MOSI, MISO + //#define CLCD_USE_SOFT_SPI + #if ENABLED(CLCD_USE_SOFT_SPI) + #define CLCD_SOFT_SPI_MOSI 11 + #define CLCD_SOFT_SPI_MISO 12 + #define CLCD_SOFT_SPI_SCLK 13 + #endif + #endif + + // Display Orientation. An inverted (i.e. upside-down) display + // is supported on the FT800. The FT810 and beyond also support + // portrait and mirrored orientations. + //#define TOUCH_UI_INVERTED + //#define TOUCH_UI_PORTRAIT + //#define TOUCH_UI_MIRRORED + + // UTF8 processing and rendering. + // Unsupported characters are shown as '?'. + //#define TOUCH_UI_USE_UTF8 + #if ENABLED(TOUCH_UI_USE_UTF8) + // Western accents support. These accented characters use + // combined bitmaps and require relatively little storage. + #define TOUCH_UI_UTF8_WESTERN_CHARSET + #if ENABLED(TOUCH_UI_UTF8_WESTERN_CHARSET) + // Additional character groups. These characters require + // full bitmaps and take up considerable storage: + //#define TOUCH_UI_UTF8_SUPERSCRIPTS // ¹ ² ³ + //#define TOUCH_UI_UTF8_COPYRIGHT // © ® + //#define TOUCH_UI_UTF8_GERMANIC // ß + //#define TOUCH_UI_UTF8_SCANDINAVIAN // Æ Ð Ø Þ æ ð ø þ + //#define TOUCH_UI_UTF8_PUNCTUATION // « » ¿ ¡ + //#define TOUCH_UI_UTF8_CURRENCY // ¢ £ ¤ ¥ + //#define TOUCH_UI_UTF8_ORDINALS // º ª + //#define TOUCH_UI_UTF8_MATHEMATICS // ± × ÷ + //#define TOUCH_UI_UTF8_FRACTIONS // ¼ ½ ¾ + //#define TOUCH_UI_UTF8_SYMBOLS // µ ¶ ¦ § ¬ + #endif + + // Cyrillic character set, costs about 27KiB of flash + //#define TOUCH_UI_UTF8_CYRILLIC_CHARSET + #endif + + // Use a smaller font when labels don't fit buttons + #define TOUCH_UI_FIT_TEXT + + // Use a numeric passcode for "Screen lock" keypad. + // (recommended for smaller displays) + //#define TOUCH_UI_PASSCODE + + // Output extra debug info for Touch UI events + //#define TOUCH_UI_DEBUG + + // Developer menu (accessed by touching "About Printer" copyright text) + //#define TOUCH_UI_DEVELOPER_MENU +#endif + +// +// Classic UI Options +// +#if TFT_SCALED_DOGLCD + //#define TFT_MARLINUI_COLOR 0xFFFF // White + //#define TFT_MARLINBG_COLOR 0x0000 // Black + //#define TFT_DISABLED_COLOR 0x0003 // Almost black + //#define TFT_BTCANCEL_COLOR 0xF800 // Red + //#define TFT_BTARROWS_COLOR 0xDEE6 // 11011 110111 00110 Yellow + //#define TFT_BTOKMENU_COLOR 0x145F // 00010 100010 11111 Cyan +#endif + +// +// ADC Button Debounce +// +#if HAS_ADC_BUTTONS + #define ADC_BUTTON_DEBOUNCE_DELAY 16 // Increase if buttons bounce or repeat too fast +#endif + +// @section safety + +/** + * The watchdog hardware timer will do a reset and disable all outputs + * if the firmware gets too overloaded to read the temperature sensors. + * + * If you find that watchdog reboot causes your AVR board to hang forever, + * enable WATCHDOG_RESET_MANUAL to use a custom timer instead of WDTO. + * NOTE: This method is less reliable as it can only catch hangups while + * interrupts are enabled. + */ +#define USE_WATCHDOG +#if ENABLED(USE_WATCHDOG) + //#define WATCHDOG_RESET_MANUAL +#endif + +// @section lcd + +/** + * Babystepping enables movement of the axes by tiny increments without changing + * the current position values. This feature is used primarily to adjust the Z + * axis in the first layer of a print in real-time. + * + * Warning: Does not respect endstops! + */ +//#define BABYSTEPPING +#if ENABLED(BABYSTEPPING) + //#define INTEGRATED_BABYSTEPPING // EXPERIMENTAL integration of babystepping into the Stepper ISR + //#define BABYSTEP_WITHOUT_HOMING + //#define BABYSTEP_ALWAYS_AVAILABLE // Allow babystepping at all times (not just during movement). + //#define BABYSTEP_XY // Also enable X/Y Babystepping. Not supported on DELTA! + #define BABYSTEP_INVERT_Z false // Change if Z babysteps should go the other way + //#define BABYSTEP_MILLIMETER_UNITS // Specify BABYSTEP_MULTIPLICATOR_(XY|Z) in mm instead of micro-steps + #define BABYSTEP_MULTIPLICATOR_Z 1 // (steps or mm) Steps or millimeter distance for each Z babystep + #define BABYSTEP_MULTIPLICATOR_XY 1 // (steps or mm) Steps or millimeter distance for each XY babystep + + //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. + #if ENABLED(DOUBLECLICK_FOR_Z_BABYSTEPPING) + #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + // Note: Extra time may be added to mitigate controller latency. + //#define MOVE_Z_WHEN_IDLE // Jump to the move Z menu on doubleclick when printer is idle. + #if ENABLED(MOVE_Z_WHEN_IDLE) + #define MOVE_Z_IDLE_MULTIPLICATOR 1 // Multiply 1mm by this factor for the move step size. + #endif + #endif + + //#define BABYSTEP_DISPLAY_TOTAL // Display total babysteps since last G28 + + //#define BABYSTEP_ZPROBE_OFFSET // Combine M851 Z and Babystepping + #if ENABLED(BABYSTEP_ZPROBE_OFFSET) + //#define BABYSTEP_HOTEND_Z_OFFSET // For multiple hotends, babystep relative Z offsets + //#define BABYSTEP_ZPROBE_GFX_OVERLAY // Enable graphical overlay on Z-offset editor + #endif +#endif + +// @section extruder + +/** + * Linear Pressure Control v1.5 + * + * Assumption: advance [steps] = k * (delta velocity [steps/s]) + * K=0 means advance disabled. + * + * NOTE: K values for LIN_ADVANCE 1.5 differ from earlier versions! + * + * Set K around 0.22 for 3mm PLA Direct Drive with ~6.5cm between the drive gear and heatbreak. + * Larger K values will be needed for flexible filament and greater distances. + * If this algorithm produces a higher speed offset than the extruder can handle (compared to E jerk) + * print acceleration will be reduced during the affected moves to keep within the limit. + * + * See https://marlinfw.org/docs/features/lin_advance.html for full instructions. + */ +#define LIN_ADVANCE +#if ENABLED(LIN_ADVANCE) + //#define EXTRA_LIN_ADVANCE_K // Enable for second linear advance constants + #define LIN_ADVANCE_K 0.22 // Unit: mm compression per 1mm/s extruder speed + //#define LA_DEBUG // If enabled, this will generate debug information output over USB. + //#define EXPERIMENTAL_SCURVE // Enable this option to permit S-Curve Acceleration +#endif + +// @section leveling + +/** + * Points to probe for all 3-point Leveling procedures. + * Override if the automatically selected points are inadequate. + */ +#if EITHER(AUTO_BED_LEVELING_3POINT, AUTO_BED_LEVELING_UBL) + //#define PROBE_PT_1_X 15 + //#define PROBE_PT_1_Y 180 + //#define PROBE_PT_2_X 15 + //#define PROBE_PT_2_Y 20 + //#define PROBE_PT_3_X 170 + //#define PROBE_PT_3_Y 20 +#endif + +/** + * Probing Margins + * + * Override PROBING_MARGIN for each side of the build plate + * Useful to get probe points to exact positions on targets or + * to allow leveling to avoid plate clamps on only specific + * sides of the bed. With NOZZLE_AS_PROBE negative values are + * allowed, to permit probing outside the bed. + * + * If you are replacing the prior *_PROBE_BED_POSITION options, + * LEFT and FRONT values in most cases will map directly over + * RIGHT and REAR would be the inverse such as + * (X/Y_BED_SIZE - RIGHT/BACK_PROBE_BED_POSITION) + * + * This will allow all positions to match at compilation, however + * should the probe position be modified with M851XY then the + * probe points will follow. This prevents any change from causing + * the probe to be unable to reach any points. + */ +#if PROBE_SELECTED && !IS_KINEMATIC + //#define PROBING_MARGIN_LEFT PROBING_MARGIN + //#define PROBING_MARGIN_RIGHT PROBING_MARGIN + //#define PROBING_MARGIN_FRONT PROBING_MARGIN + //#define PROBING_MARGIN_BACK PROBING_MARGIN +#endif + +#if EITHER(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL) + // Override the mesh area if the automatic (max) area is too large + //#define MESH_MIN_X MESH_INSET + //#define MESH_MIN_Y MESH_INSET + //#define MESH_MAX_X X_BED_SIZE - (MESH_INSET) + //#define MESH_MAX_Y Y_BED_SIZE - (MESH_INSET) +#endif + +#if BOTH(AUTO_BED_LEVELING_UBL, EEPROM_SETTINGS) + //#define OPTIMIZED_MESH_STORAGE // Store mesh with less precision to save EEPROM space +#endif + +/** + * Repeatedly attempt G29 leveling until it succeeds. + * Stop after G29_MAX_RETRIES attempts. + */ +//#define G29_RETRY_AND_RECOVER +#if ENABLED(G29_RETRY_AND_RECOVER) + #define G29_MAX_RETRIES 3 + #define G29_HALT_ON_FAILURE + /** + * Specify the GCODE commands that will be executed when leveling succeeds, + * between attempts, and after the maximum number of retries have been tried. + */ + #define G29_SUCCESS_COMMANDS "M117 Bed leveling done." + #define G29_RECOVER_COMMANDS "M117 Probe failed. Rewiping.\nG28\nG12 P0 S12 T0" + #define G29_FAILURE_COMMANDS "M117 Bed leveling failed.\nG0 Z10\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nM300 P25 S880\nM300 P50 S0\nG4 S1" + +#endif + +/** + * Thermal Probe Compensation + * Probe measurements are adjusted to compensate for temperature distortion. + * Use G76 to calibrate this feature. Use M871 to set values manually. + * For a more detailed explanation of the process see G76_M871.cpp. + */ +#if HAS_BED_PROBE && TEMP_SENSOR_PROBE && TEMP_SENSOR_BED + // Enable thermal first layer compensation using bed and probe temperatures + #define PROBE_TEMP_COMPENSATION + + // Add additional compensation depending on hotend temperature + // Note: this values cannot be calibrated and have to be set manually + #if ENABLED(PROBE_TEMP_COMPENSATION) + // Park position to wait for probe cooldown + #define PTC_PARK_POS { 0, 0, 100 } + + // Probe position to probe and wait for probe to reach target temperature + #define PTC_PROBE_POS { 90, 100 } + + // Enable additional compensation using hotend temperature + // Note: this values cannot be calibrated automatically but have to be set manually + //#define USE_TEMP_EXT_COMPENSATION + + // Probe temperature calibration generates a table of values starting at PTC_SAMPLE_START + // (e.g. 30), in steps of PTC_SAMPLE_RES (e.g. 5) with PTC_SAMPLE_COUNT (e.g. 10) samples. + + //#define PTC_SAMPLE_START 30.0f + //#define PTC_SAMPLE_RES 5.0f + //#define PTC_SAMPLE_COUNT 10U + + // Bed temperature calibration builds a similar table. + + //#define BTC_SAMPLE_START 60.0f + //#define BTC_SAMPLE_RES 5.0f + //#define BTC_SAMPLE_COUNT 10U + + // The temperature the probe should be at while taking measurements during bed temperature + // calibration. + //#define BTC_PROBE_TEMP 30.0f + + // Height above Z=0.0f to raise the nozzle. Lowering this can help the probe to heat faster. + // Note: the Z=0.0f offset is determined by the probe offset which can be set using M851. + //#define PTC_PROBE_HEATING_OFFSET 0.5f + + // Height to raise the Z-probe between heating and taking the next measurement. Some probes + // may fail to untrigger if they have been triggered for a long time, which can be solved by + // increasing the height the probe is raised to. + //#define PTC_PROBE_RAISE 15U + + // If the probe is outside of the defined range, use linear extrapolation using the closest + // point and the PTC_LINEAR_EXTRAPOLATION'th next point. E.g. if set to 4 it will use data[0] + // and data[4] to perform linear extrapolation for values below PTC_SAMPLE_START. + //#define PTC_LINEAR_EXTRAPOLATION 4 + #endif +#endif + +// @section extras + +// +// G60/G61 Position Save and Return +// +//#define SAVED_POSITIONS 1 // Each saved position slot costs 12 bytes + +// +// G2/G3 Arc Support +// +#define ARC_SUPPORT // Disable this feature to save ~3226 bytes +#if ENABLED(ARC_SUPPORT) + #define MM_PER_ARC_SEGMENT 1 // (mm) Length (or minimum length) of each arc segment + //#define ARC_SEGMENTS_PER_R 1 // Max segment length, MM_PER = Min + #define MIN_ARC_SEGMENTS 24 // Minimum number of segments in a complete circle + //#define ARC_SEGMENTS_PER_SEC 50 // Use feedrate to choose segment length (with MM_PER_ARC_SEGMENT as the minimum) + #define N_ARC_CORRECTION 25 // Number of interpolated segments between corrections + //#define ARC_P_CIRCLES // Enable the 'P' parameter to specify complete circles + //#define CNC_WORKSPACE_PLANES // Allow G2/G3 to operate in XY, ZX, or YZ planes + //#define SF_ARC_FIX // Enable only if using SkeinForge with "Arc Point" fillet procedure +#endif + +// Support for G5 with XYZE destination and IJPQ offsets. Requires ~2666 bytes. +//#define BEZIER_CURVE_SUPPORT + +/** + * Direct Stepping + * + * Comparable to the method used by Klipper, G6 direct stepping significantly + * reduces motion calculations, increases top printing speeds, and results in + * less step aliasing by calculating all motions in advance. + * Preparing your G-code: https://github.com/colinrgodsey/step-daemon + */ +//#define DIRECT_STEPPING + +/** + * G38 Probe Target + * + * This option adds G38.2 and G38.3 (probe towards target) + * and optionally G38.4 and G38.5 (probe away from target). + * Set MULTIPLE_PROBING for G38 to probe more than once. + */ +//#define G38_PROBE_TARGET +#if ENABLED(G38_PROBE_TARGET) + //#define G38_PROBE_AWAY // Include G38.4 and G38.5 to probe away from target + #define G38_MINIMUM_MOVE 0.0275 // (mm) Minimum distance that will produce a move. +#endif + +// Moves (or segments) with fewer steps than this will be joined with the next move +#define MIN_STEPS_PER_SEGMENT 6 + +/** + * Minimum delay before and after setting the stepper DIR (in ns) + * 0 : No delay (Expect at least 10µS since one Stepper ISR must transpire) + * 20 : Minimum for TMC2xxx drivers + * 200 : Minimum for A4988 drivers + * 400 : Minimum for A5984 drivers + * 500 : Minimum for LV8729 drivers (guess, no info in datasheet) + * 650 : Minimum for DRV8825 drivers + * 1500 : Minimum for TB6600 drivers (guess, no info in datasheet) + * 15000 : Minimum for TB6560 drivers (guess, no info in datasheet) + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_POST_DIR_DELAY 650 +//#define MINIMUM_STEPPER_PRE_DIR_DELAY 650 + +/** + * Minimum stepper driver pulse width (in µs) + * 0 : Smallest possible width the MCU can produce, compatible with TMC2xxx drivers + * 0 : Minimum 500ns for LV8729, adjusted in stepper.h + * 1 : Minimum for A4988 and A5984 stepper drivers + * 2 : Minimum for DRV8825 stepper drivers + * 3 : Minimum for TB6600 stepper drivers + * 30 : Minimum for TB6560 stepper drivers + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MINIMUM_STEPPER_PULSE 2 + +/** + * Maximum stepping rate (in Hz) the stepper driver allows + * If undefined, defaults to 1MHz / (2 * MINIMUM_STEPPER_PULSE) + * 5000000 : Maximum for TMC2xxx stepper drivers + * 1000000 : Maximum for LV8729 stepper driver + * 500000 : Maximum for A4988 stepper driver + * 250000 : Maximum for DRV8825 stepper driver + * 150000 : Maximum for TB6600 stepper driver + * 15000 : Maximum for TB6560 stepper driver + * + * Override the default value based on the driver type set in Configuration.h. + */ +//#define MAXIMUM_STEPPER_RATE 250000 + +// @section temperature + +// Control heater 0 and heater 1 in parallel. +//#define HEATERS_PARALLEL + +//=========================================================================== +//================================= Buffers ================================= +//=========================================================================== + +// @section motion + +// The number of linear moves that can be in the planner at once. +// The value of BLOCK_BUFFER_SIZE must be a power of 2 (e.g. 8, 16, 32) +#if BOTH(SDSUPPORT, DIRECT_STEPPING) + #define BLOCK_BUFFER_SIZE 8 +#elif ENABLED(SDSUPPORT) + #define BLOCK_BUFFER_SIZE 16 +#else + #define BLOCK_BUFFER_SIZE 16 +#endif + +// @section serial + +// The ASCII buffer for serial input +#define MAX_CMD_SIZE 96 +#define BUFSIZE 4 + +// Transmission to Host Buffer Size +// To save 386 bytes of PROGMEM (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. +// To buffer a simple "ok" you need 4 bytes. +// For ADVANCED_OK (M105) you need 32 bytes. +// For debug-echo: 128 bytes for the optimal speed. +// Other output doesn't need to be that speedy. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +#define TX_BUFFER_SIZE 0 + +// Host Receive Buffer Size +// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. +// To use flow control, set this buffer size to at least 1024 bytes. +// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +//#define RX_BUFFER_SIZE 1024 + +#if RX_BUFFER_SIZE >= 1024 + // Enable to have the controller send XON/XOFF control characters to + // the host to signal the RX buffer is becoming full. + //#define SERIAL_XON_XOFF +#endif + +// Add M575 G-code to change the baud rate +//#define BAUD_RATE_GCODE + +#if ENABLED(SDSUPPORT) + // Enable this option to collect and display the maximum + // RX queue usage after transferring a file to SD. + //#define SERIAL_STATS_MAX_RX_QUEUED + + // Enable this option to collect and display the number + // of dropped bytes after a file transfer to SD. + //#define SERIAL_STATS_DROPPED_RX +#endif + +// Monitor RX buffer usage +// Dump an error to the serial port if the serial receive buffer overflows. +// If you see these errors, increase the RX_BUFFER_SIZE value. +// Not supported on all platforms. +//#define RX_BUFFER_MONITOR + +/** + * Emergency Command Parser + * + * Add a low-level parser to intercept certain commands as they + * enter the serial receive buffer, so they cannot be blocked. + * Currently handles M108, M112, M410, M876 + * NOTE: Not yet implemented for all platforms. + */ +#define EMERGENCY_PARSER + +// Bad Serial-connections can miss a received command by sending an 'ok' +// Therefore some clients abort after 30 seconds in a timeout. +// Some other clients start sending commands while receiving a 'wait'. +// This "wait" is only sent when the buffer is empty. 1 second is a good value here. +//#define NO_TIMEOUTS 1000 // Milliseconds + +// Some clients will have this feature soon. This could make the NO_TIMEOUTS unnecessary. +//#define ADVANCED_OK + +// Printrun may have trouble receiving long strings all at once. +// This option inserts short delays between lines of serial output. +#define SERIAL_OVERRUN_PROTECTION + +// For serial echo, the number of digits after the decimal point +//#define SERIAL_FLOAT_PRECISION 4 + +// @section extras + +/** + * Extra Fan Speed + * Adds a secondary fan speed for each print-cooling fan. + * 'M106 P T3-255' : Set a secondary speed for + * 'M106 P T2' : Use the set secondary speed + * 'M106 P T1' : Restore the previous fan speed + */ +//#define EXTRA_FAN_SPEED + +/** + * Firmware-based and LCD-controlled retract + * + * Add G10 / G11 commands for automatic firmware-based retract / recover. + * Use M207 and M208 to define parameters for retract / recover. + * + * Use M209 to enable or disable auto-retract. + * With auto-retract enabled, all G1 E moves within the set range + * will be converted to firmware-based retract/recover moves. + * + * Be sure to turn off auto-retract during filament change. + * + * Note that M207 / M208 / M209 settings are saved to EEPROM. + */ +//#define FWRETRACT +#if ENABLED(FWRETRACT) + #define FWRETRACT_AUTORETRACT // Override slicer retractions + #if ENABLED(FWRETRACT_AUTORETRACT) + #define MIN_AUTORETRACT 0.1 // (mm) Don't convert E moves under this length + #define MAX_AUTORETRACT 10.0 // (mm) Don't convert E moves over this length + #endif + #define RETRACT_LENGTH 3 // (mm) Default retract length (positive value) + #define RETRACT_LENGTH_SWAP 13 // (mm) Default swap retract length (positive value) + #define RETRACT_FEEDRATE 45 // (mm/s) Default feedrate for retracting + #define RETRACT_ZRAISE 0 // (mm) Default retract Z-raise + #define RETRACT_RECOVER_LENGTH 0 // (mm) Default additional recover length (added to retract length on recover) + #define RETRACT_RECOVER_LENGTH_SWAP 0 // (mm) Default additional swap recover length (added to retract length on recover from toolchange) + #define RETRACT_RECOVER_FEEDRATE 8 // (mm/s) Default feedrate for recovering from retraction + #define RETRACT_RECOVER_FEEDRATE_SWAP 8 // (mm/s) Default feedrate for recovering from swap retraction + #if ENABLED(MIXING_EXTRUDER) + //#define RETRACT_SYNC_MIXING // Retract and restore all mixing steppers simultaneously + #endif +#endif + +/** + * Universal tool change settings. + * Applies to all types of extruders except where explicitly noted. + */ +#if HAS_MULTI_EXTRUDER + // Z raise distance for tool-change, as needed for some extruders + #define TOOLCHANGE_ZRAISE 2 // (mm) + //#define TOOLCHANGE_ZRAISE_BEFORE_RETRACT // Apply raise before swap retraction (if enabled) + //#define TOOLCHANGE_NO_RETURN // Never return to previous position on tool-change + #if ENABLED(TOOLCHANGE_NO_RETURN) + //#define EVENT_GCODE_AFTER_TOOLCHANGE "G12X" // Extra G-code to run after tool-change + #endif + + /** + * Retract and prime filament on tool-change to reduce + * ooze and stringing and to get cleaner transitions. + */ + //#define TOOLCHANGE_FILAMENT_SWAP + #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) + // Load / Unload + #define TOOLCHANGE_FS_LENGTH 12 // (mm) Load / Unload length + #define TOOLCHANGE_FS_EXTRA_RESUME_LENGTH 0 // (mm) Extra length for better restart, fine tune by LCD/Gcode) + #define TOOLCHANGE_FS_RETRACT_SPEED (50*60) // (mm/min) (Unloading) + #define TOOLCHANGE_FS_UNRETRACT_SPEED (25*60) // (mm/min) (On SINGLENOZZLE or Bowden loading must be slowed down) + + // Longer prime to clean out a SINGLENOZZLE + #define TOOLCHANGE_FS_EXTRA_PRIME 0 // (mm) Extra priming length + #define TOOLCHANGE_FS_PRIME_SPEED (4.6*60) // (mm/min) Extra priming feedrate + #define TOOLCHANGE_FS_WIPE_RETRACT 0 // (mm/min) Retract before cooling for less stringing, better wipe, etc. + + // Cool after prime to reduce stringing + #define TOOLCHANGE_FS_FAN -1 // Fan index or -1 to skip + #define TOOLCHANGE_FS_FAN_SPEED 255 // 0-255 + #define TOOLCHANGE_FS_FAN_TIME 10 // (seconds) + + // Swap uninitialized extruder with TOOLCHANGE_FS_PRIME_SPEED for all lengths (recover + prime) + // (May break filament if not retracted beforehand.) + //#define TOOLCHANGE_FS_INIT_BEFORE_SWAP + + // Prime on the first T0 (If other, TOOLCHANGE_FS_INIT_BEFORE_SWAP applied) + // Enable it (M217 V[0/1]) before printing, to avoid unwanted priming on host connect + //#define TOOLCHANGE_FS_PRIME_FIRST_USED + + /** + * Tool Change Migration + * This feature provides G-code and LCD options to switch tools mid-print. + * All applicable tool properties are migrated so the print can continue. + * Tools must be closely matching and other restrictions may apply. + * Useful to: + * - Change filament color without interruption + * - Switch spools automatically on filament runout + * - Switch to a different nozzle on an extruder jam + */ + #define TOOLCHANGE_MIGRATION_FEATURE + + #endif + + /** + * Position to park head during tool change. + * Doesn't apply to SWITCHING_TOOLHEAD, DUAL_X_CARRIAGE, or PARKING_EXTRUDER + */ + //#define TOOLCHANGE_PARK + #if ENABLED(TOOLCHANGE_PARK) + #define TOOLCHANGE_PARK_XY { X_MIN_POS + 10, Y_MIN_POS + 10 } + #define TOOLCHANGE_PARK_XY_FEEDRATE 6000 // (mm/min) + //#define TOOLCHANGE_PARK_X_ONLY // X axis only move + //#define TOOLCHANGE_PARK_Y_ONLY // Y axis only move + #endif +#endif // HAS_MULTI_EXTRUDER + +/** + * Advanced Pause + * Experimental feature for filament change support and for parking the nozzle when paused. + * Adds the GCode M600 for initiating filament change. + * If PARK_HEAD_ON_PAUSE enabled, adds the GCode M125 to pause printing and park the nozzle. + * + * Requires an LCD display. + * Requires NOZZLE_PARK_FEATURE. + * This feature is required for the default FILAMENT_RUNOUT_SCRIPT. + */ +#define ADVANCED_PAUSE_FEATURE +#if ENABLED(ADVANCED_PAUSE_FEATURE) + #define PAUSE_PARK_RETRACT_FEEDRATE 60 // (mm/s) Initial retract feedrate. + #define PAUSE_PARK_RETRACT_LENGTH 2 // (mm) Initial retract. + // This short retract is done immediately, before parking the nozzle. + #define FILAMENT_CHANGE_UNLOAD_FEEDRATE 10 // (mm/s) Unload filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_UNLOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_UNLOAD_LENGTH 100 // (mm) The length of filament for a complete unload. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + // Set to 0 for manual unloading. + #define FILAMENT_CHANGE_SLOW_LOAD_FEEDRATE 6 // (mm/s) Slow move when starting load. + #define FILAMENT_CHANGE_SLOW_LOAD_LENGTH 0 // (mm) Slow length, to allow time to insert material. + // 0 to disable start loading and skip to fast load only + #define FILAMENT_CHANGE_FAST_LOAD_FEEDRATE 6 // (mm/s) Load filament feedrate. This can be pretty fast. + #define FILAMENT_CHANGE_FAST_LOAD_ACCEL 25 // (mm/s^2) Lower acceleration may allow a faster feedrate. + #define FILAMENT_CHANGE_FAST_LOAD_LENGTH 0 // (mm) Load length of filament, from extruder gear to nozzle. + // For Bowden, the full length of the tube and nozzle. + // For direct drive, the full length of the nozzle. + //#define ADVANCED_PAUSE_CONTINUOUS_PURGE // Purge continuously up to the purge length until interrupted. + #define ADVANCED_PAUSE_PURGE_FEEDRATE 3 // (mm/s) Extrude feedrate (after loading). Should be slower than load feedrate. + #define ADVANCED_PAUSE_PURGE_LENGTH 50 // (mm) Length to extrude after loading. + // Set to 0 for manual extrusion. + // Filament can be extruded repeatedly from the Filament Change menu + // until extrusion is consistent, and to purge old filament. + #define ADVANCED_PAUSE_RESUME_PRIME 0 // (mm) Extra distance to prime nozzle after returning from park. + //#define ADVANCED_PAUSE_FANS_PAUSE // Turn off print-cooling fans while the machine is paused. + + // Filament Unload does a Retract, Delay, and Purge first: + #define FILAMENT_UNLOAD_PURGE_RETRACT 13 // (mm) Unload initial retract length. + #define FILAMENT_UNLOAD_PURGE_DELAY 5000 // (ms) Delay for the filament to cool after retract. + #define FILAMENT_UNLOAD_PURGE_LENGTH 8 // (mm) An unretract is done, then this length is purged. + #define FILAMENT_UNLOAD_PURGE_FEEDRATE 25 // (mm/s) feedrate to purge before unload + + #define PAUSE_PARK_NOZZLE_TIMEOUT 45 // (seconds) Time limit before the nozzle is turned off for safety. + #define FILAMENT_CHANGE_ALERT_BEEPS 10 // Number of alert beeps to play when a response is needed. + #define PAUSE_PARK_NO_STEPPER_TIMEOUT // Enable for XYZ steppers to stay powered on during filament change. + + //#define PARK_HEAD_ON_PAUSE // Park the nozzle during pause and filament change. + //#define HOME_BEFORE_FILAMENT_CHANGE // If needed, home before parking for filament change + + #define FILAMENT_LOAD_UNLOAD_GCODES // Add M701/M702 Load/Unload G-codes, plus Load/Unload in the LCD Prepare menu. + //#define FILAMENT_UNLOAD_ALL_EXTRUDERS // Allow M702 to unload all extruders above a minimum target temp (as set by M302) +#endif + +// @section tmc + +/** + * TMC26X Stepper Driver options + * + * The TMC26XStepper library is required for this stepper driver. + * https://github.com/trinamic/TMC26XStepper + */ +#if HAS_DRIVER(TMC26X) + + #if AXIS_DRIVER_TYPE_X(TMC26X) + #define X_MAX_CURRENT 1000 // (mA) + #define X_SENSE_RESISTOR 91 // (mOhms) + #define X_MICROSTEPS 16 // Number of microsteps + #endif + + #if AXIS_DRIVER_TYPE_X2(TMC26X) + #define X2_MAX_CURRENT 1000 + #define X2_SENSE_RESISTOR 91 + #define X2_MICROSTEPS X_MICROSTEPS + #endif + + #if AXIS_DRIVER_TYPE_Y(TMC26X) + #define Y_MAX_CURRENT 1000 + #define Y_SENSE_RESISTOR 91 + #define Y_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_Y2(TMC26X) + #define Y2_MAX_CURRENT 1000 + #define Y2_SENSE_RESISTOR 91 + #define Y2_MICROSTEPS Y_MICROSTEPS + #endif + + #if AXIS_DRIVER_TYPE_Z(TMC26X) + #define Z_MAX_CURRENT 1000 + #define Z_SENSE_RESISTOR 91 + #define Z_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_Z2(TMC26X) + #define Z2_MAX_CURRENT 1000 + #define Z2_SENSE_RESISTOR 91 + #define Z2_MICROSTEPS Z_MICROSTEPS + #endif + + #if AXIS_DRIVER_TYPE_Z3(TMC26X) + #define Z3_MAX_CURRENT 1000 + #define Z3_SENSE_RESISTOR 91 + #define Z3_MICROSTEPS Z_MICROSTEPS + #endif + + #if AXIS_DRIVER_TYPE_Z4(TMC26X) + #define Z4_MAX_CURRENT 1000 + #define Z4_SENSE_RESISTOR 91 + #define Z4_MICROSTEPS Z_MICROSTEPS + #endif + + #if AXIS_DRIVER_TYPE_E0(TMC26X) + #define E0_MAX_CURRENT 1000 + #define E0_SENSE_RESISTOR 91 + #define E0_MICROSTEPS 16 + #endif + + #if AXIS_DRIVER_TYPE_E1(TMC26X) + #define E1_MAX_CURRENT 1000 + #define E1_SENSE_RESISTOR 91 + #define E1_MICROSTEPS E0_MICROSTEPS + #endif + + #if AXIS_DRIVER_TYPE_E2(TMC26X) + #define E2_MAX_CURRENT 1000 + #define E2_SENSE_RESISTOR 91 + #define E2_MICROSTEPS E0_MICROSTEPS + #endif + + #if AXIS_DRIVER_TYPE_E3(TMC26X) + #define E3_MAX_CURRENT 1000 + #define E3_SENSE_RESISTOR 91 + #define E3_MICROSTEPS E0_MICROSTEPS + #endif + + #if AXIS_DRIVER_TYPE_E4(TMC26X) + #define E4_MAX_CURRENT 1000 + #define E4_SENSE_RESISTOR 91 + #define E4_MICROSTEPS E0_MICROSTEPS + #endif + + #if AXIS_DRIVER_TYPE_E5(TMC26X) + #define E5_MAX_CURRENT 1000 + #define E5_SENSE_RESISTOR 91 + #define E5_MICROSTEPS E0_MICROSTEPS + #endif + + #if AXIS_DRIVER_TYPE_E6(TMC26X) + #define E6_MAX_CURRENT 1000 + #define E6_SENSE_RESISTOR 91 + #define E6_MICROSTEPS E0_MICROSTEPS + #endif + + #if AXIS_DRIVER_TYPE_E7(TMC26X) + #define E7_MAX_CURRENT 1000 + #define E7_SENSE_RESISTOR 91 + #define E7_MICROSTEPS E0_MICROSTEPS + #endif + +#endif // TMC26X + +// @section tmc_smart + +/** + * To use TMC2130, TMC2160, TMC2660, TMC5130, TMC5160 stepper drivers in SPI mode + * connect your SPI pins to the hardware SPI interface on your board and define + * the required CS pins in your `pins_MYBOARD.h` file. (e.g., RAMPS 1.4 uses AUX3 + * pins `X_CS_PIN 53`, `Y_CS_PIN 49`, etc.). + * You may also use software SPI if you wish to use general purpose IO pins. + * + * To use TMC2208 stepper UART-configurable stepper drivers connect #_SERIAL_TX_PIN + * to the driver side PDN_UART pin with a 1K resistor. + * To use the reading capabilities, also connect #_SERIAL_RX_PIN to PDN_UART without + * a resistor. + * The drivers can also be used with hardware serial. + * + * TMCStepper library is required to use TMC stepper drivers. + * https://github.com/teemuatlut/TMCStepper + */ +#if HAS_TRINAMIC_CONFIG + + #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + + /** + * Interpolate microsteps to 256 + * Override for each driver with _INTERPOLATE settings below + */ + #define INTERPOLATE true + + #if AXIS_IS_TMC(X) + #define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current. + #define X_CURRENT_HOME X_CURRENT // (mA) RMS current for sensorless homing + #define X_MICROSTEPS 16 // 0..256 + #define X_RSENSE 0.11 + #define X_CHAIN_POS -1 // -1..0: Not chained. 1: MCU MOSI connected. 2: Next in chain, ... + //#define X_INTERPOLATE true // Enable to override 'INTERPOLATE' for the X axis + #endif + + #if AXIS_IS_TMC(X2) + #define X2_CURRENT 800 + #define X2_CURRENT_HOME X2_CURRENT + #define X2_MICROSTEPS X_MICROSTEPS + #define X2_RSENSE 0.11 + #define X2_CHAIN_POS -1 + //#define X2_INTERPOLATE true + #endif + + #if AXIS_IS_TMC(Y) + #define Y_CURRENT 800 + #define Y_CURRENT_HOME Y_CURRENT + #define Y_MICROSTEPS 16 + #define Y_RSENSE 0.11 + #define Y_CHAIN_POS -1 + //#define Y_INTERPOLATE true + #endif + + #if AXIS_IS_TMC(Y2) + #define Y2_CURRENT 800 + #define Y2_CURRENT_HOME Y2_CURRENT + #define Y2_MICROSTEPS Y_MICROSTEPS + #define Y2_RSENSE 0.11 + #define Y2_CHAIN_POS -1 + //#define Y2_INTERPOLATE true + #endif + + #if AXIS_IS_TMC(Z) + #define Z_CURRENT 800 + #define Z_CURRENT_HOME Z_CURRENT + #define Z_MICROSTEPS 16 + #define Z_RSENSE 0.11 + #define Z_CHAIN_POS -1 + //#define Z_INTERPOLATE true + #endif + + #if AXIS_IS_TMC(Z2) + #define Z2_CURRENT 800 + #define Z2_CURRENT_HOME Z2_CURRENT + #define Z2_MICROSTEPS Z_MICROSTEPS + #define Z2_RSENSE 0.11 + #define Z2_CHAIN_POS -1 + //#define Z2_INTERPOLATE true + #endif + + #if AXIS_IS_TMC(Z3) + #define Z3_CURRENT 800 + #define Z3_CURRENT_HOME Z3_CURRENT + #define Z3_MICROSTEPS Z_MICROSTEPS + #define Z3_RSENSE 0.11 + #define Z3_CHAIN_POS -1 + //#define Z3_INTERPOLATE true + #endif + + #if AXIS_IS_TMC(Z4) + #define Z4_CURRENT 800 + #define Z4_CURRENT_HOME Z4_CURRENT + #define Z4_MICROSTEPS Z_MICROSTEPS + #define Z4_RSENSE 0.11 + #define Z4_CHAIN_POS -1 + //#define Z4_INTERPOLATE true + #endif + + #if AXIS_IS_TMC(E0) + #define E0_CURRENT 800 + #define E0_MICROSTEPS 16 + #define E0_RSENSE 0.11 + #define E0_CHAIN_POS -1 + //#define E0_INTERPOLATE true + #endif + + #if AXIS_IS_TMC(E1) + #define E1_CURRENT 800 + #define E1_MICROSTEPS E0_MICROSTEPS + #define E1_RSENSE 0.11 + #define E1_CHAIN_POS -1 + //#define E1_INTERPOLATE true + #endif + + #if AXIS_IS_TMC(E2) + #define E2_CURRENT 800 + #define E2_MICROSTEPS E0_MICROSTEPS + #define E2_RSENSE 0.11 + #define E2_CHAIN_POS -1 + //#define E2_INTERPOLATE true + #endif + + #if AXIS_IS_TMC(E3) + #define E3_CURRENT 800 + #define E3_MICROSTEPS E0_MICROSTEPS + #define E3_RSENSE 0.11 + #define E3_CHAIN_POS -1 + //#define E3_INTERPOLATE true + #endif + + #if AXIS_IS_TMC(E4) + #define E4_CURRENT 800 + #define E4_MICROSTEPS E0_MICROSTEPS + #define E4_RSENSE 0.11 + #define E4_CHAIN_POS -1 + //#define E4_INTERPOLATE true + #endif + + #if AXIS_IS_TMC(E5) + #define E5_CURRENT 800 + #define E5_MICROSTEPS E0_MICROSTEPS + #define E5_RSENSE 0.11 + #define E5_CHAIN_POS -1 + //#define E5_INTERPOLATE true + #endif + + #if AXIS_IS_TMC(E6) + #define E6_CURRENT 800 + #define E6_MICROSTEPS E0_MICROSTEPS + #define E6_RSENSE 0.11 + #define E6_CHAIN_POS -1 + //#define E6_INTERPOLATE true + #endif + + #if AXIS_IS_TMC(E7) + #define E7_CURRENT 800 + #define E7_MICROSTEPS E0_MICROSTEPS + #define E7_RSENSE 0.11 + #define E7_CHAIN_POS -1 + //#define E7_INTERPOLATE true + #endif + + /** + * Override default SPI pins for TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160 drivers here. + * The default pins can be found in your board's pins file. + */ + //#define X_CS_PIN -1 + //#define Y_CS_PIN -1 + //#define Z_CS_PIN -1 + //#define X2_CS_PIN -1 + //#define Y2_CS_PIN -1 + //#define Z2_CS_PIN -1 + //#define Z3_CS_PIN -1 + //#define E0_CS_PIN -1 + //#define E1_CS_PIN -1 + //#define E2_CS_PIN -1 + //#define E3_CS_PIN -1 + //#define E4_CS_PIN -1 + //#define E5_CS_PIN -1 + //#define E6_CS_PIN -1 + //#define E7_CS_PIN -1 + + /** + * Software option for SPI driven drivers (TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160). + * The default SW SPI pins are defined the respective pins files, + * but you can override or define them here. + */ + //#define TMC_USE_SW_SPI + //#define TMC_SW_MOSI -1 + //#define TMC_SW_MISO -1 + //#define TMC_SW_SCK -1 + + /** + * Four TMC2209 drivers can use the same HW/SW serial port with hardware configured addresses. + * Set the address using jumpers on pins MS1 and MS2. + * Address | MS1 | MS2 + * 0 | LOW | LOW + * 1 | HIGH | LOW + * 2 | LOW | HIGH + * 3 | HIGH | HIGH + * + * Set *_SERIAL_TX_PIN and *_SERIAL_RX_PIN to match for all drivers + * on the same serial port, either here or in your board's pins file. + */ + //#define X_SLAVE_ADDRESS 0 + //#define Y_SLAVE_ADDRESS 0 + //#define Z_SLAVE_ADDRESS 0 + //#define X2_SLAVE_ADDRESS 0 + //#define Y2_SLAVE_ADDRESS 0 + //#define Z2_SLAVE_ADDRESS 0 + //#define Z3_SLAVE_ADDRESS 0 + //#define Z4_SLAVE_ADDRESS 0 + //#define E0_SLAVE_ADDRESS 0 + //#define E1_SLAVE_ADDRESS 0 + //#define E2_SLAVE_ADDRESS 0 + //#define E3_SLAVE_ADDRESS 0 + //#define E4_SLAVE_ADDRESS 0 + //#define E5_SLAVE_ADDRESS 0 + //#define E6_SLAVE_ADDRESS 0 + //#define E7_SLAVE_ADDRESS 0 + + /** + * Software enable + * + * Use for drivers that do not use a dedicated enable pin, but rather handle the same + * function through a communication line such as SPI or UART. + */ + //#define SOFTWARE_DRIVER_ENABLE + + /** + * TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only + * Use Trinamic's ultra quiet stepping mode. + * When disabled, Marlin will use spreadCycle stepping mode. + */ + #define STEALTHCHOP_XY + #define STEALTHCHOP_Z + #define STEALTHCHOP_E + + /** + * Optimize spreadCycle chopper parameters by using predefined parameter sets + * or with the help of an example included in the library. + * Provided parameter sets are + * CHOPPER_DEFAULT_12V + * CHOPPER_DEFAULT_19V + * CHOPPER_DEFAULT_24V + * CHOPPER_DEFAULT_36V + * CHOPPER_09STEP_24V // 0.9 degree steppers (24V) + * CHOPPER_PRUSAMK3_24V // Imported parameters from the official Průša firmware for MK3 (24V) + * CHOPPER_MARLIN_119 // Old defaults from Marlin v1.1.9 + * + * Define your own with: + * { , , hysteresis_start[1..8] } + */ + #define CHOPPER_TIMING CHOPPER_DEFAULT_12V // All axes (override below) + //#define CHOPPER_TIMING_X CHOPPER_DEFAULT_12V // For X Axes (override below) + //#define CHOPPER_TIMING_X2 CHOPPER_DEFAULT_12V + //#define CHOPPER_TIMING_Y CHOPPER_DEFAULT_12V // For Y Axes (override below) + //#define CHOPPER_TIMING_Y2 CHOPPER_DEFAULT_12V + //#define CHOPPER_TIMING_Z CHOPPER_DEFAULT_12V // For Z Axes (override below) + //#define CHOPPER_TIMING_Z2 CHOPPER_DEFAULT_12V + //#define CHOPPER_TIMING_Z3 CHOPPER_DEFAULT_12V + //#define CHOPPER_TIMING_Z4 CHOPPER_DEFAULT_12V + //#define CHOPPER_TIMING_E CHOPPER_DEFAULT_12V // For Extruders (override below) + //#define CHOPPER_TIMING_E1 CHOPPER_DEFAULT_12V + //#define CHOPPER_TIMING_E2 CHOPPER_DEFAULT_12V + //#define CHOPPER_TIMING_E3 CHOPPER_DEFAULT_12V + //#define CHOPPER_TIMING_E4 CHOPPER_DEFAULT_12V + //#define CHOPPER_TIMING_E5 CHOPPER_DEFAULT_12V + //#define CHOPPER_TIMING_E6 CHOPPER_DEFAULT_12V + //#define CHOPPER_TIMING_E7 CHOPPER_DEFAULT_12V + + /** + * Monitor Trinamic drivers + * for error conditions like overtemperature and short to ground. + * To manage over-temp Marlin can decrease the driver current until the error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant G-codes: + * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. + * M911 - Report stepper driver overtemperature pre-warn condition. + * M912 - Clear stepper driver overtemperature pre-warn condition flag. + * M122 - Report driver parameters (Requires TMC_DEBUG) + */ + //#define MONITOR_DRIVER_STATUS + + #if ENABLED(MONITOR_DRIVER_STATUS) + #define CURRENT_STEP_DOWN 50 // [mA] + #define REPORT_CURRENT_CHANGE + #define STOP_ON_ERROR + #endif + + /** + * TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only + * The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD. + * This mode allows for faster movements at the expense of higher noise levels. + * STEALTHCHOP_(XY|Z|E) must be enabled to use HYBRID_THRESHOLD. + * M913 X/Y/Z/E to live tune the setting + */ + //#define HYBRID_THRESHOLD + + #define X_HYBRID_THRESHOLD 100 // [mm/s] + #define X2_HYBRID_THRESHOLD 100 + #define Y_HYBRID_THRESHOLD 100 + #define Y2_HYBRID_THRESHOLD 100 + #define Z_HYBRID_THRESHOLD 3 + #define Z2_HYBRID_THRESHOLD 3 + #define Z3_HYBRID_THRESHOLD 3 + #define Z4_HYBRID_THRESHOLD 3 + #define E0_HYBRID_THRESHOLD 30 + #define E1_HYBRID_THRESHOLD 30 + #define E2_HYBRID_THRESHOLD 30 + #define E3_HYBRID_THRESHOLD 30 + #define E4_HYBRID_THRESHOLD 30 + #define E5_HYBRID_THRESHOLD 30 + #define E6_HYBRID_THRESHOLD 30 + #define E7_HYBRID_THRESHOLD 30 + + /** + * Use StallGuard to home / probe X, Y, Z. + * + * TMC2130, TMC2160, TMC2209, TMC2660, TMC5130, and TMC5160 only + * Connect the stepper driver's DIAG1 pin to the X/Y endstop pin. + * X, Y, and Z homing will always be done in spreadCycle mode. + * + * X/Y/Z_STALL_SENSITIVITY is the default stall threshold. + * Use M914 X Y Z to set the stall threshold at runtime: + * + * Sensitivity TMC2209 Others + * HIGHEST 255 -64 (Too sensitive => False positive) + * LOWEST 0 63 (Too insensitive => No trigger) + * + * It is recommended to set HOMING_BUMP_MM to { 0, 0, 0 }. + * + * SPI_ENDSTOPS *** Beta feature! *** TMC2130 Only *** + * Poll the driver through SPI to determine load when homing. + * Removes the need for a wire from DIAG1 to an endstop pin. + * + * IMPROVE_HOMING_RELIABILITY tunes acceleration and jerk when + * homing and adds a guard period for endstop triggering. + * + * Comment *_STALL_SENSITIVITY to disable sensorless homing for that axis. + */ + //#define SENSORLESS_HOMING // StallGuard capable drivers only + + #if EITHER(SENSORLESS_HOMING, SENSORLESS_PROBING) + // TMC2209: 0...255. TMC2130: -64...63 + #define X_STALL_SENSITIVITY 8 + #define X2_STALL_SENSITIVITY X_STALL_SENSITIVITY + #define Y_STALL_SENSITIVITY 8 + #define Y2_STALL_SENSITIVITY Y_STALL_SENSITIVITY + //#define Z_STALL_SENSITIVITY 8 + //#define Z2_STALL_SENSITIVITY Z_STALL_SENSITIVITY + //#define Z3_STALL_SENSITIVITY Z_STALL_SENSITIVITY + //#define Z4_STALL_SENSITIVITY Z_STALL_SENSITIVITY + //#define SPI_ENDSTOPS // TMC2130 only + //#define IMPROVE_HOMING_RELIABILITY + #endif + + /** + * TMC Homing stepper phase. + * + * Improve homing repeatability by homing to stepper coil's nearest absolute + * phase position. Trinamic drivers use a stepper phase table with 1024 values + * spanning 4 full steps with 256 positions each (ergo, 1024 positions). + * Full step positions (128, 384, 640, 896) have the highest holding torque. + * + * Values from 0..1023, -1 to disable homing phase for that axis. + */ + //#define TMC_HOME_PHASE { 896, 896, 896 } + + /** + * Beta feature! + * Create a 50/50 square wave step pulse optimal for stepper drivers. + */ + //#define SQUARE_WAVE_STEPPING + + /** + * Enable M122 debugging command for TMC stepper drivers. + * M122 S0/1 will enable continous reporting. + */ + //#define TMC_DEBUG + + /** + * You can set your own advanced settings by filling in predefined functions. + * A list of available functions can be found on the library github page + * https://github.com/teemuatlut/TMCStepper + * + * Example: + * #define TMC_ADV() { \ + * stepperX.diag0_otpw(1); \ + * stepperY.intpol(0); \ + * } + */ + #define TMC_ADV() { } + +#endif // HAS_TRINAMIC_CONFIG + +// @section L64XX + +/** + * L64XX Stepper Driver options + * + * Arduino-L6470 library (0.8.0 or higher) is required. + * https://github.com/ameyer/Arduino-L6470 + * + * Requires the following to be defined in your pins_YOUR_BOARD file + * L6470_CHAIN_SCK_PIN + * L6470_CHAIN_MISO_PIN + * L6470_CHAIN_MOSI_PIN + * L6470_CHAIN_SS_PIN + * ENABLE_RESET_L64XX_CHIPS(Q) where Q is 1 to enable and 0 to reset + */ + +#if HAS_L64XX + + //#define L6470_CHITCHAT // Display additional status info + + #if AXIS_IS_L64XX(X) + #define X_MICROSTEPS 128 // Number of microsteps (VALID: 1, 2, 4, 8, 16, 32, 128) - L6474 max is 16 + #define X_OVERCURRENT 2000 // (mA) Current where the driver detects an over current + // L6470 & L6474 - VALID: 375 x (1 - 16) - 6A max - rounds down + // POWERSTEP01: VALID: 1000 x (1 - 32) - 32A max - rounds down + #define X_STALLCURRENT 1500 // (mA) Current where the driver detects a stall (VALID: 31.25 * (1-128) - 4A max - rounds down) + // L6470 & L6474 - VALID: 31.25 * (1-128) - 4A max - rounds down + // POWERSTEP01: VALID: 200 x (1 - 32) - 6.4A max - rounds down + // L6474 - STALLCURRENT setting is used to set the nominal (TVAL) current + #define X_MAX_VOLTAGE 127 // 0-255, Maximum effective voltage seen by stepper - not used by L6474 + #define X_CHAIN_POS -1 // Position in SPI chain, 0=Not in chain, 1=Nearest MOSI + #define X_SLEW_RATE 1 // 0-3, Slew 0 is slowest, 3 is fastest + #endif + + #if AXIS_IS_L64XX(X2) + #define X2_MICROSTEPS X_MICROSTEPS + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + #define X2_MAX_VOLTAGE 127 + #define X2_CHAIN_POS -1 + #define X2_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(Y) + #define Y_MICROSTEPS 128 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + #define Y_MAX_VOLTAGE 127 + #define Y_CHAIN_POS -1 + #define Y_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(Y2) + #define Y2_MICROSTEPS Y_MICROSTEPS + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + #define Y2_MAX_VOLTAGE 127 + #define Y2_CHAIN_POS -1 + #define Y2_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(Z) + #define Z_MICROSTEPS 128 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + #define Z_MAX_VOLTAGE 127 + #define Z_CHAIN_POS -1 + #define Z_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(Z2) + #define Z2_MICROSTEPS Z_MICROSTEPS + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + #define Z2_MAX_VOLTAGE 127 + #define Z2_CHAIN_POS -1 + #define Z2_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(Z3) + #define Z3_MICROSTEPS Z_MICROSTEPS + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 + #define Z3_MAX_VOLTAGE 127 + #define Z3_CHAIN_POS -1 + #define Z3_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(Z4) + #define Z4_MICROSTEPS Z_MICROSTEPS + #define Z4_OVERCURRENT 2000 + #define Z4_STALLCURRENT 1500 + #define Z4_MAX_VOLTAGE 127 + #define Z4_CHAIN_POS -1 + #define Z4_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(E0) + #define E0_MICROSTEPS 128 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + #define E0_MAX_VOLTAGE 127 + #define E0_CHAIN_POS -1 + #define E0_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(E1) + #define E1_MICROSTEPS E0_MICROSTEPS + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + #define E1_MAX_VOLTAGE 127 + #define E1_CHAIN_POS -1 + #define E1_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(E2) + #define E2_MICROSTEPS E0_MICROSTEPS + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + #define E2_MAX_VOLTAGE 127 + #define E2_CHAIN_POS -1 + #define E2_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(E3) + #define E3_MICROSTEPS E0_MICROSTEPS + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + #define E3_MAX_VOLTAGE 127 + #define E3_CHAIN_POS -1 + #define E3_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(E4) + #define E4_MICROSTEPS E0_MICROSTEPS + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + #define E4_MAX_VOLTAGE 127 + #define E4_CHAIN_POS -1 + #define E4_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(E5) + #define E5_MICROSTEPS E0_MICROSTEPS + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 + #define E5_MAX_VOLTAGE 127 + #define E5_CHAIN_POS -1 + #define E5_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(E6) + #define E6_MICROSTEPS E0_MICROSTEPS + #define E6_OVERCURRENT 2000 + #define E6_STALLCURRENT 1500 + #define E6_MAX_VOLTAGE 127 + #define E6_CHAIN_POS -1 + #define E6_SLEW_RATE 1 + #endif + + #if AXIS_IS_L64XX(E7) + #define E7_MICROSTEPS E0_MICROSTEPS + #define E7_OVERCURRENT 2000 + #define E7_STALLCURRENT 1500 + #define E7_MAX_VOLTAGE 127 + #define E7_CHAIN_POS -1 + #define E7_SLEW_RATE 1 + #endif + + /** + * Monitor L6470 drivers for error conditions like over temperature and over current. + * In the case of over temperature Marlin can decrease the drive until the error condition clears. + * Other detected conditions can be used to stop the current print. + * Relevant G-codes: + * M906 - I1/2/3/4/5 Set or get motor drive level using axis codes X, Y, Z, E. Report values if no axis codes given. + * I not present or I0 or I1 - X, Y, Z or E0 + * I2 - X2, Y2, Z2 or E1 + * I3 - Z3 or E3 + * I4 - Z4 or E4 + * I5 - E5 + * M916 - Increase drive level until get thermal warning + * M917 - Find minimum current thresholds + * M918 - Increase speed until max or error + * M122 S0/1 - Report driver parameters + */ + //#define MONITOR_L6470_DRIVER_STATUS + + #if ENABLED(MONITOR_L6470_DRIVER_STATUS) + #define KVAL_HOLD_STEP_DOWN 1 + //#define L6470_STOP_ON_ERROR + #endif + +#endif // HAS_L64XX + +// @section i2cbus + +// +// I2C Master ID for LPC176x LCD and Digital Current control +// Does not apply to other peripherals based on the Wire library. +// +//#define I2C_MASTER_ID 1 // Set a value from 0 to 2 + +/** + * TWI/I2C BUS + * + * This feature is an EXPERIMENTAL feature so it shall not be used on production + * machines. Enabling this will allow you to send and receive I2C data from slave + * devices on the bus. + * + * ; Example #1 + * ; This macro send the string "Marlin" to the slave device with address 0x63 (99) + * ; It uses multiple M260 commands with one B arg + * M260 A99 ; Target slave address + * M260 B77 ; M + * M260 B97 ; a + * M260 B114 ; r + * M260 B108 ; l + * M260 B105 ; i + * M260 B110 ; n + * M260 S1 ; Send the current buffer + * + * ; Example #2 + * ; Request 6 bytes from slave device with address 0x63 (99) + * M261 A99 B5 + * + * ; Example #3 + * ; Example serial output of a M261 request + * echo:i2c-reply: from:99 bytes:5 data:hello + */ + +//#define EXPERIMENTAL_I2CBUS +#if ENABLED(EXPERIMENTAL_I2CBUS) + #define I2C_SLAVE_ADDRESS 0 // Set a value from 8 to 127 to act as a slave +#endif + +// @section extras + +/** + * Photo G-code + * Add the M240 G-code to take a photo. + * The photo can be triggered by a digital pin or a physical movement. + */ +//#define PHOTO_GCODE +#if ENABLED(PHOTO_GCODE) + // A position to move to (and raise Z) before taking the photo + //#define PHOTO_POSITION { X_MAX_POS - 5, Y_MAX_POS, 0 } // { xpos, ypos, zraise } (M240 X Y Z) + //#define PHOTO_DELAY_MS 100 // (ms) Duration to pause before moving back (M240 P) + //#define PHOTO_RETRACT_MM 6.5 // (mm) E retract/recover for the photo move (M240 R S) + + // Canon RC-1 or homebrew digital camera trigger + // Data from: https://www.doc-diy.net/photo/rc-1_hacked/ + //#define PHOTOGRAPH_PIN 23 + + // Canon Hack Development Kit + // https://captain-slow.dk/2014/03/09/3d-printing-timelapses/ + //#define CHDK_PIN 4 + + // Optional second move with delay to trigger the camera shutter + //#define PHOTO_SWITCH_POSITION { X_MAX_POS, Y_MAX_POS } // { xpos, ypos } (M240 I J) + + // Duration to hold the switch or keep CHDK_PIN high + //#define PHOTO_SWITCH_MS 50 // (ms) (M240 D) + + /** + * PHOTO_PULSES_US may need adjustment depending on board and camera model. + * Pin must be running at 48.4kHz. + * Be sure to use a PHOTOGRAPH_PIN which can rise and fall quick enough. + * (e.g., MKS SBase temp sensor pin was too slow, so used P1.23 on J8.) + * + * Example pulse data for Nikon: https://bit.ly/2FKD0Aq + * IR Wiring: https://git.io/JvJf7 + */ + //#define PHOTO_PULSES_US { 2000, 27850, 400, 1580, 400, 3580, 400 } // (µs) Durations for each 48.4kHz oscillation + #ifdef PHOTO_PULSES_US + #define PHOTO_PULSE_DELAY_US 13 // (µs) Approximate duration of each HIGH and LOW pulse in the oscillation + #endif +#endif + +/** + * Spindle & Laser control + * + * Add the M3, M4, and M5 commands to turn the spindle/laser on and off, and + * to set spindle speed, spindle direction, and laser power. + * + * SuperPid is a router/spindle speed controller used in the CNC milling community. + * Marlin can be used to turn the spindle on and off. It can also be used to set + * the spindle speed from 5,000 to 30,000 RPM. + * + * You'll need to select a pin for the ON/OFF function and optionally choose a 0-5V + * hardware PWM pin for the speed control and a pin for the rotation direction. + * + * See https://marlinfw.org/docs/configuration/laser_spindle.html for more config details. + */ +//#define SPINDLE_FEATURE +//#define LASER_FEATURE +#if EITHER(SPINDLE_FEATURE, LASER_FEATURE) + #define SPINDLE_LASER_ACTIVE_STATE LOW // Set to "HIGH" if the on/off function is active HIGH + #define SPINDLE_LASER_PWM true // Set to "true" if your controller supports setting the speed/power + #define SPINDLE_LASER_PWM_INVERT false // Set to "true" if the speed/power goes up when you want it to go slower + + #define SPINDLE_LASER_FREQUENCY 2500 // (Hz) Spindle/laser frequency (only on supported HALs: AVR and LPC) + + //#define SPINDLE_SERVO // A servo converting an angle to spindle power + #ifdef SPINDLE_SERVO + #define SPINDLE_SERVO_NR 0 // Index of servo used for spindle control + #define SPINDLE_SERVO_MIN 10 // Minimum angle for servo spindle + #endif + + /** + * Speed / Power can be set ('M3 S') and displayed in terms of: + * - PWM255 (S0 - S255) + * - PERCENT (S0 - S100) + * - RPM (S0 - S50000) Best for use with a spindle + * - SERVO (S0 - S180) + */ + #define CUTTER_POWER_UNIT PWM255 + + /** + * Relative Cutter Power + * Normally, 'M3 O' sets + * OCR power is relative to the range SPEED_POWER_MIN...SPEED_POWER_MAX. + * so input powers of 0...255 correspond to SPEED_POWER_MIN...SPEED_POWER_MAX + * instead of normal range (0 to SPEED_POWER_MAX). + * Best used with (e.g.) SuperPID router controller: S0 = 5,000 RPM and S255 = 30,000 RPM + */ + //#define CUTTER_POWER_RELATIVE // Set speed proportional to [SPEED_POWER_MIN...SPEED_POWER_MAX] + + #if ENABLED(SPINDLE_FEATURE) + //#define SPINDLE_CHANGE_DIR // Enable if your spindle controller can change spindle direction + #define SPINDLE_CHANGE_DIR_STOP // Enable if the spindle should stop before changing spin direction + #define SPINDLE_INVERT_DIR false // Set to "true" if the spin direction is reversed + + #define SPINDLE_LASER_POWERUP_DELAY 5000 // (ms) Delay to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 5000 // (ms) Delay to allow the spindle to stop + + /** + * M3/M4 Power Equation + * + * Each tool uses different value ranges for speed / power control. + * These parameters are used to convert between tool power units and PWM. + * + * Speed/Power = (PWMDC / 255 * 100 - SPEED_POWER_INTERCEPT) / SPEED_POWER_SLOPE + * PWMDC = (spdpwr - SPEED_POWER_MIN) / (SPEED_POWER_MAX - SPEED_POWER_MIN) / SPEED_POWER_SLOPE + */ + #define SPEED_POWER_INTERCEPT 0 // (%) 0-100 i.e., Minimum power percentage + #define SPEED_POWER_MIN 5000 // (RPM) + #define SPEED_POWER_MAX 30000 // (RPM) SuperPID router controller 0 - 30,000 RPM + #define SPEED_POWER_STARTUP 25000 // (RPM) M3/M4 speed/power default (with no arguments) + + #else + + #define SPEED_POWER_INTERCEPT 0 // (%) 0-100 i.e., Minimum power percentage + #define SPEED_POWER_MIN 0 // (%) 0-100 + #define SPEED_POWER_MAX 100 // (%) 0-100 + #define SPEED_POWER_STARTUP 80 // (%) M3/M4 speed/power default (with no arguments) + + // Define the minimum and maximum test pulse time values for a laser test fire function + #define LASER_TEST_PULSE_MIN 1 // Used with Laser Control Menu + #define LASER_TEST_PULSE_MAX 999 // Caution: Menu may not show more than 3 characters + + /** + * Enable inline laser power to be handled in the planner / stepper routines. + * Inline power is specified by the I (inline) flag in an M3 command (e.g., M3 S20 I) + * or by the 'S' parameter in G0/G1/G2/G3 moves (see LASER_MOVE_POWER). + * + * This allows the laser to keep in perfect sync with the planner and removes + * the powerup/down delay since lasers require negligible time. + */ + //#define LASER_POWER_INLINE + + #if ENABLED(LASER_POWER_INLINE) + /** + * Scale the laser's power in proportion to the movement rate. + * + * - Sets the entry power proportional to the entry speed over the nominal speed. + * - Ramps the power up every N steps to approximate the speed trapezoid. + * - Due to the limited power resolution this is only approximate. + */ + #define LASER_POWER_INLINE_TRAPEZOID + + /** + * Continuously calculate the current power (nominal_power * current_rate / nominal_rate). + * Required for accurate power with non-trapezoidal acceleration (e.g., S_CURVE_ACCELERATION). + * This is a costly calculation so this option is discouraged on 8-bit AVR boards. + * + * LASER_POWER_INLINE_TRAPEZOID_CONT_PER defines how many step cycles there are between power updates. If your + * board isn't able to generate steps fast enough (and you are using LASER_POWER_INLINE_TRAPEZOID_CONT), increase this. + * Note that when this is zero it means it occurs every cycle; 1 means a delay wait one cycle then run, etc. + */ + //#define LASER_POWER_INLINE_TRAPEZOID_CONT + + /** + * Stepper iterations between power updates. Increase this value if the board + * can't keep up with the processing demands of LASER_POWER_INLINE_TRAPEZOID_CONT. + * Disable (or set to 0) to recalculate power on every stepper iteration. + */ + //#define LASER_POWER_INLINE_TRAPEZOID_CONT_PER 10 + + /** + * Include laser power in G0/G1/G2/G3/G5 commands with the 'S' parameter + */ + //#define LASER_MOVE_POWER + + #if ENABLED(LASER_MOVE_POWER) + // Turn off the laser on G0 moves with no power parameter. + // If a power parameter is provided, use that instead. + //#define LASER_MOVE_G0_OFF + + // Turn off the laser on G28 homing. + //#define LASER_MOVE_G28_OFF + #endif + + /** + * Inline flag inverted + * + * WARNING: M5 will NOT turn off the laser unless another move + * is done (so G-code files must end with 'M5 I'). + */ + //#define LASER_POWER_INLINE_INVERT + + /** + * Continuously apply inline power. ('M3 S3' == 'G1 S3' == 'M3 S3 I') + * + * The laser might do some weird things, so only enable this + * feature if you understand the implications. + */ + //#define LASER_POWER_INLINE_CONTINUOUS + + #else + + #define SPINDLE_LASER_POWERUP_DELAY 50 // (ms) Delay to allow the spindle/laser to come up to speed/power + #define SPINDLE_LASER_POWERDOWN_DELAY 50 // (ms) Delay to allow the spindle to stop + + #endif + #endif +#endif + +/** + * Coolant Control + * + * Add the M7, M8, and M9 commands to turn mist or flood coolant on and off. + * + * Note: COOLANT_MIST_PIN and/or COOLANT_FLOOD_PIN must also be defined. + */ +//#define COOLANT_CONTROL +#if ENABLED(COOLANT_CONTROL) + #define COOLANT_MIST // Enable if mist coolant is present + #define COOLANT_FLOOD // Enable if flood coolant is present + #define COOLANT_MIST_INVERT false // Set "true" if the on/off function is reversed + #define COOLANT_FLOOD_INVERT false // Set "true" if the on/off function is reversed +#endif + +/** + * Filament Width Sensor + * + * Measures the filament width in real-time and adjusts + * flow rate to compensate for any irregularities. + * + * Also allows the measured filament diameter to set the + * extrusion rate, so the slicer only has to specify the + * volume. + * + * Only a single extruder is supported at this time. + * + * 34 RAMPS_14 : Analog input 5 on the AUX2 connector + * 81 PRINTRBOARD : Analog input 2 on the Exp1 connector (version B,C,D,E) + * 301 RAMBO : Analog input 3 + * + * Note: May require analog pins to be defined for other boards. + */ +//#define FILAMENT_WIDTH_SENSOR + +#if ENABLED(FILAMENT_WIDTH_SENSOR) + #define FILAMENT_SENSOR_EXTRUDER_NUM 0 // Index of the extruder that has the filament sensor. :[0,1,2,3,4] + #define MEASUREMENT_DELAY_CM 14 // (cm) The distance from the filament sensor to the melting chamber + + #define FILWIDTH_ERROR_MARGIN 1.0 // (mm) If a measurement differs too much from nominal width ignore it + #define MAX_MEASUREMENT_DELAY 20 // (bytes) Buffer size for stored measurements (1 byte per cm). Must be larger than MEASUREMENT_DELAY_CM. + + #define DEFAULT_MEASURED_FILAMENT_DIA DEFAULT_NOMINAL_FILAMENT_DIA // Set measured to nominal initially + + // Display filament width on the LCD status line. Status messages will expire after 5 seconds. + //#define FILAMENT_LCD_DISPLAY +#endif + +/** + * Power Monitor + * Monitor voltage (V) and/or current (A), and -when possible- power (W) + * + * Read and configure with M430 + * + * The current sensor feeds DC voltage (relative to the measured current) to an analog pin + * The voltage sensor feeds DC voltage (relative to the measured voltage) to an analog pin + */ +//#define POWER_MONITOR_CURRENT // Monitor the system current +//#define POWER_MONITOR_VOLTAGE // Monitor the system voltage +#if EITHER(POWER_MONITOR_CURRENT, POWER_MONITOR_VOLTAGE) + #define POWER_MONITOR_VOLTS_PER_AMP 0.05000 // Input voltage to the MCU analog pin per amp - DO NOT apply more than ADC_VREF! + #define POWER_MONITOR_CURRENT_OFFSET -1 // Offset value for current sensors with linear function output + #define POWER_MONITOR_VOLTS_PER_VOLT 0.11786 // Input voltage to the MCU analog pin per volt - DO NOT apply more than ADC_VREF! + #define POWER_MONITOR_FIXED_VOLTAGE 13.6 // Voltage for a current sensor with no voltage sensor (for power display) +#endif + +/** + * CNC Coordinate Systems + * + * Enables G53 and G54-G59.3 commands to select coordinate systems + * and G92.1 to reset the workspace to native machine space. + */ +//#define CNC_COORDINATE_SYSTEMS + +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + +/** + * Include capabilities in M115 output + */ +#define EXTENDED_CAPABILITIES_REPORT +#if ENABLED(EXTENDED_CAPABILITIES_REPORT) + //#define M115_GEOMETRY_REPORT +#endif + +/** + * Expected Printer Check + * Add the M16 G-code to compare a string to the MACHINE_NAME. + * M16 with a non-matching string causes the printer to halt. + */ +//#define EXPECTED_PRINTER_CHECK + +/** + * Disable all Volumetric extrusion options + */ +//#define NO_VOLUMETRICS + +#if DISABLED(NO_VOLUMETRICS) + /** + * Volumetric extrusion default state + * Activate to make volumetric extrusion the default method, + * with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter. + * + * M200 D0 to disable, M200 Dn to set a new diameter (and enable volumetric). + * M200 S0/S1 to disable/enable volumetric extrusion. + */ + //#define VOLUMETRIC_DEFAULT_ON + + //#define VOLUMETRIC_EXTRUDER_LIMIT + #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) + /** + * Default volumetric extrusion limit in cubic mm per second (mm^3/sec). + * This factory setting applies to all extruders. + * Use 'M200 [T] L' to override and 'M502' to reset. + * A non-zero value activates Volume-based Extrusion Limiting. + */ + #define DEFAULT_VOLUMETRIC_EXTRUDER_LIMIT 0.00 // (mm^3/sec) + #endif +#endif + +/** + * Enable this option for a leaner build of Marlin that removes all + * workspace offsets, simplifying coordinate transformations, leveling, etc. + * + * - M206 and M428 are disabled. + * - G92 will revert to its behavior from Marlin 1.0. + */ +//#define NO_WORKSPACE_OFFSETS + +// Extra options for the M114 "Current Position" report +//#define M114_DETAIL // Use 'M114` for details to check planner calculations +//#define M114_REALTIME // Real current position based on forward kinematics +//#define M114_LEGACY // M114 used to synchronize on every call. Enable if needed. + +//#define REPORT_FAN_CHANGE // Report the new fan speed when changed by M106 (and others) + +/** + * Set the number of proportional font spaces required to fill up a typical character space. + * This can help to better align the output of commands like `G29 O` Mesh Output. + * + * For clients that use a fixed-width font (like OctoPrint), leave this set to 1.0. + * Otherwise, adjust according to your client and font. + */ +#define PROPORTIONAL_FONT_RATIO 1.0 + +/** + * Spend 28 bytes of SRAM to optimize the GCode parser + */ +#define FASTER_GCODE_PARSER + +#if ENABLED(FASTER_GCODE_PARSER) + //#define GCODE_QUOTED_STRINGS // Support for quoted string parameters +#endif + +// Support for MeatPack G-code compression (https://github.com/scottmudge/OctoPrint-MeatPack) +//#define MEATPACK_ON_SERIAL_PORT_1 +//#define MEATPACK_ON_SERIAL_PORT_2 + +//#define GCODE_CASE_INSENSITIVE // Accept G-code sent to the firmware in lowercase + +//#define REPETIER_GCODE_M360 // Add commands originally from Repetier FW + +/** + * CNC G-code options + * Support CNC-style G-code dialects used by laser cutters, drawing machine cams, etc. + * Note that G0 feedrates should be used with care for 3D printing (if used at all). + * High feedrates may cause ringing and harm print quality. + */ +//#define PAREN_COMMENTS // Support for parentheses-delimited comments +//#define GCODE_MOTION_MODES // Remember the motion mode (G0 G1 G2 G3 G5 G38.X) and apply for X Y Z E F, etc. + +// Enable and set a (default) feedrate for all G0 moves +//#define G0_FEEDRATE 3000 // (mm/min) +#ifdef G0_FEEDRATE + //#define VARIABLE_G0_FEEDRATE // The G0 feedrate is set by F in G0 motion mode +#endif + +/** + * Startup commands + * + * Execute certain G-code commands immediately after power-on. + */ +//#define STARTUP_COMMANDS "M17 Z" + +/** + * G-code Macros + * + * Add G-codes M810-M819 to define and run G-code macros. + * Macros are not saved to EEPROM. + */ +//#define GCODE_MACROS +#if ENABLED(GCODE_MACROS) + #define GCODE_MACROS_SLOTS 5 // Up to 10 may be used + #define GCODE_MACROS_SLOT_SIZE 50 // Maximum length of a single macro +#endif + +/** + * User-defined buttons to run custom G-code. + * Up to 25 may be defined. + */ +//#define CUSTOM_USER_BUTTONS +#if ENABLED(CUSTOM_USER_BUTTONS) + //#define BUTTON1_PIN -1 + #if PIN_EXISTS(BUTTON1) + #define BUTTON1_HIT_STATE LOW // State of the triggered button. NC=LOW. NO=HIGH. + #define BUTTON1_WHEN_PRINTING false // Button allowed to trigger during printing? + #define BUTTON1_GCODE "G28" + #define BUTTON1_DESC "Homing" // Optional string to set the LCD status + #endif + + //#define BUTTON2_PIN -1 + #if PIN_EXISTS(BUTTON2) + #define BUTTON2_HIT_STATE LOW + #define BUTTON2_WHEN_PRINTING false + #define BUTTON2_GCODE "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + #define BUTTON2_DESC "Preheat for " PREHEAT_1_LABEL + #endif + + //#define BUTTON3_PIN -1 + #if PIN_EXISTS(BUTTON3) + #define BUTTON3_HIT_STATE LOW + #define BUTTON3_WHEN_PRINTING false + #define BUTTON3_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + #define BUTTON3_DESC "Preheat for " PREHEAT_2_LABEL + #endif +#endif + +/** + * User-defined menu items to run custom G-code. + * Up to 25 may be defined, but the actual number is LCD-dependent. + */ +//#define CUSTOM_USER_MENUS +#if ENABLED(CUSTOM_USER_MENUS) + //#define CUSTOM_USER_MENU_TITLE "Custom Commands" + #define USER_SCRIPT_DONE "M117 User Script Done" + #define USER_SCRIPT_AUDIBLE_FEEDBACK + //#define USER_SCRIPT_RETURN // Return to status screen after a script + + #define USER_DESC_1 "Home & UBL Info" + #define USER_GCODE_1 "G28\nG29W" + + #define USER_DESC_2 "Preheat for " PREHEAT_1_LABEL + #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + + #define USER_DESC_3 "Preheat for " PREHEAT_2_LABEL + #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + + #define USER_DESC_4 "Heat Bed/Home/Level" + #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + + #define USER_DESC_5 "Home & Info" + #define USER_GCODE_5 "G28\nM503" +#endif + +/** + * Host Action Commands + * + * Define host streamer action commands in compliance with the standard. + * + * See https://reprap.org/wiki/G-code#Action_commands + * Common commands ........ poweroff, pause, paused, resume, resumed, cancel + * G29_RETRY_AND_RECOVER .. probe_rewipe, probe_failed + * + * Some features add reason codes to extend these commands. + * + * Host Prompt Support enables Marlin to use the host for user prompts so + * filament runout and other processes can be managed from the host side. + */ +//#define HOST_ACTION_COMMANDS +#if ENABLED(HOST_ACTION_COMMANDS) + //#define HOST_PROMPT_SUPPORT + //#define HOST_START_MENU_ITEM // Add a menu item that tells the host to start +#endif + +/** + * Cancel Objects + * + * Implement M486 to allow Marlin to skip objects + */ +//#define CANCEL_OBJECTS + +/** + * I2C position encoders for closed loop control. + * Developed by Chris Barr at Aus3D. + * + * Wiki: https://wiki.aus3d.com.au/Magnetic_Encoder + * Github: https://github.com/Aus3D/MagneticEncoder + * + * Supplier: https://aus3d.com.au/magnetic-encoder-module + * Alternative Supplier: https://reliabuild3d.com/ + * + * Reliabuild encoders have been modified to improve reliability. + */ + +//#define I2C_POSITION_ENCODERS +#if ENABLED(I2C_POSITION_ENCODERS) + + #define I2CPE_ENCODER_CNT 1 // The number of encoders installed; max of 5 + // encoders supported currently. + + #define I2CPE_ENC_1_ADDR I2CPE_PRESET_ADDR_X // I2C address of the encoder. 30-200. + #define I2CPE_ENC_1_AXIS X_AXIS // Axis the encoder module is installed on. _AXIS. + #define I2CPE_ENC_1_TYPE I2CPE_ENC_TYPE_LINEAR // Type of encoder: I2CPE_ENC_TYPE_LINEAR -or- + // I2CPE_ENC_TYPE_ROTARY. + #define I2CPE_ENC_1_TICKS_UNIT 2048 // 1024 for magnetic strips with 2mm poles; 2048 for + // 1mm poles. For linear encoders this is ticks / mm, + // for rotary encoders this is ticks / revolution. + //#define I2CPE_ENC_1_TICKS_REV (16 * 200) // Only needed for rotary encoders; number of stepper + // steps per full revolution (motor steps/rev * microstepping) + //#define I2CPE_ENC_1_INVERT // Invert the direction of axis travel. + #define I2CPE_ENC_1_EC_METHOD I2CPE_ECM_MICROSTEP // Type of error error correction. + #define I2CPE_ENC_1_EC_THRESH 0.10 // Threshold size for error (in mm) above which the + // printer will attempt to correct the error; errors + // smaller than this are ignored to minimize effects of + // measurement noise / latency (filter). + + #define I2CPE_ENC_2_ADDR I2CPE_PRESET_ADDR_Y // Same as above, but for encoder 2. + #define I2CPE_ENC_2_AXIS Y_AXIS + #define I2CPE_ENC_2_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_ENC_2_TICKS_UNIT 2048 + //#define I2CPE_ENC_2_TICKS_REV (16 * 200) + //#define I2CPE_ENC_2_INVERT + #define I2CPE_ENC_2_EC_METHOD I2CPE_ECM_MICROSTEP + #define I2CPE_ENC_2_EC_THRESH 0.10 + + #define I2CPE_ENC_3_ADDR I2CPE_PRESET_ADDR_Z // Encoder 3. Add additional configuration options + #define I2CPE_ENC_3_AXIS Z_AXIS // as above, or use defaults below. + + #define I2CPE_ENC_4_ADDR I2CPE_PRESET_ADDR_E // Encoder 4. + #define I2CPE_ENC_4_AXIS E_AXIS + + #define I2CPE_ENC_5_ADDR 34 // Encoder 5. + #define I2CPE_ENC_5_AXIS E_AXIS + + // Default settings for encoders which are enabled, but without settings configured above. + #define I2CPE_DEF_TYPE I2CPE_ENC_TYPE_LINEAR + #define I2CPE_DEF_ENC_TICKS_UNIT 2048 + #define I2CPE_DEF_TICKS_REV (16 * 200) + #define I2CPE_DEF_EC_METHOD I2CPE_ECM_NONE + #define I2CPE_DEF_EC_THRESH 0.1 + + //#define I2CPE_ERR_THRESH_ABORT 100.0 // Threshold size for error (in mm) error on any given + // axis after which the printer will abort. Comment out to + // disable abort behavior. + + #define I2CPE_TIME_TRUSTED 10000 // After an encoder fault, there must be no further fault + // for this amount of time (in ms) before the encoder + // is trusted again. + + /** + * Position is checked every time a new command is executed from the buffer but during long moves, + * this setting determines the minimum update time between checks. A value of 100 works well with + * error rolling average when attempting to correct only for skips and not for vibration. + */ + #define I2CPE_MIN_UPD_TIME_MS 4 // (ms) Minimum time between encoder checks. + + // Use a rolling average to identify persistant errors that indicate skips, as opposed to vibration and noise. + #define I2CPE_ERR_ROLLING_AVERAGE + +#endif // I2C_POSITION_ENCODERS + +/** + * Analog Joystick(s) + */ +//#define JOYSTICK +#if ENABLED(JOYSTICK) + #define JOY_X_PIN 5 // RAMPS: Suggested pin A5 on AUX2 + #define JOY_Y_PIN 10 // RAMPS: Suggested pin A10 on AUX2 + #define JOY_Z_PIN 12 // RAMPS: Suggested pin A12 on AUX2 + #define JOY_EN_PIN 44 // RAMPS: Suggested pin D44 on AUX2 + + //#define INVERT_JOY_X // Enable if X direction is reversed + //#define INVERT_JOY_Y // Enable if Y direction is reversed + //#define INVERT_JOY_Z // Enable if Z direction is reversed + + // Use M119 with JOYSTICK_DEBUG to find reasonable values after connecting: + #define JOY_X_LIMITS { 5600, 8190-100, 8190+100, 10800 } // min, deadzone start, deadzone end, max + #define JOY_Y_LIMITS { 5600, 8250-100, 8250+100, 11000 } + #define JOY_Z_LIMITS { 4800, 8080-100, 8080+100, 11550 } + //#define JOYSTICK_DEBUG +#endif + +/** + * Mechanical Gantry Calibration + * Modern replacement for the Prusa TMC_Z_CALIBRATION. + * Adds capability to work with any adjustable current drivers. + * Implemented as G34 because M915 is deprecated. + */ +//#define MECHANICAL_GANTRY_CALIBRATION +#if ENABLED(MECHANICAL_GANTRY_CALIBRATION) + #define GANTRY_CALIBRATION_CURRENT 600 // Default calibration current in ma + #define GANTRY_CALIBRATION_EXTRA_HEIGHT 15 // Extra distance in mm past Z_###_POS to move + #define GANTRY_CALIBRATION_FEEDRATE 500 // Feedrate for correction move + //#define GANTRY_CALIBRATION_TO_MIN // Enable to calibrate Z in the MIN direction + + //#define GANTRY_CALIBRATION_SAFE_POSITION XY_CENTER // Safe position for nozzle + //#define GANTRY_CALIBRATION_XY_PARK_FEEDRATE 3000 // XY Park Feedrate - MMM + //#define GANTRY_CALIBRATION_COMMANDS_PRE "" + #define GANTRY_CALIBRATION_COMMANDS_POST "G28" // G28 highly recommended to ensure an accurate position +#endif + +/** + * MAX7219 Debug Matrix + * + * Add support for a low-cost 8x8 LED Matrix based on the Max7219 chip as a realtime status display. + * Requires 3 signal wires. Some useful debug options are included to demonstrate its usage. + */ +//#define MAX7219_DEBUG +#if ENABLED(MAX7219_DEBUG) + #define MAX7219_CLK_PIN 64 + #define MAX7219_DIN_PIN 57 + #define MAX7219_LOAD_PIN 44 + + //#define MAX7219_GCODE // Add the M7219 G-code to control the LED matrix + #define MAX7219_INIT_TEST 2 // Test pattern at startup: 0=none, 1=sweep, 2=spiral + #define MAX7219_NUMBER_UNITS 1 // Number of Max7219 units in chain. + #define MAX7219_ROTATE 0 // Rotate the display clockwise (in multiples of +/- 90°) + // connector at: right=0 bottom=-90 top=90 left=180 + //#define MAX7219_REVERSE_ORDER // The individual LED matrix units may be in reversed order + //#define MAX7219_SIDE_BY_SIDE // Big chip+matrix boards can be chained side-by-side + + /** + * Sample debug features + * If you add more debug displays, be careful to avoid conflicts! + */ + #define MAX7219_DEBUG_PRINTER_ALIVE // Blink corner LED of 8x8 matrix to show that the firmware is functioning + #define MAX7219_DEBUG_PLANNER_HEAD 3 // Show the planner queue head position on this and the next LED matrix row + #define MAX7219_DEBUG_PLANNER_TAIL 5 // Show the planner queue tail position on this and the next LED matrix row + + #define MAX7219_DEBUG_PLANNER_QUEUE 0 // Show the current planner queue depth on this and the next LED matrix row + // If you experience stuttering, reboots, etc. this option can reveal how + // tweaks made to the configuration are affecting the printer in real-time. +#endif + +/** + * NanoDLP Sync support + * + * Add support for Synchronized Z moves when using with NanoDLP. G0/G1 axis moves will output "Z_move_comp" + * string to enable synchronization with DLP projector exposure. This change will allow to use + * [[WaitForDoneMessage]] instead of populating your gcode with M400 commands + */ +//#define NANODLP_Z_SYNC +#if ENABLED(NANODLP_Z_SYNC) + //#define NANODLP_ALL_AXIS // Enables "Z_move_comp" output on any axis move. + // Default behavior is limited to Z axis only. +#endif + +/** + * Ethernet. Use M552 to enable and set the IP address. + */ +#if HAS_ETHERNET + #define MAC_ADDRESS { 0xDE, 0xAD, 0xBE, 0xEF, 0xF0, 0x0D } // A MAC address unique to your network +#endif + +/** + * WiFi Support (Espressif ESP32 WiFi) + */ +//#define WIFISUPPORT // Marlin embedded WiFi managenent +//#define ESP3D_WIFISUPPORT // ESP3D Library WiFi management (https://github.com/luc-github/ESP3DLib) + +#if EITHER(WIFISUPPORT, ESP3D_WIFISUPPORT) + //#define WEBSUPPORT // Start a webserver (which may include auto-discovery) + //#define OTASUPPORT // Support over-the-air firmware updates + //#define WIFI_CUSTOM_COMMAND // Accept feature config commands (e.g., WiFi ESP3D) from the host + + /** + * To set a default WiFi SSID / Password, create a file called Configuration_Secure.h with + * the following defines, customized for your network. This specific file is excluded via + * .gitignore to prevent it from accidentally leaking to the public. + * + * #define WIFI_SSID "WiFi SSID" + * #define WIFI_PWD "WiFi Password" + */ + //#include "Configuration_Secure.h" // External file with WiFi SSID / Password +#endif + +/** + * Průša Multi-Material Unit (MMU) + * Enable in Configuration.h + * + * These devices allow a single stepper driver on the board to drive + * multi-material feeders with any number of stepper motors. + */ +#if HAS_PRUSA_MMU1 + /** + * This option only allows the multiplexer to switch on tool-change. + * Additional options to configure custom E moves are pending. + * + * Override the default DIO selector pins here, if needed. + * Some pins files may provide defaults for these pins. + */ + //#define E_MUX0_PIN 40 // Always Required + //#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs + //#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs +#elif HAS_PRUSA_MMU2 + // Serial port used for communication with MMU2. + #define MMU2_SERIAL_PORT 2 + + // Use hardware reset for MMU if a pin is defined for it + //#define MMU2_RST_PIN 23 + + // Enable if the MMU2 has 12V stepper motors (MMU2 Firmware 1.0.2 and up) + //#define MMU2_MODE_12V + + // G-code to execute when MMU2 F.I.N.D.A. probe detects filament runout + #define MMU2_FILAMENT_RUNOUT_SCRIPT "M600" + + // Add an LCD menu for MMU2 + //#define MMU2_MENUS + #if EITHER(MMU2_MENUS, HAS_PRUSA_MMU2S) + // Settings for filament load / unload from the LCD menu. + // This is for Průša MK3-style extruders. Customize for your hardware. + #define MMU2_FILAMENTCHANGE_EJECT_FEED 80.0 + #define MMU2_LOAD_TO_NOZZLE_SEQUENCE \ + { 7.2, 1145 }, \ + { 14.4, 871 }, \ + { 36.0, 1393 }, \ + { 14.4, 871 }, \ + { 50.0, 198 } + + #define MMU2_RAMMING_SEQUENCE \ + { 1.0, 1000 }, \ + { 1.0, 1500 }, \ + { 2.0, 2000 }, \ + { 1.5, 3000 }, \ + { 2.5, 4000 }, \ + { -15.0, 5000 }, \ + { -14.0, 1200 }, \ + { -6.0, 600 }, \ + { 10.0, 700 }, \ + { -10.0, 400 }, \ + { -50.0, 2000 } + #endif + + /** + * Using a sensor like the MMU2S + * This mode requires a MK3S extruder with a sensor at the extruder idler, like the MMU2S. + * See https://help.prusa3d.com/en/guide/3b-mk3s-mk2-5s-extruder-upgrade_41560, step 11 + */ + #if HAS_PRUSA_MMU2S + #define MMU2_C0_RETRY 5 // Number of retries (total time = timeout*retries) + + #define MMU2_CAN_LOAD_FEEDRATE 800 // (mm/min) + #define MMU2_CAN_LOAD_SEQUENCE \ + { 0.1, MMU2_CAN_LOAD_FEEDRATE }, \ + { 60.0, MMU2_CAN_LOAD_FEEDRATE }, \ + { -52.0, MMU2_CAN_LOAD_FEEDRATE } + + #define MMU2_CAN_LOAD_RETRACT 6.0 // (mm) Keep under the distance between Load Sequence values + #define MMU2_CAN_LOAD_DEVIATION 0.8 // (mm) Acceptable deviation + + #define MMU2_CAN_LOAD_INCREMENT 0.2 // (mm) To reuse within MMU2 module + #define MMU2_CAN_LOAD_INCREMENT_SEQUENCE \ + { -MMU2_CAN_LOAD_INCREMENT, MMU2_CAN_LOAD_FEEDRATE } + + // Continue unloading if sensor detects filament after the initial unload move + //#define MMU_IR_UNLOAD_MOVE + #else + + /** + * MMU1 Extruder Sensor + * + * Support for a Průša (or other) IR Sensor to detect filament near the extruder + * and make loading more reliable. Suitable for an extruder equipped with a filament + * sensor less than 38mm from the gears. + * + * During loading the extruder will stop when the sensor is triggered, then do a last + * move up to the gears. If no filament is detected, the MMU2 can make some more attempts. + * If all attempts fail, a filament runout will be triggered. + */ + //#define MMU_EXTRUDER_SENSOR + #if ENABLED(MMU_EXTRUDER_SENSOR) + #define MMU_LOADING_ATTEMPTS_NR 5 // max. number of attempts to load filament if first load fail + #endif + + #endif + + //#define MMU2_DEBUG // Write debug info to serial output + +#endif // HAS_PRUSA_MMU2 + +/** + * Advanced Print Counter settings + */ +#if ENABLED(PRINTCOUNTER) + #define SERVICE_WARNING_BUZZES 3 + // Activate up to 3 service interval watchdogs + //#define SERVICE_NAME_1 "Service S" + //#define SERVICE_INTERVAL_1 100 // print hours + //#define SERVICE_NAME_2 "Service L" + //#define SERVICE_INTERVAL_2 200 // print hours + //#define SERVICE_NAME_3 "Service 3" + //#define SERVICE_INTERVAL_3 1 // print hours +#endif + +// @section develop + +// +// M100 Free Memory Watcher to debug memory usage +// +//#define M100_FREE_MEMORY_WATCHER + +// +// M42 - Set pin states +// +//#define DIRECT_PIN_CONTROL + +// +// M43 - display pin status, toggle pins, watch pins, watch endstops & toggle LED, test servo probe +// +//#define PINS_DEBUGGING + +// Enable Marlin dev mode which adds some special commands +//#define MARLIN_DEV_MODE + +/** + * Postmortem Debugging captures misbehavior and outputs the CPU status and backtrace to serial. + * When running in the debugger it will break for debugging. This is useful to help understand + * a crash from a remote location. Requires ~400 bytes of SRAM and 5Kb of flash. + */ +//#define POSTMORTEM_DEBUGGING diff --git a/config/examples/Nextion/HMI/Marlin4Nextion.HMI.zip b/config/examples/Nextion/HMI/Marlin4Nextion.HMI.zip new file mode 100644 index 0000000000000000000000000000000000000000..c2157d010269dd68eb7824583e5b92239a6426a2 GIT binary patch literal 10681280 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