static void lcd_menu_first_run_bed_level_center_adjust() { LED_GLOW(); if (lcd_lib_encoder_pos == ENCODER_NO_SELECTION) lcd_lib_encoder_pos = 0; if (printing_state == PRINT_STATE_NORMAL && lcd_lib_encoder_pos != 0 && movesplanned() < 4) { current_position[Z_AXIS] -= float(lcd_lib_encoder_pos) * 0.05; plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 60, 0); } lcd_lib_encoder_pos = 0; if (movesplanned() > 0) lcd_info_screen(NULL, NULL, PSTR("CONTINUE")); else lcd_info_screen(lcd_menu_first_run_bed_level_left_adjust, storeHomingZ_parkHeadForLeftAdjustment, PSTR("CONTINUE")); DRAW_PROGRESS_NR(4); lcd_lib_draw_string_centerP(10, PSTR("Rotate the button")); lcd_lib_draw_string_centerP(20, PSTR("until the nozzle is")); lcd_lib_draw_string_centerP(30, PSTR("a millimeter away")); lcd_lib_draw_string_centerP(40, PSTR("from the buildplate.")); lcd_lib_update_screen(); }
static void lcd_menu_first_run_bed_level_paper_center() { LED_GLOW(); if (lcd_lib_encoder_pos == ENCODER_NO_SELECTION) lcd_lib_encoder_pos = 0; if (printing_state == PRINT_STATE_NORMAL && lcd_lib_encoder_pos != 0 && movesplanned() < 4) { current_position[Z_AXIS] -= float(lcd_lib_encoder_pos) * 0.05; lcd_lib_encoder_pos = 0; plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 60, 0); } if (movesplanned() > 0) lcd_info_screen(NULL, NULL, PSTR("POKRACOVAT")); else lcd_info_screen(lcd_menu_first_run_bed_level_paper_left, parkHeadForLeftAdjustment, PSTR("POKRACOVAT")); DRAW_PROGRESS_NR_IF_NOT_DONE(8); lcd_lib_draw_string_centerP(10, PSTR("Zasunte papir mezi")); lcd_lib_draw_string_centerP(20, PSTR("trysku a podlozku,")); lcd_lib_draw_string_centerP(30, PSTR("otacejte dokud")); lcd_lib_draw_string_centerP(40, PSTR("papir neklade odpor")); lcd_lib_update_screen(); }
static void lcd_menu_first_run_bed_level_center_adjust() { LED_GLOW(); if (lcd_lib_encoder_pos == ENCODER_NO_SELECTION) lcd_lib_encoder_pos = 0; if (printing_state == PRINT_STATE_NORMAL && lcd_lib_encoder_pos != 0 && movesplanned() < 4) { current_position[Z_AXIS] -= float(lcd_lib_encoder_pos) * 0.05; plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 60, 0); } lcd_lib_encoder_pos = 0; if (movesplanned() > 0) lcd_info_screen(NULL, NULL, PSTR("POKRACOVAT")); else lcd_info_screen(lcd_menu_first_run_bed_level_left_adjust, parkHeadForLeftAdjustment, PSTR("POKRACOVAT")); DRAW_PROGRESS_NR_IF_NOT_DONE(4); lcd_lib_draw_string_centerP(10, PSTR("Otacejte tlacitkem")); lcd_lib_draw_string_centerP(20, PSTR("dokud nebude tryska")); lcd_lib_draw_string_centerP(30, PSTR("priblizne milimetr")); lcd_lib_draw_string_centerP(40, PSTR("od tiskove podlozky.")); lcd_lib_update_screen(); }
static void lcd_menu_first_run_print_card_detect() { if (!IS_SD_INSERTED) { lcd_info_screen(lcd_menu_main); DRAW_PROGRESS_NR(21); lcd_lib_draw_string_centerP(20, PSTR("Please insert SD-card")); lcd_lib_draw_string_centerP(30, PSTR("that came with")); lcd_lib_draw_string_centerP(40, PSTR("your Ultimaker2...")); lcd_lib_update_screen(); card.release(); return; } if (!card.isOk()) { lcd_info_screen(lcd_menu_main); DRAW_PROGRESS_NR(21); lcd_lib_draw_string_centerP(30, PSTR("Reading card...")); lcd_lib_update_screen(); card.initsd(); return; } SELECT_MAIN_MENU_ITEM(0); lcd_info_screen(lcd_menu_print_select, setFirstRunDone, PSTR("LET'S PRINT")); DRAW_PROGRESS_NR(21); lcd_lib_draw_string_centerP(10, PSTR("Select a print file")); lcd_lib_draw_string_centerP(20, PSTR("on the SD-card")); lcd_lib_draw_string_centerP(30, PSTR("and press the button")); lcd_lib_draw_string_centerP(40, PSTR("to print it!")); lcd_lib_update_screen(); }
static void lcd_menu_first_run_bed_level_paper_center() { LED_GLOW(); if (lcd_lib_encoder_pos == ENCODER_NO_SELECTION) lcd_lib_encoder_pos = 0; if (printing_state == PRINT_STATE_NORMAL && lcd_lib_encoder_pos != 0 && movesplanned() < 4) { current_position[Z_AXIS] -= float(lcd_lib_encoder_pos) * 0.05; lcd_lib_encoder_pos = 0; plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 60, 0); } if (movesplanned() > 0) lcd_info_screen(NULL, NULL, PSTR("CONTINUE")); else lcd_info_screen(lcd_menu_first_run_bed_level_paper_left, storeHomingZ_parkHeadForLeftAdjustment, PSTR("CONTINUE")); DRAW_PROGRESS_NR(8); lcd_lib_draw_string_centerP(10, PSTR("Slide a paper between")); lcd_lib_draw_string_centerP(20, PSTR("buildplate and nozzle")); lcd_lib_draw_string_centerP(30, PSTR("until you feel a")); lcd_lib_draw_string_centerP(40, PSTR("bit resistance.")); lcd_lib_update_screen(); }
static void lcd_menu_first_run_bed_level_paper_right() { LED_GLOW(); SELECT_MAIN_MENU_ITEM(0); if (IS_FIRST_RUN_DONE()) lcd_info_screen(lcd_menu_main, homeBed, PSTR("HOTOVO")); else lcd_info_screen(lcd_menu_first_run_material_load, homeBed, PSTR("POKRACOVAT")); DRAW_PROGRESS_NR_IF_NOT_DONE(10); lcd_lib_draw_string_centerP(20, PSTR("Opakujte to stejne")); lcd_lib_draw_string_centerP(30, PSTR("pro levy roh...")); lcd_lib_update_screen(); }
static void lcd_menu_first_run_bed_level_paper_right() { LED_GLOW(); SELECT_MAIN_MENU_ITEM(0); if (IS_FIRST_RUN_DONE()) lcd_info_screen(lcd_menu_main, homeBed, PSTR("DONE")); else lcd_info_screen(lcd_menu_first_run_material_load, homeBed, PSTR("CONTINUE")); DRAW_PROGRESS_NR(10); lcd_lib_draw_string_centerP(20, PSTR("Repeat this for")); lcd_lib_draw_string_centerP(30, PSTR("the right corner...")); lcd_lib_update_screen(); }
static void lcd_menu_change_material_remove() { run_history = true; lcd_info_screen(lcd_menu_material_main, cancelMaterialInsert); lcd_lib_draw_stringP(3, 20, PSTR("Reversing material")); if (!blocks_queued()) { lcd_lib_beep(); led_glow_dir = led_glow = 0; currentMenu = lcd_menu_change_material_remove_wait_user; SELECT_MAIN_MENU_ITEM(0); //Disable the extruder motor so you can pull out the remaining filament. disable_e0(); disable_e1(); disable_e2(); } long pos = -st_get_position(E_AXIS); long targetPos = lround(FILAMENT_REVERSAL_LENGTH*axis_steps_per_unit[E_AXIS]); uint8_t progress = (pos * 125 / targetPos); lcd_progressbar(progress); lcd_lib_led_color(48,48,255); lcd_lib_update_screen(); }
static void lcd_menu_insert_material_preheat() { setTargetHotend(material[active_extruder].temperature, active_extruder); int16_t temp = degHotend(active_extruder) - 20; int16_t target = degTargetHotend(active_extruder) - 20 - 10; if (temp < 0) temp = 0; if (temp > target && !is_command_queued()) { set_extrude_min_temp(0); for(uint8_t e=0; e<EXTRUDERS; e++) volume_to_filament_length[e] = 1.0;//Set the extrusion to 1mm per given value, so we can move the filament a set distance. currentMenu = lcd_menu_change_material_insert_wait_user; temp = target; } uint8_t progress = uint8_t(temp * 125 / target); if (progress < minProgress) progress = minProgress; else minProgress = progress; lcd_info_screen(lcd_menu_material_main, cancelMaterialInsert); lcd_lib_draw_stringP(3, 10, PSTR("Heating printhead for")); lcd_lib_draw_stringP(3, 20, PSTR("material insertion")); lcd_progressbar(progress); lcd_lib_update_screen(); }
static void lcd_menu_material_import_done() { lcd_lib_encoder_pos = MAIN_MENU_ITEM_POS(0); lcd_info_screen(lcd_menu_material_select, NULL, PSTR("Ok")); lcd_lib_draw_string_centerP(20, PSTR("Loaded materials")); lcd_lib_draw_string_centerP(30, PSTR("from the SD card")); lcd_lib_update_screen(); }
static void lcd_menu_change_material_preheat() { #ifdef USE_CHANGE_TEMPERATURE setTargetHotend(material[active_extruder].change_temperature, active_extruder); #else setTargetHotend(material[active_extruder].temperature, active_extruder); #endif int16_t temp = degHotend(active_extruder) - 20; int16_t target = degTargetHotend(active_extruder) - 20; if (temp < 0) temp = 0; if (temp > target - 5 && temp < target + 5) { if ((signed long)(millis() - preheat_end_time) > 0) { set_extrude_min_temp(0); plan_set_e_position(0); plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], 20.0 / volume_to_filament_length[active_extruder], retract_feedrate/60.0, active_extruder); float old_max_feedrate_e = max_feedrate[E_AXIS]; float old_retract_acceleration = retract_acceleration; max_feedrate[E_AXIS] = FILAMENT_REVERSAL_SPEED; retract_acceleration = FILAMENT_LONG_MOVE_ACCELERATION; plan_set_e_position(0); plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], -1.0 / volume_to_filament_length[active_extruder], FILAMENT_REVERSAL_SPEED, active_extruder); plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], -FILAMENT_REVERSAL_LENGTH / volume_to_filament_length[active_extruder], FILAMENT_REVERSAL_SPEED, active_extruder); max_feedrate[E_AXIS] = old_max_feedrate_e; retract_acceleration = old_retract_acceleration; currentMenu = lcd_menu_change_material_remove; temp = target; } } else { #ifdef USE_CHANGE_TEMPERATURE preheat_end_time = millis() + (unsigned long)material[active_extruder].change_preheat_wait_time * 1000L; #else preheat_end_time = millis(); #endif } uint8_t progress = uint8_t(temp * 125 / target); if (progress < minProgress) progress = minProgress; else minProgress = progress; lcd_info_screen(post_change_material_menu, cancelMaterialInsert); lcd_lib_draw_stringP(3, 10, PSTR("Heating printhead")); lcd_lib_draw_stringP(3, 20, PSTR("for material removal")); lcd_progressbar(progress); lcd_lib_update_screen(); }
static void lcd_menu_change_material_preheat() { run_history = true; setTargetHotend(material[active_extruder].temperature, active_extruder); int16_t temp = degHotend(active_extruder) - 20; int16_t target = degTargetHotend(active_extruder) - 20 - 10; if (temp < 0) temp = 0; if (temp > target && !is_command_queued()) { set_extrude_min_temp(0); for(uint8_t e=0; e<EXTRUDERS; e++) volume_to_filament_length[e] = 1.0;//Set the extrusion to 1mm per given value, so we can move the filament a set distance. plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], 20.0, retract_feedrate/60.0, active_extruder); float old_max_feedrate_e = max_feedrate[E_AXIS]; float old_retract_acceleration = retract_acceleration; max_feedrate[E_AXIS] = FILAMENT_REVERSAL_SPEED; retract_acceleration = FILAMENT_LONG_MOVE_ACCELERATION; current_position[E_AXIS] = 0; plan_set_e_position(current_position[E_AXIS]); plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], -1.0, FILAMENT_REVERSAL_SPEED, active_extruder); for(uint8_t n=0; n<6; n++) plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], (n+1)*-FILAMENT_REVERSAL_LENGTH/6, FILAMENT_REVERSAL_SPEED, active_extruder); max_feedrate[E_AXIS] = old_max_feedrate_e; retract_acceleration = old_retract_acceleration; currentMenu = lcd_menu_change_material_remove; temp = target; } uint8_t progress = uint8_t(temp * 125 / target); if (progress < minProgress) progress = minProgress; else minProgress = progress; lcd_info_screen(lcd_menu_material_main, cancelMaterialInsert); lcd_lib_draw_stringP(3, 0, PSTR("Heating printhead")); lcd_lib_draw_stringP(3, 10, PSTR("for material removal")); char buffer[20]; memset (buffer,0,sizeof(buffer)); char* c; c = int_to_string(temp, buffer/*, PSTR( DEGREE_C_SYMBOL )*/); *c++ = TEMPERATURE_SEPARATOR; c = int_to_string(target, c, PSTR( DEGREE_C_SYMBOL )); lcd_lib_draw_string_center(20, buffer); lcd_progressbar(progress); LED_HEAT(); lcd_lib_update_screen(); }
static void lcd_menu_material_export_done() { lcd_lib_encoder_pos = MAIN_MENU_ITEM_POS(0); lcd_info_screen(lcd_menu_material_select, NULL, PSTR("Ok")); lcd_lib_draw_string_centerP(20, PSTR("Saved materials")); lcd_lib_draw_string_centerP(30, PSTR("to the SD card")); lcd_lib_draw_string_centerP(40, PSTR("in MATERIAL.TXT")); lcd_lib_update_screen(); }
static void lcd_menu_first_run_print_1() { SELECT_MAIN_MENU_ITEM(0); lcd_info_screen(lcd_menu_first_run_print_card_detect, NULL, PSTR("ARE YOU READY?")); DRAW_PROGRESS_NR(20); lcd_lib_draw_string_centerP(20, PSTR("I'm ready let's")); lcd_lib_draw_string_centerP(30, PSTR("make a 3D Print!")); lcd_lib_update_screen(); }
static void lcd_menu_first_run_material_select_1() { SELECT_MAIN_MENU_ITEM(0); lcd_info_screen(lcd_menu_first_run_material_select_pla_abs, doCooldown, PSTR("READY")); DRAW_PROGRESS_NR(16); lcd_lib_draw_string_centerP(10, PSTR("Next, select the")); lcd_lib_draw_string_centerP(20, PSTR("material you have")); lcd_lib_draw_string_centerP(30, PSTR("inserted in the ")); lcd_lib_draw_string_centerP(40, PSTR("Ultimaker2.")); lcd_lib_update_screen(); }
static void lcd_menu_first_run_init_3() { SELECT_MAIN_MENU_ITEM(0); lcd_info_screen(lcd_menu_first_run_bed_level_center_adjust, homeAndParkHeadForCenterAdjustment, PSTR("CONTINUE")); DRAW_PROGRESS_NR(3); lcd_lib_draw_string_centerP(10, PSTR("After transportation")); lcd_lib_draw_string_centerP(20, PSTR("we need to do some")); lcd_lib_draw_string_centerP(30, PSTR("adjustments, we are")); lcd_lib_draw_string_centerP(40, PSTR("going to do that now.")); lcd_lib_update_screen(); }
static void lcd_menu_first_run_bed_level_paper_left() { LED_GLOW(); SELECT_MAIN_MENU_ITEM(0); lcd_info_screen(lcd_menu_first_run_bed_level_paper_right, parkHeadForRightAdjustment, PSTR("POKRACOVAT")); DRAW_PROGRESS_NR_IF_NOT_DONE(9); lcd_lib_draw_string_centerP(20, PSTR("Opakujte to stejne")); lcd_lib_draw_string_centerP(30, PSTR("pro levy roh...")); lcd_lib_update_screen(); }
static void lcd_menu_first_run_init_2() { SELECT_MAIN_MENU_ITEM(0); lcd_info_screen(lcd_menu_first_run_init_3, homeAndRaiseBed, PSTR("CONTINUE")); DRAW_PROGRESS_NR(2); lcd_lib_draw_string_centerP(10, PSTR("Because this is the")); lcd_lib_draw_string_centerP(20, PSTR("first startup I will")); lcd_lib_draw_string_centerP(30, PSTR("walk you through")); lcd_lib_draw_string_centerP(40, PSTR("a first run wizard.")); lcd_lib_update_screen(); }
//Started bed leveling from the calibration menu void lcd_menu_first_run_start_bed_leveling() { add_homeing[Z_AXIS] = 0; SELECT_MAIN_MENU_ITEM(0); lcd_info_screen(lcd_menu_first_run_bed_level_center_adjust, homeAndParkHeadForCenterAdjustment2, PSTR("CONTINUE")); lcd_lib_draw_string_centerP(10, PSTR("I will guide you")); lcd_lib_draw_string_centerP(20, PSTR("trought the process")); lcd_lib_draw_string_centerP(30, PSTR("of adjusting your")); lcd_lib_draw_string_centerP(40, PSTR("buildplate.")); lcd_lib_update_screen(); }
//Run the first time you start-up the machine or after a factory reset. void lcd_menu_first_run_init() { SELECT_MAIN_MENU_ITEM(0); lcd_info_screen(lcd_menu_first_run_init_2, NULL, PSTR("CONTINUE")); DRAW_PROGRESS_NR(1); lcd_lib_draw_string_centerP(10, PSTR("Welcome to the first")); lcd_lib_draw_string_centerP(20, PSTR("startup of your")); lcd_lib_draw_string_centerP(30, PSTR("Ultimaker! Press the")); lcd_lib_draw_string_centerP(40, PSTR("button to continue")); lcd_lib_update_screen(); }
static void lcd_menu_first_run_material_select_2() { SELECT_MAIN_MENU_ITEM(0); lcd_info_screen(lcd_menu_first_run_print_1, NULL, PSTR("CONTINUE")); DRAW_PROGRESS_NR(19); lcd_lib_draw_string_centerP(10, PSTR("Now your Ultimaker2")); lcd_lib_draw_string_centerP(20, PSTR("knows what kind")); lcd_lib_draw_string_centerP(30, PSTR("of material")); lcd_lib_draw_string_centerP(40, PSTR("it is using.")); lcd_lib_update_screen(); }
static void lcd_menu_first_run_material_load() { SELECT_MAIN_MENU_ITEM(0); lcd_info_screen(lcd_menu_first_run_material_load_heatup, parkHeadForHeating, PSTR("CONTINUE")); DRAW_PROGRESS_NR(11); lcd_lib_draw_string_centerP(10, PSTR("Now that we leveled")); lcd_lib_draw_string_centerP(20, PSTR("the buildplate")); lcd_lib_draw_string_centerP(30, PSTR("the next step is")); lcd_lib_draw_string_centerP(40, PSTR("to insert material.")); lcd_lib_update_screen(); }
static void lcd_menu_first_run_bed_level_paper() { SELECT_MAIN_MENU_ITEM(0); lcd_info_screen(lcd_menu_first_run_bed_level_paper_center, parkHeadForCenterAdjustment, PSTR("POKRACOVAT")); DRAW_PROGRESS_NR_IF_NOT_DONE(7); lcd_lib_draw_string_centerP(10, PSTR("Pro presnou kalibraci")); lcd_lib_draw_string_centerP(20, PSTR("zopakujte tyto kroky")); lcd_lib_draw_string_centerP(30, PSTR("za pomoci kousku")); lcd_lib_draw_string_centerP(40, PSTR("papiru.")); lcd_lib_update_screen(); }
static void lcd_menu_first_run_bed_level_paper_left() { LED_GLOW(); SELECT_MAIN_MENU_ITEM(0); lcd_info_screen(lcd_menu_first_run_bed_level_paper_right, parkHeadForRightAdjustment, PSTR("CONTINUE")); DRAW_PROGRESS_NR(9); lcd_lib_draw_string_centerP(20, PSTR("Repeat this for")); lcd_lib_draw_string_centerP(30, PSTR("the left corner...")); lcd_lib_update_screen(); }
static void lcd_menu_first_run_bed_level_paper() { SELECT_MAIN_MENU_ITEM(0); lcd_info_screen(lcd_menu_first_run_bed_level_paper_center, parkHeadForCenterAdjustment, PSTR("CONTINUE")); DRAW_PROGRESS_NR(7); lcd_lib_draw_string_centerP(10, PSTR("Repeat this step, but")); lcd_lib_draw_string_centerP(20, PSTR("now use a sheet of")); lcd_lib_draw_string_centerP(30, PSTR("paper to fine-tune")); lcd_lib_draw_string_centerP(40, PSTR("the buildplate level.")); lcd_lib_update_screen(); }
static void lcd_menu_first_run_bed_level_right_adjust() { LED_GLOW(); SELECT_MAIN_MENU_ITEM(0); lcd_info_screen(lcd_menu_first_run_bed_level_paper, NULL, PSTR("POKRACOVAT")); DRAW_PROGRESS_NR_IF_NOT_DONE(6); lcd_lib_draw_string_centerP(10, PSTR("Otacejte pravym pred-")); lcd_lib_draw_string_centerP(20, PSTR("nim sroubem, dokud")); lcd_lib_draw_string_centerP(30, PSTR("nebude tryska asi")); lcd_lib_draw_string_centerP(40, PSTR("milimetr od podlozky")); lcd_lib_update_screen(); }
static void lcd_menu_first_run_bed_level_right_adjust() { LED_GLOW(); SELECT_MAIN_MENU_ITEM(0); lcd_info_screen(lcd_menu_first_run_bed_level_paper, NULL, PSTR("CONTINUE")); DRAW_PROGRESS_NR(6); lcd_lib_draw_string_centerP(10, PSTR("Turn right buildplate")); lcd_lib_draw_string_centerP(20, PSTR("screw till the nozzle")); lcd_lib_draw_string_centerP(30, PSTR("is a millimeter away")); lcd_lib_draw_string_centerP(40, PSTR("from the buildplate.")); lcd_lib_update_screen(); }
static void lcd_menu_material_selected() { lcd_info_screen(lcd_menu_main, NULL, PSTR("OK")); lcd_lib_draw_string_centerP(20, PSTR("Selected material:")); lcd_lib_draw_string_center(30, card.longFilename); #if EXTRUDERS > 1 if (active_extruder == 0) lcd_lib_draw_string_centerP(40, PSTR("for primary nozzle")); else if (active_extruder == 1) lcd_lib_draw_string_centerP(40, PSTR("for secondary nozzle")); #endif lcd_lib_update_screen(); }
static void lcd_menu_first_run_bed_level_left_adjust() { LED_GLOW(); SELECT_MAIN_MENU_ITEM(0); lcd_info_screen(lcd_menu_first_run_bed_level_right_adjust, parkHeadForRightAdjustment, PSTR("CONTINUE")); DRAW_PROGRESS_NR_IF_NOT_DONE(5); lcd_lib_draw_string_centerP(10, PSTR("Turn left buildplate")); lcd_lib_draw_string_centerP(20, PSTR("screw till the nozzle")); lcd_lib_draw_string_centerP(30, PSTR("is a millimeter away")); lcd_lib_draw_string_centerP(40, PSTR("from the buildplate.")); lcd_lib_update_screen(); }
static void lcd_menu_print_error() { LED_GLOW_ERROR(); lcd_info_screen(lcd_menu_main, NULL, PSTR("RETURN TO MAIN")); lcd_lib_draw_string_centerP(10, PSTR("Error while")); lcd_lib_draw_string_centerP(20, PSTR("reading")); lcd_lib_draw_string_centerP(30, PSTR("SD-card!")); char buffer[12]; strcpy_P(buffer, PSTR("Code:")); int_to_string(card.errorCode(), buffer+5); lcd_lib_draw_string_center(40, buffer); lcd_lib_update_screen(); }