Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8c73aa0de4 | ||
|
|
53a1b9b7f4 | ||
|
|
c9d0d5bdb3 | ||
|
|
4f9e738501 | ||
|
|
fcaf909a54 | ||
|
|
9b51750a1d | ||
|
|
fceb81287e | ||
|
|
c3d8d246dc | ||
|
|
1f7cdf9694 | ||
|
|
b2db129ab8 | ||
|
|
b7e4249d2e |
30
README.md
30
README.md
@@ -1,27 +1,28 @@
|
|||||||
# TS100
|
# TS100
|
||||||
This is a complete open source re-write of the software for the ts100 soldering iron.
|
This is a complete open source re-write of the 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 was started to remove the need for USB for changing system settings.
|
|
||||||
|
|
||||||
The software has similar functionality to the original firmware.
|
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.
|
||||||
|
|
||||||
## Features Working
|
## Features Working
|
||||||
* Soldering / Temperature control
|
* Soldering / Temperature control
|
||||||
* Full PID Iron Temp
|
* Full PID iron temperature control
|
||||||
* Adjusting temperature
|
* Adjusting temperature
|
||||||
* Automatic sleep
|
* Automatic sleep
|
||||||
* Motion wake support
|
* Motion wake support
|
||||||
* Basic settings menu
|
* Settings menu
|
||||||
* Input voltage UVLO measurement
|
* Input voltage UVLO measurement
|
||||||
* Saving settings to flash for persistence
|
* Saving settings to flash for persistence
|
||||||
* Improved GUI
|
* Improved GUI Fonts
|
||||||
* Use hardware I2C for communications
|
* Use hardware I2C for communications
|
||||||
* Can disable movement detection if desired
|
* Can disable movement detection if desired
|
||||||
## Features still to be implemented
|
|
||||||
* Manual Temp Calibration
|
|
||||||
|
|
||||||
# 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 :)
|
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)
|
||||||
|
**You will need a windows computer (7,8,10 tested), using the normal windows explorer to load the firmware.
|
||||||
|
The bootloader does not appear to work under mac or linux at the moment.**
|
||||||
|
|
||||||
1. Hold the button closest to the tip, and plug in the USB to the computer.
|
1. Hold the button closest to the tip, and plug in the USB to the computer.
|
||||||
2. The unit will appear as a USB drive.
|
2. The unit will appear as a USB drive.
|
||||||
@@ -29,10 +30,19 @@ This is completely safe, if it goes wrong just put the .hex file from the offici
|
|||||||
4. The unit will disconnect and reconnect.
|
4. The unit will disconnect and reconnect.
|
||||||
5. The filename will have changed to end in .RDY or .ERR .
|
5. The filename will have changed to end in .RDY or .ERR .
|
||||||
6. If it ends with .RDY your done! Otherwise something went wrong.
|
6. If it ends with .RDY your done! Otherwise something went wrong.
|
||||||
7. If it went wrong try on a windows computer, some Mac / Linux machines do not play well with their boot loader.
|
7. Disconnect the USB and power up the iron. You're good to go.
|
||||||
|
|
||||||
|
For the more adventurerous out there, you can also load this firmware onto the device using a SWD programmer.
|
||||||
|
On the bottom of the MCU riser pcb, there are 4 pads for programming.
|
||||||
|
There is a complete device flash backup included in this repository. (Note this includes the bootloader, so will need a SWD programmer to load onto the unit). Please do not use the backup of the bootloader for anything malicious, its only saved here for those who are tinkering with their iron and decide to replace it.
|
||||||
|
|
||||||
# New Menu System
|
# New Menu System
|
||||||
This new firmware uses a new menu system to allow access to the settings on the device.
|
This new firmware uses a new menu system to allow access to the settings on the device.
|
||||||
This menu can be accessed as shown in following flow chart, in the settings numbers roll over from top to bottom.
|
This menu can be accessed as shown in following flow chart, in the settings numbers roll over from top to bottom.
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
# Version Changes:
|
||||||
|
V1.02
|
||||||
|
- Adds hold both buttons on IDLE to access the therometer mode.
|
||||||
|
- Changes the exit soldering mode to be holding both buttons (Like original firmware).
|
||||||
|
|||||||
@@ -103,7 +103,7 @@
|
|||||||
</extensions>
|
</extensions>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.release.1113492345" name="Release" parent="fr.ac6.managedbuild.config.gnu.cross.exe.release" postannouncebuildStep="Generating binary and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O binary "${BuildArtifactFileBaseName}.elf" "${BuildArtifactFileBaseName}.bin"; arm-none-eabi-size -B "${BuildArtifactFileName}"">
|
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="fr.ac6.managedbuild.config.gnu.cross.exe.release.1113492345" name="Release" parent="fr.ac6.managedbuild.config.gnu.cross.exe.release" postannouncebuildStep="Generating binary and Printing size information:" postbuildStep="arm-none-eabi-objcopy -O binary "${BuildArtifactFileBaseName}.elf" "${BuildArtifactFileBaseName}.bin"; arm-none-eabi-size -B "${BuildArtifactFileName}";arm-none-eabi-objcopy -O ihex "${BuildArtifactFileBaseName}.elf" "${BuildArtifactFileBaseName}.hex"">
|
||||||
<folderInfo id="fr.ac6.managedbuild.config.gnu.cross.exe.release.1113492345." name="/" resourcePath="">
|
<folderInfo id="fr.ac6.managedbuild.config.gnu.cross.exe.release.1113492345." name="/" resourcePath="">
|
||||||
<toolChain id="fr.ac6.managedbuild.toolchain.gnu.cross.exe.release.668479481" name="Ac6 STM32 MCU GCC" superClass="fr.ac6.managedbuild.toolchain.gnu.cross.exe.release">
|
<toolChain id="fr.ac6.managedbuild.toolchain.gnu.cross.exe.release.668479481" name="Ac6 STM32 MCU GCC" superClass="fr.ac6.managedbuild.toolchain.gnu.cross.exe.release">
|
||||||
<option id="fr.ac6.managedbuild.option.gnu.cross.mcu.302274410" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" value="STM32F103T8Ux" valueType="string"/>
|
<option id="fr.ac6.managedbuild.option.gnu.cross.mcu.302274410" name="Mcu" superClass="fr.ac6.managedbuild.option.gnu.cross.mcu" value="STM32F103T8Ux" valueType="string"/>
|
||||||
|
|||||||
1
workspace/ts100/.gitignore
vendored
1
workspace/ts100/.gitignore
vendored
@@ -1 +1,2 @@
|
|||||||
/Debug/
|
/Debug/
|
||||||
|
/Release/
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
#define __MMA8652FC__H
|
#define __MMA8652FC__H
|
||||||
|
|
||||||
|
|
||||||
void StartUp_Accelerometer(void);//This is the only function we expose
|
void StartUp_Accelerometer(uint8_t sensitivity);//This is the only function we expose
|
||||||
|
|
||||||
//--------------MMA8652 Device ID----------------------------------------------//
|
//--------------MMA8652 Device ID----------------------------------------------//
|
||||||
|
|
||||||
|
|||||||
@@ -24,11 +24,18 @@ enum {
|
|||||||
SLEEP,
|
SLEEP,
|
||||||
COOLING,
|
COOLING,
|
||||||
UVLOWARN,
|
UVLOWARN,
|
||||||
|
THERMOMETER,
|
||||||
|
DCINDISP,
|
||||||
} operatingMode;
|
} operatingMode;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
UVCO = 0, SLEEP_TEMP, SLEEP_TIME, MOTIONDETECT, TEMPDISPLAY,LEFTY
|
UVCO = 0,
|
||||||
|
SLEEP_TEMP,
|
||||||
|
SLEEP_TIME,
|
||||||
|
MOTIONDETECT,
|
||||||
|
MOTIONSENSITIVITY,
|
||||||
|
TEMPDISPLAY,
|
||||||
|
LEFTY,
|
||||||
} settingsPage;
|
} settingsPage;
|
||||||
|
|
||||||
void ProcessUI();
|
void ProcessUI();
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ u8* Oled_DrawArea(u8 x0, u8 y0, u8 wide, u8 high, u8* ptr);
|
|||||||
void Set_ShowPos(u8 x, u8 y);
|
void Set_ShowPos(u8 x, u8 y);
|
||||||
void Oled_DisplayFlip();
|
void Oled_DisplayFlip();
|
||||||
void GPIO_Init_OLED(void);
|
void GPIO_Init_OLED(void);
|
||||||
void Init_Oled(void);
|
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*/
|
||||||
|
|||||||
@@ -11,20 +11,25 @@
|
|||||||
#define SETTINGS_H_
|
#define SETTINGS_H_
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "stm32f10x_flash.h"
|
#include "stm32f10x_flash.h"
|
||||||
#define SETTINGSVERSION 0x02 /*Change this if you change the struct below to prevent people getting out of sync*/
|
#define SETTINGSVERSION 0x03 /*Change this if you change the struct below to prevent people getting out of sync*/
|
||||||
#define SETTINGSOPTIONSCOUNT 5 /*Number of settings in the settings menu*/
|
#define SETTINGSOPTIONSCOUNT 6 /*Number of settings in the settings menu*/
|
||||||
|
#define MOTION_HIGH (0x00)
|
||||||
|
#define MOTION_MED (0x10)
|
||||||
|
#define MOTION_LOW (0x20)
|
||||||
/*
|
/*
|
||||||
* 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 setpoint 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; //The voltage we cutout at for undervoltage
|
uint8_t cutoutVoltage:5; //The voltage we cutout at for undervoltage
|
||||||
uint8_t movementEnabled; //If movement is enabled
|
uint8_t movementEnabled:1; //If movement is enabled
|
||||||
uint8_t displayTempInF; //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; //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
|
||||||
|
uint16_t tempCalibration; //Temperature calibration value
|
||||||
} systemSettings;
|
} systemSettings;
|
||||||
|
|
||||||
void saveSettings();
|
void saveSettings();
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ void TIM3_IRQHandler(void) {
|
|||||||
//used for buttons and movement
|
//used for buttons and movement
|
||||||
void EXTI9_5_IRQHandler(void) {
|
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
|
||||||
//Lien 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);
|
||||||
|
|||||||
@@ -29,15 +29,15 @@ uint8_t I2C_RegisterRead(uint8_t reg) {
|
|||||||
return tx_data[0];
|
return tx_data[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
void StartUp_Accelerometer(void) {
|
void StartUp_Accelerometer(uint8_t sensitivity) {
|
||||||
I2C_RegisterWrite(CTRL_REG2, 0); //Normal mode
|
I2C_RegisterWrite(CTRL_REG2, 0); //Normal mode
|
||||||
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, 0x0F); // Set threshold
|
I2C_RegisterWrite(FF_MT_THS_REG, sensitivity|0x0F); // 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
|
||||||
I2C_RegisterWrite( CTRL_REG5, 0x04);// Route motion interrupts to INT1 ->PB5 ->EXTI
|
I2C_RegisterWrite( CTRL_REG5, 0x04);// Route motion interrupts to INT1 ->PB5 ->EXTI5
|
||||||
I2C_RegisterWrite( CTRL_REG1, 0x19); // ODR=100 Hz, Active mode
|
I2C_RegisterWrite( CTRL_REG1, 0x19); // ODR=100 Hz, Active mode
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,29 +14,30 @@ void setup();
|
|||||||
int main(void) {
|
int main(void) {
|
||||||
setup();/*Setup the system*/
|
setup();/*Setup the system*/
|
||||||
while (1) {
|
while (1) {
|
||||||
Clear_Watchdog(); //reset the Watchdog timer
|
Clear_Watchdog(); //reset the Watch dog timer
|
||||||
ProcessUI();
|
ProcessUI();
|
||||||
DrawUI();
|
DrawUI();
|
||||||
delayMs(50); //Slow the system down a little bit
|
delayMs(50); //Slow the system down a little bit
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void setup() {
|
void setup() {
|
||||||
RCC_Config(); //setup system clock
|
RCC_Config(); //setup system clock
|
||||||
NVIC_Config(0x4000); //this shifts the NVIC table to be offset, for the usb bootloader's size
|
NVIC_Config(0x4000); //this shifts the NVIC table to be offset, for the usb bootloader's size
|
||||||
GPIO_Config(); //setup all the GPIO pins
|
GPIO_Config(); //setup all the GPIO pins
|
||||||
Init_EXTI(); //init the EXTI inputs
|
Init_EXTI(); //init the EXTI inputs
|
||||||
Init_Timer3(); //Used for the soldering iron tip
|
Init_Timer3(); //Used for the soldering iron tip
|
||||||
Adc_Init(); //init adc and dma
|
Adc_Init(); //init adc and dma
|
||||||
I2C_Configuration(); //Start the I2C hardware
|
I2C_Configuration(); //Start the I2C hardware
|
||||||
GPIO_Init_OLED(); //Init the GPIO ports for the OLED
|
GPIO_Init_OLED(); //Init the GPIO ports for the OLED
|
||||||
StartUp_Accelerometer(); //start the accelerometer
|
restoreSettings(); //Load settings
|
||||||
Init_Oled(); //init the OLED display
|
|
||||||
setupPID(); //init the PID values
|
StartUp_Accelerometer(systemSettings.sensitivity); //start the accelerometer
|
||||||
readIronTemp(239, 0); //load the default calibration value
|
|
||||||
restoreSettings(); //Load settings
|
setupPID(); //init the PID values
|
||||||
if (systemSettings.flipDisplay)
|
readIronTemp(239, 0); //load the default calibration value
|
||||||
Oled_DisplayFlip();
|
Init_Oled(systemSettings.flipDisplay); //init the OLED display
|
||||||
OLED_DrawString("VER 1.01",8);
|
|
||||||
delayMs(800);
|
OLED_DrawString("VER 1.03", 8); //1.settings version as of current
|
||||||
Start_Watchdog(1000); //start the system watchdog as 1 seconds timeout
|
delayMs(800); //Pause to show version number
|
||||||
|
Start_Watchdog(1000); //start the system watch dog as 1 second timeout
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,39 +9,36 @@
|
|||||||
void ProcessUI() {
|
void ProcessUI() {
|
||||||
uint8_t Buttons = getButtons(); //read the buttons status
|
uint8_t Buttons = getButtons(); //read the buttons status
|
||||||
static uint32_t lastModeChange = 0;
|
static uint32_t lastModeChange = 0;
|
||||||
if (millis() - getLastButtonPress() < 200)
|
if (millis() - getLastButtonPress() < 30)
|
||||||
Buttons = 0;
|
Buttons = 0;
|
||||||
|
else if (Buttons != 0) {
|
||||||
|
resetLastButtonPress();
|
||||||
|
resetButtons();
|
||||||
|
}
|
||||||
//rough prevention for de-bouncing and allocates settling time
|
//rough prevention for de-bouncing and allocates settling time
|
||||||
|
|
||||||
switch (operatingMode) {
|
switch (operatingMode) {
|
||||||
case STARTUP:
|
case STARTUP:
|
||||||
if ((millis() - getLastButtonPress() > 1000)) {
|
if (Buttons == (BUT_A | BUT_B)) {
|
||||||
if (Buttons & BUT_A) {
|
operatingMode = THERMOMETER;
|
||||||
//A key pressed so we are moving to soldering mode
|
} else if (Buttons == BUT_A) {
|
||||||
operatingMode = SOLDERING;
|
//A key pressed so we are moving to soldering mode
|
||||||
resetLastButtonPress();
|
operatingMode = SOLDERING;
|
||||||
resetButtons();
|
} 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;
|
|
||||||
resetLastButtonPress();
|
|
||||||
resetButtons();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
//Nothing else to check here
|
|
||||||
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) {
|
if (Buttons == BUT_A || Buttons == BUT_B) {
|
||||||
//A 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;
|
||||||
resetLastButtonPress();
|
} else if (Buttons == (BUT_A | BUT_B)) {
|
||||||
resetButtons();
|
|
||||||
} else if (Buttons & BUT_B) {
|
//Both buttons were pressed, exit back to the cooling screen
|
||||||
//B Button was pressed so we are moving back to idle
|
|
||||||
operatingMode = COOLING;
|
operatingMode = COOLING;
|
||||||
resetLastButtonPress();
|
|
||||||
resetButtons();
|
|
||||||
} else {
|
} else {
|
||||||
//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)
|
||||||
@@ -56,32 +53,29 @@ void ProcessUI() {
|
|||||||
uint16_t voltage = readDCVoltage(); //get X10 voltage
|
uint16_t voltage = readDCVoltage(); //get X10 voltage
|
||||||
if ((voltage / 10) < systemSettings.cutoutVoltage) {
|
if ((voltage / 10) < systemSettings.cutoutVoltage) {
|
||||||
operatingMode = UVLOWARN;
|
operatingMode = UVLOWARN;
|
||||||
resetLastButtonPress();
|
|
||||||
resetButtons();
|
|
||||||
lastModeChange = millis();
|
lastModeChange = millis();
|
||||||
}
|
}
|
||||||
//If no buttons pushed we need to perform the PID loop for the iron temp
|
//Update the PID Loop
|
||||||
int32_t newOutput = computePID(systemSettings.SolderingTemp);
|
int32_t newOutput = computePID(systemSettings.SolderingTemp);
|
||||||
|
|
||||||
setIronTimer(newOutput);
|
setIronTimer(newOutput);
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TEMP_ADJ:
|
case TEMP_ADJ:
|
||||||
if (Buttons & BUT_A) {
|
if (Buttons == BUT_A) {
|
||||||
//A key pressed so we are moving down in temp
|
//A key pressed so we are moving down in temp
|
||||||
resetLastButtonPress();
|
|
||||||
if (systemSettings.SolderingTemp > 1000)
|
if (systemSettings.SolderingTemp > 1000)
|
||||||
systemSettings.SolderingTemp -= 100;
|
systemSettings.SolderingTemp -= 100;
|
||||||
} else if (Buttons & BUT_B) {
|
} else if (Buttons == BUT_B) {
|
||||||
//B key pressed so we are moving up in temp
|
//B key pressed so we are moving up in temp
|
||||||
resetLastButtonPress();
|
|
||||||
if (systemSettings.SolderingTemp < 4500)
|
if (systemSettings.SolderingTemp < 4500)
|
||||||
systemSettings.SolderingTemp += 100;
|
systemSettings.SolderingTemp += 100;
|
||||||
} else {
|
} else {
|
||||||
//we check the timeout for how long the buttons have not been pushed
|
//we check the timeout for how long the buttons have not been pushed
|
||||||
//if idle for > 3 seconds then we return to soldering
|
//if idle for > 3 seconds then we return to soldering
|
||||||
if (millis() - getLastButtonPress() > 3000) {
|
//Or if both buttons pressed
|
||||||
|
if ((millis() - getLastButtonPress() > 2000)
|
||||||
|
|| Buttons == (BUT_A | BUT_B)) {
|
||||||
operatingMode = SOLDERING;
|
operatingMode = SOLDERING;
|
||||||
saveSettings();
|
saveSettings();
|
||||||
}
|
}
|
||||||
@@ -90,11 +84,8 @@ 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 (millis() - getLastButtonPress() < 300)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (Buttons & BUT_A) {
|
if (Buttons & BUT_A) {
|
||||||
resetLastButtonPress();
|
|
||||||
//A key iterates through the menu
|
//A key iterates through the menu
|
||||||
if (settingsPage == SETTINGSOPTIONSCOUNT) {
|
if (settingsPage == SETTINGSOPTIONSCOUNT) {
|
||||||
//Roll off the end
|
//Roll off the end
|
||||||
@@ -133,6 +124,12 @@ void ProcessUI() {
|
|||||||
break;
|
break;
|
||||||
case LEFTY:
|
case LEFTY:
|
||||||
systemSettings.flipDisplay = !systemSettings.flipDisplay;
|
systemSettings.flipDisplay = !systemSettings.flipDisplay;
|
||||||
|
break;
|
||||||
|
case MOTIONSENSITIVITY:
|
||||||
|
systemSettings.sensitivity += 0x10;
|
||||||
|
if (systemSettings.sensitivity > 0x20)
|
||||||
|
systemSettings.sensitivity = 0; //reset to high on wrap
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -144,14 +141,10 @@ 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;
|
||||||
resetLastButtonPress();
|
|
||||||
resetButtons();
|
|
||||||
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;
|
||||||
resetLastButtonPress();
|
|
||||||
resetButtons();
|
|
||||||
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
|
||||||
@@ -160,28 +153,17 @@ void ProcessUI() {
|
|||||||
}
|
}
|
||||||
//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);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
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); //take a new reading as the heater code is not taking new readings
|
uint16_t temp = readIronTemp(0, 1); //take a new reading as the heater code is not taking new readings
|
||||||
if (temp < 500) { //if the temp is < 50C then we can go back to IDLE
|
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
|
||||||
operatingMode = STARTUP;
|
operatingMode = STARTUP;
|
||||||
resetLastButtonPress();
|
|
||||||
resetButtons();
|
|
||||||
} else { //we check if the user has pushed a button to ack
|
|
||||||
if ((millis() - getLastButtonPress() > 200)
|
|
||||||
&& (millis() - getLastButtonPress() < 2000)) {
|
|
||||||
if (getButtons() && (BUT_A | BUT_B)) {
|
|
||||||
//A button was pushed
|
|
||||||
operatingMode = STARTUP;
|
|
||||||
resetLastButtonPress();
|
|
||||||
resetButtons();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -192,6 +174,32 @@ void ProcessUI() {
|
|||||||
operatingMode = STARTUP; //jump back to idle mode
|
operatingMode = STARTUP; //jump back to idle mode
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case THERMOMETER: {
|
||||||
|
//This lets the user check the tip temp without heating the iron.. And eventually calibration will be added here
|
||||||
|
|
||||||
|
if ((Buttons == BUT_A) | (Buttons == BUT_B)) {
|
||||||
|
//Single button press, cycle over to the DC display
|
||||||
|
operatingMode = DCINDISP;
|
||||||
|
} else if (Buttons == (BUT_A | BUT_B)) {
|
||||||
|
//If the user is holding both button, exit the screen
|
||||||
|
operatingMode = STARTUP;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DCINDISP: {
|
||||||
|
//This lets the user check the input voltage
|
||||||
|
|
||||||
|
if ((Buttons == BUT_A) | (Buttons == BUT_B)) {
|
||||||
|
//Single button press, cycle over to the temp display
|
||||||
|
operatingMode = THERMOMETER;
|
||||||
|
} else if (Buttons == (BUT_A | BUT_B)) {
|
||||||
|
//If the user is holding both button, exit the screen
|
||||||
|
operatingMode = STARTUP;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -229,7 +237,7 @@ void DrawUI() {
|
|||||||
if (getIronTimer() == 0) {
|
if (getIronTimer() == 0) {
|
||||||
OLED_DrawChar('C', 5);
|
OLED_DrawChar('C', 5);
|
||||||
} else {
|
} else {
|
||||||
if (getIronTimer() < 500) {
|
if (getIronTimer() < 900) {
|
||||||
OLED_DrawChar(' ', 5);
|
OLED_DrawChar(' ', 5);
|
||||||
} else { //we are heating
|
} else { //we are heating
|
||||||
OLED_DrawChar('H', 5);
|
OLED_DrawChar('H', 5);
|
||||||
@@ -292,6 +300,23 @@ void DrawUI() {
|
|||||||
else
|
else
|
||||||
OLED_DrawString("FLPDSP F", 8);
|
OLED_DrawString("FLPDSP F", 8);
|
||||||
break;
|
break;
|
||||||
|
case MOTIONSENSITIVITY:
|
||||||
|
switch (systemSettings.sensitivity) {
|
||||||
|
case MOTION_HIGH:
|
||||||
|
OLED_DrawString("SENSE H ", 8);
|
||||||
|
break;
|
||||||
|
case MOTION_MED:
|
||||||
|
OLED_DrawString("SENSE M ", 8);
|
||||||
|
break;
|
||||||
|
case MOTION_LOW:
|
||||||
|
OLED_DrawString("SENSE L ", 8);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
OLED_DrawString("SENSE ", 8);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -300,16 +325,35 @@ void DrawUI() {
|
|||||||
//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, 3);
|
drawTemp(temp, 4);
|
||||||
break;
|
break;
|
||||||
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", 3);
|
OLED_DrawString("COOL", 4);
|
||||||
drawTemp(temp, 4);
|
drawTemp(temp, 5);
|
||||||
break;
|
break;
|
||||||
case UVLOWARN:
|
case UVLOWARN:
|
||||||
OLED_DrawString("LOW VOLT", 8);
|
OLED_DrawString("LOW VOLT", 8);
|
||||||
break;
|
break;
|
||||||
|
case THERMOMETER:
|
||||||
|
temp = readIronTemp(0, 1); //Force a reading as heater is off
|
||||||
|
OLED_DrawString("TEMP ", 5);//extra one to it clears the leftover 'L' from IDLE
|
||||||
|
drawTemp(temp, 5);
|
||||||
|
break;
|
||||||
|
case DCINDISP: {
|
||||||
|
uint16_t voltage = readDCVoltage(); //get X10 voltage
|
||||||
|
OLED_DrawString("IN", 2);
|
||||||
|
OLED_DrawChar((voltage / 100) % 10, 2);
|
||||||
|
voltage -= (voltage / 100) * 100;
|
||||||
|
OLED_DrawChar((voltage / 10) % 10, 3);
|
||||||
|
voltage -= (voltage / 10) * 10;
|
||||||
|
OLED_DrawChar('.', 4);
|
||||||
|
OLED_DrawChar(voltage % 10, 5);
|
||||||
|
OLED_DrawChar('V', 6);
|
||||||
|
OLED_DrawChar(' ', 7);
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,15 +13,15 @@
|
|||||||
#include "I2C.h"
|
#include "I2C.h"
|
||||||
|
|
||||||
#include "Font.h"
|
#include "Font.h"
|
||||||
u8 displayOffset = 32;
|
int8_t displayOffset = 32;
|
||||||
/*Setup params for the OLED screen*/
|
/*Setup params for the OLED screen*/
|
||||||
/*http://www.displayfuture.com/Display/datasheet/controller/SSD1307.pdf*/
|
/*http://www.displayfuture.com/Display/datasheet/controller/SSD1307.pdf*/
|
||||||
/*All commands are prefixed with 0x80*/
|
/*All commands are prefixed with 0x80*/
|
||||||
u8 OLED_Setup_Array[46] = { 0x80, 0xAE,/*Display off*/
|
u8 OLED_Setup_Array[46] = { 0x80, 0xAE,/*Display off*/
|
||||||
0x80, 0xD5,/*Set display clock divide ratio / osc freq*/
|
0x80, 0xD5,/*Set display clock divide ratio / osc freq*/
|
||||||
0x80, 0b01010001,/**/
|
0x80, 0x52,/**/
|
||||||
0x80, 0xA8,/*Set Multiplex Ratio*/
|
0x80, 0xA8,/*Set Multiplex Ratio*/
|
||||||
0x80, 16, /*16 == max brightness,39==dimmest*/
|
0x80, 0x0F, /*16 == max brightness,39==dimmest*/
|
||||||
0x80, 0xC0,/*Set COM Scan direction*/
|
0x80, 0xC0,/*Set COM Scan direction*/
|
||||||
0x80, 0xD3,/*Set Display offset*/
|
0x80, 0xD3,/*Set Display offset*/
|
||||||
0x80, 0x00,/*0 Offset*/
|
0x80, 0x00,/*0 Offset*/
|
||||||
@@ -69,7 +69,7 @@ void Oled_DisplayFlip() {
|
|||||||
I2C_PageWrite(data, 2, DEVICEADDR_OLED);
|
I2C_PageWrite(data, 2, DEVICEADDR_OLED);
|
||||||
data[1] = 0xA1;
|
data[1] = 0xA1;
|
||||||
I2C_PageWrite(data, 2, DEVICEADDR_OLED);
|
I2C_PageWrite(data, 2, DEVICEADDR_OLED);
|
||||||
displayOffset=0;
|
displayOffset = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
@@ -79,10 +79,10 @@ void Oled_DisplayFlip() {
|
|||||||
*/
|
*/
|
||||||
u8* Data_Command(u8 length, u8* data) {
|
u8* Data_Command(u8 length, u8* data) {
|
||||||
int i;
|
int i;
|
||||||
u8 tx_data[128];
|
u8 tx_data[129];
|
||||||
//here are are inserting the data write command at the beginning
|
//here are are inserting the data write command at the beginning
|
||||||
tx_data[0] = 0x40;
|
tx_data[0] = 0x40;
|
||||||
length += 1;
|
length++;
|
||||||
for (i = 1; i < length; i++) //Loop through the array of data
|
for (i = 1; i < length; i++) //Loop through the array of data
|
||||||
tx_data[i] = *data++;
|
tx_data[i] = *data++;
|
||||||
I2C_PageWrite(tx_data, length, DEVICEADDR_OLED); //write out the buffer
|
I2C_PageWrite(tx_data, length, DEVICEADDR_OLED); //write out the buffer
|
||||||
@@ -96,7 +96,7 @@ u8* Data_Command(u8 length, u8* data) {
|
|||||||
void Set_ShowPos(u8 x, u8 y) {
|
void Set_ShowPos(u8 x, u8 y) {
|
||||||
u8 pos_param[8] = { 0x80, 0xB0, 0x80, 0x21, 0x80, 0x00, 0x80, 0x7F };
|
u8 pos_param[8] = { 0x80, 0xB0, 0x80, 0x21, 0x80, 0x00, 0x80, 0x7F };
|
||||||
//page 0, start add = x(below) through to 0x7F (aka 127)
|
//page 0, start add = x(below) through to 0x7F (aka 127)
|
||||||
pos_param[5] = x + displayOffset;/*Display offset ==0 for Lefty, == 32 fo righty*/
|
pos_param[5] = x + displayOffset;/*Display offset ==0 for Lefty, == 32 for righty*/
|
||||||
pos_param[1] += y;
|
pos_param[1] += y;
|
||||||
I2C_PageWrite(pos_param, 8, DEVICEADDR_OLED);
|
I2C_PageWrite(pos_param, 8, DEVICEADDR_OLED);
|
||||||
}
|
}
|
||||||
@@ -142,16 +142,21 @@ void GPIO_Init_OLED(void) {
|
|||||||
}
|
}
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
Function: Init_Oled
|
Function: Init_Oled
|
||||||
Description: Initalizes the Oled screen
|
Description: Initializes the Oled screen
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
void Init_Oled(void) {
|
void Init_Oled(uint8_t leftHanded) {
|
||||||
u8 param_len;
|
u8 param_len;
|
||||||
|
|
||||||
OLED_RST();
|
OLED_RST();
|
||||||
delayMs(2);
|
delayMs(5);
|
||||||
OLED_ACT(); //Toggling reset to reset the oled
|
OLED_ACT(); //Toggling reset to reset the oled
|
||||||
delayMs(2);
|
delayMs(5);
|
||||||
param_len = 46;
|
param_len = 46;
|
||||||
|
if (leftHanded) {
|
||||||
|
OLED_Setup_Array[11] = 0xC8;
|
||||||
|
OLED_Setup_Array[19] = 0xA1;
|
||||||
|
displayOffset = 0;
|
||||||
|
}
|
||||||
I2C_PageWrite((u8 *) OLED_Setup_Array, param_len, DEVICEADDR_OLED);
|
I2C_PageWrite((u8 *) OLED_Setup_Array, param_len, DEVICEADDR_OLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,7 +166,7 @@ void Init_Oled(void) {
|
|||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
void Clear_Screen(void) {
|
void Clear_Screen(void) {
|
||||||
u8 tx_data[128];
|
u8 tx_data[128];
|
||||||
memset(&tx_data[0], 0, 128);
|
memset(tx_data, 0, 128);
|
||||||
for (u8 i = 0; i < 2; i++) {
|
for (u8 i = 0; i < 2; i++) {
|
||||||
Oled_DrawArea(0, i * 8, 128, 8, tx_data);
|
Oled_DrawArea(0, i * 8, 128, 8, tx_data);
|
||||||
}
|
}
|
||||||
@@ -196,8 +201,7 @@ void OLED_DrawChar(char c, uint8_t x) {
|
|||||||
ptr += (37) * (FONT_WIDTH * 2);
|
ptr += (37) * (FONT_WIDTH * 2);
|
||||||
} else if (c == '>') {
|
} else if (c == '>') {
|
||||||
ptr += (38) * (FONT_WIDTH * 2);
|
ptr += (38) * (FONT_WIDTH * 2);
|
||||||
}else if (c=='.')
|
} else if (c == '.') {
|
||||||
{
|
|
||||||
ptr += (39) * (FONT_WIDTH * 2);
|
ptr += (39) * (FONT_WIDTH * 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,5 +49,8 @@ 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.tempCalibration=239; //Default to their calibration value
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user