Adds automatic shutdown
Closes #7 . Adds shutdown feature with settings entry
This commit is contained in:
@@ -51,8 +51,9 @@ The button near the tip cycles through the options, and the one near the usb cha
|
|||||||
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.
|
||||||
|
|
||||||
* UVCO -> Undervoltage cut out level, settable in 1V increments from 10-24V
|
* UVCO -> Undervoltage cut out level, settable in 1V increments from 10-24V
|
||||||
* STIME -> Sleep time, how long it takes before the unit goes to sleep
|
* 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
|
||||||
|
* 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
|
||||||
* TMPUNIT -> Temperature unit, C or F
|
* TMPUNIT -> Temperature unit, C or F
|
||||||
* FLPDSP -> Flip display for left handed users
|
* FLPDSP -> Flip display for left handed users
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ enum {
|
|||||||
UVCO = 0,
|
UVCO = 0,
|
||||||
SLEEP_TEMP,
|
SLEEP_TEMP,
|
||||||
SLEEP_TIME,
|
SLEEP_TIME,
|
||||||
|
SHUTDOWN_TIME,
|
||||||
MOTIONDETECT,
|
MOTIONDETECT,
|
||||||
MOTIONSENSITIVITY,
|
MOTIONSENSITIVITY,
|
||||||
TEMPDISPLAY,
|
TEMPDISPLAY,
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
#define SETTINGS_H_
|
#define SETTINGS_H_
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "stm32f10x_flash.h"
|
#include "stm32f10x_flash.h"
|
||||||
#define SETTINGSVERSION 0x04 /*Change this if you change the struct below to prevent people getting out of sync*/
|
#define SETTINGSVERSION 0x05 /*Change this if you change the struct below to prevent people getting out of sync*/
|
||||||
#define SETTINGSOPTIONSCOUNT 6 /*Number of settings in the settings menu*/
|
#define SETTINGSOPTIONSCOUNT 6 /*Number of settings in the settings menu*/
|
||||||
#define MOTION_HIGH (0x00)
|
#define MOTION_HIGH (0x00)
|
||||||
#define MOTION_MED (0x10)
|
#define MOTION_MED (0x10)
|
||||||
@@ -20,15 +20,16 @@
|
|||||||
* 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 setpoint for the iron
|
uint32_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
|
||||||
uint8_t cutoutVoltage:5; //The voltage we cutout at for undervoltage
|
uint8_t cutoutVoltage:5; //The voltage we cut out at for under voltage
|
||||||
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:7; //Sensitivity of accelerometer
|
||||||
|
uint8_t ShutdownTime:7; //Time until unit shuts down if left alone
|
||||||
uint16_t tempCalibration; //Temperature calibration value
|
uint16_t tempCalibration; //Temperature calibration value
|
||||||
uint16_t voltageDiv; //Voltage divisor factor
|
uint16_t voltageDiv; //Voltage divisor factor
|
||||||
} systemSettings;
|
} systemSettings;
|
||||||
|
|||||||
@@ -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.06", 8); //
|
OLED_DrawString("VER 1.07", 8); //
|
||||||
delayMs(800); //Pause to show version number
|
delayMs(800); //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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -116,6 +116,11 @@ void ProcessUI() {
|
|||||||
systemSettings.SleepTime = 1; //cant set time over 30 mins
|
systemSettings.SleepTime = 1; //cant set time over 30 mins
|
||||||
//Remember that ^ is the time of no movement
|
//Remember that ^ is the time of no movement
|
||||||
break;
|
break;
|
||||||
|
case SHUTDOWN_TIME:
|
||||||
|
++systemSettings.ShutdownTime;
|
||||||
|
if (systemSettings.ShutdownTime > 60)
|
||||||
|
systemSettings.ShutdownTime = 0; //wrap to off
|
||||||
|
break;
|
||||||
case MOTIONDETECT:
|
case MOTIONDETECT:
|
||||||
systemSettings.movementEnabled =
|
systemSettings.movementEnabled =
|
||||||
!systemSettings.movementEnabled;
|
!systemSettings.movementEnabled;
|
||||||
@@ -142,16 +147,29 @@ void ProcessUI() {
|
|||||||
if (Buttons & BUT_A) {
|
if (Buttons & BUT_A) {
|
||||||
//A Button was pressed so we are moving back to soldering
|
//A Button was pressed so we are moving back to soldering
|
||||||
operatingMode = SOLDERING;
|
operatingMode = SOLDERING;
|
||||||
|
Oled_DisplayOn();
|
||||||
return;
|
return;
|
||||||
} else if (Buttons & BUT_B) {
|
} else if (Buttons & BUT_B) {
|
||||||
//B Button was pressed so we are moving back to soldering
|
//B Button was pressed so we are moving back to soldering
|
||||||
operatingMode = SOLDERING;
|
operatingMode = SOLDERING;
|
||||||
|
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();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (systemSettings.movementEnabled) {
|
||||||
|
//Check if we should shutdown
|
||||||
|
if ((millis() - getLastMovement()
|
||||||
|
> (systemSettings.ShutdownTime * 60000))
|
||||||
|
|| (millis() - getLastButtonPress()
|
||||||
|
> systemSettings.ShutdownTime * 60000)) {
|
||||||
|
operatingMode = COOLING; //shutdown the tip
|
||||||
|
Oled_DisplayOn();
|
||||||
|
}
|
||||||
|
}
|
||||||
//else if nothing has been pushed we need to compute the PID to keep the iron at the sleep temp
|
//else if nothing has been pushed we need to compute the PID to keep the iron at the sleep temp
|
||||||
int32_t newOutput = computePID(systemSettings.SleepTemp);
|
int32_t newOutput = computePID(systemSettings.SleepTemp);
|
||||||
setIronTimer(newOutput);
|
setIronTimer(newOutput);
|
||||||
@@ -333,9 +351,13 @@ void DrawUI() {
|
|||||||
OLED_DrawThreeNumber(systemSettings.SleepTemp / 10, 5);
|
OLED_DrawThreeNumber(systemSettings.SleepTemp / 10, 5);
|
||||||
break;
|
break;
|
||||||
case SLEEP_TIME:
|
case SLEEP_TIME:
|
||||||
OLED_DrawString("STIME ", 6);
|
OLED_DrawString("SLTME ", 6);
|
||||||
OLED_DrawTwoNumber(systemSettings.SleepTime, 6);
|
OLED_DrawTwoNumber(systemSettings.SleepTime, 6);
|
||||||
break;
|
break;
|
||||||
|
case SHUTDOWN_TIME:
|
||||||
|
OLED_DrawString("SHTME ", 6);
|
||||||
|
OLED_DrawTwoNumber(systemSettings.ShutdownTime, 6);
|
||||||
|
break;
|
||||||
case MOTIONDETECT:/*Toggle the mode*/
|
case MOTIONDETECT:/*Toggle the mode*/
|
||||||
if (systemSettings.movementEnabled)
|
if (systemSettings.movementEnabled)
|
||||||
OLED_DrawString("MOTION T", 8);
|
OLED_DrawString("MOTION T", 8);
|
||||||
@@ -373,6 +395,7 @@ void DrawUI() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -382,6 +405,15 @@ void DrawUI() {
|
|||||||
//Draw in temp and sleep
|
//Draw in temp and sleep
|
||||||
OLED_DrawString("SLP", 3);
|
OLED_DrawString("SLP", 3);
|
||||||
drawTemp(temp, 4);
|
drawTemp(temp, 4);
|
||||||
|
|
||||||
|
if (millis() - getLastMovement() > (10 * 60 * 1000)
|
||||||
|
&& (millis() - getLastButtonPress() > (10 * 60 * 1000))) {
|
||||||
|
//OLED off
|
||||||
|
Oled_DisplayOff();
|
||||||
|
} else {
|
||||||
|
Oled_DisplayOn();
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case COOLING:
|
case COOLING:
|
||||||
//We are warning the user the tip is cooling
|
//We are warning the user the tip is cooling
|
||||||
|
|||||||
@@ -52,5 +52,6 @@ void resetSettings() {
|
|||||||
systemSettings.sensitivity=0x00; //Default high sensitivity
|
systemSettings.sensitivity=0x00; //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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user