mirror of
https://github.com/Ralim/IronOS.git
synced 2025-02-26 07:53:55 +00:00
Compare commits
37 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
54356d53a9 | ||
|
|
d536fb33de | ||
|
|
fa717b2741 | ||
|
|
0a7b6145af | ||
|
|
7b4f467eec | ||
|
|
f72fc36427 | ||
|
|
3c6151385f | ||
|
|
03f063cbf2 | ||
|
|
a9e9fb63bf | ||
|
|
6bbade318d | ||
|
|
f3156e88dc | ||
|
|
13603d8db6 | ||
|
|
551853360c | ||
|
|
711a3e9182 | ||
|
|
7e1e81cc6f | ||
|
|
a01cb7a4be | ||
|
|
cb5d4bc49d | ||
|
|
67e3c44f54 | ||
|
|
e47753d5ab | ||
|
|
07d9b15ecc | ||
|
|
1522c419cf | ||
|
|
ddedd9ad4f | ||
|
|
0f3bb4c356 | ||
|
|
0ebaab5847 | ||
|
|
203a7c154b | ||
|
|
ebfe457f65 | ||
|
|
8c73aa0de4 | ||
|
|
53a1b9b7f4 | ||
|
|
c9d0d5bdb3 | ||
|
|
4f9e738501 | ||
|
|
fcaf909a54 | ||
|
|
9b51750a1d | ||
|
|
fceb81287e | ||
|
|
c3d8d246dc | ||
|
|
1f7cdf9694 | ||
|
|
b2db129ab8 | ||
|
|
b7e4249d2e |
117
README.md
117
README.md
@@ -1,38 +1,113 @@
|
|||||||
# 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 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.
|
||||||
|
|
||||||
The software has similar functionality to the original firmware.
|
## Features
|
||||||
|
|
||||||
## Features Working
|
|
||||||
* Soldering / Temperature control
|
* Soldering / Temperature control
|
||||||
* Full PID Iron Temp
|
* Full PID iron temperature control
|
||||||
* Adjusting temperature
|
* Automatic sleep with selectable sensitivity
|
||||||
* Automatic sleep
|
|
||||||
* Motion wake support
|
* Motion wake support
|
||||||
* Basic 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
|
* 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
|
||||||
## Features still to be implemented
|
* Calibration of the temperature offset
|
||||||
* Manual Temp Calibration
|
* 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 :)
|
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)
|
||||||
|
Officially the bootloader on the iron only works under windows. However, users have reported that it does work under Mac, and can be made to work under Linux. Details over on the [wiki page](https://github.com/Ralim/ts100/wiki/Upgrading-Firmware).
|
||||||
|
|
||||||
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.
|
||||||
3. Drag the .hex file onto the USB drive.
|
3. Drag the .hex file onto the USB drive.
|
||||||
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 you're 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.
|
When on the main screen, the unit shows prompts for the two most common operations.
|
||||||

|
-> 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.
|
||||||
|
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
|
||||||
|
* 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
|
||||||
|
* MOTION -> Wether motion detection is enabled or not
|
||||||
|
* SENSE -> Motion Sensitivity, H is more sensitive. L is lowest sensitivity (ie takes more movement to trigger)
|
||||||
|
* 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
|
||||||
|
* 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
|
||||||
|
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 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:
|
||||||
|
V1.11
|
||||||
|
- Boost mode
|
||||||
|
|
||||||
|
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
|
||||||
|
- Changes H and C when the iron is heating to the minidso chevron like images
|
||||||
|
|
||||||
|
V1.05
|
||||||
|
- Adds ability to calibrate the input voltage measurement
|
||||||
|
|
||||||
|
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
|
||||||
|
- Adds hold both buttons on IDLE to access the therometer mode.
|
||||||
|
- Changes the exit soldering mode to be holding both buttons (Like original firmware).
|
||||||
|
|||||||
BIN
TS100 V2.46 Schematics V1.0.pdf
Normal file
BIN
TS100 V2.46 Schematics V1.0.pdf
Normal file
Binary file not shown.
@@ -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,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_ */
|
||||||
|
|||||||
@@ -97,4 +97,96 @@ 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,
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint8_t SymbolTable[]={
|
||||||
|
|
||||||
|
0x0E,0x11,0x11,0x0E,0xE0,0xF8,0x0C,0x06,0x03,0x01,0x01,0x01,0x01,0x02,0x1E,0x00,
|
||||||
|
0x00,0x00,0x00,0x00,0x0F,0x3F,0x70,0xC0,0x80,0x80,0x80,0x80,0x80,0x40,0x20,0x00, // Degrees C
|
||||||
|
|
||||||
|
0x08,0x14,0x22,0x14,0x08,0x02,0x02,0xFE,0x06,0x02,0x02,0x02,0xC2,0x02,0x06,0x1E,
|
||||||
|
0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xFF,0x81,0x81,0x01,0x01,0x03,0x00,0x00,0x00, // Degrees F
|
||||||
|
|
||||||
|
0xC0,0x30,0x08,0x04,0x04,0x02,0xFA,0xAA,0xFA,0x02,0x04,0x04,0x08,0x30,0xC0,0x00,
|
||||||
|
0x07,0x18,0x20,0x40,0x58,0xA4,0xDB,0xDE,0xDB,0xA4,0x58,0x40,0x20,0x18,0x07,0x00, // Temp symbol
|
||||||
|
|
||||||
|
0x00,0xF0,0xF0,0x00,0x00,0xF0,0xF0,0xF0,0x00,0x00,0xFC,0xF8,0xF0,0xE0,0xC0,0x80, //Right Arrow
|
||||||
|
0x00,0x0F,0x0F,0x00,0x00,0x0F,0x0F,0x0F,0x00,0x00,0x3F,0x1F,0x0F,0x07,0x03,0x01,
|
||||||
|
|
||||||
|
0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0x00,0x00,0xF0,0xF0,0xF0,0x00,0x00,0xF0,0xF0,0x00, //Left Arrow
|
||||||
|
0x01,0x03,0x07,0x0F,0x1F,0x3F,0x00,0x00,0x0F,0x0F,0x0F,0x00,0x00,0x0F,0x0F,0x00,
|
||||||
|
|
||||||
|
0x11,0x33,0x66,0xCC,0x98,0x30,0x60,0xC0,0xC0,0x60,0x30,0x98,0xCC,0x66,0x33,0x11,
|
||||||
|
0x01,0x03,0x06,0x0C,0x19,0x33,0x66,0xCC,0xCC,0x66,0x33,0x19,0x0C,0x06,0x03,0x01, //Down Chevron
|
||||||
|
|
||||||
|
0x80,0xC0,0x60,0x30,0x98,0xCC,0x66,0x33,0x33,0x66,0xCC,0x98,0x30,0x60,0xC0,0x80,
|
||||||
|
0x88,0xCC,0x66,0x33,0x19,0x0C,0x06,0x03,0x03,0x06,0x0C,0x19,0x33,0x66,0xCC,0x88, //Up Chevron
|
||||||
|
|
||||||
|
0x00,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x8C,0x00, // Flat Lines
|
||||||
|
0x00,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x00,
|
||||||
|
};
|
||||||
#endif /* FONT_H_ */
|
#endif /* FONT_H_ */
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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----------------------------------------------//
|
||||||
|
|
||||||
|
|||||||
@@ -17,18 +17,33 @@
|
|||||||
#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, //Read the tip temp
|
||||||
|
DCINDISP, //Disp the input voltage && Cal the DCin voltage divider
|
||||||
|
TEMPCAL, //Cal tip temp offset
|
||||||
|
|
||||||
} operatingMode;
|
} operatingMode;
|
||||||
|
#define SETTINGSOPTIONSCOUNT 11 /*Number of settings in the settings menu*/
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
UVCO = 0, SLEEP_TEMP, SLEEP_TIME, MOTIONDETECT, TEMPDISPLAY,LEFTY
|
UVCO = 0,
|
||||||
|
SLEEP_TEMP,
|
||||||
|
SLEEP_TIME,
|
||||||
|
SHUTDOWN_TIME,
|
||||||
|
MOTIONDETECT,
|
||||||
|
MOTIONSENSITIVITY,
|
||||||
|
TEMPDISPLAY,
|
||||||
|
TEMPROUNDING,
|
||||||
|
DISPUPDATERATE,
|
||||||
|
LEFTY,
|
||||||
|
BOOSTMODE,
|
||||||
|
BOOSTTEMP,
|
||||||
} settingsPage;
|
} settingsPage;
|
||||||
|
|
||||||
void ProcessUI();
|
void ProcessUI();
|
||||||
|
|||||||
@@ -18,14 +18,16 @@ 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*/
|
||||||
void OLED_DrawString(char* string, uint8_t length);
|
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_BlankSlot(uint8_t xStart,uint8_t width);
|
||||||
void OLED_DrawThreeNumber(uint16_t in, uint8_t x);
|
void OLED_DrawThreeNumber(uint16_t in, uint8_t x);
|
||||||
|
void OLED_DrawIDLELogo();
|
||||||
|
void OLED_DrawSymbol(uint8_t x,uint8_t symbol);
|
||||||
#endif
|
#endif
|
||||||
/******************************** END OF FILE *********************************/
|
/******************************** END OF FILE *********************************/
|
||||||
|
|||||||
@@ -11,20 +11,40 @@
|
|||||||
#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 10 /*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*/
|
//Motion Sensitivity
|
||||||
|
#define MOTION_HIGH (0x00)
|
||||||
|
#define MOTION_MED (0x01)
|
||||||
|
#define MOTION_LOW (0x02)
|
||||||
|
//Display Speeds
|
||||||
|
#define DISPLAYMODE_FAST (0x00)
|
||||||
|
#define DISPLAYMODE_MEDIUM (0x01)
|
||||||
|
#define DISPLAYMODE_SLOW (0x02)
|
||||||
|
//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 setpoint 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
|
||||||
uint8_t cutoutVoltage; //The voltage we cutout at for undervoltage
|
uint8_t cutoutVoltage:5; //The voltage we cut out at for under voltage
|
||||||
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:5; //Sensitivity of accelerometer
|
||||||
|
uint8_t ShutdownTime:6; //Time until unit shuts down if left alone
|
||||||
|
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 voltageDiv; //Voltage divisor factor
|
||||||
|
uint16_t BoostTemp; //Boost mode set point for the iron
|
||||||
} systemSettings;
|
} systemSettings;
|
||||||
|
|
||||||
void saveSettings();
|
void saveSettings();
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -23,7 +23,7 @@ uint16_t readDCVoltage() {
|
|||||||
//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
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,16 +109,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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -53,20 +54,26 @@ 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);
|
||||||
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) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -29,15 +29,28 @@ 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
|
uint8_t sens =0x0F;
|
||||||
|
switch(sensitivity)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
sens=0x1A;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
sens=0x20;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
sens=0x2A;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
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
|
||||||
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(systemSettings.tempCalibration, 0,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.11", 8); //Version Number
|
||||||
Start_Watchdog(1000); //start the system watchdog as 1 seconds timeout
|
delayMs(500); //Pause to show version number
|
||||||
|
Start_Watchdog(1000); //start the system watch dog as 1 second timeout
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,44 +5,82 @@
|
|||||||
* Author: Ralim <ralim@ralimtek.com>
|
* Author: Ralim <ralim@ralimtek.com>
|
||||||
*/
|
*/
|
||||||
#include "Modes.h"
|
#include "Modes.h"
|
||||||
|
const char *SettingsLongNames[] = { " Undervoltage Cutout <V>",
|
||||||
|
" Sleep Temperature <C>", " Sleep Timeout <Minutes>",
|
||||||
|
" Shutdown Timeout <Minutes>", " Motion Detection",
|
||||||
|
" Motion Sensitivity", " 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, 24, 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
|
||||||
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 && !systemSettings.boostModeEnabled)
|
||||||
//A key pressed so we are moving to temp set
|
|| Buttons == BUT_B) {
|
||||||
|
//A or B key pressed so we are moving to temp set
|
||||||
operatingMode = TEMP_ADJ;
|
operatingMode = TEMP_ADJ;
|
||||||
resetLastButtonPress();
|
if (StatusFlags == 8) {
|
||||||
resetButtons();
|
//Boost mode was enabled before
|
||||||
} else if (Buttons & BUT_B) {
|
//We need to cancel the temp
|
||||||
//B Button was pressed so we are moving back to idle
|
systemSettings.SolderingTemp = temporaryTempStorage;
|
||||||
|
StatusFlags = 0;
|
||||||
|
}
|
||||||
|
} else if (Buttons == (BUT_A | BUT_B)) {
|
||||||
|
|
||||||
|
//Both buttons were pressed, exit back to the cooling screen
|
||||||
operatingMode = COOLING;
|
operatingMode = COOLING;
|
||||||
resetLastButtonPress();
|
if (StatusFlags == 8) {
|
||||||
resetButtons();
|
//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()
|
||||||
@@ -53,35 +91,32 @@ 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;
|
||||||
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,52 +125,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 (millis() - getLastButtonPress() < 300)
|
if (StatusFlags == 4 && Buttons != 0) {
|
||||||
return;
|
//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 % 3;
|
||||||
|
|
||||||
if (Buttons & BUT_A) {
|
break;
|
||||||
resetLastButtonPress();
|
case TEMPROUNDING:
|
||||||
//A key iterates through the menu
|
systemSettings.temperatureRounding++;
|
||||||
if (settingsPage == SETTINGSOPTIONSCOUNT) {
|
systemSettings.temperatureRounding =
|
||||||
//Roll off the end
|
systemSettings.temperatureRounding % 3;
|
||||||
settingsPage = 0; //reset
|
break;
|
||||||
operatingMode = STARTUP; //reset back to the startup
|
case DISPUPDATERATE:
|
||||||
saveSettings(); //Save the settings
|
systemSettings.displayUpdateSpeed++;
|
||||||
} else
|
systemSettings.displayUpdateSpeed =
|
||||||
++settingsPage; //move to the next option
|
systemSettings.displayUpdateSpeed % 3;
|
||||||
} else if (Buttons & BUT_B) {
|
break;
|
||||||
resetLastButtonPress();
|
case BOOSTMODE:
|
||||||
//B changes the value selected
|
systemSettings.boostModeEnabled =
|
||||||
switch (settingsPage) {
|
!systemSettings.boostModeEnabled;
|
||||||
case UVCO:
|
break;
|
||||||
//we are incrementing the cutout voltage
|
case BOOSTTEMP:
|
||||||
systemSettings.cutoutVoltage += 1; //Go up 1V at a jump
|
systemSettings.BoostTemp += 100; //Go up 10C at a time
|
||||||
if (systemSettings.cutoutVoltage > 24)
|
if (systemSettings.BoostTemp > 4500)
|
||||||
systemSettings.cutoutVoltage = 10;
|
systemSettings.BoostTemp = 2500; //loop back at 250
|
||||||
break;
|
break;
|
||||||
case SLEEP_TEMP:
|
default:
|
||||||
systemSettings.SleepTemp += 100; //Go up 10c at a time
|
break;
|
||||||
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 MOTIONDETECT:
|
|
||||||
systemSettings.movementEnabled =
|
|
||||||
!systemSettings.movementEnabled;
|
|
||||||
break;
|
|
||||||
case TEMPDISPLAY:
|
|
||||||
systemSettings.displayTempInF = !systemSettings.displayTempInF;
|
|
||||||
break;
|
|
||||||
case LEFTY:
|
|
||||||
systemSettings.flipDisplay = !systemSettings.flipDisplay;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -144,44 +210,42 @@ 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();
|
Oled_DisplayOn();
|
||||||
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();
|
Oled_DisplayOn();
|
||||||
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
|
||||||
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);
|
||||||
|
|
||||||
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, 0xFFFF); //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 +256,82 @@ 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) {
|
||||||
|
//Single button press, cycle over to the DC display
|
||||||
|
StatusFlags = 0;
|
||||||
|
operatingMode = DCINDISP;
|
||||||
|
} else if (Buttons == BUT_B) {
|
||||||
|
StatusFlags = 0;
|
||||||
|
operatingMode = TEMPCAL;
|
||||||
|
} 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 (StatusFlags == 0) {
|
||||||
|
if (Buttons == BUT_A) {
|
||||||
|
//Single button press, cycle over to the temp display
|
||||||
|
operatingMode = THERMOMETER;
|
||||||
|
} else if (Buttons == BUT_B) {
|
||||||
|
//dc cal mode
|
||||||
|
StatusFlags = 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)) {
|
||||||
|
StatusFlags = 0;
|
||||||
|
saveSettings();
|
||||||
|
}
|
||||||
|
if (systemSettings.voltageDiv < 120)
|
||||||
|
systemSettings.voltageDiv = 160;
|
||||||
|
else if (systemSettings.voltageDiv > 160)
|
||||||
|
systemSettings.voltageDiv = 120;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TEMPCAL: {
|
||||||
|
if (Buttons == BUT_B) {
|
||||||
|
//Single button press, cycle over to the DC IN
|
||||||
|
operatingMode = THERMOMETER;
|
||||||
|
} else if (Buttons == BUT_A) {
|
||||||
|
//Try and calibrate
|
||||||
|
if (StatusFlags == 0) {
|
||||||
|
if ((readTipTemp() < 300) && (readSensorTemp() < 300)) {
|
||||||
|
StatusFlags = 1;
|
||||||
|
systemSettings.tempCalibration = readTipTemp();
|
||||||
|
saveSettings();
|
||||||
|
} else {
|
||||||
|
StatusFlags = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (Buttons == (BUT_A | BUT_B)) {
|
||||||
|
//If the user is holding both button, exit the screen
|
||||||
|
operatingMode = STARTUP;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -199,17 +339,35 @@ 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*/
|
||||||
OLED_DrawThreeNumber(temp / 10, x);
|
if (temp % 10 > 5)
|
||||||
|
temp += 10; //round up
|
||||||
|
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() {
|
||||||
uint16_t temp = readIronTemp(0, 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);
|
||||||
switch (operatingMode) {
|
switch (operatingMode) {
|
||||||
case STARTUP:
|
case STARTUP:
|
||||||
//We are chilling in the idle mode
|
//We are chilling in the idle mode
|
||||||
@@ -220,97 +378,263 @@ void DrawUI() {
|
|||||||
Oled_DisplayOff();
|
Oled_DisplayOff();
|
||||||
} else {
|
} else {
|
||||||
Oled_DisplayOn();
|
Oled_DisplayOn();
|
||||||
OLED_DrawString(" IDLE ", 8); //write the word IDLE
|
OLED_DrawIDLELogo(); //Draw the icons for prompting the user
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SOLDERING:
|
case SOLDERING:
|
||||||
//The user is soldering
|
//The user is soldering
|
||||||
{
|
{
|
||||||
if (getIronTimer() == 0) {
|
if (systemSettings.displayUpdateSpeed == DISPLAYMODE_SLOW
|
||||||
OLED_DrawChar('C', 5);
|
&& (millis() - lastOLEDDrawTime < 200))
|
||||||
|
return;
|
||||||
|
else if (systemSettings.displayUpdateSpeed == DISPLAYMODE_MEDIUM
|
||||||
|
&& (millis() - lastOLEDDrawTime < 100))
|
||||||
|
return;
|
||||||
|
else if (systemSettings.displayUpdateSpeed == DISPLAYMODE_FAST
|
||||||
|
&& (millis() - lastOLEDDrawTime < 50))
|
||||||
|
return;
|
||||||
|
|
||||||
|
uint32_t tempavg = (temp + lastSolderingDrawnTemp1
|
||||||
|
+ lastSolderingDrawnTemp2);
|
||||||
|
tempavg /= 3;
|
||||||
|
drawTemp(tempavg, 0, systemSettings.temperatureRounding);
|
||||||
|
lastSolderingDrawnTemp1 = temp;
|
||||||
|
lastSolderingDrawnTemp2 = lastSolderingDrawnTemp1;
|
||||||
|
lastOLEDDrawTime = millis();
|
||||||
|
//Now draw symbols
|
||||||
|
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(4 * 12 + 16, 24 - 16);//blank out the tail after the temp
|
||||||
|
if (getIronTimer() == 0
|
||||||
|
&& (temp / 10) > (systemSettings.SolderingTemp / 10)) {
|
||||||
|
//Cooling
|
||||||
|
OLED_DrawSymbol(6, 5);
|
||||||
} else {
|
} else {
|
||||||
if (getIronTimer() < 500) {
|
if (getIronTimer() < 1500) {
|
||||||
OLED_DrawChar(' ', 5);
|
//Maintaining
|
||||||
|
OLED_DrawSymbol(6, 7);
|
||||||
} else { //we are heating
|
} else { //we are heating
|
||||||
OLED_DrawChar('H', 5);
|
OLED_DrawSymbol(6, 6);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
drawTemp(temp, 0);
|
if (systemSettings.displayTempInF) {
|
||||||
OLED_DrawChar(' ', 3);
|
OLED_DrawSymbol(4, 1);
|
||||||
OLED_DrawChar(' ', 4);
|
} else {
|
||||||
OLED_DrawChar(' ', 6);
|
OLED_DrawSymbol(4, 0);
|
||||||
OLED_DrawChar(' ', 7);
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TEMP_ADJ:
|
case TEMP_ADJ:
|
||||||
//We are prompting the user to change the temp so we draw the current setpoint temp
|
//We are prompting the user to change the temp so we draw the current setpoint temp
|
||||||
//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(' ', 6);
|
OLED_DrawChar(' ', 7);
|
||||||
OLED_DrawChar('>', 7);
|
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) {
|
||||||
|
StatusFlags = 4;
|
||||||
|
//If the user has idled for > 3 seconds, show the long name for the selected setting instead
|
||||||
|
//draw from settingsLongTestScrollPos through to end of screen
|
||||||
|
uint8_t lengthLeft = SettingsLongNamesLengths[settingsPage]
|
||||||
|
- settingsLongTestScrollPos;
|
||||||
|
if (lengthLeft < 1)
|
||||||
|
settingsLongTestScrollPos = 0;
|
||||||
|
//^ Reset once not much left
|
||||||
|
if (lengthLeft > 8)
|
||||||
|
lengthLeft = 8;
|
||||||
|
OLED_DrawString(
|
||||||
|
SettingsLongNames[(uint8_t) settingsPage]
|
||||||
|
+ settingsLongTestScrollPos, lengthLeft);
|
||||||
|
if (lengthLeft < 8)
|
||||||
|
for (uint8_t i = lengthLeft; i < 8; i++)
|
||||||
|
OLED_DrawChar(' ', i);
|
||||||
|
if (millis() - lastOLEDDrawTime > 120) {
|
||||||
|
settingsLongTestScrollPos++;
|
||||||
|
lastOLEDDrawTime = millis();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
settingsLongTestScrollPos = 0;
|
||||||
|
switch (settingsPage) {
|
||||||
|
case UVCO:
|
||||||
|
OLED_DrawString("UVCO ", 5);
|
||||||
|
OLED_DrawTwoNumber(systemSettings.cutoutVoltage, 5);
|
||||||
|
OLED_DrawChar('V', 7);
|
||||||
|
break;
|
||||||
|
case SLEEP_TEMP:
|
||||||
|
OLED_DrawString("STMP ", 5);
|
||||||
|
OLED_DrawThreeNumber(systemSettings.SleepTemp / 10, 5);
|
||||||
|
break;
|
||||||
|
case SLEEP_TIME:
|
||||||
|
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;
|
||||||
|
|
||||||
switch (settingsPage) {
|
case LEFTY:
|
||||||
case UVCO:
|
|
||||||
OLED_DrawString("UVCO ", 5);
|
|
||||||
OLED_DrawTwoNumber(systemSettings.cutoutVoltage, 5);
|
|
||||||
OLED_DrawChar('V', 7);
|
|
||||||
break;
|
|
||||||
case SLEEP_TEMP:
|
|
||||||
OLED_DrawString("STMP ", 5);
|
|
||||||
OLED_DrawThreeNumber(systemSettings.SleepTemp / 10, 5);
|
|
||||||
break;
|
|
||||||
case SLEEP_TIME:
|
|
||||||
OLED_DrawString("STIME ", 6);
|
|
||||||
OLED_DrawTwoNumber(systemSettings.SleepTime, 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:
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
if (systemSettings.flipDisplay)
|
break;
|
||||||
OLED_DrawString("FLPDSP T", 8);
|
case TEMPROUNDING:
|
||||||
else
|
//We are prompting the user about their display mode preferences
|
||||||
OLED_DrawString("FLPDSP F", 8);
|
{
|
||||||
break;
|
switch (systemSettings.temperatureRounding) {
|
||||||
default:
|
case ROUNDING_NONE:
|
||||||
break;
|
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;
|
||||||
|
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, 3);
|
drawTemp(temp, 4, systemSettings.temperatureRounding);
|
||||||
|
OLED_BlankSlot(84, 96 - 85); //blank out after the temp
|
||||||
|
|
||||||
|
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
|
||||||
OLED_DrawString("COOL", 3);
|
OLED_DrawString("COOL ", 5);
|
||||||
drawTemp(temp, 4);
|
drawTemp(temp, 5, systemSettings.temperatureRounding);
|
||||||
break;
|
break;
|
||||||
case UVLOWARN:
|
case UVLOWARN:
|
||||||
OLED_DrawString("LOW VOLT", 8);
|
OLED_DrawString("LOW VOLT", 8);
|
||||||
|
break;
|
||||||
|
case THERMOMETER:
|
||||||
|
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
|
||||||
|
drawTemp(temp, 5, 0);
|
||||||
|
break;
|
||||||
|
case DCINDISP: {
|
||||||
|
uint16_t voltage = readDCVoltage(systemSettings.voltageDiv); //get X10 voltage
|
||||||
|
|
||||||
|
if (StatusFlags == 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 (StatusFlags == 0) {
|
||||||
|
OLED_DrawString("CAL TEMP", 8);
|
||||||
|
} else if (StatusFlags == 1) {
|
||||||
|
OLED_DrawString("CAL OK ", 8);
|
||||||
|
} else if (StatusFlags == 2) {
|
||||||
|
OLED_DrawString("CAL FAIL", 8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,22 +13,22 @@
|
|||||||
#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,/*Unknown*/
|
||||||
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*/
|
||||||
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*/
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
@@ -183,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);
|
||||||
@@ -196,13 +203,20 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
Oled_DrawArea(x, 0, FONT_WIDTH, 16, (u8*) ptr);
|
Oled_DrawArea(x, 0, FONT_WIDTH, 16, (u8*) ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OLED_BlankSlot(uint8_t xStart, uint8_t width) {
|
||||||
|
u8* ptr = (u8*) FONT;
|
||||||
|
ptr += (36) * (FONT_WIDTH * 2);
|
||||||
|
|
||||||
|
Oled_DrawArea(xStart, 0, width, 16, (u8*) ptr);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Draw a 2 digit number to the display at letter slot x
|
* Draw a 2 digit number to the display at letter slot x
|
||||||
*/
|
*/
|
||||||
@@ -230,3 +244,27 @@ 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void OLED_DrawSymbol(uint8_t x, uint8_t symbol) {
|
||||||
|
Oled_DrawArea(x * FONT_WIDTH, 0, 16, 16, SymbolTable + (symbol * 32));
|
||||||
|
}
|
||||||
|
|||||||
@@ -12,11 +12,11 @@
|
|||||||
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/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 = 22;
|
pidSettings.kp = 15;
|
||||||
pidSettings.ki = 7;
|
pidSettings.ki = 2;
|
||||||
pidSettings.kd = 2;
|
pidSettings.kd = 3;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,5 +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.tempCalibration=239; //Default to their calibration value
|
||||||
|
systemSettings.voltageDiv=144; //Default divider from schematic
|
||||||
|
systemSettings.ShutdownTime=30; //How many minutes until the unit turns itself off
|
||||||
|
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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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-LinkV2</dbgDEV>
|
<dbgDEV>ST-Link</dbgDEV>
|
||||||
|
<mcuId>stm32f103t8ux</mcuId>
|
||||||
</board>
|
</board>
|
||||||
</targetDefinitions>
|
</targetDefinitions>
|
||||||
|
|||||||
Reference in New Issue
Block a user