1
0
forked from me/IronOS

Compare commits

..

5 Commits
v1.0 ... v1.02

Author SHA1 Message Date
Ben V. Brown
1f7cdf9694 For temperature mode force reading 2017-01-23 19:39:56 +11:00
Ben V. Brown
b2db129ab8 V1.02 Add Thermometer Mode 2017-01-23 19:33:03 +11:00
Ben V. Brown
b7e4249d2e Use both buttons to exit soldering instead of B 2017-01-22 21:19:26 +11:00
Ben V. Brown
0bbdda5b55 Add FlipDisplay, Fahrenheit, Better Font 2016-10-03 19:01:57 +11:00
Ben V. Brown
acb97f1d46 Documentation Updates
Update documentation to include menu flow diagram from my website.
Remove old firmware version as it is no longer relivant.
Remove System Design as it is complete.
2016-10-03 01:18:23 +11:00
14 changed files with 358 additions and 284 deletions

View File

@@ -30,3 +30,9 @@ This is completely safe, if it goes wrong just put the .hex file from the offici
5. The filename will have changed to end in .RDY or .ERR . 5. The filename will have changed to end in .RDY or .ERR .
6. If it ends with .RDY your done! Otherwise something went wrong. 6. If it ends with .RDY your done! Otherwise something went wrong.
7. If it went wrong try on a windows computer, some Mac / Linux machines do not play well with their boot loader. 7. If it went wrong try on a windows computer, some Mac / Linux machines do not play well with their boot loader.
# New Menu System
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.
![TS100: Software Menu](http://ralimtek.com/images/TS100.png "Fairly easy to learn")

View File

@@ -1,21 +0,0 @@
# System Design
# Movement Detection
The unit has a MMA8652FC Accelerometer on the small sub board along with the STM32.
This is used for motion detection of the soldering iron.
# USB Disk
When the unit is plugged into the computer, it presents a FAT device to the operating system over the usb connection.
This is implemented using a ram buffer for the disk.
# Future improvements to be made
These features are things I would like to add to the firmware
* Use the sysTick hardware for timing of events
* Move all the settings to an on device menu system instead of usb link
* Move error codes into a unified struct
* Rewrite most of the OLED stack to not require hardcoded values
* Rework the modes of the unit to be neater

View File

@@ -1,25 +0,0 @@
v2.11 update (2015/08/03)
1, optimizing the key for delay;
2, optimized display processing
3, optimization of high-temperature alarm;
4, to increase the maximum voltage alarm;
5, the newly added screen protection, enter standby interface for some time, the screen will shut itself down, or move the iron screen button will automatically light up;
6, optimizing the movement decision
v2.10 update (2015/07/14)
1, temperature calibration is not refresh bug;
2, Cancel USB-powered thermometer into the function;
---Original --
v2.11 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(20150803)
1<EFBFBD><EFBFBD> <09>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2<EFBFBD><EFBFBD> <09>Ż<EFBFBD><C5BB><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
3<EFBFBD><EFBFBD> <09>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD>
4<EFBFBD><EFBFBD> <09><><EFBFBD>߱<EFBFBD><DFB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>ѹ<EFBFBD><D1B9>
5<EFBFBD><EFBFBD> <09>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>Լ<EFBFBD><D4BC>رգ<D8B1><D5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
6<EFBFBD><EFBFBD> <09>Ż<EFBFBD><C5BB>ƶ<EFBFBD><C6B6>ж<EFBFBD>
v2.10 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(20150714)
1<EFBFBD><EFBFBD> <09><EFBFBD>У׼ʱû<CAB1><C3BB>ˢ<EFBFBD>µ<EFBFBD>bug<75><67>
2<EFBFBD><EFBFBD> ȡ<><C8A1>USB<53><42><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>¶ȼƵĹ<C6B5><C4B9>ܣ<EFBFBD>

View File

@@ -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 &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.bin&quot;; arm-none-eabi-size -B &quot;${BuildArtifactFileName}&quot;"> <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 &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.bin&quot;; arm-none-eabi-size -B &quot;${BuildArtifactFileName}&quot;;arm-none-eabi-objcopy -O ihex &quot;${BuildArtifactFileBaseName}.elf&quot; &quot;${BuildArtifactFileBaseName}.hex&quot;">
<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"/>

View File

@@ -1 +1,2 @@
/Debug/ /Debug/
/Release/

View File

@@ -10,86 +10,91 @@
#ifndef FONT_H_ #ifndef FONT_H_
#define FONT_H_ #define FONT_H_
const u8 FONT[]={ #define FONT_WIDTH 12 /*How many pixels wide the font is*/
0x00,0xF0,0xFC,0x0E,0x82,0xC2,0x62,0x1E,0xFC,0xF0,0x00,0x00,0x00,0x00, const uint8_t FONT[]={
0x00,0x03,0x0F,0x1F,0x11,0x10,0x10,0x1C,0x0F,0x03,0x00,0x00,0x00,0x00,/*0*/ 0x00,0xF0,0xFC,0x0E,0x82,0xC2,0x62,0x1E,0xFC,0xF0,0x00,0x00,
0x00,0x08,0x04,0x02,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x03,0x0F,0x1F,0x11,0x10,0x10,0x1C,0x0F,0x03,0x00,0x00,/*0*/
0x00,0x10,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,/*1*/ 0x00,0x08,0x04,0x02,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x04,0x02,0x02,0x02,0xC6,0xFC,0x78,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x10,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10,0x00,0x00,0x00,/*1*/
0x00,0x18,0x1C,0x16,0x13,0x11,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,/*2*/ 0x00,0x04,0x02,0x02,0x02,0xC6,0xFC,0x78,0x00,0x00,0x00,0x00,
0x00,0x02,0x02,0x42,0x42,0x66,0xFE,0x9C,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x18,0x1C,0x16,0x13,0x11,0x10,0x10,0x10,0x00,0x00,0x00,/*2*/
0x00,0x10,0x10,0x10,0x10,0x10,0x08,0x0F,0x07,0x00,0x00,0x00,0x00,0x00,/*3*/ 0x00,0x02,0x02,0x42,0x42,0x66,0xFE,0x9C,0x00,0x00,0x00,0x00,
0x00,0x00,0x80,0xE0,0x30,0x1C,0x06,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00, 0x00,0x10,0x10,0x10,0x10,0x10,0x08,0x0F,0x07,0x00,0x00,0x00,/*3*/
0x00,0x03,0x03,0x02,0x02,0x02,0x02,0x1F,0x1F,0x02,0x02,0x00,0x00,0x00,/*4*/ 0x00,0x00,0x80,0xE0,0x30,0x1C,0x06,0xFE,0xFE,0x00,0x00,0x00,
0x00,0x7E,0x7E,0x42,0x42,0x42,0xC2,0x82,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x03,0x03,0x02,0x02,0x02,0x02,0x1F,0x1F,0x02,0x02,0x00,/*4*/
0x00,0x10,0x10,0x10,0x10,0x10,0x08,0x0F,0x07,0x00,0x00,0x00,0x00,0x00,/*5*/ 0x00,0x7E,0x7E,0x42,0x42,0x42,0xC2,0x82,0x00,0x00,0x00,0x00,
0x00,0xE0,0xF8,0x8C,0x44,0x42,0x42,0xC2,0x82,0x80,0x00,0x00,0x00,0x00, 0x00,0x10,0x10,0x10,0x10,0x10,0x08,0x0F,0x07,0x00,0x00,0x00,/*5*/
0x00,0x07,0x0F,0x18,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00,0x00,0x00,/*6*/ 0x00,0xE0,0xF8,0x8C,0x44,0x42,0x42,0xC2,0x82,0x80,0x00,0x00,
0x00,0x02,0x02,0x02,0x02,0xC2,0xF2,0x1E,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0x07,0x0F,0x18,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00,/*6*/
0x00,0x00,0x10,0x1C,0x0F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*7*/ 0x00,0x02,0x02,0x02,0x02,0xC2,0xF2,0x1E,0x06,0x00,0x00,0x00,
0x00,0x38,0x7C,0x66,0xC2,0x82,0xC2,0x66,0x7C,0x3C,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x1C,0x0F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,/*7*/
0x00,0x0E,0x0F,0x19,0x10,0x10,0x10,0x19,0x0F,0x0E,0x00,0x00,0x00,0x00,/*8*/ 0x00,0x38,0x7C,0x66,0xC2,0x82,0xC2,0x66,0x7C,0x3C,0x00,0x00,
0x00,0x78,0x7C,0xC6,0x82,0x82,0x82,0x46,0xFC,0xF8,0x00,0x00,0x00,0x00, 0x00,0x0E,0x0F,0x19,0x10,0x10,0x10,0x19,0x0F,0x0E,0x00,0x00,/*8*/
0x00,0x00,0x10,0x10,0x10,0x10,0x08,0x0C,0x07,0x03,0x00,0x00,0x00,0x00,/*9*/ 0x00,0x78,0x7C,0xC6,0x82,0x82,0x82,0x46,0xFC,0xF8,0x00,0x00,
0x00,0x00,0x80,0xF0,0x1E,0x02,0x1E,0xF0,0x80,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x10,0x10,0x10,0x08,0x0C,0x07,0x03,0x00,0x00,/*9*/
0x00,0x1C,0x0F,0x03,0x02,0x02,0x02,0x03,0x0F,0x1C,0x00,0x00,0x00,0x00,/*A*/
0x00,0xFE,0xFE,0x42,0x42,0x42,0xE6,0xBE,0x9C,0x00,0x00,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00,0x00,0x00,0x00,/*B*/
0x00,0xF0,0xF8,0x0C,0x06,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0x0F,0x0C,0x18,0x10,0x10,0x10,0x08,0x00,0x00,0x00,0x00,0x00,/*C*/
0x00,0xFE,0xFE,0x02,0x02,0x02,0x06,0x0C,0xFC,0xF0,0x00,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x10,0x10,0x10,0x18,0x0C,0x07,0x03,0x00,0x00,0x00,0x00,/*D*/
0x00,0xFE,0xFE,0x42,0x42,0x42,0x42,0x42,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,/*E*/
0x00,0xFE,0xFE,0x82,0x82,0x82,0x82,0x82,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*F*/
0x00,0xF0,0xF8,0x0C,0x06,0x02,0x82,0x82,0x82,0x84,0x00,0x00,0x00,0x00,
0x00,0x03,0x0F,0x0C,0x18,0x10,0x10,0x10,0x1F,0x1F,0x00,0x00,0x00,0x00,/*G*/
0x00,0xFE,0xFE,0x40,0x40,0x40,0x40,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,/*H*/
0x00,0x02,0x02,0x02,0xFE,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,
0x00,0x10,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,/*I*/
0x00,0x02,0x02,0x02,0x02,0x02,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x08,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,/*J*/
0x00,0xFE,0xFE,0xC0,0xE0,0x30,0x18,0x0C,0x06,0x02,0x00,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x00,0x01,0x03,0x06,0x0C,0x18,0x10,0x00,0x00,0x00,0x00,/*K*/
0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,/*L*/
0x00,0x00,0xFE,0x06,0x3C,0xC0,0xC0,0x3C,0x06,0xFE,0x00,0x00,0x00,0x00,
0x00,0x10,0x1F,0x00,0x00,0x01,0x01,0x00,0x00,0x1F,0x18,0x00,0x00,0x00,/*M*/
0x00,0xFE,0xFE,0x1E,0x70,0x80,0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x00,0x00,0x03,0x1C,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,/*N*/
0x00,0xF0,0xFC,0x0C,0x02,0x02,0x02,0x0E,0xFC,0xF0,0x00,0x00,0x00,0x00,
0x00,0x03,0x0F,0x1C,0x10,0x10,0x10,0x0C,0x0F,0x03,0x00,0x00,0x00,0x00,/*O*/
0x00,0xFE,0xFE,0x02,0x02,0x02,0x86,0xFC,0x78,0x00,0x00,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*P*/
0x00,0xF0,0xF8,0x0C,0x02,0x02,0x02,0x02,0x0C,0xFC,0xF0,0x00,0x00,0x00,
0x00,0x03,0x0F,0x1C,0x10,0x30,0x70,0xD8,0x8C,0x8F,0x83,0x40,0x00,0x00,/*Q*/
0x00,0xFE,0xFE,0x42,0x42,0xC2,0xE6,0x3C,0x1C,0x00,0x00,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x00,0x00,0x00,0x01,0x0F,0x1C,0x10,0x00,0x00,0x00,0x00,/*R*/
0x00,0x38,0x7C,0x66,0xC2,0xC2,0x82,0x84,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x08,0x10,0x10,0x10,0x10,0x19,0x0F,0x07,0x00,0x00,0x00,0x00,0x00,/*S*/
0x00,0x02,0x02,0x02,0x02,0xFE,0xFE,0x02,0x02,0x02,0x02,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*T*/
0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,
0x00,0x07,0x0F,0x18,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00,0x00,0x00,/*U*/
0x00,0x0E,0x7E,0xE0,0x00,0x00,0x00,0xE0,0x7C,0x0E,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x03,0x1F,0x18,0x1F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,/*V*/
0x00,0x7E,0xFE,0x00,0x00,0xE0,0xE0,0x00,0x00,0xFE,0x7E,0x00,0x00,0x00,
0x00,0x00,0x1F,0x18,0x0F,0x01,0x01,0x0F,0x18,0x1F,0x00,0x00,0x00,0x00,/*W*/
0x00,0x02,0x06,0x1C,0x38,0xE0,0xE0,0x38,0x1C,0x06,0x02,0x00,0x00,0x00,
0x00,0x10,0x18,0x0E,0x07,0x01,0x01,0x07,0x0E,0x18,0x10,0x00,0x00,0x00,/*X*/
0x00,0x02,0x0E,0x3C,0xF0,0xC0,0xC0,0xF0,0x3C,0x0E,0x02,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*Y*/
0x00,0x02,0x02,0x02,0xC2,0xE2,0x3A,0x0E,0x02,0x00,0x00,0x00,0x00,0x00,
0x00,0x10,0x1C,0x17,0x11,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,/*Z*/
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,0x60,0xF0,0x98,0x0C,0x06,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0xF0,0x1E,0x02,0x1E,0xF0,0x80,0x00,0x00,0x00,
0x00,0x00,0x00,0x01,0x03,0x06,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*<*/ 0x00,0x1C,0x0F,0x03,0x02,0x02,0x02,0x03,0x0F,0x1C,0x00,0x00,/*A*/
0x00,0x02,0x06,0x0C,0x98,0xF0,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xFE,0xFE,0x42,0x42,0x42,0xE6,0xBE,0x9C,0x00,0x00,0x00,
0x00,0x04,0x06,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*>*/ 0x00,0x1F,0x1F,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00,0x00,/*B*/
0x00,0xF0,0xF8,0x0C,0x06,0x02,0x02,0x02,0x04,0x00,0x00,0x00,
0x00,0x03,0x0F,0x0C,0x18,0x10,0x10,0x10,0x08,0x00,0x00,0x00,/*C*/
0x00,0xFE,0xFE,0x02,0x02,0x02,0x06,0x0C,0xFC,0xF0,0x00,0x00,
0x00,0x1F,0x1F,0x10,0x10,0x10,0x18,0x0C,0x07,0x03,0x00,0x00,/*D*/
0x00,0xFE,0xFE,0x42,0x42,0x42,0x42,0x42,0x00,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,/*E*/
0x00,0xFE,0xFE,0x82,0x82,0x82,0x82,0x82,0x00,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*F*/
0x00,0xF0,0xF8,0x0C,0x06,0x02,0x82,0x82,0x82,0x84,0x00,0x00,
0x00,0x03,0x0F,0x0C,0x18,0x10,0x10,0x10,0x1F,0x1F,0x00,0x00,/*G*/
0x00,0xFE,0xFE,0x40,0x40,0x40,0x40,0xFE,0xFE,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,/*H*/
0x00,0x02,0x02,0x02,0xFE,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,
0x00,0x10,0x10,0x10,0x1F,0x1F,0x10,0x10,0x10,0x00,0x00,0x00,/*I*/
0x00,0x02,0x02,0x02,0x02,0x02,0xFE,0xFE,0x00,0x00,0x00,0x00,
0x00,0x08,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00,0x00,0x00,/*J*/
0x00,0xFE,0xFE,0xC0,0xE0,0x30,0x18,0x0C,0x06,0x02,0x00,0x00,
0x00,0x1F,0x1F,0x00,0x01,0x03,0x06,0x0C,0x18,0x10,0x00,0x00,/*K*/
0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,/*L*/
0x00,0x00,0xFE,0x06,0x3C,0xC0,0xC0,0x3C,0x06,0xFE,0x00,0x00,
0x00,0x10,0x1F,0x00,0x00,0x01,0x01,0x00,0x00,0x1F,0x18,0x00,/*M*/
0x00,0xFE,0xFE,0x1E,0x70,0x80,0x00,0xFE,0xFE,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x00,0x00,0x03,0x1C,0x1F,0x1F,0x00,0x00,0x00,/*N*/
0x00,0xF0,0xFC,0x0C,0x02,0x02,0x02,0x0E,0xFC,0xF0,0x00,0x00,
0x00,0x03,0x0F,0x1C,0x10,0x10,0x10,0x0C,0x0F,0x03,0x00,0x00,/*O*/
0x00,0xFE,0xFE,0x02,0x02,0x02,0x86,0xFC,0x78,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,/*P*/
0x00,0xF0,0xF8,0x0C,0x02,0x02,0x02,0x02,0x0C,0xFC,0xF0,0x00,
0x00,0x03,0x0F,0x1C,0x10,0x30,0x70,0xD8,0x8C,0x8F,0x83,0x40,/*Q*/
0x00,0xFE,0xFE,0x42,0x42,0xC2,0xE6,0x3C,0x1C,0x00,0x00,0x00,
0x00,0x1F,0x1F,0x00,0x00,0x00,0x01,0x0F,0x1C,0x10,0x00,0x00,/*R*/
0x00,0x38,0x7C,0x66,0xC2,0xC2,0x82,0x84,0x00,0x00,0x00,0x00,
0x00,0x08,0x10,0x10,0x10,0x10,0x19,0x0F,0x07,0x00,0x00,0x00,/*S*/
0x00,0x02,0x02,0x02,0x02,0xFE,0xFE,0x02,0x02,0x02,0x02,0x00,
0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,/*T*/
0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x00,0x00,
0x00,0x07,0x0F,0x18,0x10,0x10,0x10,0x18,0x0F,0x07,0x00,0x00,/*U*/
0x00,0x0E,0x7E,0xE0,0x00,0x00,0x00,0xE0,0x7C,0x0E,0x00,0x00,
0x00,0x00,0x00,0x03,0x1F,0x18,0x1F,0x03,0x00,0x00,0x00,0x00,/*V*/
0x00,0x7E,0xFE,0x00,0x00,0xE0,0xE0,0x00,0x00,0xFE,0x7E,0x00,
0x00,0x00,0x1F,0x18,0x0F,0x01,0x01,0x0F,0x18,0x1F,0x00,0x00,/*W*/
0x00,0x02,0x06,0x1C,0x38,0xE0,0xE0,0x38,0x1C,0x06,0x02,0x00,
0x00,0x10,0x18,0x0E,0x07,0x01,0x01,0x07,0x0E,0x18,0x10,0x00,/*X*/
0x00,0x02,0x0E,0x3C,0xF0,0xC0,0xC0,0xF0,0x3C,0x0E,0x02,0x00,
0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,/*Y*/
0x00,0x02,0x02,0x02,0xC2,0xE2,0x3A,0x0E,0x02,0x00,0x00,0x00,
0x00,0x10,0x1C,0x17,0x11,0x10,0x10,0x10,0x10,0x00,0x00,0x00,/*Z*/
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,0x60,0xF0,0x98,0x0C,0x06,0x02,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x01,0x03,0x06,0x04,0x00,0x00,0x00,0x00,0x00,/*<*/
0x00,0x02,0x06,0x0C,0x98,0xF0,0x60,0x00,0x00,0x00,0x00,0x00,
0x00,0x04,0x06,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*>*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x0F,0x0F,0x0F,0x0F,0x00,0x00,0x00,0x00,/*.*/
}; };
#endif /* FONT_H_ */ #endif /* FONT_H_ */

View File

@@ -24,10 +24,11 @@ enum {
SLEEP, SLEEP,
COOLING, COOLING,
UVLOWARN, UVLOWARN,
THERMOMETER,
} operatingMode; } operatingMode;
enum { enum {
UVLO = 0, SLEEP_TEMP, SLEEP_TIME,MOTIONDETECT, UVCO = 0, SLEEP_TEMP, SLEEP_TIME, MOTIONDETECT, TEMPDISPLAY, LEFTY
} settingsPage; } settingsPage;

View File

@@ -16,7 +16,7 @@ void Oled_DisplayOff(void);
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);
void Set_ShowPos(u8 x, u8 y); void Set_ShowPos(u8 x, u8 y);
void Oled_DisplayFlip();
void GPIO_Init_OLED(void); void GPIO_Init_OLED(void);
void Init_Oled(void); void Init_Oled(void);
u8* Data_Command(u8 len, u8* ptr); u8* Data_Command(u8 len, u8* ptr);

View File

@@ -11,16 +11,21 @@
#define SETTINGS_H_ #define SETTINGS_H_
#include <stdint.h> #include <stdint.h>
#include "stm32f10x_flash.h" #include "stm32f10x_flash.h"
#define SETTINGSVERSION 0x01 /*Change this if you change the struct below to prevent people getting out of sync*/ #define SETTINGSVERSION 0x02 /*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*/
/*
* This struct must be a multiple of 2 bytes as it is saved / restored from flash in uint16_t chunks
*/
struct { struct {
uint32_t SolderingTemp; //current setpoint for the iron uint32_t SolderingTemp; //current setpoint for the iron
uint32_t SleepTemp; //temp to drop to in sleep uint32_t SleepTemp; //temp to drop to in sleep
uint8_t SleepTime; //minutes to sleep uint8_t version; //Used to track if a reset is needed on firmware upgrade
uint8_t cutoutVoltage; //X10 the voltage we cutout at for undervoltage uint8_t SleepTime; //minutes timeout to sleep
uint8_t movementEnabled; uint8_t cutoutVoltage; //The voltage we cutout at for undervoltage
uint8_t version; uint8_t movementEnabled; //If movement is enabled
uint8_t displayTempInF; //If we need to convert the C reading to F
uint8_t flipDisplay; //If true we want to invert the display for lefties
} systemSettings; } systemSettings;
//Settings struct used for user settings
void saveSettings(); void saveSettings();
void restoreSettings(); void restoreSettings();

View File

@@ -22,7 +22,7 @@ void I2C_Configuration(void) {
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 100000; //100k I2C_InitStructure.I2C_ClockSpeed = 400000; //400k
I2C_Init(I2C1, &I2C_InitStructure); I2C_Init(I2C1, &I2C_InitStructure);
I2C_Cmd(I2C1, ENABLE); I2C_Cmd(I2C1, ENABLE);
} }

View File

@@ -12,30 +12,31 @@
void setup(); void setup();
int main(void) { int main(void) {
setup(); setup();/*Setup the system*/
while (1) { while (1) {
Clear_Watchdog(); //reset the Watchdog Clear_Watchdog(); //reset the Watchdog timer
ProcessUI(); ProcessUI();
DrawUI(); DrawUI();
delayMs(50); 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
StartUp_Accelerometer(); //start the accelerometer Init_Oled(); //init the OLED display
Init_Oled(); //init the OLED display setupPID(); //init the PID values
Clear_Screen(); //clear the display buffer to black readIronTemp(239, 0); //load the default calibration value
setupPID(); //init the PID values restoreSettings(); //Load settings
readIronTemp(239, 0); //load the default calibration value if (systemSettings.flipDisplay)
restoreSettings(); //Load settings Oled_DisplayFlip();
OLED_DrawString("VER 1.02",8);
Start_Watchdog(1000); //start the system watchdog as 1 seconds timeout delayMs(800);
Start_Watchdog(1000); //start the system watchdog as 1 seconds timeout
} }

View File

@@ -16,12 +16,16 @@ void ProcessUI() {
switch (operatingMode) { switch (operatingMode) {
case STARTUP: case STARTUP:
if ((millis() - getLastButtonPress() > 1000)) { if ((millis() - getLastButtonPress() > 1000)) {
if (Buttons & BUT_A) { if (Buttons == (BUT_A | BUT_B)) {
operatingMode = THERMOMETER;
resetLastButtonPress();
resetButtons();
} else if (Buttons == BUT_A) {
//A key pressed so we are moving to soldering mode //A key pressed so we are moving to soldering mode
operatingMode = SOLDERING; operatingMode = SOLDERING;
resetLastButtonPress(); resetLastButtonPress();
resetButtons(); 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(); resetLastButtonPress();
@@ -32,16 +36,18 @@ void ProcessUI() {
break; break;
case SOLDERING: case SOLDERING:
//We need to check the buttons if we need to jump out //We need to check the buttons if we need to jump out
if (Buttons & BUT_A) { if (Buttons == BUT_A || Buttons == BUT_B) {
//A key pressed so we are moving to temp set //A or B key pressed so we are moving to temp set
operatingMode = TEMP_ADJ; operatingMode = TEMP_ADJ;
resetLastButtonPress(); resetLastButtonPress();
resetButtons(); resetButtons();
} else if (Buttons & BUT_B) { } else if (Buttons == (BUT_A | BUT_B)) {
//B Button was pressed so we are moving back to idle if (millis() - getLastButtonPress() > 1000) {
operatingMode = COOLING; //Both buttons were pressed, exit back to the cooling screen
resetLastButtonPress(); operatingMode = COOLING;
resetButtons(); resetLastButtonPress();
resetButtons();
}
} else { } else {
//We need to check the timer for movement in case we need to goto idle //We need to check the timer for movement in case we need to goto idle
if (systemSettings.movementEnabled) if (systemSettings.movementEnabled)
@@ -63,7 +69,7 @@ void ProcessUI() {
//If no buttons pushed we need to perform the PID loop for the iron temp //If no buttons pushed we need to perform the PID loop for the iron temp
int32_t newOutput = computePID(systemSettings.SolderingTemp); int32_t newOutput = computePID(systemSettings.SolderingTemp);
setIronTimer(newOutput); setIronTimer(newOutput);
} }
break; break;
@@ -81,37 +87,37 @@ void ProcessUI() {
} 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) if (millis() - getLastButtonPress() > 3000) {
operatingMode = SOLDERING; operatingMode = SOLDERING;
saveSettings();
}
} }
break; break;
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() < 400) if (millis() - getLastButtonPress() < 300)
return; return;
if (Buttons & BUT_A) { if (Buttons & BUT_A) {
resetLastButtonPress(); resetLastButtonPress();
//A key iterates through the menu //A key iterates through the menu
if (settingsPage == 3) { if (settingsPage == SETTINGSOPTIONSCOUNT) {
//Roll off the end //Roll off the end
settingsPage = 0; //reset settingsPage = 0; //reset
operatingMode = STARTUP; operatingMode = STARTUP; //reset back to the startup
saveSettings(); //Save the settings saveSettings(); //Save the settings
} else } else
++settingsPage; //move to the next option ++settingsPage; //move to the next option
} else if (Buttons & BUT_B) { } else if (Buttons & BUT_B) {
resetLastButtonPress(); resetLastButtonPress();
//B changes the value selected //B changes the value selected
switch (settingsPage) { switch (settingsPage) {
case UVLO: case UVCO:
//we are incrementing the cutout voltage //we are incrementing the cutout voltage
systemSettings.cutoutVoltage += 1; //Go up 1V at a jump systemSettings.cutoutVoltage += 1; //Go up 1V at a jump
if (systemSettings.cutoutVoltage > 24) if (systemSettings.cutoutVoltage > 24)
systemSettings.cutoutVoltage = 9; systemSettings.cutoutVoltage = 10;
else if (systemSettings.cutoutVoltage < 9)
systemSettings.cutoutVoltage = 9; //cant set UVLO below 9V
break; break;
case SLEEP_TEMP: case SLEEP_TEMP:
systemSettings.SleepTemp += 100; //Go up 10c at a time systemSettings.SleepTemp += 100; //Go up 10c at a time
@@ -120,14 +126,20 @@ void ProcessUI() {
break; break;
case SLEEP_TIME: case SLEEP_TIME:
++systemSettings.SleepTime; //Go up 1 minute at a time ++systemSettings.SleepTime; //Go up 1 minute at a time
if (systemSettings.SleepTime > 60) if (systemSettings.SleepTime > 30)
systemSettings.SleepTime = 2; //cant set time over an hour systemSettings.SleepTime = 1; //cant set time over 30 mins
//Remember that ^ is the time of no movement //Remember that ^ is the time of no movement
break; break;
case MOTIONDETECT: case MOTIONDETECT:
systemSettings.movementEnabled = systemSettings.movementEnabled =
!systemSettings.movementEnabled; !systemSettings.movementEnabled;
break; break;
case TEMPDISPLAY:
systemSettings.displayTempInF = !systemSettings.displayTempInF;
break;
case LEFTY:
systemSettings.flipDisplay = !systemSettings.flipDisplay;
break;
default: default:
break; break;
} }
@@ -155,27 +167,22 @@ void ProcessUI() {
//else if nothing has been pushed we need to compute the PID to keep the iron at the sleep temp //else if nothing has been pushed we need to compute the PID to keep the iron at the sleep temp
int32_t newOutput = computePID(systemSettings.SleepTemp); int32_t newOutput = computePID(systemSettings.SleepTemp);
setIronTimer(newOutput); setIronTimer(newOutput);
break; break;
case COOLING: { case COOLING: {
setIronTimer(0); //turn off heating setIronTimer(0); //turn off heating
//This mode warns the user the iron is still cooling down //This mode warns the user the iron is still cooling down
uint16_t temp = readIronTemp(0, 1); //take a new reading as the heater code is not taking new readings uint16_t temp = readIronTemp(0, 1); //take a new reading as the heater code is not taking new readings
if (temp < 500) { //if the temp is < 50C then we can go back to IDLE if (temp < 400) { //if the temp is < 40C then we can go back to IDLE
operatingMode = STARTUP;
resetLastButtonPress();
resetButtons();
} 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(); resetLastButtonPress();
resetButtons(); 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;
@@ -186,13 +193,35 @@ 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 ((millis() - getLastButtonPress() > 1000))
if (Buttons == (BUT_A | BUT_B)) {
//If the user is holding both button, exit the temp screen
operatingMode = STARTUP;
resetLastButtonPress();
resetButtons();
}
}
break;
default: default:
break; break;
} }
} }
/*
* Draws the temp with temp conversion if needed
*/
void drawTemp(uint16_t temp, uint8_t x) {
if (systemSettings.displayTempInF)
temp = (temp * 9 + 1600) / 5;/*Convert to F -> T*(9/5)+32*/
OLED_DrawThreeNumber(temp / 10, x);
}
/*
* Performs all the OLED drawing for the current operating mode
*/
void DrawUI() { void DrawUI() {
uint16_t temp = readIronTemp(0, 0) / 10; uint16_t temp = readIronTemp(0, 0);
switch (operatingMode) { switch (operatingMode) {
case STARTUP: case STARTUP:
//We are chilling in the idle mode //We are chilling in the idle mode
@@ -203,60 +232,77 @@ void DrawUI() {
Oled_DisplayOff(); Oled_DisplayOff();
} else { } else {
Oled_DisplayOn(); Oled_DisplayOn();
OLED_DrawString("IDLE ", 7); //write the word IDLE OLED_DrawString(" IDLE ", 8); //write the word IDLE
} }
break; break;
case SOLDERING: case SOLDERING:
//The user is soldering //The user is soldering
{ {
if (getIronTimer() == 0) { if (getIronTimer() == 0) {
OLED_DrawChar('C', 14 * 4); OLED_DrawChar('C', 5);
} else { } else {
if (getIronTimer() < 500) { if (getIronTimer() < 900) {
OLED_DrawChar(' ', 14 * 4); OLED_DrawChar(' ', 5);
} else { //we are heating } else { //we are heating
OLED_DrawChar('H', 14 * 4); OLED_DrawChar('H', 5);
} }
} }
OLED_DrawThreeNumber(temp, 0); drawTemp(temp, 0);
OLED_DrawChar(' ', 14 * 3); OLED_DrawChar(' ', 3);
OLED_DrawChar(' ', 14 * 5); OLED_DrawChar(' ', 4);
OLED_DrawChar(' ', 14 * 6); OLED_DrawChar(' ', 6);
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_DrawThreeNumber(systemSettings.SolderingTemp / 10, 14 * 1); OLED_DrawChar(' ', 0);
OLED_DrawChar(' ', 14 * 4); OLED_DrawChar('<', 1);
OLED_DrawChar('>', 14 * 5); drawTemp(systemSettings.SolderingTemp, 2);
OLED_DrawChar(' ', 5);
OLED_DrawChar(' ', 6);
OLED_DrawChar('>', 7);
break; break;
case SETTINGS: case SETTINGS:
//We are prompting the user the setting name //We are prompting the user the setting name
switch (settingsPage) { switch (settingsPage) {
case UVLO: case UVCO:
OLED_DrawString("UVLO", 4); OLED_DrawString("UVCO ", 5);
OLED_DrawTwoNumber(systemSettings.cutoutVoltage, 14 * 4); OLED_DrawTwoNumber(systemSettings.cutoutVoltage, 5);
//OLED_DrawChar('V', 14 * 5); OLED_DrawChar('V', 7);
break; break;
case SLEEP_TEMP: case SLEEP_TEMP:
OLED_DrawString("STMP", 4); OLED_DrawString("STMP ", 5);
OLED_DrawThreeNumber(systemSettings.SleepTemp / 10, 14 * 4); OLED_DrawThreeNumber(systemSettings.SleepTemp / 10, 5);
//OLED_DrawChar('V', 14 * 5);
break; break;
case SLEEP_TIME: case SLEEP_TIME:
OLED_DrawString("STME ", 5); OLED_DrawString("STIME ", 6);
OLED_DrawTwoNumber(systemSettings.SleepTime, 14 * 5); OLED_DrawTwoNumber(systemSettings.SleepTime, 6);
break; break;
case MOTIONDETECT:/*Toggle the mode*/ case MOTIONDETECT:/*Toggle the mode*/
if (systemSettings.movementEnabled) if (systemSettings.movementEnabled)
OLED_DrawString("MOTN T", 7); OLED_DrawString("MOTION T", 8);
else else
OLED_DrawString("MOTN F", 7); 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; break;
default: default:
break; break;
@@ -266,15 +312,20 @@ void DrawUI() {
//The iron is in sleep temp mode //The iron is in sleep temp mode
//Draw in temp and sleep //Draw in temp and sleep
OLED_DrawString("SLP", 3); OLED_DrawString("SLP", 3);
OLED_DrawThreeNumber(temp, 14 * 3); drawTemp(temp, 4);
break; break;
case COOLING: case COOLING:
//We are warning the user the tip is cooling //We are warning the user the tip is cooling
OLED_DrawString("COL", 3); OLED_DrawString("COOL", 4);
OLED_DrawThreeNumber(temp, 14 * 3); drawTemp(temp, 5);
break; break;
case UVLOWARN: case UVLOWARN:
OLED_DrawString("UND VL", 6); OLED_DrawString("LOW VOLT", 8);
break;
case THERMOMETER:
temp = readIronTemp(0, 1);//Force a reading as heater is off
OLED_DrawString("TEMP ", 5);//extra one to it clears the leftover 'L' from IDLE
drawTemp(temp, 5);
break; break;
default: default:
break; break;

View File

@@ -13,38 +13,70 @@
#include "I2C.h" #include "I2C.h"
#include "Font.h" #include "Font.h"
int8_t displayOffset = 32;
/*Setup params for the OLED screen*/ /*Setup params for the OLED screen*/
u8 OLED_Setup_Array[46] = { 0x80, 0xAE, 0x80, 0xD5, 0x80, 0x52, 0x80, 0xA8, /*http://www.displayfuture.com/Display/datasheet/controller/SSD1307.pdf*/
0x80, 0x0f, 0x80, 0xC0, 0x80, 0xD3, 0x80, 0x00, 0x80, 0x40, 0x80, 0xA0, /*All commands are prefixed with 0x80*/
0x80, 0x8D, 0x80, 0x14, 0x80, 0xDA, 0x80, 0x02, 0x80, 0x81, 0x80, 0x33, u8 OLED_Setup_Array[46] = { 0x80, 0xAE,/*Display off*/
0x80, 0xD9, 0x80, 0xF1, 0x80, 0xDB, 0x80, 0x30, 0x80, 0xA4, 0x80, 0XA6, 0x80, 0xD5,/*Set display clock divide ratio / osc freq*/
0x80, 0xAF }; 0x80, 0b01010001,/**/
0x80, 0xA8,/*Set Multiplex Ratio*/
0x80, 16, /*16 == max brightness,39==dimmest*/
0x80, 0xC0,/*Set COM Scan direction*/
0x80, 0xD3,/*Set Display offset*/
0x80, 0x00,/*0 Offset*/
0x80, 0x40,/*Set Display start line to 0*/
0x80, 0xA0,/*Set Segment remap to normal*/
0x80, 0x8D,/*Unknown*/
0x80, 0x14,/**/
0x80, 0xDA,/*Set VCOM Pins hardware config*/
0x80, 0x02,/*Combination 2*/
0x80, 0x81,/*Contrast*/
0x80, 0x33,/*51*/
0x80, 0xD9,/*Set pre-charge period*/
0x80, 0xF1,/**/
0x80, 0xDB,/*Adjust VCOMH regulator ouput*/
0x80, 0x30,/**/
0x80, 0xA4,/*Enable the display GDDR*/
0x80, 0XA6,/*Normal display*/
0x80, 0xAF /*Dispaly on*/
};
/******************************************************************************* /*
Function: Oled_DisplayOn Function: Oled_DisplayOn
Description:Turn on the Oled display Description:Turn on the Oled display
*******************************************************************************/ */
void Oled_DisplayOn(void) { void Oled_DisplayOn(void) {
u8 data[6] = { 0x80, 0X8D, 0x80, 0X14, 0x80, 0XAF }; u8 data[6] = { 0x80, 0X8D, 0x80, 0X14, 0x80, 0XAF };
I2C_PageWrite(data, 6, DEVICEADDR_OLED); I2C_PageWrite(data, 6, DEVICEADDR_OLED);
} }
/******************************************************************************* /*
Function: Oled_DisplayOff Function: Oled_DisplayOff
Description:Turn off the Oled display Description:Turn off the Oled display
*******************************************************************************/ */
void Oled_DisplayOff(void) { void Oled_DisplayOff(void) {
u8 data[6] = { 0x80, 0X8D, 0x80, 0X10, 0x80, 0XAE }; u8 data[6] = { 0x80, 0X8D, 0x80, 0X10, 0x80, 0XAE };
I2C_PageWrite(data, 6, DEVICEADDR_OLED); I2C_PageWrite(data, 6, DEVICEADDR_OLED);
} }
/*
* This sets the OLED screen to invert the screen (flip it vertically)
* This is used if the unit is set to left hand mode
*/
void Oled_DisplayFlip() {
u8 data[2] = { 0x80, 0XC8 };
I2C_PageWrite(data, 2, DEVICEADDR_OLED);
data[1] = 0xA1;
I2C_PageWrite(data, 2, DEVICEADDR_OLED);
displayOffset=0;
/******************************************************************************* }
Function: Data_Command /*
Description: write a command to the Oled display Description: write a command to the Oled display
Input: number of bytes to write, array to write Input: number of bytes to write, array to write
Output: Output:
*******************************************************************************/ */
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[128];
@@ -62,8 +94,9 @@ u8* Data_Command(u8 length, u8* data) {
Input:x,y co-ordinates Input:x,y co-ordinates
*******************************************************************************/ *******************************************************************************/
void Set_ShowPos(u8 x, u8 y) { void Set_ShowPos(u8 x, u8 y) {
u8 pos_param[8] = { 0x80, 0xB0, 0x80, 0x21, 0x80, 0x20, 0x80, 0x7F }; u8 pos_param[8] = { 0x80, 0xB0, 0x80, 0x21, 0x80, 0x00, 0x80, 0x7F };
pos_param[5] = x + 32; //page 0, start add = x(below) through to 0x7F (aka 127)
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);
} }
@@ -128,56 +161,72 @@ 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);
} }
} }
/*
* Draws a string onto the screen starting at the left
*/
void OLED_DrawString(char* string, uint8_t length) { void OLED_DrawString(char* string, uint8_t length) {
for (uint8_t i = 0; i < length; i++) { for (uint8_t i = 0; i < length; i++) {
OLED_DrawChar(string[i], i * 14); OLED_DrawChar(string[i], i);
} }
} }
void OLED_DrawChar(char c, uint8_t x) {
if ((x) > (128 - 14))
return; //Rudimentary clipping to not draw off screen
u8* ptr;
ptr = (u8*) FONT;
if (c >= 'A' && c <= 'Z') {
ptr += (c - 'A' + 10) * (14 * 2); //alpha is ofset 10 chars into the array
} else if (c >= '0' && c <= '9')
ptr += (c - '0') * (14 * 2);
else if (c < 10)
ptr += (c) * (14 * 2);
else if (c == ' ') {
//blank on space bar
ptr += (36) * (14 * 2);
} else if (c == '<') {
ptr += (37) * (14 * 2);
} else if (c == '>') {
ptr += (38) * (14 * 2);
}
Oled_DrawArea(x, 0, 14, 16, (u8*) ptr);
}
/* /*
* Draw a 2 digit number to the display * Draw a char onscreen at letter index x
* */ */
void OLED_DrawTwoNumber(uint8_t in, uint8_t x) { void OLED_DrawChar(char c, uint8_t x) {
OLED_DrawChar((in / 10) % 10, x); if (x > 7)
OLED_DrawChar(in % 10, x + 14); return; //clipping
x *= FONT_WIDTH; //convert to a x coordinate
u8* ptr = (u8*) FONT;
if (c >= 'A' && c <= 'Z') {
ptr += (c - 'A' + 10) * (FONT_WIDTH * 2); //alpha is ofset 10 chars into the array
} else if (c >= '0' && c <= '9')
ptr += (c - '0') * (FONT_WIDTH * 2);
else if (c < 10)
ptr += (c) * (FONT_WIDTH * 2);
else if (c == ' ') {
//blank on space bar
ptr += (36) * (FONT_WIDTH * 2);
} else if (c == '<') {
ptr += (37) * (FONT_WIDTH * 2);
} else if (c == '>') {
ptr += (38) * (FONT_WIDTH * 2);
}else if (c=='.')
{
ptr += (39) * (FONT_WIDTH * 2);
}
Oled_DrawArea(x, 0, FONT_WIDTH, 16, (u8*) ptr);
} }
/*
* Draw a 2 digit number to the display at letter slot x
*/
void OLED_DrawTwoNumber(uint8_t in, uint8_t x) {
OLED_DrawChar((in / 10) % 10, x);
OLED_DrawChar(in % 10, x + 1);
}
/*
* Draw a 3 digit number to the display at letter slot x
*/
void OLED_DrawThreeNumber(uint16_t in, uint8_t x) { void OLED_DrawThreeNumber(uint16_t in, uint8_t x) {
OLED_DrawChar((in / 100) % 10, x); OLED_DrawChar((in / 100) % 10, x);
OLED_DrawChar((in / 10) % 10, x + 14); OLED_DrawChar((in / 10) % 10, x + 1);
OLED_DrawChar(in % 10, x + 28); OLED_DrawChar(in % 10, x + 2);
} }
/*
* Draw a 4 digit number to the display at letter slot x
*/
void OLED_DrawFourNumber(uint16_t in, uint8_t x) { void OLED_DrawFourNumber(uint16_t in, uint8_t x) {
OLED_DrawChar((in / 1000) % 10, x); OLED_DrawChar((in / 1000) % 10, x);
OLED_DrawChar((in / 100) % 10, x + 14); OLED_DrawChar((in / 100) % 10, x + 1);
OLED_DrawChar((in / 10) % 10, x + 28); OLED_DrawChar((in / 10) % 10, x + 2);
OLED_DrawChar(in % 10, x + 42); OLED_DrawChar(in % 10, x + 3);
} }

View File

@@ -8,9 +8,9 @@
*/ */
#include "Settings.h" #include "Settings.h"
#define FLASH_ADDR (0x8000000|48896) #define FLASH_ADDR (0x8000000|48896)/*Flash start OR'ed with the maximum amount of flash - 256 bytes*/
void saveSettings() { void saveSettings() {
//First we erase the flash //First we erase the flash
FLASH_Unlock(); //unlock flash writing FLASH_Unlock(); //unlock flash writing
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
while (FLASH_ErasePage(FLASH_ADDR) != FLASH_COMPLETE) while (FLASH_ErasePage(FLASH_ADDR) != FLASH_COMPLETE)
@@ -26,9 +26,8 @@ void saveSettings() {
void restoreSettings() { void restoreSettings() {
//We read the flash //We read the flash
uint16_t *data = (uint16_t*) &systemSettings; uint16_t *data = (uint16_t*) &systemSettings;
for(uint8_t i=0;i<(sizeof(systemSettings)/2);i++) for (uint8_t i = 0; i < (sizeof(systemSettings) / 2); i++) {
{ data[i] = *(uint16_t *) (FLASH_ADDR + (i * 2));
data[i] = *(uint16_t *)(FLASH_ADDR + (i*2));
} }
//if the version is correct were done //if the version is correct were done
//if not we reset and save //if not we reset and save
@@ -42,11 +41,13 @@ void restoreSettings() {
void resetSettings() { void resetSettings() {
systemSettings.SleepTemp = 900; systemSettings.SleepTemp = 1500; //Temperature the iron sleeps at - default 150.0 C
systemSettings.SleepTime = 1; systemSettings.SleepTime = 1; //How many minutes we wait until going to sleep - default 1 min
systemSettings.SolderingTemp = 3200; systemSettings.SolderingTemp = 3200; //Default soldering temp is 320.0 C
systemSettings.movementEnabled = 1; //we use movement detection systemSettings.movementEnabled = 1; //we use movement detection by default
systemSettings.cutoutVoltage = 9; systemSettings.cutoutVoltage = 10; //10V is the minium cutout voltage as the unit V measurement is unstable below 9.5V
systemSettings.version=SETTINGSVERSION; systemSettings.version = SETTINGSVERSION; //Store the version number to allow for easier upgrades
systemSettings.displayTempInF =0; //default to C
systemSettings.flipDisplay=0; //Default to right handed mode
} }