IR sensor gen. II
disconnected PCB detection
This commit is contained in:
parent
be598687d0
commit
011468598e
@ -4,6 +4,7 @@
|
||||
#include <stdio.h>
|
||||
#include <avr/io.h>
|
||||
#include <avr/pgmspace.h>
|
||||
#include "pins.h"
|
||||
|
||||
uint8_t adc_state;
|
||||
uint8_t adc_count;
|
||||
@ -24,8 +25,8 @@ void adc_init(void)
|
||||
ADMUX |= (1 << REFS0);
|
||||
ADCSRA |= (1 << ADEN);
|
||||
// ADCSRA |= (1 << ADIF) | (1 << ADSC);
|
||||
DIDR0 = (ADC_CHAN_MSK & 0xff);
|
||||
DIDR2 = (ADC_CHAN_MSK >> 8);
|
||||
DIDR0 = ((ADC_CHAN_MSK & ADC_DIDR_MSK) & 0xff);
|
||||
DIDR2 = ((ADC_CHAN_MSK & ADC_DIDR_MSK) >> 8);
|
||||
adc_reset();
|
||||
// adc_sim_mask = 0b0101;
|
||||
// adc_sim_mask = 0b100101;
|
||||
|
@ -2,9 +2,21 @@
|
||||
#define _CONFIG_H
|
||||
|
||||
|
||||
#include "Configuration_prusa.h"
|
||||
#include "pins.h"
|
||||
|
||||
#define IR_SENSOR_ANALOG (defined(VOLT_IR_PIN) && defined(IR_SENSOR))
|
||||
|
||||
//ADC configuration
|
||||
#if !IR_SENSOR_ANALOG
|
||||
#define ADC_CHAN_MSK 0b0000001001011111 //used AD channels bit mask (0,1,2,3,4,6,9)
|
||||
#define ADC_DIDR_MSK 0b0000001001011111 //AD channels DIDR mask (1 ~ disabled digital input)
|
||||
#define ADC_CHAN_CNT 7 //number of used channels)
|
||||
#else //!IR_SENSOR_ANALOG
|
||||
#define ADC_CHAN_MSK 0b0000001101011111 //used AD channels bit mask (0,1,2,3,4,6,8,9)
|
||||
#define ADC_DIDR_MSK 0b0000001001011111 //AD channels DIDR mask (1 ~ disabled digital input)
|
||||
#define ADC_CHAN_CNT 8 //number of used channels)
|
||||
#endif //!IR_SENSOR_ANALOG
|
||||
#define ADC_OVRSAMPL 16 //oversampling multiplier
|
||||
#define ADC_CALLBACK adc_ready //callback function ()
|
||||
|
||||
@ -42,11 +54,8 @@
|
||||
#define W25X20CL_SPCR SPI_SPCR(W25X20CL_SPI_RATE, 1, 1, 1, 0)
|
||||
#define W25X20CL_SPSR SPI_SPSR(W25X20CL_SPI_RATE)
|
||||
|
||||
#include "boards.h"
|
||||
#include "Configuration_prusa.h"
|
||||
|
||||
//LANG - Multi-language support
|
||||
//#define LANG_MODE 0 // primary language only
|
||||
//define LANG_MODE 0 // primary language only
|
||||
#define LANG_MODE 1 // sec. language support
|
||||
|
||||
#define LANG_SIZE_RESERVED 0x2800 // reserved space for secondary language (10240 bytes)
|
||||
|
@ -203,6 +203,9 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP
|
||||
#define EEPROM_SHEETS_BASE (EEPROM_CHECK_GCODE - EEPROM_SHEETS_SIZEOF) // Sheets
|
||||
static Sheets * const EEPROM_Sheets_base = (Sheets*)(EEPROM_SHEETS_BASE);
|
||||
|
||||
#define EEPROM_FSENSOR_PCB (EEPROM_SHEETS_BASE-1) // uint8
|
||||
#define EEPROM_FSENSOR_ACTION_NA (EEPROM_FSENSOR_PCB-1) // uint8
|
||||
|
||||
|
||||
//This is supposed to point to last item to allow EEPROM overrun check. Please update when adding new items.
|
||||
#define EEPROM_LAST_ITEM EEPROM_SHEETS_BASE
|
||||
|
@ -15,6 +15,10 @@
|
||||
#include "mmu.h"
|
||||
#include "cardreader.h"
|
||||
|
||||
#include "adc.h"
|
||||
#include "temperature.h"
|
||||
#include "config.h"
|
||||
|
||||
//! @name Basic parameters
|
||||
//! @{
|
||||
#define FSENSOR_CHUNK_LEN 0.64F //!< filament sensor chunk length 0.64mm
|
||||
@ -117,6 +121,13 @@ int16_t fsensor_oq_yd_max;
|
||||
uint16_t fsensor_oq_sh_sum;
|
||||
//! @}
|
||||
|
||||
#if IR_SENSOR_ANALOG
|
||||
ClFsensorPCB oFsensorPCB;
|
||||
ClFsensorActionNA oFsensorActionNA;
|
||||
bool bIRsensorStateFlag=false;
|
||||
unsigned long nIRsensorLastTime;
|
||||
#endif //IR_SENSOR_ANALOG
|
||||
|
||||
void fsensor_stop_and_save_print(void)
|
||||
{
|
||||
printf_P(PSTR("fsensor_stop_and_save_print\n"));
|
||||
@ -136,10 +147,11 @@ void fsensor_init(void)
|
||||
{
|
||||
#ifdef PAT9125
|
||||
uint8_t pat9125 = pat9125_init();
|
||||
printf_P(PSTR("PAT9125_init:%hhu\n"), pat9125);
|
||||
printf_P(PSTR("PAT9125_init:%hhu\n"), pat9125);
|
||||
#endif //PAT9125
|
||||
uint8_t fsensor = eeprom_read_byte((uint8_t*)EEPROM_FSENSOR);
|
||||
fsensor_autoload_enabled=eeprom_read_byte((uint8_t*)EEPROM_FSENS_AUTOLOAD_ENABLED);
|
||||
fsensor_not_responding = false;
|
||||
#ifdef PAT9125
|
||||
uint8_t oq_meassure_enabled = eeprom_read_byte((uint8_t*)EEPROM_FSENS_OQ_MEASS_ENABLED);
|
||||
fsensor_oq_meassure_enabled = (oq_meassure_enabled == 1)?true:false;
|
||||
@ -150,19 +162,27 @@ void fsensor_init(void)
|
||||
fsensor = 0; //disable sensor
|
||||
fsensor_not_responding = true;
|
||||
}
|
||||
else
|
||||
fsensor_not_responding = false;
|
||||
#endif //PAT9125
|
||||
#if IR_SENSOR_ANALOG
|
||||
bIRsensorStateFlag=false;
|
||||
oFsensorPCB=(ClFsensorPCB)eeprom_read_byte((uint8_t*)EEPROM_FSENSOR_PCB);
|
||||
oFsensorActionNA=(ClFsensorActionNA)eeprom_read_byte((uint8_t*)EEPROM_FSENSOR_ACTION_NA);
|
||||
#endif //IR_SENSOR_ANALOG
|
||||
if (fsensor)
|
||||
fsensor_enable();
|
||||
fsensor_enable(false); // (in this case) EEPROM update is not necessary
|
||||
else
|
||||
fsensor_disable();
|
||||
printf_P(PSTR("FSensor %S\n"), (fsensor_enabled?PSTR("ENABLED"):PSTR("DISABLED\n")));
|
||||
fsensor_disable(false); // (in this case) EEPROM update is not necessary
|
||||
printf_P(PSTR("FSensor %S"), (fsensor_enabled?PSTR("ENABLED"):PSTR("DISABLED")));
|
||||
#if IR_SENSOR_ANALOG
|
||||
printf_P(PSTR(" (sensor board revision: %S)\n"),(oFsensorPCB==ClFsensorPCB::_Rev03b)?PSTR("03b or newer"):PSTR("03 or older"));
|
||||
#else //IR_SENSOR_ANALOG
|
||||
printf_P(PSTR("\n"));
|
||||
#endif //IR_SENSOR_ANALOG
|
||||
if (check_for_ir_sensor()) ir_sensor_detected = true;
|
||||
|
||||
}
|
||||
|
||||
bool fsensor_enable(void)
|
||||
bool fsensor_enable(bool bUpdateEEPROM)
|
||||
{
|
||||
#ifdef PAT9125
|
||||
if (mmu_enabled == false) { //filament sensor is pat9125, enable only if it is working
|
||||
@ -187,18 +207,34 @@ bool fsensor_enable(void)
|
||||
FSensorStateMenu = 1;
|
||||
}
|
||||
#else // PAT9125
|
||||
fsensor_enabled = true;
|
||||
eeprom_update_byte((uint8_t*)EEPROM_FSENSOR, 0x01);
|
||||
FSensorStateMenu = 1;
|
||||
#endif // PAT9125
|
||||
#if IR_SENSOR_ANALOG
|
||||
if(!fsensor_IR_check())
|
||||
{
|
||||
bUpdateEEPROM=true;
|
||||
fsensor_enabled=false;
|
||||
fsensor_not_responding=true;
|
||||
FSensorStateMenu=0;
|
||||
}
|
||||
else {
|
||||
#endif //IR_SENSOR_ANALOG
|
||||
fsensor_enabled=true;
|
||||
fsensor_not_responding=false;
|
||||
FSensorStateMenu=1;
|
||||
#if IR_SENSOR_ANALOG
|
||||
}
|
||||
#endif //IR_SENSOR_ANALOG
|
||||
if(bUpdateEEPROM)
|
||||
eeprom_update_byte((uint8_t*)EEPROM_FSENSOR, FSensorStateMenu);
|
||||
#endif //PAT9125
|
||||
return fsensor_enabled;
|
||||
}
|
||||
|
||||
void fsensor_disable(void)
|
||||
{
|
||||
void fsensor_disable(bool bUpdateEEPROM)
|
||||
{
|
||||
fsensor_enabled = false;
|
||||
eeprom_update_byte((uint8_t*)EEPROM_FSENSOR, 0x00);
|
||||
FSensorStateMenu = 0;
|
||||
if(bUpdateEEPROM)
|
||||
eeprom_update_byte((uint8_t*)EEPROM_FSENSOR, 0x00);
|
||||
}
|
||||
|
||||
void fsensor_autoload_set(bool State)
|
||||
@ -589,10 +625,76 @@ void fsensor_update(void)
|
||||
fsensor_oq_meassure_enabled = oq_meassure_enabled_tmp;
|
||||
}
|
||||
#else //PAT9125
|
||||
if ((digitalRead(IR_SENSOR_PIN) == 1) && CHECK_FSENSOR && fsensor_enabled && ir_sensor_detected && ( ! fsensor_m600_enqueued) )
|
||||
{
|
||||
fsensor_stop_and_save_print();
|
||||
fsensor_enque_M600();
|
||||
if (CHECK_FSENSOR && fsensor_enabled && ir_sensor_detected && ( ! fsensor_m600_enqueued) )
|
||||
{
|
||||
if(digitalRead(IR_SENSOR_PIN))
|
||||
{ // IR_SENSOR_PIN ~ H
|
||||
#if IR_SENSOR_ANALOG
|
||||
if(!bIRsensorStateFlag)
|
||||
{
|
||||
bIRsensorStateFlag=true;
|
||||
nIRsensorLastTime=_millis();
|
||||
}
|
||||
else
|
||||
{
|
||||
if((_millis()-nIRsensorLastTime)>IR_SENSOR_STEADY)
|
||||
{
|
||||
uint8_t nMUX1,nMUX2;
|
||||
uint16_t nADC;
|
||||
bIRsensorStateFlag=false;
|
||||
// sequence for direct data reading from AD converter
|
||||
DISABLE_TEMPERATURE_INTERRUPT();
|
||||
nMUX1=ADMUX; // ADMUX saving
|
||||
nMUX2=ADCSRB;
|
||||
adc_setmux(VOLT_IR_PIN);
|
||||
ADCSRA|=(1<<ADSC); // first conversion after ADMUX change discarded (preventively)
|
||||
while(ADCSRA&(1<<ADSC))
|
||||
;
|
||||
ADCSRA|=(1<<ADSC); // second conversion used
|
||||
while(ADCSRA&(1<<ADSC))
|
||||
;
|
||||
nADC=ADC;
|
||||
ADMUX=nMUX1; // ADMUX restoring
|
||||
ADCSRB=nMUX2;
|
||||
ENABLE_TEMPERATURE_INTERRUPT();
|
||||
// end of sequence for ...
|
||||
if((oFsensorPCB==ClFsensorPCB::_Rev03b)&&((nADC*OVERSAMPLENR)>((int)IRsensor_Hopen_TRESHOLD)))
|
||||
{
|
||||
fsensor_disable();
|
||||
fsensor_not_responding = true;
|
||||
printf_P(PSTR("IR sensor not responding (%d)!\n"),1);
|
||||
if((ClFsensorActionNA)eeprom_read_byte((uint8_t*)EEPROM_FSENSOR_ACTION_NA)==ClFsensorActionNA::_Pause)
|
||||
if(oFsensorActionNA==ClFsensorActionNA::_Pause)
|
||||
lcd_pause_print();
|
||||
}
|
||||
else
|
||||
{
|
||||
#endif //IR_SENSOR_ANALOG
|
||||
fsensor_stop_and_save_print();
|
||||
fsensor_enque_M600();
|
||||
#if IR_SENSOR_ANALOG
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{ // IR_SENSOR_PIN ~ L
|
||||
bIRsensorStateFlag=false;
|
||||
#endif //IR_SENSOR_ANALOG
|
||||
}
|
||||
}
|
||||
#endif //PAT9125
|
||||
}
|
||||
|
||||
#if IR_SENSOR_ANALOG
|
||||
bool fsensor_IR_check()
|
||||
{
|
||||
uint16_t volt_IR_int;
|
||||
bool bCheckResult;
|
||||
|
||||
volt_IR_int=current_voltage_raw_IR;
|
||||
bCheckResult=(volt_IR_int<((int)IRsensor_Lmax_TRESHOLD))||(volt_IR_int>((int)IRsensor_Hmin_TRESHOLD));
|
||||
bCheckResult=bCheckResult&&(!((oFsensorPCB==ClFsensorPCB::_Rev03b)&&(volt_IR_int>((int)IRsensor_Hopen_TRESHOLD))));
|
||||
return(bCheckResult);
|
||||
}
|
||||
#endif //IR_SENSOR_ANALOG
|
||||
|
@ -3,6 +3,7 @@
|
||||
#define FSENSOR_H
|
||||
|
||||
#include <inttypes.h>
|
||||
#include "config.h"
|
||||
|
||||
|
||||
//! minimum meassured chunk length in steps
|
||||
@ -27,8 +28,8 @@ extern void fsensor_init(void);
|
||||
|
||||
//! @name enable/disable
|
||||
//! @{
|
||||
extern bool fsensor_enable(void);
|
||||
extern void fsensor_disable(void);
|
||||
extern bool fsensor_enable(bool bUpdateEEPROM=true);
|
||||
extern void fsensor_disable(bool bUpdateEEPROM=true);
|
||||
//! @}
|
||||
|
||||
//autoload feature enabled
|
||||
@ -65,4 +66,28 @@ extern void fsensor_st_block_begin(block_t* bl);
|
||||
extern void fsensor_st_block_chunk(block_t* bl, int cnt);
|
||||
//! @}
|
||||
|
||||
|
||||
#if IR_SENSOR_ANALOG
|
||||
#define IR_SENSOR_STEADY 10 // [ms]
|
||||
|
||||
enum class ClFsensorPCB:uint_least8_t
|
||||
{
|
||||
_Old=0,
|
||||
_Rev03b=1,
|
||||
_Undef=EEPROM_EMPTY_VALUE
|
||||
};
|
||||
|
||||
enum class ClFsensorActionNA:uint_least8_t
|
||||
{
|
||||
_Continue=0,
|
||||
_Pause=1,
|
||||
_Undef=EEPROM_EMPTY_VALUE
|
||||
};
|
||||
|
||||
extern ClFsensorPCB oFsensorPCB;
|
||||
extern ClFsensorActionNA oFsensorActionNA;
|
||||
|
||||
extern bool fsensor_IR_check();
|
||||
#endif //IR_SENSOR_ANALOG
|
||||
|
||||
#endif //FSENSOR_H
|
||||
|
@ -71,12 +71,13 @@
|
||||
#define HEATER_2_PIN -1
|
||||
#define TEMP_2_PIN -1
|
||||
|
||||
#define TEMP_AMBIENT_PIN 5 //A5
|
||||
#define TEMP_AMBIENT_PIN 6 //A6
|
||||
|
||||
#define TEMP_PINDA_PIN 3 //A3
|
||||
|
||||
#define VOLT_PWR_PIN 4 //A4
|
||||
#define VOLT_BED_PIN 9 //A9
|
||||
#define VOLT_IR_PIN 8 //A8
|
||||
|
||||
|
||||
#define E0_TMC2130_CS 66
|
||||
|
@ -44,6 +44,8 @@
|
||||
#include "Timer.h"
|
||||
#include "Configuration_prusa.h"
|
||||
|
||||
#include "config.h"
|
||||
|
||||
//===========================================================================
|
||||
//=============================public variables============================
|
||||
//===========================================================================
|
||||
@ -71,6 +73,10 @@ int current_voltage_raw_pwr = 0;
|
||||
int current_voltage_raw_bed = 0;
|
||||
#endif
|
||||
|
||||
#if IR_SENSOR_ANALOG
|
||||
int current_voltage_raw_IR = 0;
|
||||
#endif //IR_SENSOR_ANALOG
|
||||
|
||||
int current_temperature_bed_raw = 0;
|
||||
float current_temperature_bed = 0.0;
|
||||
#ifdef TEMP_SENSOR_1_AS_REDUNDANT
|
||||
@ -1635,11 +1641,14 @@ void adc_ready(void) //callback from adc when sampling finished
|
||||
current_voltage_raw_pwr = adc_values[ADC_PIN_IDX(VOLT_PWR_PIN)];
|
||||
#endif
|
||||
#ifdef AMBIENT_THERMISTOR
|
||||
current_temperature_raw_ambient = adc_values[ADC_PIN_IDX(TEMP_AMBIENT_PIN)];
|
||||
current_temperature_raw_ambient = adc_values[ADC_PIN_IDX(TEMP_AMBIENT_PIN)]; // 5->6
|
||||
#endif //AMBIENT_THERMISTOR
|
||||
#ifdef VOLT_BED_PIN
|
||||
current_voltage_raw_bed = adc_values[ADC_PIN_IDX(VOLT_BED_PIN)]; // 6->9
|
||||
#endif
|
||||
#if IR_SENSOR_ANALOG
|
||||
current_voltage_raw_IR = adc_values[ADC_PIN_IDX(VOLT_IR_PIN)];
|
||||
#endif //IR_SENSOR_ANALOG
|
||||
temp_meas_ready = true;
|
||||
}
|
||||
|
||||
|
@ -27,6 +27,8 @@
|
||||
#include "stepper.h"
|
||||
#endif
|
||||
|
||||
#include "config.h"
|
||||
|
||||
|
||||
#ifdef SYSTEM_TIMER_2
|
||||
|
||||
@ -74,6 +76,10 @@ extern int current_voltage_raw_pwr;
|
||||
extern int current_voltage_raw_bed;
|
||||
#endif
|
||||
|
||||
#if IR_SENSOR_ANALOG
|
||||
extern int current_voltage_raw_IR;
|
||||
#endif //IR_SENSOR_ANALOG
|
||||
|
||||
#ifdef TEMP_SENSOR_1_AS_REDUNDANT
|
||||
extern float redundant_temperature;
|
||||
#endif
|
||||
|
@ -42,6 +42,10 @@
|
||||
#include "io_atmega2560.h"
|
||||
#include "first_lay_cal.h"
|
||||
|
||||
#include "fsensor.h"
|
||||
#include "adc.h"
|
||||
#include "config.h"
|
||||
|
||||
|
||||
int scrollstuff = 0;
|
||||
char longFilenameOLD[LONG_FILENAME_LENGTH];
|
||||
@ -61,9 +65,6 @@ int8_t FSensorStateMenu = 1;
|
||||
int8_t CrashDetectMenu = 1;
|
||||
|
||||
|
||||
extern bool fsensor_enable();
|
||||
extern void fsensor_disable();
|
||||
|
||||
#ifdef TMC2130
|
||||
extern void crashdet_enable();
|
||||
extern void crashdet_disable();
|
||||
@ -200,6 +201,7 @@ enum class TestError : uint_least8_t
|
||||
SwappedFan,
|
||||
WiringFsensor,
|
||||
TriggeringFsensor,
|
||||
FsensorLevel
|
||||
};
|
||||
|
||||
static int lcd_selftest_screen(TestScreen screen, int _progress, int _progress_scale, bool _clear, int _delay);
|
||||
@ -231,6 +233,9 @@ static FanCheck lcd_selftest_fan_auto(int _fan);
|
||||
static bool lcd_selftest_fsensor();
|
||||
#endif //PAT9125
|
||||
static bool selftest_irsensor();
|
||||
#if IR_SENSOR_ANALOG
|
||||
static bool lcd_selftest_IRsensor();
|
||||
#endif //IR_SENSOR_ANALOG
|
||||
static void lcd_selftest_error(TestError error, const char *_error_1, const char *_error_2);
|
||||
static void lcd_colorprint_change();
|
||||
#ifdef SNMM
|
||||
@ -1984,21 +1989,28 @@ static void lcd_menu_temperatures()
|
||||
menu_back_if_clicked();
|
||||
}
|
||||
|
||||
#if defined (VOLT_BED_PIN) || defined (VOLT_PWR_PIN)
|
||||
#if defined (VOLT_BED_PIN) || defined (VOLT_PWR_PIN) || IR_SENSOR_ANALOG
|
||||
#define VOLT_DIV_R1 10000
|
||||
#define VOLT_DIV_R2 2370
|
||||
#define VOLT_DIV_FAC ((float)VOLT_DIV_R2 / (VOLT_DIV_R2 + VOLT_DIV_R1))
|
||||
#define VOLT_DIV_REF 5
|
||||
|
||||
static void lcd_menu_voltages()
|
||||
{
|
||||
lcd_timeoutToStatus.stop(); //infinite timeout
|
||||
float volt_pwr = VOLT_DIV_REF * ((float)current_voltage_raw_pwr / (1023 * OVERSAMPLENR)) / VOLT_DIV_FAC;
|
||||
float volt_bed = VOLT_DIV_REF * ((float)current_voltage_raw_bed / (1023 * OVERSAMPLENR)) / VOLT_DIV_FAC;
|
||||
lcd_home();
|
||||
lcd_printf_P(PSTR(" PWR: %d.%01dV\n" " BED: %d.%01dV"), (int)volt_pwr, (int)(10*fabs(volt_pwr - (int)volt_pwr)), (int)volt_bed, (int)(10*fabs(volt_bed - (int)volt_bed)));
|
||||
menu_back_if_clicked();
|
||||
#if !IR_SENSOR_ANALOG
|
||||
lcd_printf_P(PSTR("\n"));
|
||||
#endif //!IR_SENSOR_ANALOG
|
||||
lcd_printf_P(PSTR(" PWR: %4.1fV\n" " BED: %4.1fV"), volt_pwr, volt_bed);
|
||||
#if IR_SENSOR_ANALOG
|
||||
float volt_IR = VOLT_DIV_REF * ((float)current_voltage_raw_IR / (1023 * OVERSAMPLENR));
|
||||
lcd_printf_P(PSTR("\n IR : %3.1fV"),volt_IR);
|
||||
#endif //IR_SENSOR_ANALOG
|
||||
menu_back_if_clicked();
|
||||
}
|
||||
#endif //defined VOLT_BED_PIN || defined VOLT_PWR_PIN
|
||||
#endif //defined (VOLT_BED_PIN) || defined (VOLT_PWR_PIN) || IR_SENSOR_ANALOG
|
||||
|
||||
#ifdef TMC2130
|
||||
static void lcd_menu_belt_status()
|
||||
@ -5505,6 +5517,41 @@ SETTINGS_VERSION;
|
||||
MENU_END();
|
||||
}
|
||||
|
||||
#if IR_SENSOR_ANALOG
|
||||
static void lcd_fsensor_actionNA_set(void)
|
||||
{
|
||||
switch(oFsensorActionNA)
|
||||
{
|
||||
case ClFsensorActionNA::_Continue:
|
||||
oFsensorActionNA=ClFsensorActionNA::_Pause;
|
||||
break;
|
||||
case ClFsensorActionNA::_Pause:
|
||||
oFsensorActionNA=ClFsensorActionNA::_Continue;
|
||||
break;
|
||||
default:
|
||||
oFsensorActionNA=ClFsensorActionNA::_Continue;
|
||||
}
|
||||
eeprom_update_byte((uint8_t*)EEPROM_FSENSOR_ACTION_NA,(uint8_t)oFsensorActionNA);
|
||||
}
|
||||
|
||||
#define FSENSOR_ACTION_NA \
|
||||
do\
|
||||
{\
|
||||
switch(oFsensorActionNA)\
|
||||
{\
|
||||
case ClFsensorActionNA::_Continue:\
|
||||
MENU_ITEM_FUNCTION_P(_i("FS Action [cont.]"),lcd_fsensor_actionNA_set);\
|
||||
break;\
|
||||
case ClFsensorActionNA::_Pause:\
|
||||
MENU_ITEM_FUNCTION_P(_i("FS Action [pause]"),lcd_fsensor_actionNA_set);\
|
||||
break;\
|
||||
default:\
|
||||
oFsensorActionNA=ClFsensorActionNA::_Continue;\
|
||||
}\
|
||||
}\
|
||||
while (0)
|
||||
#endif //IR_SENSOR_ANALOG
|
||||
|
||||
void lcd_hw_setup_menu(void) // can not be "static"
|
||||
{
|
||||
MENU_BEGIN();
|
||||
@ -5536,6 +5583,11 @@ if(!farm_mode){
|
||||
SETTINGS_NOZZLE;
|
||||
MENU_ITEM_SUBMENU_P(_i("Checks"), lcd_checking_menu);
|
||||
}
|
||||
|
||||
#if IR_SENSOR_ANALOG
|
||||
FSENSOR_ACTION_NA;
|
||||
#endif //IR_SENSOR_ANALOG
|
||||
|
||||
MENU_END();
|
||||
}
|
||||
|
||||
@ -6850,11 +6902,21 @@ static void lcd_tune_menu()
|
||||
|
||||
#ifdef FILAMENT_SENSOR
|
||||
if (FSensorStateMenu == 0) {
|
||||
MENU_ITEM_FUNCTION_P(_T(MSG_FSENSOR_OFF), lcd_fsensor_state_set);
|
||||
if (fsensor_not_responding && (mmu_enabled == false)) {
|
||||
/* Filament sensor not working*/
|
||||
MENU_ITEM_FUNCTION_P(_i("Fil. sensor [N/A]"), lcd_fsensor_state_set);
|
||||
}
|
||||
else {
|
||||
/* Filament sensor turned off, working, no problems*/
|
||||
MENU_ITEM_FUNCTION_P(_T(MSG_FSENSOR_OFF), lcd_fsensor_state_set);
|
||||
}
|
||||
}
|
||||
else {
|
||||
MENU_ITEM_FUNCTION_P(_T(MSG_FSENSOR_ON), lcd_fsensor_state_set);
|
||||
}
|
||||
#if IR_SENSOR_ANALOG
|
||||
FSENSOR_ACTION_NA;
|
||||
#endif //IR_SENSOR_ANALOG
|
||||
#endif //FILAMENT_SENSOR
|
||||
|
||||
SETTINGS_AUTO_DEPLETE;
|
||||
@ -7137,6 +7199,42 @@ void lcd_sdcard_menu()
|
||||
MENU_END();
|
||||
}
|
||||
|
||||
#if IR_SENSOR_ANALOG
|
||||
static bool lcd_selftest_IRsensor()
|
||||
{
|
||||
bool bAction;
|
||||
bool bPCBrev03b;
|
||||
uint16_t volt_IR_int;
|
||||
float volt_IR;
|
||||
|
||||
volt_IR_int=current_voltage_raw_IR;
|
||||
bPCBrev03b=(volt_IR_int<((int)IRsensor_Hopen_TRESHOLD));
|
||||
volt_IR=VOLT_DIV_REF*((float)volt_IR_int/(1023*OVERSAMPLENR));
|
||||
printf_P(PSTR("Measured filament sensor high level: %4.2fV\n"),volt_IR);
|
||||
if(volt_IR_int<((int)IRsensor_Hmin_TRESHOLD))
|
||||
{
|
||||
lcd_selftest_error(TestError::FsensorLevel,"HIGH","");
|
||||
return(false);
|
||||
}
|
||||
lcd_show_fullscreen_message_and_wait_P(_i("Please insert filament (but not load them!) into extruder and then press the knob."));
|
||||
volt_IR_int=current_voltage_raw_IR;
|
||||
volt_IR=VOLT_DIV_REF*((float)volt_IR_int/(1023*OVERSAMPLENR));
|
||||
printf_P(PSTR("Measured filament sensor low level: %4.2fV\n"),volt_IR);
|
||||
if(volt_IR_int>((int)IRsensor_Lmax_TRESHOLD))
|
||||
{
|
||||
lcd_selftest_error(TestError::FsensorLevel,"LOW","");
|
||||
return(false);
|
||||
}
|
||||
if((bPCBrev03b?1:0)!=(uint8_t)oFsensorPCB) // safer then "(uint8_t)bPCBrev03b"
|
||||
{
|
||||
printf_P(PSTR("Filament sensor board change detected: revision %S\n"),bPCBrev03b?PSTR("03b or newer"):PSTR("03 or older"));
|
||||
oFsensorPCB=bPCBrev03b?ClFsensorPCB::_Rev03b:ClFsensorPCB::_Old;
|
||||
eeprom_update_byte((uint8_t*)EEPROM_FSENSOR_PCB,(uint8_t)oFsensorPCB);
|
||||
}
|
||||
return(true);
|
||||
}
|
||||
#endif //IR_SENSOR_ANALOG
|
||||
|
||||
static void lcd_selftest_v()
|
||||
{
|
||||
(void)lcd_selftest();
|
||||
@ -7153,8 +7251,16 @@ bool lcd_selftest()
|
||||
#ifdef TMC2130
|
||||
FORCE_HIGH_POWER_START;
|
||||
#endif // TMC2130
|
||||
_delay(2000);
|
||||
#if !IR_SENSOR_ANALOG
|
||||
_delay(2000);
|
||||
#endif //!IR_SENSOR_ANALOG
|
||||
KEEPALIVE_STATE(IN_HANDLER);
|
||||
#if IR_SENSOR_ANALOG
|
||||
bool bAction;
|
||||
bAction=lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Is filament unloaded?"),false,true);
|
||||
if(!bAction)
|
||||
return(false);
|
||||
#endif //IR_SENSOR_ANALOG
|
||||
|
||||
_progress = lcd_selftest_screen(TestScreen::ExtruderFan, _progress, 3, true, 2000);
|
||||
#if (defined(FANCHECK) && defined(TACH_0))
|
||||
@ -7340,12 +7446,20 @@ bool lcd_selftest()
|
||||
{
|
||||
#ifdef PAT9125
|
||||
_progress = lcd_selftest_screen(TestScreen::Fsensor, _progress, 3, true, 2000); //check filaments sensor
|
||||
_result = lcd_selftest_fsensor();
|
||||
_result = lcd_selftest_fsensor();
|
||||
if (_result)
|
||||
{
|
||||
_progress = lcd_selftest_screen(TestScreen::FsensorOk, _progress, 3, true, 2000); //fil sensor OK
|
||||
}
|
||||
#endif //PAT9125
|
||||
#if IR_SENSOR_ANALOG
|
||||
_progress = lcd_selftest_screen(TestScreen::Fsensor, _progress, 3, true, 2000); //check filament sensor
|
||||
_result = lcd_selftest_IRsensor();
|
||||
if (_result)
|
||||
{
|
||||
_progress = lcd_selftest_screen(TestScreen::FsensorOk, _progress, 3, true, 2000); //filament sensor OK
|
||||
}
|
||||
#endif //IR_SENSOR_ANALOG
|
||||
}
|
||||
}
|
||||
#endif //FILAMENT_SENSOR
|
||||
@ -7881,11 +7995,17 @@ static void lcd_selftest_error(TestError testError, const char *_error_1, const
|
||||
lcd_puts_P(_T(MSG_SELFTEST_WIRINGERROR));
|
||||
break;
|
||||
case TestError::TriggeringFsensor:
|
||||
lcd_set_cursor(0, 2);
|
||||
lcd_puts_P(_T(MSG_SELFTEST_FILAMENT_SENSOR));
|
||||
lcd_set_cursor(0, 3);
|
||||
lcd_puts_P(_i("False triggering"));////c=20
|
||||
break;
|
||||
lcd_set_cursor(0, 2);
|
||||
lcd_puts_P(_T(MSG_SELFTEST_FILAMENT_SENSOR));
|
||||
lcd_set_cursor(0, 3);
|
||||
lcd_puts_P(_i("False triggering"));////c=20
|
||||
break;
|
||||
case TestError::FsensorLevel:
|
||||
lcd_set_cursor(0, 2);
|
||||
lcd_puts_P(_T(MSG_SELFTEST_FILAMENT_SENSOR));
|
||||
lcd_set_cursor(0, 3);
|
||||
lcd_printf_P(_i("%s level expected"),_error_1);////c=20
|
||||
break;
|
||||
}
|
||||
|
||||
_delay(1000);
|
||||
|
@ -7,6 +7,8 @@
|
||||
#include "menu.h"
|
||||
#include "mesh_bed_calibration.h"
|
||||
|
||||
#include "config.h"
|
||||
|
||||
extern void menu_lcd_longpress_func(void);
|
||||
extern void menu_lcd_charsetup_func(void);
|
||||
extern void menu_lcd_lcdupdate_func(void);
|
||||
@ -234,4 +236,12 @@ enum class WizState : uint8_t
|
||||
|
||||
void lcd_wizard(WizState state);
|
||||
|
||||
#define VOLT_DIV_REF 5
|
||||
#if IR_SENSOR_ANALOG
|
||||
#define IRsensor_Hmin_TRESHOLD (3.0*1023*OVERSAMPLENR/VOLT_DIV_REF) // ~3.0V (0.6*Vcc)
|
||||
#define IRsensor_Lmax_TRESHOLD (1.5*1023*OVERSAMPLENR/VOLT_DIV_REF) // ~1.5V (0.3*Vcc)
|
||||
#define IRsensor_Hopen_TRESHOLD (4.6*1023*OVERSAMPLENR/VOLT_DIV_REF) // ~4.6V (N.C. @ Ru~20-50k, Rd'=56k, Ru'=10k)
|
||||
#define IRsensor_Ldiode_TRESHOLD (0.3*1023*OVERSAMPLENR/VOLT_DIV_REF) // ~0.3V
|
||||
#endif //IR_SENSOR_ANALOG
|
||||
|
||||
#endif //ULTRALCD_H
|
||||
|
Loading…
Reference in New Issue
Block a user