1
0
forked from me/IronOS

Add FlipDisplay, Fahrenheit, Better Font

This commit is contained in:
Ben V. Brown
2016-10-03 19:01:57 +11:00
parent acb97f1d46
commit 0bbdda5b55
9 changed files with 310 additions and 215 deletions

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

@@ -27,7 +27,7 @@ enum {
} 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,16 +12,15 @@
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
@@ -32,10 +31,12 @@ void setup()
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
Clear_Screen(); //clear the display buffer to black
setupPID(); //init the PID values setupPID(); //init the PID values
readIronTemp(239, 0); //load the default calibration value readIronTemp(239, 0); //load the default calibration value
restoreSettings(); //Load settings restoreSettings(); //Load settings
if (systemSettings.flipDisplay)
Oled_DisplayFlip();
OLED_DrawString("VER 1.01",8);
delayMs(800);
Start_Watchdog(1000); //start the system watchdog as 1 seconds timeout Start_Watchdog(1000); //start the system watchdog as 1 seconds timeout
} }

View File

@@ -81,23 +81,25 @@ 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
@@ -105,13 +107,11 @@ void ProcessUI() {
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 +120,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;
} }
@@ -190,9 +196,20 @@ void ProcessUI() {
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 +220,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() < 500) {
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 +300,15 @@ 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, 3);
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", 3);
OLED_DrawThreeNumber(temp, 14 * 3); drawTemp(temp, 4);
break; break;
case UVLOWARN: case UVLOWARN:
OLED_DrawString("UND VL", 6); OLED_DrawString("LOW VOLT", 8);
break; break;
default: default:
break; break;

View File

@@ -13,38 +13,70 @@
#include "I2C.h" #include "I2C.h"
#include "Font.h" #include "Font.h"
u8 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 fo righty*/
pos_param[1] += y; pos_param[1] += y;
I2C_PageWrite(pos_param, 8, DEVICEADDR_OLED); I2C_PageWrite(pos_param, 8, DEVICEADDR_OLED);
} }
@@ -133,51 +166,67 @@ void Clear_Screen(void) {
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
} }