1
0
forked from me/IronOS

Compare commits

..

13 Commits

Author SHA1 Message Date
Ben V. Brown
52e3247f7e Fix #19
Prevent skipping from cool straight to soldering without turning oled
back on.
2017-07-11 18:22:49 +10:00
Ben V. Brown
16ecf486c2 Update README.md 2017-07-10 19:51:55 +10:00
Ben V. Brown
aa2fe7b31b Update README.md 2017-07-10 19:41:13 +10:00
Ben V. Brown
a40ad665fe Bugfix sensitivity options typo + add more options
Changes sensitivity scale to be more precise.
Fixes #17
2017-07-10 19:31:48 +10:00
Ben V. Brown
54356d53a9 Update README.md 2017-07-08 23:26:41 +10:00
Ben V. Brown
d536fb33de V1.11 - Adding a Boost mode
Allows users to enable a boost mode.
This allows you to hold down the button near the tip while soldering to
temporarily boost the soldering temperature.
Closes #10
2017-07-08 23:16:02 +10:00
Ben V. Brown
fa717b2741 Inital work on boost mode 2017-07-08 22:36:49 +10:00
Ben V. Brown
0a7b6145af V1.10.2
Closes #16
Fixes pressing a button to exit the settings prompts
2017-07-08 18:12:28 +10:00
Ben V. Brown
7b4f467eec Increase pre PID filtering, reducing display flicker
Also improve movement sensitivities to be less extreme ramp up
2017-07-07 23:22:20 +10:00
Ben V. Brown
f72fc36427 Update README.md 2017-07-07 22:23:05 +10:00
Ben V. Brown
3c6151385f Update display speeds and rounding 2017-07-07 21:31:08 +10:00
Ben V. Brown
03f063cbf2 Add short summary messages for settings 2017-07-07 20:48:03 +10:00
Ben V. Brown
a9e9fb63bf Update README.md 2017-07-07 19:41:37 +10:00
14 changed files with 431 additions and 229 deletions

View File

@@ -1,6 +1,6 @@
# TS100 # TS100
This is a complete re-write of the open source software for the ts100 soldering iron. This is a complete re-write of the open source software for the ts100 soldering iron.
This project is feature complete for use as a soldering iron, but is still open to ideas and suggestions. This project is feature complete for use as a soldering iron, *but is still open to ideas and suggestions.*
This project was started to remove the need for USB for changing system settings. This project was started to remove the need for USB for changing system settings.
In the latest official firmware they have also added a settings menu system, so it is still worth comparing the two firmwares to select your preferred option. In the latest official firmware they have also added a settings menu system, so it is still worth comparing the two firmwares to select your preferred option.
@@ -17,6 +17,7 @@ In the latest official firmware they have also added a settings menu system, so
* Use hardware features to improve reliability * Use hardware features to improve reliability
* Can disable movement detection if desired * Can disable movement detection if desired
* Calibration of the temperature offset * Calibration of the temperature offset
* Boost mode lets you temporarily change the temperature when soldering
# Upgrading your ts100 iron # Upgrading your ts100 iron
This is completely safe, if it goes wrong just put the .hex file from the official website onto the unit and your back to the old firmware. Downloads for the hex files to flash are available on the [releases page.](https://github.com/Ralim/ts100/releases) This is completely safe, if it goes wrong just put the .hex file from the official website onto the unit and your back to the old firmware. Downloads for the hex files to flash are available on the [releases page.](https://github.com/Ralim/ts100/releases)
@@ -48,23 +49,49 @@ Pressing both buttons will also exit the soldering mode.
This menu allows you to cycle through all the options and set their values. This menu allows you to cycle through all the options and set their values.
The button near the tip cycles through the options, and the one near the usb changes the selected option. The button near the tip cycles through the options, and the one near the usb changes the selected option.
Note that settings are not saved until you exit the menu, and some settings such as screen flip do not apply until a power cycle is applied. Note that settings are not saved until you exit the menu, and some settings such as screen flip do not apply until a power cycle is applied.
If you leave the unit alone (ie don't press any buttons) on a setting, after 3 seconds the screen will scroll a longer version of the name
* UVCO -> Undervoltage cut out level, settable in 1V increments from 10-24V * UVCO -> Undervoltage cut out level, settable in 1V increments from 10-24V
* SLTME -> Sleep time, how long it takes before the unit goes to sleep
* STMP -> The temperature the unit drops to in sleep mode * STMP -> The temperature the unit drops to in sleep mode
* SLTME -> Sleep time, how long it takes before the unit goes to sleep
* SHTME -> Shutdown Time, how long the unit will wait after movement before shutting down completely * SHTME -> Shutdown Time, how long the unit will wait after movement before shutting down completely
* MOTION -> Wether motion detection is enabled or not * MOTION -> Wether motion detection is enabled or not
* MSENSE -> Motion Sensitivity,1-8, 8 is most sensitive, 1 is least sensitive (ie takes more movement to trigger)
* TMPUNIT -> Temperature unit, C or F * TMPUNIT -> Temperature unit, C or F
* TMPRND -> Temperature Rounding, {1,5,10}
* TMPSPD -> How fast the temperature should update in the soldering status screen.
* FLPDSP -> Flip display for left handed users * FLPDSP -> Flip display for left handed users
* SENSE -> Motion Sensitivity, H is more sensitive. L is lowest sensitivity (ie takes more movement to trigger) * BOOST -> Enable boost mode
* BTMP -> Set the temperature for the boost mode
Temperature rounding means that the unit will round off the temperature before displaying. This can helpt to reduce the flickering of the temperature when the unit oscillates between two temperatures.
## Extras Menu ## Extras Menu
This menu defaults to showing the current temperature on the tip. This menu defaults to showing the current temperature on the tip.
Pressing the button near the iron tip will show the current input voltage. Pressing the other button while this is show will allow you to calibrate the reading if your iron is like mine and is not overly accurate out of the factory. (Press buttons to change measurement up and down, press both to exit and save). Pressing the button near the iron tip will show the current input voltage. Pressing the other button while this is show will allow you to calibrate the reading if your iron is like mine and is not overly accurate out of the factory. (Press buttons to change measurement up and down, press both to exit and save).
Pressing the button near the usb enters the temperature offset setting menu, when the iron is cold, pressing the other button will start the unit calibrating for any offset in the tip temperature. Pressing the button near the usb enters the temperature offset setting menu, when the iron is cold, pressing the other button will start the unit calibrating for any offset in the tip temperature.
## Boost mode
This allows you to change the front key (one near the tip) to become a boost button instead of going to temperature editing when in soldering mode. This allows you to set this button to change the soldering temperature for short periods. For example when soldering a big joint and you want to boost the temperature a bit.
The boost temperature is set in the settings menu.
# Version Changes: # Version Changes:
V1.11
- Boost mode
- Change sensitivity options to be 1-8
V1.10
- Adds help text to settings
- Improves settings for the display update rate
V1.09
- Adds display modes, for slowing down or simplifying the display
V1.08
- Fix settings menu not showing flip display
V1.07
- Adds shutdown time to automatically shutdown the iron after inactivity
V1.06 V1.06
- Changes H and C when the iron is heating to the minidso chevron like images - Changes H and C when the iron is heating to the minidso chevron like images
@@ -85,3 +112,5 @@ V1.03
V1.02 V1.02
- Adds hold both buttons on IDLE to access the therometer mode. - Adds hold both buttons on IDLE to access the therometer mode.
- Changes the exit soldering mode to be holding both buttons (Like original firmware). - Changes the exit soldering mode to be holding both buttons (Like original firmware).
If you _really_ loved this firmware and want to continue my caffine addiction, you can do so here (or email me) : https://paypal.me/RalimTek

View File

@@ -11,7 +11,9 @@ void delayMs(uint32_t ticks);
volatile extern uint32_t lastKeyPress; volatile extern uint32_t lastKeyPress;
volatile extern uint32_t lastMovement; volatile extern uint32_t lastMovement;
volatile extern uint16_t keyState; volatile extern uint8_t keyState;
volatile extern uint8_t rawKeys;
inline uint32_t millis() { inline uint32_t millis() {
return system_Ticks; return system_Ticks;
} }
@@ -34,6 +36,10 @@ inline uint32_t getLastMovement() {
inline uint16_t getButtons() { inline uint16_t getButtons() {
return keyState; return keyState;
} }
inline uint16_t getRawButtons() {
return rawKeys;
}
/*IRQ prototypes*/ /*IRQ prototypes*/
void NMI_Handler(void); void NMI_Handler(void);

View File

@@ -29,7 +29,7 @@ enum {
TEMPCAL, //Cal tip temp offset TEMPCAL, //Cal tip temp offset
} operatingMode; } operatingMode;
#define SETTINGSOPTIONSCOUNT 8 /*Number of settings in the settings menu*/ #define SETTINGSOPTIONSCOUNT 11 /*Number of settings in the settings menu*/
enum { enum {
UVCO = 0, UVCO = 0,
@@ -39,8 +39,11 @@ enum {
MOTIONDETECT, MOTIONDETECT,
MOTIONSENSITIVITY, MOTIONSENSITIVITY,
TEMPDISPLAY, TEMPDISPLAY,
DISPLAYMODE, TEMPROUNDING,
DISPUPDATERATE,
LEFTY, LEFTY,
BOOSTMODE,
BOOSTTEMP,
} settingsPage; } settingsPage;
void ProcessUI(); void ProcessUI();

View File

@@ -22,7 +22,7 @@ void Init_Oled(uint8_t leftHanded);
u8* Data_Command(u8 len, u8* ptr); u8* Data_Command(u8 len, u8* ptr);
void Clear_Screen(void);//Clear the screen void Clear_Screen(void);//Clear the screen
/*Functions for writing to the screen*/ /*Functions for writing to the screen*/
void OLED_DrawString(char* string, uint8_t length); void OLED_DrawString(const char* string, const uint8_t length);
void OLED_DrawChar(char c, uint8_t x); void OLED_DrawChar(char c, uint8_t x);
void OLED_DrawTwoNumber(uint8_t in, uint8_t x); void OLED_DrawTwoNumber(uint8_t in, uint8_t x);
void OLED_BlankSlot(uint8_t xStart,uint8_t width); void OLED_BlankSlot(uint8_t xStart,uint8_t width);

View File

@@ -11,19 +11,25 @@
#define SETTINGS_H_ #define SETTINGS_H_
#include <stdint.h> #include <stdint.h>
#include "stm32f10x_flash.h" #include "stm32f10x_flash.h"
#define SETTINGSVERSION 0x06 /*Change this if you change the struct below to prevent people getting out of sync*/ #define SETTINGSVERSION 11 /*Change this if you change the struct below to prevent people getting out of sync*/
//Motion Sensitivity
#define MOTION_HIGH (0x00) #define MOTION_HIGH (0x00)
#define MOTION_MED (0x10) #define MOTION_MED (0x01)
#define MOTION_LOW (0x20) #define MOTION_LOW (0x02)
//Display Speeds
#define DISPLAYMODE_FAST (0x00) #define DISPLAYMODE_FAST (0x00)
#define DISPLAYMODE_SLOW (0x01) #define DISPLAYMODE_MEDIUM (0x01)
#define DISPLAYMODE_ROUND (0x02) #define DISPLAYMODE_SLOW (0x02)
#define DISPLAYMODE_NONE (0x03) //Rounding Modes
#define ROUNDING_NONE (0x00)
#define ROUNDING_FIVE (0x01)
#define ROUNDING_TEN (0x02)
/* /*
* This struct must be a multiple of 2 bytes as it is saved / restored from flash in uint16_t chunks * This struct must be a multiple of 2 bytes as it is saved / restored from flash in uint16_t chunks
*/ */
struct { struct {
uint32_t SolderingTemp; //current set point for the iron uint16_t SolderingTemp; //current set point for the iron
uint32_t SleepTemp; //temp to drop to in sleep uint32_t SleepTemp; //temp to drop to in sleep
uint8_t version; //Used to track if a reset is needed on firmware upgrade uint8_t version; //Used to track if a reset is needed on firmware upgrade
uint8_t SleepTime; //minutes timeout to sleep uint8_t SleepTime; //minutes timeout to sleep
@@ -31,11 +37,14 @@ struct {
uint8_t movementEnabled:1; //If movement is enabled uint8_t movementEnabled:1; //If movement is enabled
uint8_t displayTempInF:1; //If we need to convert the C reading to F uint8_t displayTempInF:1; //If we need to convert the C reading to F
uint8_t flipDisplay:1; //If true we want to invert the display for lefties uint8_t flipDisplay:1; //If true we want to invert the display for lefties
uint8_t sensitivity:7; //Sensitivity of accelerometer uint8_t sensitivity:5; //Sensitivity of accelerometer (4 bits)
uint8_t ShutdownTime:7; //Time until unit shuts down if left alone uint8_t ShutdownTime:6; //Time until unit shuts down if left alone
uint8_t displayUpdateMode:2; //How fast the display updates / temp showing mode uint8_t displayUpdateSpeed:2; //How fast the display updates / temp showing mode
uint8_t temperatureRounding:2; //Rounding mode for the temperature
uint8_t boostModeEnabled:1; //Boost mode swaps BUT_A in soldering mode to temporary soldering temp over-ride
uint16_t tempCalibration; //Temperature calibration value uint16_t tempCalibration; //Temperature calibration value
uint16_t voltageDiv; //Voltage divisor factor uint16_t voltageDiv; //Voltage divisor factor
uint16_t BoostTemp; //Boost mode set point for the iron
} systemSettings; } systemSettings;
void saveSettings(); void saveSettings();

View File

@@ -23,7 +23,7 @@ uint16_t readDCVoltage(uint16_t divFactor) {
//This allows us to read it in X10 mode //This allows us to read it in X10 mode
//Returns temperature in C X10 mode //Returns temperature in C X10 mode
int16_t readTipTemp() { int16_t readTipTemp() {
static uint32_t rollingAverage[4]; static uint32_t rollingAverage[16];
static uint8_t rIndex = 0; static uint8_t rIndex = 0;
/*The head has a thermocouple inline with the heater /*The head has a thermocouple inline with the heater
@@ -54,9 +54,13 @@ int16_t readTipTemp() {
ad_sum = ad_sum - max - min; //remove the two outliers ad_sum = ad_sum - max - min; //remove the two outliers
avg_data = ad_sum / 8; //take the average avg_data = ad_sum / 8; //take the average
rollingAverage[rIndex] = avg_data; rollingAverage[rIndex] = avg_data;
rIndex = (rIndex + 1) % 4; rIndex = (rIndex + 1) % 16;
return (rollingAverage[0] + rollingAverage[1] + rollingAverage[2] return (rollingAverage[0] + rollingAverage[1] + rollingAverage[2]
+ rollingAverage[3]) / 4; //get the average + rollingAverage[3] + rollingAverage[4] + rollingAverage[5]
+ rollingAverage[6] + rollingAverage[7] + rollingAverage[8]
+ rollingAverage[9] + rollingAverage[10] + rollingAverage[11]
+ rollingAverage[12] + rollingAverage[13] + rollingAverage[14]
+ rollingAverage[15]) / 16; //get the average
} }
@@ -110,7 +114,7 @@ uint16_t readIronTemp(uint16_t calibration_temp, uint8_t read,
static uint16_t calTemp = 0; static uint16_t calTemp = 0;
static uint16_t lastVal = 0; static uint16_t lastVal = 0;
static uint16_t lastSetTemp; static uint16_t lastSetTemp;
if(setPointTemp!=0xFFFF) if (setPointTemp != 0xFFFF)
lastSetTemp = setPointTemp; lastSetTemp = setPointTemp;
if (calibration_temp != 0) if (calibration_temp != 0)
calTemp = calibration_temp; calTemp = calibration_temp;

View File

@@ -4,7 +4,8 @@
volatile uint32_t system_Ticks; volatile uint32_t system_Ticks;
volatile uint32_t lastKeyPress; //millis() at the last button event volatile uint32_t lastKeyPress; //millis() at the last button event
volatile uint16_t keyState; //tracks the button status volatile uint8_t keyState; //tracks the button status
volatile uint8_t rawKeys;
volatile uint32_t lastMovement; //millis() at last movement event volatile uint32_t lastMovement; //millis() at last movement event
//Delay in milliseconds using systemTick //Delay in milliseconds using systemTick
@@ -55,18 +56,24 @@ void EXTI9_5_IRQHandler(void) {
//we are interested in line 9 and line 6 for buttons //we are interested in line 9 and line 6 for buttons
//Line 5 == movement //Line 5 == movement
if (EXTI_GetITStatus(EXTI_Line9) != RESET) { if (EXTI_GetITStatus(EXTI_Line9) != RESET) {
if (GPIO_ReadInputDataBit(GPIOA, KEY_A) == SET) if (GPIO_ReadInputDataBit(GPIOA, KEY_A) == SET) {
keyState &= ~(BUT_A); keyState &= ~(BUT_A);
else rawKeys &= ~BUT_A;
} else {
keyState |= BUT_A; keyState |= BUT_A;
lastKeyPress = millis(); rawKeys |= BUT_A;
lastKeyPress = millis();
}
EXTI_ClearITPendingBit(EXTI_Line9); EXTI_ClearITPendingBit(EXTI_Line9);
} else if (EXTI_GetITStatus(EXTI_Line6) != RESET) { } else if (EXTI_GetITStatus(EXTI_Line6) != RESET) {
if (GPIO_ReadInputDataBit(GPIOA, KEY_B) == SET) if (GPIO_ReadInputDataBit(GPIOA, KEY_B) == SET) {
keyState &= ~(BUT_B); keyState &= ~(BUT_B);
else rawKeys &= ~BUT_B;
} else {
keyState |= BUT_B; keyState |= BUT_B;
lastKeyPress = millis(); rawKeys |= BUT_B;
lastKeyPress = millis();
}
EXTI_ClearITPendingBit(EXTI_Line6); EXTI_ClearITPendingBit(EXTI_Line6);
} else if (EXTI_GetITStatus(EXTI_Line5) != RESET) { //Movement Event } else if (EXTI_GetITStatus(EXTI_Line5) != RESET) { //Movement Event
lastMovement = millis(); lastMovement = millis();
@@ -205,4 +212,3 @@ void USB_LP_CAN1_RX0_IRQHandler(void) {
} }

View File

@@ -34,7 +34,9 @@ void StartUp_Accelerometer(uint8_t sensitivity) {
I2C_RegisterWrite( CTRL_REG2, 0x40); // Reset all registers to POR values I2C_RegisterWrite( CTRL_REG2, 0x40); // Reset all registers to POR values
delayMs(2); // ~1ms delay delayMs(2); // ~1ms delay
I2C_RegisterWrite(FF_MT_CFG_REG, 0x78); // Enable motion detection for X and Y axis, latch enabled I2C_RegisterWrite(FF_MT_CFG_REG, 0x78); // Enable motion detection for X and Y axis, latch enabled
I2C_RegisterWrite(FF_MT_THS_REG, sensitivity|0x0F); // Set threshold uint8_t sens = 0x3F;
sens -= 0x08 * sensitivity;
I2C_RegisterWrite(FF_MT_THS_REG, sens); // Set threshold
I2C_RegisterWrite(FF_MT_COUNT_REG, 0x01); // Set debounce to 100ms I2C_RegisterWrite(FF_MT_COUNT_REG, 0x01); // Set debounce to 100ms
I2C_RegisterWrite( CTRL_REG4, 0x04); // Enable motion interrupt I2C_RegisterWrite( CTRL_REG4, 0x04); // Enable motion interrupt

View File

@@ -37,7 +37,7 @@ void setup() {
readIronTemp(systemSettings.tempCalibration, 0,0); //load the default calibration value readIronTemp(systemSettings.tempCalibration, 0,0); //load the default calibration value
Init_Oled(systemSettings.flipDisplay); //Init the OLED display Init_Oled(systemSettings.flipDisplay); //Init the OLED display
OLED_DrawString("VER 1.09", 8); // OLED_DrawString("VER 1.11", 8); //Version Number
delayMs(800); //Pause to show version number delayMs(500); //Pause to show version number
Start_Watchdog(1000); //start the system watch dog as 1 second timeout Start_Watchdog(1000); //start the system watch dog as 1 second timeout
} }

View File

@@ -5,7 +5,19 @@
* Author: Ralim <ralim@ralimtek.com> * Author: Ralim <ralim@ralimtek.com>
*/ */
#include "Modes.h" #include "Modes.h"
uint8_t CalStatus = 0; const char *SettingsLongNames[] = { " Undervoltage Cutout <V>",
" Sleep Temperature <C>", " Sleep Timeout <Minutes>",
" Shutdown Timeout <Minutes>", " Motion Detection",
" Motion Sensitivity <1.least sensitive 8.most sensitive>",
" Temperature Unit", " Temperature Rounding Amount",
" Temperature Display Update Rate",
" Flip Display for Left Hand",
" Enable front key boost 450C mode when soldering",
" Temperature when in boost mode" };
const uint8_t SettingsLongNamesLengths[] = { 29, 27, 29, 32, 22, 61, 22, 33, 37,
32, 53, 36 };
uint8_t StatusFlags = 0;
uint32_t temporaryTempStorage = 0;
//This does the required processing and state changes //This does the required processing and state changes
void ProcessUI() { void ProcessUI() {
uint8_t Buttons = getButtons(); //read the buttons status uint8_t Buttons = getButtons(); //read the buttons status
@@ -25,22 +37,52 @@ void ProcessUI() {
} else if (Buttons == BUT_A) { } else if (Buttons == BUT_A) {
//A key pressed so we are moving to soldering mode //A key pressed so we are moving to soldering mode
operatingMode = SOLDERING; operatingMode = SOLDERING;
Oled_DisplayOn();
} else if (Buttons == BUT_B) { } else if (Buttons == BUT_B) {
//B Button was pressed so we are moving to the Settings menu //B Button was pressed so we are moving to the Settings menu
operatingMode = SETTINGS; operatingMode = SETTINGS;
Oled_DisplayOn();
} }
break; break;
case SOLDERING: case SOLDERING:
//We need to check the buttons if we need to jump out //We need to check the buttons if we need to jump out
if (Buttons == BUT_A || Buttons == BUT_B) { if ((Buttons == BUT_A && !systemSettings.boostModeEnabled)
|| Buttons == BUT_B) {
//A or B key pressed so we are moving to temp set //A or B key pressed so we are moving to temp set
operatingMode = TEMP_ADJ; operatingMode = TEMP_ADJ;
if (StatusFlags == 8) {
//Boost mode was enabled before
//We need to cancel the temp
systemSettings.SolderingTemp = temporaryTempStorage;
StatusFlags = 0;
}
} else if (Buttons == (BUT_A | BUT_B)) { } else if (Buttons == (BUT_A | BUT_B)) {
//Both buttons were pressed, exit back to the cooling screen //Both buttons were pressed, exit back to the cooling screen
operatingMode = COOLING; operatingMode = COOLING;
if (StatusFlags == 8) {
//Boost mode was enabled before
//We need to cancel the temp
systemSettings.SolderingTemp = temporaryTempStorage;
StatusFlags = 0;
}
} else if ((getRawButtons() == BUT_A && systemSettings.boostModeEnabled)) {
if (StatusFlags != 8) {
StatusFlags = 8;
temporaryTempStorage = systemSettings.SolderingTemp;
systemSettings.SolderingTemp = systemSettings.BoostTemp;
}
//Update the PID Loop
int32_t newOutput = computePID(systemSettings.SolderingTemp);
setIronTimer(newOutput);
} else { } else {
if (StatusFlags == 8) {
//Boost mode was enabled before
//We need to cancel the temp
systemSettings.SolderingTemp = temporaryTempStorage;
StatusFlags = 0;
}
//We need to check the timer for movement in case we need to goto idle //We need to check the timer for movement in case we need to goto idle
if (systemSettings.movementEnabled) if (systemSettings.movementEnabled)
if (millis() - getLastMovement() if (millis() - getLastMovement()
@@ -85,69 +127,83 @@ void ProcessUI() {
case SETTINGS: case SETTINGS:
//Settings is the mode with the most logic //Settings is the mode with the most logic
//Here we are in the menu so we need to increment through the sub menus / increase the value //Here we are in the menu so we need to increment through the sub menus / increase the value
if (StatusFlags == 4 && Buttons != 0) {
//The user pressed the button to breakout of the settings help prompt
StatusFlags = 0;
} else {
if (Buttons & BUT_A) {
//A key iterates through the menu
if (settingsPage == SETTINGSOPTIONSCOUNT) {
//Roll off the end
settingsPage = 0; //reset
operatingMode = STARTUP; //reset back to the startup
saveSettings(); //Save the settings
} else {
++settingsPage; //move to the next option
}
} else if (Buttons & BUT_B) {
//B changes the value selected
switch (settingsPage) {
case UVCO:
//we are incrementing the cutout voltage
systemSettings.cutoutVoltage += 1; //Go up 1V at a jump
if (systemSettings.cutoutVoltage > 24)
systemSettings.cutoutVoltage = 10;
break;
case SLEEP_TEMP:
systemSettings.SleepTemp += 100; //Go up 10C at a time
if (systemSettings.SleepTemp > 3000)
systemSettings.SleepTemp = 1000;//cant sleep higher than 300
break;
case SLEEP_TIME:
++systemSettings.SleepTime; //Go up 1 minute at a time
if (systemSettings.SleepTime > 30)
systemSettings.SleepTime = 1;//cant set time over 30 mins
//Remember that ^ is the time of no movement
break;
case SHUTDOWN_TIME:
++systemSettings.ShutdownTime;
if (systemSettings.ShutdownTime > 60)
systemSettings.ShutdownTime = 0; //wrap to off
break;
case MOTIONDETECT:
systemSettings.movementEnabled =
!systemSettings.movementEnabled;
break;
case TEMPDISPLAY:
systemSettings.displayTempInF =
!systemSettings.displayTempInF;
break;
case LEFTY:
systemSettings.flipDisplay = !systemSettings.flipDisplay;
break;
case MOTIONSENSITIVITY:
systemSettings.sensitivity++;
systemSettings.sensitivity = systemSettings.sensitivity % 8;
if (Buttons & BUT_A) { break;
//A key iterates through the menu case TEMPROUNDING:
if (settingsPage == SETTINGSOPTIONSCOUNT) { systemSettings.temperatureRounding++;
//Roll off the end systemSettings.temperatureRounding =
settingsPage = 0; //reset systemSettings.temperatureRounding % 3;
operatingMode = STARTUP; //reset back to the startup break;
saveSettings(); //Save the settings case DISPUPDATERATE:
} else { systemSettings.displayUpdateSpeed++;
++settingsPage; //move to the next option systemSettings.displayUpdateSpeed =
systemSettings.displayUpdateSpeed % 3;
} break;
} else if (Buttons & BUT_B) { case BOOSTMODE:
resetLastButtonPress(); systemSettings.boostModeEnabled =
//B changes the value selected !systemSettings.boostModeEnabled;
switch (settingsPage) { break;
case UVCO: case BOOSTTEMP:
//we are incrementing the cutout voltage systemSettings.BoostTemp += 100; //Go up 10C at a time
systemSettings.cutoutVoltage += 1; //Go up 1V at a jump if (systemSettings.BoostTemp > 4500)
if (systemSettings.cutoutVoltage > 24) systemSettings.BoostTemp = 2500; //loop back at 250
systemSettings.cutoutVoltage = 10; break;
break; default:
case SLEEP_TEMP: break;
systemSettings.SleepTemp += 100; //Go up 10c at a time }
if (systemSettings.SleepTemp > 3000)
systemSettings.SleepTemp = 1000;//cant sleep higher than 300
break;
case SLEEP_TIME:
++systemSettings.SleepTime; //Go up 1 minute at a time
if (systemSettings.SleepTime > 30)
systemSettings.SleepTime = 1; //cant set time over 30 mins
//Remember that ^ is the time of no movement
break;
case SHUTDOWN_TIME:
++systemSettings.ShutdownTime;
if (systemSettings.ShutdownTime > 60)
systemSettings.ShutdownTime = 0; //wrap to off
break;
case MOTIONDETECT:
systemSettings.movementEnabled =
!systemSettings.movementEnabled;
break;
case TEMPDISPLAY:
systemSettings.displayTempInF = !systemSettings.displayTempInF;
break;
case LEFTY:
systemSettings.flipDisplay = !systemSettings.flipDisplay;
break;
case MOTIONSENSITIVITY:
systemSettings.sensitivity += 0x10;
if (systemSettings.sensitivity > 0x20)
systemSettings.sensitivity = 0; //reset to high on wrap
break;
case DISPLAYMODE:
systemSettings.displayUpdateMode++;
systemSettings.displayUpdateMode =
systemSettings.displayUpdateMode % 4;
break;
default:
break;
} }
} }
break; break;
@@ -163,12 +219,13 @@ void ProcessUI() {
operatingMode = SOLDERING; operatingMode = SOLDERING;
Oled_DisplayOn(); Oled_DisplayOn();
return; return;
} else if (systemSettings.movementEnabled) } else if (systemSettings.movementEnabled) {
if (millis() - getLastMovement() < 1000) {//moved in the last second if (millis() - getLastMovement() < 1000) {//moved in the last second
operatingMode = SOLDERING; //Goto active mode again operatingMode = SOLDERING; //Goto active mode again
Oled_DisplayOn(); Oled_DisplayOn();
return; return;
} }
}
if (systemSettings.movementEnabled) { if (systemSettings.movementEnabled) {
//Check if we should shutdown //Check if we should shutdown
if ((millis() - getLastMovement() if ((millis() - getLastMovement()
@@ -186,13 +243,23 @@ void ProcessUI() {
case COOLING: { case COOLING: {
setIronTimer(0); //turn off heating setIronTimer(0); //turn off heating
//This mode warns the user the iron is still cooling down //This mode warns the user the iron is still cooling down
uint16_t temp = readIronTemp(0, 1, 0xFFFF); //take a new reading as the heater code is not taking new readings if (Buttons & (BUT_A | BUT_B)) { //we check if the user has pushed a button to exit
if (temp < 400) { //if the temp is < 40C then we can go back to IDLE
operatingMode = STARTUP;
} else if (Buttons & (BUT_A | BUT_B)) { //we check if the user has pushed a button to ack
//Either button was pushed //Either button was pushed
operatingMode = STARTUP; operatingMode = STARTUP;
} }
if (systemSettings.movementEnabled) {
if (millis() - getLastMovement()
> (systemSettings.ShutdownTime * 60000)) {
if ((millis() - getLastButtonPress()
> systemSettings.ShutdownTime * 60000)) {
Oled_DisplayOff();
}
} else {
Oled_DisplayOn();
}
}
else
Oled_DisplayOn();
} }
break; break;
case UVLOWARN: case UVLOWARN:
@@ -207,10 +274,10 @@ void ProcessUI() {
if (Buttons == BUT_A) { if (Buttons == BUT_A) {
//Single button press, cycle over to the DC display //Single button press, cycle over to the DC display
CalStatus = 0; StatusFlags = 0;
operatingMode = DCINDISP; operatingMode = DCINDISP;
} else if (Buttons == BUT_B) { } else if (Buttons == BUT_B) {
CalStatus = 0; StatusFlags = 0;
operatingMode = TEMPCAL; operatingMode = TEMPCAL;
} else if (Buttons == (BUT_A | BUT_B)) { } else if (Buttons == (BUT_A | BUT_B)) {
//If the user is holding both button, exit the screen //If the user is holding both button, exit the screen
@@ -221,13 +288,13 @@ void ProcessUI() {
break; break;
case DCINDISP: { case DCINDISP: {
//This lets the user check the input voltage //This lets the user check the input voltage
if (CalStatus == 0) { if (StatusFlags == 0) {
if (Buttons == BUT_A) { if (Buttons == BUT_A) {
//Single button press, cycle over to the temp display //Single button press, cycle over to the temp display
operatingMode = THERMOMETER; operatingMode = THERMOMETER;
} else if (Buttons == BUT_B) { } else if (Buttons == BUT_B) {
//dc cal mode //dc cal mode
CalStatus = 1; StatusFlags = 1;
} else if (Buttons == (BUT_A | BUT_B)) { } else if (Buttons == (BUT_A | BUT_B)) {
//If the user is holding both button, exit the screen //If the user is holding both button, exit the screen
operatingMode = STARTUP; operatingMode = STARTUP;
@@ -245,7 +312,7 @@ void ProcessUI() {
else else
systemSettings.voltageDiv++; systemSettings.voltageDiv++;
} else if (Buttons == (BUT_A | BUT_B)) { } else if (Buttons == (BUT_A | BUT_B)) {
CalStatus = 0; StatusFlags = 0;
saveSettings(); saveSettings();
} }
if (systemSettings.voltageDiv < 120) if (systemSettings.voltageDiv < 120)
@@ -262,13 +329,13 @@ void ProcessUI() {
operatingMode = THERMOMETER; operatingMode = THERMOMETER;
} else if (Buttons == BUT_A) { } else if (Buttons == BUT_A) {
//Try and calibrate //Try and calibrate
if (CalStatus == 0) { if (StatusFlags == 0) {
if ((readTipTemp() < 300) && (readSensorTemp() < 300)) { if ((readTipTemp() < 300) && (readSensorTemp() < 300)) {
CalStatus = 1; StatusFlags = 1;
systemSettings.tempCalibration = readTipTemp(); systemSettings.tempCalibration = readTipTemp();
saveSettings(); saveSettings();
} else { } else {
CalStatus = 2; StatusFlags = 2;
} }
} }
} else if (Buttons == (BUT_A | BUT_B)) { } else if (Buttons == (BUT_A | BUT_B)) {
@@ -285,19 +352,34 @@ void ProcessUI() {
/* /*
* Draws the temp with temp conversion if needed * Draws the temp with temp conversion if needed
*/ */
void drawTemp(uint16_t temp, uint8_t x) { void drawTemp(uint16_t temp, uint8_t x, uint8_t roundingMode) {
if (systemSettings.displayTempInF) if (systemSettings.displayTempInF)
temp = (temp * 9 + 1600) / 5;/*Convert to F -> T*(9/5)+32*/ temp = (temp * 9 + 1600) / 5;/*Convert to F -> T*(9/5)+32*/
if (temp % 10 > 5) if (temp % 10 > 5)
temp += 10; //round up temp += 10; //round up
OLED_DrawThreeNumber(temp / 10, x); temp /= 10;
//handle rounding modes
if (roundingMode == ROUNDING_FIVE) {
if (temp % 10 < 5)
temp = (temp / 10) * 10;
else
temp = ((temp / 10) * 10) + 5;
} else if (roundingMode == ROUNDING_TEN) {
temp = (temp / 10) * 10;
}
OLED_DrawThreeNumber(temp, x);
} }
/* /*
* Performs all the OLED drawing for the current operating mode * Performs all the OLED drawing for the current operating mode
*/ */
void DrawUI() { void DrawUI() {
static uint32_t lastSolderingDrawTime = 0; static uint32_t lastOLEDDrawTime = 0;
static uint16_t lastSolderingDrawnTemp1 = 0;
static uint16_t lastSolderingDrawnTemp2 = 0;
static uint8_t settingsLongTestScrollPos = 0;
uint16_t temp = readIronTemp(0, 0, 0xFFFF); uint16_t temp = readIronTemp(0, 0, 0xFFFF);
switch (operatingMode) { switch (operatingMode) {
case STARTUP: case STARTUP:
@@ -315,45 +397,47 @@ void DrawUI() {
case SOLDERING: case SOLDERING:
//The user is soldering //The user is soldering
{ {
if (systemSettings.displayUpdateMode == DISPLAYMODE_SLOW if (systemSettings.displayUpdateSpeed == DISPLAYMODE_SLOW
&& (millis() - lastSolderingDrawTime < 1000)) && (millis() - lastOLEDDrawTime < 200))
return;
else if (systemSettings.displayUpdateSpeed == DISPLAYMODE_MEDIUM
&& (millis() - lastOLEDDrawTime < 100))
return;
else if (systemSettings.displayUpdateSpeed == DISPLAYMODE_FAST
&& (millis() - lastOLEDDrawTime < 50))
return; return;
if (systemSettings.displayUpdateMode == DISPLAYMODE_FAST uint32_t tempavg = (temp + lastSolderingDrawnTemp1
|| systemSettings.displayUpdateMode == DISPLAYMODE_SLOW) { + lastSolderingDrawnTemp2);
drawTemp(temp, 0); tempavg /= 3;
lastSolderingDrawTime = millis(); drawTemp(tempavg, 0, systemSettings.temperatureRounding);
} lastSolderingDrawnTemp1 = temp;
if (systemSettings.displayUpdateMode == DISPLAYMODE_ROUND) { lastSolderingDrawnTemp2 = lastSolderingDrawnTemp1;
drawTemp((temp / 100) * 100, 0); lastOLEDDrawTime = millis();
} else if (systemSettings.displayUpdateMode == DISPLAYMODE_NONE) {
OLED_DrawChar(' ', 0);
OLED_DrawChar(' ', 1);
OLED_DrawChar(' ', 2);
}
//Now draw symbols //Now draw symbols
OLED_DrawChar(' ', 3); if (StatusFlags == 8)
OLED_DrawChar('B', 3);
else
OLED_DrawChar(' ', 3);
OLED_BlankSlot(6 * 12 + 16, 24 - 16);//blank out the tail after the arrows OLED_BlankSlot(6 * 12 + 16, 24 - 16);//blank out the tail after the arrows
OLED_BlankSlot(4 * 12 + 16, 24 - 16);//blank out the tail after the temp OLED_BlankSlot(4 * 12 + 16, 24 - 16);//blank out the tail after the temp
if (getIronTimer() == 0) { if (getIronTimer() == 0
&& (temp / 10) > (systemSettings.SolderingTemp / 10)) {
//Cooling
OLED_DrawSymbol(6, 5); OLED_DrawSymbol(6, 5);
} else { } else {
if (getIronTimer() < 1000) { if (getIronTimer() < 1500) {
//Maintaining
OLED_DrawSymbol(6, 7); OLED_DrawSymbol(6, 7);
} else { //we are heating } else { //we are heating
OLED_DrawSymbol(6, 6); OLED_DrawSymbol(6, 6);
} }
} }
if (!(systemSettings.displayUpdateMode == DISPLAYMODE_NONE)) { if (systemSettings.displayTempInF) {
if (systemSettings.displayTempInF) { OLED_DrawSymbol(4, 1);
OLED_DrawSymbol(4, 1);
} else {
OLED_DrawSymbol(4, 0);
}
} else { } else {
OLED_DrawChar(' ', 4); OLED_DrawSymbol(4, 0);
OLED_DrawChar(' ', 5);
} }
} }
@@ -363,97 +447,139 @@ void DrawUI() {
//With the nifty arrows //With the nifty arrows
OLED_DrawChar(' ', 0); OLED_DrawChar(' ', 0);
OLED_DrawChar('<', 1); OLED_DrawChar('<', 1);
drawTemp(systemSettings.SolderingTemp, 2); drawTemp(systemSettings.SolderingTemp, 2, 0);
OLED_DrawChar(' ', 5); OLED_DrawChar(' ', 5);
OLED_DrawChar(' ', 7); OLED_DrawChar(' ', 7);
OLED_DrawChar('>', 6); OLED_DrawChar('>', 6);
break; break;
case SETTINGS: case SETTINGS:
//We are prompting the user the setting name //We are prompting the user the setting name
if (millis() - getLastButtonPress() > 3000) {
switch (settingsPage) { StatusFlags = 4;
case UVCO: //If the user has idled for > 3 seconds, show the long name for the selected setting instead
OLED_DrawString("UVCO ", 5); //draw from settingsLongTestScrollPos through to end of screen
OLED_DrawTwoNumber(systemSettings.cutoutVoltage, 5); uint8_t lengthLeft = SettingsLongNamesLengths[settingsPage]
OLED_DrawChar('V', 7); - settingsLongTestScrollPos;
break; if (lengthLeft < 1)
case SLEEP_TEMP: settingsLongTestScrollPos = 0;
OLED_DrawString("STMP ", 5); //^ Reset once not much left
OLED_DrawThreeNumber(systemSettings.SleepTemp / 10, 5); if (lengthLeft > 8)
break; lengthLeft = 8;
case SLEEP_TIME: OLED_DrawString(
OLED_DrawString("SLTME ", 6); SettingsLongNames[(uint8_t) settingsPage]
OLED_DrawTwoNumber(systemSettings.SleepTime, 6); + settingsLongTestScrollPos, lengthLeft);
break; if (lengthLeft < 8)
case SHUTDOWN_TIME: for (uint8_t i = lengthLeft; i < 8; i++)
OLED_DrawString("SHTME ", 6); OLED_DrawChar(' ', i);
OLED_DrawTwoNumber(systemSettings.ShutdownTime, 6); if (millis() - lastOLEDDrawTime > 120) {
break; settingsLongTestScrollPos++;
case MOTIONDETECT:/*Toggle the mode*/ lastOLEDDrawTime = millis();
if (systemSettings.movementEnabled) }
OLED_DrawString("MOTION T", 8); } else {
else settingsLongTestScrollPos = 0;
OLED_DrawString("MOTION F", 8); switch (settingsPage) {
break; case UVCO:
case TEMPDISPLAY:/*Are we showing in C or F ?*/ OLED_DrawString("UVCO ", 5);
if (systemSettings.displayTempInF) OLED_DrawTwoNumber(systemSettings.cutoutVoltage, 5);
OLED_DrawString("TMPUNT F", 8); OLED_DrawChar('V', 7);
else
OLED_DrawString("TMPUNT C", 8);
break;
case LEFTY:
if (systemSettings.flipDisplay)
OLED_DrawString("FLPDSP T", 8);
else
OLED_DrawString("FLPDSP F", 8);
break;
case MOTIONSENSITIVITY:
switch (systemSettings.sensitivity) {
case MOTION_HIGH:
OLED_DrawString("SENSE H ", 8);
break; break;
case MOTION_MED: case SLEEP_TEMP:
OLED_DrawString("SENSE M ", 8); OLED_DrawString("STMP ", 5);
OLED_DrawThreeNumber(systemSettings.SleepTemp / 10, 5);
break; break;
case MOTION_LOW: case SLEEP_TIME:
OLED_DrawString("SENSE L ", 8); OLED_DrawString("SLTME ", 6);
OLED_DrawTwoNumber(systemSettings.SleepTime, 6);
break;
case SHUTDOWN_TIME:
OLED_DrawString("SHTME ", 6);
OLED_DrawTwoNumber(systemSettings.ShutdownTime, 6);
break;
case MOTIONDETECT:/*Toggle the mode*/
if (systemSettings.movementEnabled)
OLED_DrawString("MOTION T", 8);
else
OLED_DrawString("MOTION F", 8);
break;
case TEMPDISPLAY:/*Are we showing in C or F ?*/
if (systemSettings.displayTempInF)
OLED_DrawString("TMPUNT F", 8);
else
OLED_DrawString("TMPUNT C", 8);
break;
case LEFTY:
if (systemSettings.flipDisplay)
OLED_DrawString("FLPDSP T", 8);
else
OLED_DrawString("FLPDSP F", 8);
break;
case MOTIONSENSITIVITY:
OLED_DrawString("MSENSE ", 7);
OLED_DrawChar('1' + systemSettings.sensitivity, 7);
break;
case TEMPROUNDING:
//We are prompting the user about their display mode preferences
{
switch (systemSettings.temperatureRounding) {
case ROUNDING_NONE:
OLED_DrawString("TMPRND 1", 8);
break;
case ROUNDING_FIVE:
OLED_DrawString("TMPRND 5", 8);
break;
case ROUNDING_TEN:
OLED_DrawString("TMPRND10", 8);
break;
default:
OLED_DrawString("TMPRND 1", 8);
break;
}
}
break;
case DISPUPDATERATE:
//We are prompting the user about their display mode preferences
{
switch (systemSettings.displayUpdateSpeed) {
case DISPLAYMODE_FAST:
OLED_DrawString("TMPSPD F", 8);
break;
case DISPLAYMODE_SLOW:
OLED_DrawString("TMPSPD S", 8);
break;
case DISPLAYMODE_MEDIUM:
OLED_DrawString("TMPSPD M", 8);
break;
}
}
break;
case BOOSTMODE:
switch (systemSettings.boostModeEnabled) {
case 1:
OLED_DrawString("BOOST T", 8);
break;
case 0:
OLED_DrawString("BOOST F", 8);
break;
}
break;
case BOOSTTEMP:
OLED_DrawString("BTMP ", 5);
OLED_DrawThreeNumber(systemSettings.BoostTemp / 10, 5);
break; break;
default: default:
OLED_DrawString("SENSE ", 8);
break; break;
} }
break;
case DISPLAYMODE:
//We are prompting the user about their display mode preferences
{
switch (systemSettings.displayUpdateMode) {
case DISPLAYMODE_FAST:
OLED_DrawString("DISPMD F", 8);
break;
case DISPLAYMODE_SLOW:
OLED_DrawString("DISPMD S", 8);
break;
case DISPLAYMODE_ROUND:
OLED_DrawString("DISPMD R", 8);
break;
case DISPLAYMODE_NONE:
OLED_DrawString("DISPMD N", 8);
break;
}
}
break;
default:
break;
} }
break; break;
case SLEEP: case SLEEP:
//The iron is in sleep temp mode //The iron is in sleep temp mode
//Draw in temp and sleep //Draw in temp and sleep
OLED_DrawString("SLP", 3); OLED_DrawString("SLP", 3);
drawTemp(temp, 4); drawTemp(temp, 4, systemSettings.temperatureRounding);
OLED_BlankSlot(84, 96 - 85); //blank out after the temp
if (millis() - getLastMovement() > (10 * 60 * 1000) if (millis() - getLastMovement() > (10 * 60 * 1000)
&& (millis() - getLastButtonPress() > (10 * 60 * 1000))) { && (millis() - getLastButtonPress() > (10 * 60 * 1000))) {
@@ -467,7 +593,8 @@ void DrawUI() {
case COOLING: case COOLING:
//We are warning the user the tip is cooling //We are warning the user the tip is cooling
OLED_DrawString("COOL ", 5); OLED_DrawString("COOL ", 5);
drawTemp(temp, 5); temp = readIronTemp(0, 1, 0xFFFF);//force temp re-reading
drawTemp(temp, 5, systemSettings.temperatureRounding);
break; break;
case UVLOWARN: case UVLOWARN:
OLED_DrawString("LOW VOLT", 8); OLED_DrawString("LOW VOLT", 8);
@@ -475,12 +602,12 @@ void DrawUI() {
case THERMOMETER: case THERMOMETER:
temp = readIronTemp(0, 1, 0xFFFF); //Force a reading as heater is off temp = readIronTemp(0, 1, 0xFFFF); //Force a reading as heater is off
OLED_DrawString("TEMP ", 5);//extra one to it clears the leftover 'L' from IDLE OLED_DrawString("TEMP ", 5);//extra one to it clears the leftover 'L' from IDLE
drawTemp(temp, 5); drawTemp(temp, 5, 0);
break; break;
case DCINDISP: { case DCINDISP: {
uint16_t voltage = readDCVoltage(systemSettings.voltageDiv); //get X10 voltage uint16_t voltage = readDCVoltage(systemSettings.voltageDiv); //get X10 voltage
if (CalStatus == 0 || ((millis() % 1000) > 500)) { if (StatusFlags == 0 || ((millis() % 1000) > 500)) {
OLED_DrawString("IN", 2); OLED_DrawString("IN", 2);
OLED_DrawChar((voltage / 100) % 10, 2); OLED_DrawChar((voltage / 100) % 10, 2);
voltage -= (voltage / 100) * 100; voltage -= (voltage / 100) * 100;
@@ -497,11 +624,11 @@ void DrawUI() {
break; break;
case TEMPCAL: { case TEMPCAL: {
if (CalStatus == 0) { if (StatusFlags == 0) {
OLED_DrawString("CAL TEMP", 8); OLED_DrawString("CAL TEMP", 8);
} else if (CalStatus == 1) { } else if (StatusFlags == 1) {
OLED_DrawString("CAL OK ", 8); OLED_DrawString("CAL OK ", 8);
} else if (CalStatus == 2) { } else if (StatusFlags == 2) {
OLED_DrawString("CAL FAIL", 8); OLED_DrawString("CAL FAIL", 8);
} }
} }
@@ -510,4 +637,5 @@ void DrawUI() {
default: default:
break; break;
} }
} }

View File

@@ -174,7 +174,7 @@ void Clear_Screen(void) {
/* /*
* Draws a string onto the screen starting at the left * Draws a string onto the screen starting at the left
*/ */
void OLED_DrawString(char* string, uint8_t length) { void OLED_DrawString(const char* string,const uint8_t length) {
for (uint8_t i = 0; i < length; i++) { for (uint8_t i = 0; i < length; i++) {
OLED_DrawChar(string[i], i); OLED_DrawChar(string[i], i);
} }
@@ -188,7 +188,9 @@ void OLED_DrawChar(char c, uint8_t x) {
x *= FONT_WIDTH; //convert to a x coordinate x *= FONT_WIDTH; //convert to a x coordinate
u8* ptr = (u8*) FONT; u8* ptr = (u8*) FONT;
if (c >= 'A' && c <= 'Z') { if (c >= 'a' && c <= 'z') {
ptr += (c - 'a' + 10) * (FONT_WIDTH * 2); //alpha is ofset 10 chars into the array
} else if (c >= 'A' && c <= 'Z') {
ptr += (c - 'A' + 10) * (FONT_WIDTH * 2); //alpha is ofset 10 chars into the array ptr += (c - 'A' + 10) * (FONT_WIDTH * 2); //alpha is ofset 10 chars into the array
} else if (c >= '0' && c <= '9') } else if (c >= '0' && c <= '9')
ptr += (c - '0') * (FONT_WIDTH * 2); ptr += (c - '0') * (FONT_WIDTH * 2);

View File

@@ -15,8 +15,8 @@ int32_t computePID(uint16_t setpoint) {
uint16_t currentReading = readIronTemp(0, 1,setpoint); //get the current temp of the iron uint16_t currentReading = readIronTemp(0, 1,setpoint); //get the current temp of the iron
int16_t error = (int16_t) setpoint - (int16_t) currentReading; //calculate the error term int16_t error = (int16_t) setpoint - (int16_t) currentReading; //calculate the error term
ITerm += (pidSettings.ki * error); ITerm += (pidSettings.ki * error);
if (ITerm > MAXPIDOUTPUT) if (ITerm > MAXPIDOUTPUT/2)
ITerm = MAXPIDOUTPUT; ITerm = MAXPIDOUTPUT/2;
else if (ITerm < 0) else if (ITerm < 0)
ITerm = 0; //cap at 0 since we cant force the iron to cool itself :) ITerm = 0; //cap at 0 since we cant force the iron to cool itself :)
@@ -34,8 +34,8 @@ int32_t computePID(uint16_t setpoint) {
} }
/*Sets up the pid values*/ /*Sets up the pid values*/
void setupPID(void) { void setupPID(void) {
pidSettings.kp = 25; pidSettings.kp = 15;
pidSettings.ki = 7; pidSettings.ki = 2;
pidSettings.kd = 2; pidSettings.kd = 3;
} }

View File

@@ -49,10 +49,13 @@ void resetSettings() {
systemSettings.version = SETTINGSVERSION; //Store the version number to allow for easier upgrades systemSettings.version = SETTINGSVERSION; //Store the version number to allow for easier upgrades
systemSettings.displayTempInF =0; //default to C systemSettings.displayTempInF =0; //default to C
systemSettings.flipDisplay=0; //Default to right handed mode systemSettings.flipDisplay=0; //Default to right handed mode
systemSettings.sensitivity=0x00; //Default high sensitivity systemSettings.sensitivity=6; //Default high sensitivity
systemSettings.tempCalibration=239; //Default to their calibration value systemSettings.tempCalibration=239; //Default to their calibration value
systemSettings.voltageDiv=144; //Default divider from schematic systemSettings.voltageDiv=144; //Default divider from schematic
systemSettings.ShutdownTime=30; //How many minutes until the unit turns itself off systemSettings.ShutdownTime=30; //How many minutes until the unit turns itself off
systemSettings.displayUpdateMode=0; //How fast the LCD updates systemSettings.displayUpdateSpeed=1; //How fast the LCD updates
systemSettings.temperatureRounding=0; //How the temperature is rounded off
systemSettings.boostModeEnabled=0; //Default to safe, with no boost mode
systemSettings.BoostTemp=4000; //default to 400C
} }

View File

@@ -1,9 +1,19 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8"?>
<targetDefinitions xmlns="http://openstm32.org/stm32TargetDefinitions" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://openstm32.org/stm32TargetDefinitions stm32TargetDefinitions.xsd"> <!DOCTYPE targetDefinitions [
<!ELEMENT targetDefinitions (board)>
<!ELEMENT board (name, dbgIF+, dbgDEV, mcuId)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT dbgIF (#PCDATA)>
<!ELEMENT dbgDEV (#PCDATA)>
<!ELEMENT mcuId (#PCDATA)>
<!ATTLIST board id CDATA #REQUIRED>
]>
<targetDefinitions>
<board id="ts100"> <board id="ts100">
<name>ts100</name> <name>ts100</name>
<mcuId>stm32f103t8ux</mcuId>
<dbgIF>SWD</dbgIF> <dbgIF>SWD</dbgIF>
<dbgDEV>ST-Link</dbgDEV> <dbgDEV>ST-Link</dbgDEV>
<mcuId>stm32f103t8ux</mcuId>
</board> </board>
</targetDefinitions> </targetDefinitions>