1
0
forked from me/IronOS

Compare commits

...

6 Commits
V1.03 ... v1.05

Author SHA1 Message Date
Ben V. Brown
1522c419cf Add ability to calibrate input DC voltage reading, V1.05
Closes #5
2017-05-18 23:58:39 +10:00
Ben V. Brown
ddedd9ad4f Update README.md 2017-05-18 23:34:01 +10:00
Ben V. Brown
0f3bb4c356 Bump version 1.04 2017-05-18 21:20:57 +10:00
Ben V. Brown
0ebaab5847 Add more intuitive idle screen with prompts 2017-05-18 21:20:26 +10:00
Ben V. Brown
203a7c154b Add official Schematic 2017-05-18 19:51:55 +10:00
Ben V. Brown
ebfe457f65 Add Temperature calibration, improve temp accuracy 2017-05-18 19:51:47 +10:00
13 changed files with 261 additions and 61 deletions

View File

@@ -1,23 +1,22 @@
# TS100 # TS100
This is a complete open source re-write of the 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.
## Features Working ## Features
* Soldering / Temperature control * Soldering / Temperature control
* Full PID iron temperature control * Full PID iron temperature control
* Adjusting temperature * Automatic sleep with selectable sensitivity
* Automatic sleep
* Motion wake support * Motion wake support
* Settings menu * Settings menu
* Input voltage UVLO measurement * Input voltage UVLO measurement for battery powered use
* Saving settings to flash for persistence * All settings saved
* Improved GUI Fonts * Improved readability Fonts
* Use hardware I2C for communications * Use hardware features to improve reliability
* Can disable movement detection if desired * Can disable movement detection if desired
* Calibration of the temperature offset
# 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)
@@ -38,11 +37,39 @@ There is a complete device flash backup included in this repository. (Note this
# 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. When on the main screen, the unit shows prompts for the two most common operations.
![TS100: Software Menu](TS100.png "Fairly easy to learn") -> Pressing the button near the tip enters soldering mode
-> Pressing the button near the power input enters the settings menu.
-> Pressing both buttons together enters the Extras menu
## Soldering mode
In this mode the iron works as you would expect, pressing either button will take you to a temperature change screen. Use each button to go up and down in temperature. Pressing both buttons will exit you from the temperature menu (or wait 3 seconds and it will time out).
Pressing both buttons will also exit the soldering mode.
## Settings Menu
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.
* 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
* STMP -> The temperature the unit drops to in sleep mode
* MOTION -> Wether motion detection is enabled or not
* TMPUNIT -> Temperature unit, C or F
* FLPDSP -> Flip display for left handed users
* SENSE -> Motion Sensitivity, H is more sensitive. L is lowest sensitivity (ie takes more movement to trigger)
## Extras Menu
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 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.
# Version Changes: # Version Changes:
V1.04
- Increased accuracy of the temperature control
- Improved PID response slightly
- Allows temperature offset calibration
- Nicer idle screen
V1.03
- Improved Button handling
- Ability to set motion sensitivity
- DC voltmeter page shows input voltage
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).

Binary file not shown.

View File

@@ -15,6 +15,6 @@
extern volatile uint16_t ADC1ConvertedValue[2]; extern volatile uint16_t ADC1ConvertedValue[2];
uint16_t Get_ADC1Value(uint8_t i); uint16_t Get_ADC1Value(uint8_t i);
uint16_t readIronTemp(uint16_t calibration,uint8_t read);//read the iron temp in C X10 uint16_t readIronTemp(uint16_t calibration_temp, uint8_t read,uint16_t setPointTemp); //read the iron temp in C X10
uint16_t readDCVoltage();/*Get the system voltage X10*/ uint16_t readDCVoltage(uint16_t divFactor);/*Get the system voltage X10*/
#endif /* ANALOG_H_ */ #endif /* ANALOG_H_ */

View File

@@ -97,4 +97,70 @@ const uint8_t FONT[]={
0x00,0x00,0x00,0x00,0x0F,0x0F,0x0F,0x0F,0x00,0x00,0x00,0x00,/*.*/ 0x00,0x00,0x00,0x00,0x0F,0x0F,0x0F,0x0F,0x00,0x00,0x00,0x00,/*.*/
}; };
const uint8_t Iron_Base[] ={
0x00,0x20,0x60,0x60,0x60,0x60,0x60,0x60,0x90,0x90,0x90,0x90,
0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,
0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x60,0x60,
0x60,0x60,0x60,0x60,0x60,0x70,0xF8,0x88,0x84,0x82,0x82,0x83,
0x83,0x83,0x83,0x83,0x83,0x82,0x82,0x82,0x82,0x83,0x83,0x83,
0x83,0x83,0x83,0x82,0x82,0x82,0x82,0x82,0x86,0x84,0x84,0x84,
0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,
0x84,0x84,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,
};
//The top pixel row for left arrow / on hint
const uint8_t Iron_LeftArrow_UP[] = {
0x00,0x7C,0x82,0x82,0x82,0x7C,0x00,0xFE,0x08,0x10,0x20,0xFE,//ON
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,
0x98,0xBF,0xBF,0x98,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
const uint8_t Iron_LeftArrow_DOWN[] = {
0x00,0x7C,0x82,0x82,0x82,0x7C,0x00,0xFE,0x08,0x10,0x20,0xFE,//ON
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
0x30,0x7E,0x7E,0x30,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
//The top pixel row for both arrows /
const uint8_t Iron_BothArrows[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,
0x98,0xBF,0xBF,0x98,0x88,0x00,0x00,0x00,0x00,0x88,0x98,0xBF,
0xBF,0x98,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
//The top pixel row for right arrow / settings hint
const uint8_t Iron_RightArrow_UP[] = {
0x00,0x8C,0x92,0x92,0x92,0x62,0x00,0xFE,0x92,0x92,0x92,0x82,//SE
0x00,0x02,0x02,0xFE,0x02,0x02,0x00,0x02,0x02,0xFE,0x02,0x02,//TT
0x00,0x00,0x82,0xFE,0x82,0x00,0x00,0xFE,0x08,0x10,0x20,0xFE,//IN
0x00,0x7C,0x82,0x82,0xA2,0x62,0x00,0x8C,0x92,0x92,0x92,0x62,//GS
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x98,0xBF,
0xBF,0x98,0x88,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
const uint8_t Iron_RightArrow_DOWN[] = {
0x00,0x8C,0x92,0x92,0x92,0x62,0x00,0xFE,0x92,0x92,0x92,0x82,//SE
0x00,0x02,0x02,0xFE,0x02,0x02,0x00,0x02,0x02,0xFE,0x02,0x02,//TT
0x00,0x00,0x82,0xFE,0x82,0x00,0x00,0xFE,0x08,0x10,0x20,0xFE,//IN
0x00,0x7C,0x82,0x82,0xA2,0x62,0x00,0x8C,0x92,0x92,0x92,0x62,//GS
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x30,0x7E,
0x7E,0x30,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
#endif /* FONT_H_ */ #endif /* FONT_H_ */

View File

@@ -17,15 +17,17 @@
#include "Settings.h" #include "Settings.h"
#include "Analog.h" #include "Analog.h"
enum { enum {
STARTUP, //we are sitting on the prompt to push a button STARTUP, //we are sitting on the prompt to push a button
SOLDERING, SOLDERING, //Normal operating mode
TEMP_ADJ, TEMP_ADJ, //Adjust the set temperature
SETTINGS, SETTINGS, //Settings menu
SLEEP, SLEEP, //Iron is snoozing due to lack of use
COOLING, COOLING, //Iron is cooling down -> Warning screen
UVLOWARN, UVLOWARN, //Unit tripped low voltage
THERMOMETER, THERMOMETER, //Read the tip temp
DCINDISP, DCINDISP, //Disp the input voltage && Cal the DCin voltage divider
TEMPCAL, //Cal tip temp offset
} operatingMode; } operatingMode;
enum { enum {

View File

@@ -26,6 +26,6 @@ void OLED_DrawString(char* string, 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_DrawThreeNumber(uint16_t in, uint8_t x); void OLED_DrawThreeNumber(uint16_t in, uint8_t x);
void OLED_DrawIDLELogo();
#endif #endif
/******************************** END OF FILE *********************************/ /******************************** END OF FILE *********************************/

View File

@@ -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 0x03 /*Change this if you change the struct below to prevent people getting out of sync*/ #define SETTINGSVERSION 0x04 /*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)
@@ -30,6 +30,7 @@ struct {
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
uint16_t tempCalibration; //Temperature calibration value uint16_t tempCalibration; //Temperature calibration value
uint16_t voltageDiv; //Voltage divisor factor
} systemSettings; } systemSettings;
void saveSettings(); void saveSettings();

View File

@@ -10,12 +10,12 @@
//Reads the dc input and returns it as X10 voltage (ie 236 = 23.6V) //Reads the dc input and returns it as X10 voltage (ie 236 = 23.6V)
//Seems unstable below 9.5V input //Seems unstable below 9.5V input
uint16_t readDCVoltage() { uint16_t readDCVoltage(uint16_t divFactor) {
uint16_t reading = 0; uint16_t reading = 0;
for (u8 i = 0; i < 10; i++) { for (u8 i = 0; i < 10; i++) {
reading += ADC_GetConversionValue(ADC2); reading += ADC_GetConversionValue(ADC2);
} }
reading /= 144; //take the average and convert to X10 voltage reading /= divFactor; //take the average and convert to X10 voltage
return reading; //return the read voltage return reading; //return the read voltage
} }
@@ -105,16 +105,30 @@ uint16_t Get_ADC1Value(uint8_t i) {
} }
//This returns the calibrated temperature reading of the iron temp //This returns the calibrated temperature reading of the iron temp
//inputs : calibration value / wether to take a new reading or not //inputs : calibration value / wether to take a new reading or not
uint16_t readIronTemp(uint16_t calibration_temp, uint8_t read) { uint16_t readIronTemp(uint16_t calibration_temp, uint8_t read,
uint16_t setPointTemp) {
static uint16_t calTemp = 0; static uint16_t calTemp = 0;
static uint16_t lastVal = 0; static uint16_t lastVal = 0;
static uint16_t lastSetTemp;
if(setPointTemp!=0xFFFF)
lastSetTemp = setPointTemp;
if (calibration_temp != 0) if (calibration_temp != 0)
calTemp = calibration_temp; calTemp = calibration_temp;
if (read) { if (read) {
lastVal = (readTipTemp() * 1000 + 806 * readSensorTemp() int16_t compensation = 80 + 150 * (lastSetTemp - 1000) / 3000;
- calTemp * 1000) / 806; int16_t tipTemp = readTipTemp();
int16_t ColdJTemp = readSensorTemp();
if (lastSetTemp == 1000)
compensation -= 10;
if (lastSetTemp != 0) {
if (tipTemp > (compensation + calTemp))
tipTemp -= compensation;
}
if (ColdJTemp > 400)
ColdJTemp = 400;
lastVal = (tipTemp * 1000 + 807 * ColdJTemp - calTemp * 1000) / 807;
} }

View File

@@ -24,20 +24,20 @@ 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
restoreSettings(); //Load settings restoreSettings(); //Load settings
StartUp_Accelerometer(systemSettings.sensitivity); //start the accelerometer StartUp_Accelerometer(systemSettings.sensitivity); //start the accelerometer
setupPID(); //init the PID values setupPID(); //Init the PID values
readIronTemp(239, 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.03", 8); //1.settings version as of current OLED_DrawString("VER 1.05", 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
} }

View File

@@ -5,6 +5,7 @@
* Author: Ralim <ralim@ralimtek.com> * Author: Ralim <ralim@ralimtek.com>
*/ */
#include "Modes.h" #include "Modes.h"
uint8_t CalStatus = 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
@@ -50,7 +51,7 @@ void ProcessUI() {
return; return;
} }
} }
uint16_t voltage = readDCVoltage(); //get X10 voltage uint16_t voltage = readDCVoltage(systemSettings.voltageDiv); //get X10 voltage
if ((voltage / 10) < systemSettings.cutoutVoltage) { if ((voltage / 10) < systemSettings.cutoutVoltage) {
operatingMode = UVLOWARN; operatingMode = UVLOWARN;
lastModeChange = millis(); lastModeChange = millis();
@@ -158,7 +159,7 @@ 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); //take a new reading as the heater code is not taking new readings uint16_t temp = readIronTemp(0, 1, 0xFFFF); //take a new reading as the heater code is not taking new readings
if (temp < 400) { //if the temp is < 40C then we can go back to IDLE if (temp < 400) { //if the temp is < 40C then we can go back to IDLE
operatingMode = STARTUP; operatingMode = STARTUP;
} else if (Buttons & (BUT_A | BUT_B)) { //we check if the user has pushed a button to ack } else if (Buttons & (BUT_A | BUT_B)) { //we check if the user has pushed a button to ack
@@ -177,9 +178,13 @@ void ProcessUI() {
case THERMOMETER: { case THERMOMETER: {
//This lets the user check the tip temp without heating the iron.. And eventually calibration will be added here //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)) { if (Buttons == BUT_A) {
//Single button press, cycle over to the DC display //Single button press, cycle over to the DC display
CalStatus = 0;
operatingMode = DCINDISP; operatingMode = DCINDISP;
} else if (Buttons == BUT_B) {
CalStatus = 0;
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
operatingMode = STARTUP; operatingMode = STARTUP;
@@ -189,10 +194,56 @@ 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 (Buttons == BUT_A) {
//Single button press, cycle over to the temp display
operatingMode = THERMOMETER;
} else if (Buttons == BUT_B) {
//dc cal mode
CalStatus = 1;
} else if (Buttons == (BUT_A | BUT_B)) {
//If the user is holding both button, exit the screen
operatingMode = STARTUP;
}
} else {
//User is calibrating the dc input
if (Buttons == BUT_A) {
if (!systemSettings.flipDisplay)
systemSettings.voltageDiv++;
else
systemSettings.voltageDiv--;
} else if (Buttons == BUT_B) {
if (!systemSettings.flipDisplay)
systemSettings.voltageDiv--;
else
systemSettings.voltageDiv++;
} else if (Buttons == (BUT_A | BUT_B)) {
CalStatus = 0;
saveSettings();
}
if (systemSettings.voltageDiv < 120)
systemSettings.voltageDiv = 160;
else if (systemSettings.voltageDiv > 160)
systemSettings.voltageDiv = 120;
}
if ((Buttons == BUT_A) | (Buttons == BUT_B)) { }
//Single button press, cycle over to the temp display break;
case TEMPCAL: {
if (Buttons == BUT_B) {
//Single button press, cycle over to the DC IN
operatingMode = THERMOMETER; operatingMode = THERMOMETER;
} else if (Buttons == BUT_A) {
//Try and calibrate
if (CalStatus == 0) {
if ((readTipTemp() < 300) && (readSensorTemp() < 300)) {
CalStatus = 1;
systemSettings.tempCalibration = readTipTemp();
saveSettings();
} else {
CalStatus = 2;
}
}
} 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;
@@ -210,6 +261,8 @@ void ProcessUI() {
void drawTemp(uint16_t temp, uint8_t x) { void drawTemp(uint16_t temp, uint8_t x) {
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)
temp += 10; //round up
OLED_DrawThreeNumber(temp / 10, x); OLED_DrawThreeNumber(temp / 10, x);
} }
@@ -217,7 +270,7 @@ void drawTemp(uint16_t temp, uint8_t 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() {
uint16_t temp = readIronTemp(0, 0); uint16_t temp = readIronTemp(0, 0, 0xFFFF);
switch (operatingMode) { switch (operatingMode) {
case STARTUP: case STARTUP:
//We are chilling in the idle mode //We are chilling in the idle mode
@@ -228,7 +281,8 @@ void DrawUI() {
Oled_DisplayOff(); Oled_DisplayOff();
} else { } else {
Oled_DisplayOn(); Oled_DisplayOn();
OLED_DrawString(" IDLE ", 8); //write the word IDLE //OLED_DrawString(" IDLE ", 8); //write the word IDLE
OLED_DrawIDLELogo();
} }
break; break;
case SOLDERING: case SOLDERING:
@@ -336,23 +390,39 @@ void DrawUI() {
OLED_DrawString("LOW VOLT", 8); OLED_DrawString("LOW VOLT", 8);
break; break;
case THERMOMETER: case THERMOMETER:
temp = readIronTemp(0, 1); //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);
break; break;
case DCINDISP: { case DCINDISP: {
uint16_t voltage = readDCVoltage(); //get X10 voltage uint16_t voltage = readDCVoltage(systemSettings.voltageDiv); //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);
if (CalStatus == 0 || ((millis() % 1000) > 500)) {
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);
} else {
OLED_DrawString("IN ", 8);
}
} }
break;
case TEMPCAL: {
if (CalStatus == 0) {
OLED_DrawString("CAL TEMP", 8);
} else if (CalStatus == 1) {
OLED_DrawString("CAL OK ", 8);
} else if (CalStatus == 2) {
OLED_DrawString("CAL FAIL", 8);
}
}
break; break;
default: default:
break; break;

View File

@@ -19,7 +19,7 @@ int8_t displayOffset = 32;
/*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, 0x52,/**/ 0x80, 0x52,/*Unknown*/
0x80, 0xA8,/*Set Multiplex Ratio*/ 0x80, 0xA8,/*Set Multiplex Ratio*/
0x80, 0x0F, /*16 == max brightness,39==dimmest*/ 0x80, 0x0F, /*16 == max brightness,39==dimmest*/
0x80, 0xC0,/*Set COM Scan direction*/ 0x80, 0xC0,/*Set COM Scan direction*/
@@ -28,7 +28,7 @@ u8 OLED_Setup_Array[46] = { 0x80, 0xAE,/*Display off*/
0x80, 0x40,/*Set Display start line to 0*/ 0x80, 0x40,/*Set Display start line to 0*/
0x80, 0xA0,/*Set Segment remap to normal*/ 0x80, 0xA0,/*Set Segment remap to normal*/
0x80, 0x8D,/*Unknown*/ 0x80, 0x8D,/*Unknown*/
0x80, 0x14,/**/ 0x80, 0x14,/*Unknown*/
0x80, 0xDA,/*Set VCOM Pins hardware config*/ 0x80, 0xDA,/*Set VCOM Pins hardware config*/
0x80, 0x02,/*Combination 2*/ 0x80, 0x02,/*Combination 2*/
0x80, 0x81,/*Contrast*/ 0x80, 0x81,/*Contrast*/
@@ -36,7 +36,7 @@ u8 OLED_Setup_Array[46] = { 0x80, 0xAE,/*Display off*/
0x80, 0xD9,/*Set pre-charge period*/ 0x80, 0xD9,/*Set pre-charge period*/
0x80, 0xF1,/**/ 0x80, 0xF1,/**/
0x80, 0xDB,/*Adjust VCOMH regulator ouput*/ 0x80, 0xDB,/*Adjust VCOMH regulator ouput*/
0x80, 0x30,/**/ 0x80, 0x30,/*Unknown*/
0x80, 0xA4,/*Enable the display GDDR*/ 0x80, 0xA4,/*Enable the display GDDR*/
0x80, 0XA6,/*Normal display*/ 0x80, 0XA6,/*Normal display*/
0x80, 0xAF /*Dispaly on*/ 0x80, 0xAF /*Dispaly on*/
@@ -105,7 +105,7 @@ void Set_ShowPos(u8 x, u8 y) {
Function:Oled_DrawArea Function:Oled_DrawArea
Description: Description:
Inputs:(x,y) start point, (width,height) of enclosing rect, pointer to data Inputs:(x,y) start point, (width,height) of enclosing rect, pointer to data
Output: last byte written out Output: pointer to the last byte written out
*******************************************************************************/ *******************************************************************************/
u8* Oled_DrawArea(u8 x0, u8 y0, u8 wide, u8 high, u8* ptr) { u8* Oled_DrawArea(u8 x0, u8 y0, u8 wide, u8 high, u8* ptr) {
u8 m, n, y; u8 m, n, y;
@@ -234,3 +234,23 @@ void OLED_DrawFourNumber(uint16_t in, uint8_t x) {
OLED_DrawChar((in / 10) % 10, x + 2); OLED_DrawChar((in / 10) % 10, x + 2);
OLED_DrawChar(in % 10, x + 3); OLED_DrawChar(in % 10, x + 3);
} }
void OLED_DrawIDLELogo() {
static uint8_t drawAttempt = 0;
drawAttempt++;
if (drawAttempt & 0x80) {
if (drawAttempt & 0x08)
Oled_DrawArea(0, 0, 96, 8, (u8*) Iron_RightArrow_UP);
else
Oled_DrawArea(0, 0, 96, 8, (u8*) Iron_RightArrow_DOWN);
Oled_DrawArea(0, 8, 96, 8, (u8*) Iron_Base);
} else {
if (drawAttempt & 0x08)
Oled_DrawArea(0, 0, 96, 8, (u8*) Iron_LeftArrow_UP);
else
Oled_DrawArea(0, 0, 96, 8, (u8*) Iron_LeftArrow_DOWN);
Oled_DrawArea(0, 8, 96, 8, (u8*) Iron_Base);
}
}

View File

@@ -12,7 +12,7 @@
int32_t computePID(uint16_t setpoint) { int32_t computePID(uint16_t setpoint) {
int32_t ITerm = 0; int32_t ITerm = 0;
static int16_t lastReading = 0; static int16_t lastReading = 0;
uint16_t currentReading = readIronTemp(0, 1); //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)
@@ -34,7 +34,7 @@ int32_t computePID(uint16_t setpoint) {
} }
/*Sets up the pid values*/ /*Sets up the pid values*/
void setupPID(void) { void setupPID(void) {
pidSettings.kp = 22; pidSettings.kp = 25;
pidSettings.ki = 7; pidSettings.ki = 7;
pidSettings.kd = 2; pidSettings.kd = 2;

View File

@@ -51,6 +51,6 @@ void resetSettings() {
systemSettings.flipDisplay=0; //Default to right handed mode systemSettings.flipDisplay=0; //Default to right handed mode
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
} }