With Apple recently announcing their horrible smart watch, I thought it’s only fair if hardware hobbyists also get the chance to build their own. Obviously being a student at current it can’t be too expensive. Where possible, I have cut corners to the extreme to try and make sure I don’t break the bank with this little experiment and more importantly so that others can do it too.
I’ll aim to add to this project when I learn more about what I’m actually doing and as with all of this, when I get spare time!
Code
This is the code I have so far, it’s a work in progress as everything is but it should work reasonably well… As you can probably tell, it doesn’t actually do it’s job yet!
0001 /*
0002 Scrolling text example code
0003 Modified from: http://www.arduino.cc/playground/Code/PCD8544
0004 */
0005
0006 // The pins to use on the arduino
0007 #define PIN_BACK 4
0008 #define PIN_RESET 5//6
0009 #define PIN_DC 2//5
0010 #define PIN_SDIN 1//4
0011 #define PIN_SCLK 0//3
0012
0013 // Configuration for the LCD
0014 #define LCD_C LOW
0015 #define LCD_D HIGH
0016 #define LCD_CMD 0
0017
0018 // Size of the LCD
0019 #define LCD_X 84
0020 #define LCD_Y 48
0021
0022 int scrollPosition = -10;
0023
0024 static const byte ASCII[][5] =
0025 {
0026 {0x00, 0x00, 0x00, 0x00, 0x00} // 20
0027 ,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !
0028 ,{0x00, 0x07, 0x00, 0x07, 0x00} // 22 "
0029 ,{0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 #
0030 ,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $
0031 ,{0x23, 0x13, 0x08, 0x64, 0x62} // 25 %
0032 ,{0x36, 0x49, 0x55, 0x22, 0x50} // 26 &
0033 ,{0x00, 0x05, 0x03, 0x00, 0x00} // 27 '
0034 ,{0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (
0035 ,{0x00, 0x41, 0x22, 0x1c, 0x00} // 29 )
0036 ,{0x14, 0x08, 0x3e, 0x08, 0x14} // 2a *
0037 ,{0x08, 0x08, 0x3e, 0x08, 0x08} // 2b +
0038 ,{0x00, 0x50, 0x30, 0x00, 0x00} // 2c ,
0039 ,{0x08, 0x08, 0x08, 0x08, 0x08} // 2d -
0040 ,{0x00, 0x60, 0x60, 0x00, 0x00} // 2e .
0041 ,{0x20, 0x10, 0x08, 0x04, 0x02} // 2f /
0042 ,{0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0
0043 ,{0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1
0044 ,{0x42, 0x61, 0x51, 0x49, 0x46} // 32 2
0045 ,{0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3
0046 ,{0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4
0047 ,{0x27, 0x45, 0x45, 0x45, 0x39} // 35 5
0048 ,{0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6
0049 ,{0x01, 0x71, 0x09, 0x05, 0x03} // 37 7
0050 ,{0x36, 0x49, 0x49, 0x49, 0x36} // 38 8
0051 ,{0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9
0052 ,{0x00, 0x36, 0x36, 0x00, 0x00} // 3a :
0053 ,{0x00, 0x56, 0x36, 0x00, 0x00} // 3b ;
0054 ,{0x08, 0x14, 0x22, 0x41, 0x00} // 3c <
0055 ,{0x14, 0x14, 0x14, 0x14, 0x14} // 3d =
0056 ,{0x00, 0x41, 0x22, 0x14, 0x08} // 3e >
0057 ,{0x02, 0x01, 0x51, 0x09, 0x06} // 3f ?
0058 ,{0x32, 0x49, 0x79, 0x41, 0x3e} // 40 @
0059 ,{0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A
0060 ,{0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B
0061 ,{0x3e, 0x41, 0x41, 0x41, 0x22} // 43 C
0062 ,{0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D
0063 ,{0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E
0064 ,{0x7f, 0x09, 0x09, 0x09, 0x01} // 46 F
0065 ,{0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G
0066 ,{0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H
0067 ,{0x00, 0x41, 0x7f, 0x41, 0x00} // 49 I
0068 ,{0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J
0069 ,{0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K
0070 ,{0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L
0071 ,{0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M
0072 ,{0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N
0073 ,{0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O
0074 ,{0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P
0075 ,{0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q
0076 ,{0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R
0077 ,{0x46, 0x49, 0x49, 0x49, 0x31} // 53 S
0078 ,{0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T
0079 ,{0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U
0080 ,{0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V
0081 ,{0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W
0082 ,{0x63, 0x14, 0x08, 0x14, 0x63} // 58 X
0083 ,{0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y
0084 ,{0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z
0085 ,{0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [
0086 ,{0x02, 0x04, 0x08, 0x10, 0x20} // 5c ¥
0087 ,{0x00, 0x41, 0x41, 0x7f, 0x00} // 5d ]
0088 ,{0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^
0089 ,{0x40, 0x40, 0x40, 0x40, 0x40} // 5f _
0090 ,{0x00, 0x01, 0x02, 0x04, 0x00} // 60 `
0091 ,{0x20, 0x54, 0x54, 0x54, 0x78} // 61 a
0092 ,{0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b
0093 ,{0x38, 0x44, 0x44, 0x44, 0x20} // 63 c
0094 ,{0x38, 0x44, 0x44, 0x48, 0x7f} // 64 d
0095 ,{0x38, 0x54, 0x54, 0x54, 0x18} // 65 e
0096 ,{0x08, 0x7e, 0x09, 0x01, 0x02} // 66 f
0097 ,{0x0c, 0x52, 0x52, 0x52, 0x3e} // 67 g
0098 ,{0x7f, 0x08, 0x04, 0x04, 0x78} // 68 h
0099 ,{0x00, 0x44, 0x7d, 0x40, 0x00} // 69 i
0100 ,{0x20, 0x40, 0x44, 0x3d, 0x00} // 6a j
0101 ,{0x7f, 0x10, 0x28, 0x44, 0x00} // 6b k
0102 ,{0x00, 0x41, 0x7f, 0x40, 0x00} // 6c l
0103 ,{0x7c, 0x04, 0x18, 0x04, 0x78} // 6d m
0104 ,{0x7c, 0x08, 0x04, 0x04, 0x78} // 6e n
0105 ,{0x38, 0x44, 0x44, 0x44, 0x38} // 6f o
0106 ,{0x7c, 0x14, 0x14, 0x14, 0x08} // 70 p
0107 ,{0x08, 0x14, 0x14, 0x18, 0x7c} // 71 q
0108 ,{0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r
0109 ,{0x48, 0x54, 0x54, 0x54, 0x20} // 73 s
0110 ,{0x04, 0x3f, 0x44, 0x40, 0x20} // 74 t
0111 ,{0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u
0112 ,{0x1c, 0x20, 0x40, 0x20, 0x1c} // 76 v
0113 ,{0x3c, 0x40, 0x30, 0x40, 0x3c} // 77 w
0114 ,{0x44, 0x28, 0x10, 0x28, 0x44} // 78 x
0115 ,{0x0c, 0x50, 0x50, 0x50, 0x3c} // 79 y
0116 ,{0x44, 0x64, 0x54, 0x4c, 0x44} // 7a z
0117 ,{0x00, 0x08, 0x36, 0x41, 0x00} // 7b {
0118 ,{0x00, 0x00, 0x7f, 0x00, 0x00} // 7c |
0119 ,{0x00, 0x41, 0x36, 0x08, 0x00} // 7d }
0120 ,{0x10, 0x08, 0x08, 0x10, 0x08} // 7e ←
0121 ,{0x00, 0x06, 0x09, 0x09, 0x06} // 7f →
0122 };
0123
0124 void LcdCharacter(char character){
0125 LcdWrite(LCD_D, 0x00);
0126 for(int index = 0; index < 5; index++)
0127 LcdWrite(LCD_D, ASCII[character - 0x20][index]);
0128 LcdWrite(LCD_D, 0x00);
0129 }
0130
0131 void LcdClear(void){
0132 for(int index = 0; index < LCD_X * LCD_Y / 8; index++)
0133 LcdWrite(LCD_D, 0x00);
0134 }
0135
0136 void LcdInitialise(void){
0137 pinMode(PIN_BACK, OUTPUT);
0138 pinMode(PIN_RESET, OUTPUT);
0139 pinMode(PIN_DC, OUTPUT);
0140 pinMode(PIN_SDIN, OUTPUT);
0141 pinMode(PIN_SCLK, OUTPUT);
0142
0143 digitalWrite(PIN_RESET, LOW);
0144 digitalWrite(PIN_RESET, HIGH);
0145
0146 LcdWrite(LCD_CMD, 0x21); // LCD Extended Commands.
0147 LcdWrite(LCD_CMD, 0x98); // Set LCD Vop (Contrast). //B1
0148 LcdWrite(LCD_CMD, 0x04); // Set Temp coefficent. //0x04
0149 LcdWrite(LCD_CMD, 0x14); // LCD bias mode 1:48. //0x13
0150 LcdWrite(LCD_CMD, 0x0C); // LCD in normal mode. 0x0d for inverse
0151 LcdWrite(LCD_C, 0x20);
0152 LcdWrite(LCD_C, 0x0C);
0153 }
0154
0155 void LcdString(char *characters){
0156 while (*characters){
0157 LcdCharacter(*characters++);
0158 }
0159 }
0160
0161 void LcdWrite(byte dc, byte data){
0162 digitalWrite(PIN_DC, dc);
0163 shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data);
0164 }
0165
0166 /**
0167 * gotoXY routine to position cursor
0168 * x - range: 0 to 84
0169 * y - range: 0 to 5
0170 **/
0171 void gotoXY(int x, int y){
0172 LcdWrite( 0, 0x80 | x); // Column.
0173 LcdWrite( 0, 0x40 | y); // Row.
0174 }
0175
0176 void drawBox(void){
0177 int j;
0178 for(j = 0; j < 84; j++){ // top
0179 gotoXY(j, 0);
0180 LcdWrite(1, 0x01);
0181 }
0182
0183 for(j = 0; j < 84; j++){ //Bottom
0184 gotoXY(j, 5);
0185 LcdWrite(1, 0x80);
0186 }
0187
0188 for(j = 0; j < 6; j++){ // Right
0189 gotoXY(83, j);
0190 LcdWrite(1, 0xff);
0191 }
0192
0193 for(j = 0; j < 6; j++){ // Left
0194 gotoXY(0, j);
0195 LcdWrite(1, 0xff);
0196 }
0197 }
0198
0199 void setup(void){
0200 LcdInitialise();
0201 LcdClear();
0202 drawBox();
0203
0204 gotoXY(5,1);
0205 LcdString("><><><><><><");
0206 gotoXY(5,2);
0207 LcdString("B[]Arrayx");;
0208 }
0209
0210 void loop(void){
0211 gotoXY(5,3);
0212 int mins = millis() / 1000;
0213 String val = String(mins);
0214 val += "\0";
0215 char buffer[10];
0216 val.toCharArray(buffer, 10u);
0217 LcdString(buffer);
0218 digitalWrite(PIN_BACK, HIGH);
0219 delay(250);
0220 }