{"id":19,"date":"2010-06-13T13:57:00","date_gmt":"2010-06-13T13:57:00","guid":{"rendered":"http:\/\/paulsarduino.co.uk\/?page_id=19"},"modified":"2010-06-13T14:19:45","modified_gmt":"2010-06-13T14:19:45","slug":"thermometer-and-clock-source-code","status":"publish","type":"page","link":"https:\/\/paulsarduino.co.uk\/?page_id=19","title":{"rendered":"Thermometer and Clock"},"content":{"rendered":"<pre>\/*<\/pre>\n<pre>\u00a0 Thermometer and Clock\r\n\u00a0\u00a0 \u00a0\r\n\u00a0 LCD part based on previous examples by Tomek and Dojodave\r\n*\/\r\n\r\n#include &lt;Wire.h&gt;\r\n\r\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n\/*\r\n\u00a0 Temperature module commands and registers over I2C\r\n*\/ \u00a0\r\nint\u00a0 TMP_RD = 0x91;\r\nint\u00a0 TMP_WR = 0x90; \/\/Assume ADR0 is tied to VCC\r\nint\u00a0 TEMP_REG = 0x00;\r\nint\u00a0 TEMP_ADDR = 0b1001000;\r\n\r\nint ReadTemperature()\r\n{\r\n\u00a0 int\u00a0 val_h = 0;\r\n\u00a0 int\u00a0 val_l = 0;\r\n\u00a0\r\n\u00a0 Wire.requestFrom(TEMP_ADDR, 2);\r\n\u00a0 val_h = Wire.receive();\r\n\u00a0 val_l = Wire.receive();\r\n\u00a0\u00a0 \u00a0\r\n\u00a0 \/\/\u00a0 convert temp reading into degrees C\r\n\u00a0 int tempint = ((val_h &lt;&lt; 8) | val_l) &gt;&gt; 4;\u00a0\u00a0 \u00a0\u00a0 \/\/ combine and shift\r\n\u00a0 float tempflt = float( tempint ) * .0625;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ calculate actual temperature per chip doc\r\n\u00a0 return int(tempflt);\r\n}\r\n\r\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n\/*\r\n\u00a0\u00a0 Clock functions\r\n*\/\u00a0 \u00a0\r\n\r\n\/\/ adjust button digital pins\r\nint\u00a0 HOURS = 9;\r\nint\u00a0 MINS = 8;\r\n\r\n\/\/ our base milliseconds count and corresponding time\r\nunsigned long\u00a0\u00a0\u00a0 ulBaseMillis = 0;\r\nint\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 iBaseH = 0;\r\nint\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 iBaseM = 0;\r\nint\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 iBaseS = 0;\r\nunsigned long\u00a0\u00a0\u00a0 ulLastMillis = 0;\r\nint\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 iLastH = 0;\r\nint\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 iLastM = 0;\r\nint\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 iLastS = 0;\r\n\r\nunsigned long\u00a0\u00a0 ulmSperS = 1000;\r\nunsigned long\u00a0\u00a0 ulmSperM = (ulmSperS * 60);\r\nunsigned long\u00a0\u00a0 ulmSperH = (ulmSperM * 60);\r\n\r\nvoid PrintDigits(int iVal)\r\n{\r\n\u00a0 \/\/ utility function for digital clock display: prints colon and leading 0\r\n\u00a0 if (iVal &lt; 10)\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 LcdDataWrite('0');\r\n\u00a0 }\r\n\u00a0 LcdNumberWrite(iVal);\r\n}\r\n\r\nboolean ClockAdjust()\r\n{\r\n\u00a0 boolean\u00a0\u00a0\u00a0 bRet = false;\r\n\u00a0 if (digitalRead(HOURS) == LOW)\u00a0\u00a0 \/\/ read the input switch\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 iBaseH++;\r\n\u00a0\u00a0\u00a0 if (iBaseH &gt; 23)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 iBaseH = 0;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 bRet = true;\r\n\u00a0 }\r\n\u00a0 if (digitalRead(MINS) == LOW)\u00a0\u00a0 \/\/ read the input switch\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 iBaseM++;\r\n\u00a0\u00a0\u00a0 if (iBaseM &gt; 59)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 iBaseM = 0;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 bRet = true;\r\n\u00a0 }\r\n\u00a0 return bRet; \/\/ did we adjust\r\n}\r\n\r\n\/\/ calc time difference from start and carry on\r\n\/\/ we always recalc from scratch to avoid creep\r\nvoid ClockDisplay()\r\n{\r\n\u00a0 unsigned long\u00a0 ulNow = millis(); \u00a0\r\n\u00a0 unsigned long\u00a0 ulDiff = ulNow - ulBaseMillis;\r\n\r\n\u00a0 if (ulNow &lt; ulLastMillis)\u00a0\u00a0\u00a0 \/\/ deal with wrap\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 ulDiff = (4294967295 - ulLastMillis) + ulNow;\r\n\u00a0\u00a0\u00a0 ulBaseMillis = ulLastMillis;\r\n\u00a0\u00a0\u00a0 iBaseH = iLastH;\r\n\u00a0\u00a0\u00a0 iBaseM = iLastM;\r\n\u00a0\u00a0\u00a0 iBaseS = iLastS;\r\n\u00a0\u00a0\u00a0 ulNow = ulBaseMillis + ulDiff;\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ time since last time we knew\r\n\u00a0 }\r\n\r\n\u00a0 \/\/ calc hms since base\r\n\u00a0 int iHours = ulDiff \/ ulmSperH;\r\n\u00a0 int iMins = (ulDiff - (iHours * ulmSperH)) \/ ulmSperM;\r\n\u00a0 int iSecs = (ulDiff - (iHours * ulmSperH) - (iMins * ulmSperM)) \/ ulmSperS;\r\n\r\n\u00a0 int\u00a0\u00a0\u00a0\u00a0\u00a0 iH = iBaseH + iHours;\r\n\u00a0 int\u00a0\u00a0\u00a0\u00a0\u00a0 iM = iBaseM + iMins;\r\n\u00a0 int\u00a0\u00a0\u00a0\u00a0\u00a0 iS = iBaseS + iSecs;\r\n\r\n\u00a0 if (iS &gt; 59)\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 iM += iS\/60;\r\n\u00a0\u00a0\u00a0 iS = iS % 60;\r\n\u00a0 }\r\n\u00a0 if (iM &gt; 59)\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 iH += iM\/60;\r\n\u00a0\u00a0\u00a0 iM = iM % 60;\r\n\u00a0 }\r\n\u00a0 if (iH &gt; 23)\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 iH = iH % 24;\r\n\u00a0 }\r\n\u00a0\r\n\u00a0 \/\/ remember so we can cope with a wrap\r\n\u00a0 ulLastMillis = ulNow;\r\n\u00a0 iLastH = iH;\r\n\u00a0 iLastM = iM;\r\n\u00a0 iLastS = iS;\r\n\u00a0\r\n\u00a0 \/\/ move to pos\r\n\u00a0 LcdPosition(1,0);\r\n\u00a0 PrintDigits(iH);\r\n\u00a0 LcdDataWrite(':');\r\n\u00a0 PrintDigits(iM);\r\n\u00a0 LcdDataWrite(':');\r\n\u00a0 PrintDigits(iS); \u00a0\r\n}\r\n\r\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\r\n\/*\r\n\u00a0\u00a0 LCD functions\r\n*\/ \u00a0\r\n\r\n\/\/ pins to be used on Arduino for LCD display\r\nint DOUT = 11;\r\nint STR = 12;\r\nint CLK = 10;\r\n\r\n\/\/ the Qx in the order they are connected on the chip\r\nint RS = 0x40;\r\nint RW = 0x20;\r\nint EnableSet = 0x10;\r\nint EnableClr = 0xEF;\r\nint DMASK = 0x0F;\r\n\r\n\/\/ shift byte and strobe to display\r\nvoid sendByteOut(int value)\r\n{\r\n\u00a0 digitalWrite(STR,LOW);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ set the strobe LOW\r\n\u00a0 shiftOut(DOUT, CLK, LSBFIRST, value);\r\n\u00a0 digitalWrite(STR, HIGH);\r\n\u00a0 delayMicroseconds(100);\r\n\u00a0 digitalWrite(STR,LOW);\r\n}\r\n\r\nvoid LcdClockByte(int output)\r\n{\r\n\u00a0 output &amp;= EnableClr;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ set Enable LOW\r\n\u00a0 sendByteOut(output);\r\n\u00a0 delayMicroseconds(2);\r\n\u00a0 output |= EnableSet;\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Set Enable HIGH\r\n\u00a0 sendByteOut(output);\r\n\u00a0 delayMicroseconds(2);\r\n\u00a0 output &amp;= EnableClr;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ set Enable LOW\r\n\u00a0 sendByteOut(output); \u00a0\r\n\u00a0 delayMicroseconds(100);\r\n}\r\n\r\nvoid LcdWrite(int value, boolean bData)\r\n{\r\n\u00a0 int iData = bData ? RS : 0;\r\n\u00a0 int output = value &gt;&gt; 4;\u00a0\u00a0\u00a0\u00a0 \/\/send the upper\u00a0 4 databits (from 8)\r\n\u00a0\r\n\u00a0 output |= iData;\r\n\u00a0 LcdClockByte(output);\r\n\r\n\u00a0 output = value &amp; 0x0F;\u00a0\u00a0 \/\/ send lower 4 bytes\r\n\u00a0 output |= iData;\r\n\u00a0 LcdClockByte(output);\r\n}\r\n\r\nvoid LcdCommandWrite(int value)\r\n{\r\n\u00a0 LcdWrite(value,false);\r\n}\r\n\r\nvoid LcdDataWrite(int value)\r\n{\r\n\u00a0 LcdWrite(value,true);\r\n}\r\n\r\nvoid LcdInit()\r\n{\r\n\u00a0 delay(100);\r\n\u00a0 \/\/ initialize LCD after a short pause\r\n\u00a0 \/\/ 4 pin initialization - needed twice\r\n\u00a0 LcdCommandWrite(0x28); \/\/ function set: 4 pin initialization, 2 lines, 5x8 characters\r\n\u00a0 delay(10);\r\n\u00a0 LcdCommandWrite(0x28); \/\/ function set: 4 pin initialization, 2 lines, 5x8 characters\r\n\u00a0 delay(10);\r\n\u00a0 LcdCommandWrite(0x0C); \/\/ display on:\u00a0 on with no cursor\r\n\u00a0 delay(10);\r\n\u00a0 LcdCommandWrite(0x01); \/\/ clear display\r\n\u00a0 delay(10);\r\n\u00a0 LcdCommandWrite(0x06); \/\/ entry mode set: increment automatically, no display shift\r\n\u00a0 delay(10);\r\n\u00a0 LcdCommandWrite(0x80); \/\/ display control: address top left\r\n\u00a0 delay(10);\r\n}\r\n\r\n\/\/ checks out how many digits there are in a number, keep dividing by 10 until there's nothing left\r\nint countDigits(int nr)\r\n{\r\n\u00a0 int\u00a0 iNum = 0;\r\n\u00a0\r\n\u00a0 while (nr &gt; 0)\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 iNum++;\r\n\u00a0\u00a0\u00a0 nr = nr\/10;\r\n\u00a0 }\r\n\u00a0 return iNum;\r\n}\r\n\r\n\/\/ this function help us to write numbers with more than one digit\r\n\/\/ up to 20\r\nvoid LcdNumberWrite(int nr)\r\n{\r\n\u00a0 int\u00a0 iDigits;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ how many digits\r\n\u00a0 int\u00a0 iIndex;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0 int\u00a0 cNum[20];\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ build number in here\r\n\u00a0\r\n\u00a0 if (nr == 0)\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 LcdDataWrite('0');\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ zero is a special case\r\n\u00a0 }\r\n\u00a0 else\r\n\u00a0 {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ if negative write a minus sign\r\n\u00a0\u00a0\u00a0 if (nr &lt; 0)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 LcdDataWrite('-');\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\r\n\u00a0\u00a0\u00a0 nr = abs(nr);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ make positive\r\n\u00a0\u00a0\u00a0 iDigits = countDigits(nr);\u00a0\u00a0\u00a0\u00a0 \/\/ count number of digits\r\n\u00a0\u00a0\u00a0 iIndex = iDigits-1;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ start at the end\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 while (nr &gt; 0)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ store each digit working up the powers of 10\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 cNum[iIndex] = '0' + (nr % 10);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 nr = nr\/10;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 iIndex--;\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0 \/\/ now write all the digits out\r\n\u00a0\u00a0\u00a0 for(iIndex = 0; iIndex &lt; iDigits; iIndex++)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 LcdDataWrite(cNum[iIndex]);\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0 }\r\n}\r\n\r\n\/\/ write a string from an array\r\nvoid LcdWriteString(int* msg, int len)\r\n{\r\n\u00a0 for (int count = 0; count &lt; len; count++)\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 LcdDataWrite(msg[count]);\r\n\u00a0 }\r\n}\r\n\r\n\/\/ position the cursor\r\nvoid LcdPosition(int iRow, int iCol)\r\n{\r\n\u00a0 int\u00a0 iPos = ((iRow * 0x40) + iCol) | 0x80;\r\n\u00a0 LcdCommandWrite(iPos);\r\n}\r\n\r\nvoid setup (void)\r\n{\r\n\u00a0 int msg[] = {'T','i','m','e',' ',' ',' ',' ',' ',' ',' ',' ','T','e','m','p'};\r\n\u00a0\r\n\u00a0 Serial.begin(9600);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ for debug\r\n\r\n\u00a0 pinMode(CLK,OUTPUT);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ LCD control lines\r\n\u00a0 pinMode(DOUT,OUTPUT);\r\n\u00a0 pinMode(STR,OUTPUT);\r\n\r\n\u00a0 pinMode(HOURS,INPUT);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ hours adjust switch\r\n\u00a0 digitalWrite(HOURS, HIGH);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ turn on pullup resistor\r\n\u00a0 pinMode(MINS,INPUT);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ mins adjust switch\r\n\u00a0 digitalWrite(MINS, HIGH);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ turn on pullup resistor\r\n\r\n\u00a0 LcdInit();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ set up the LCD\r\n\u00a0 delay(20);\r\n\u00a0 LcdCommandWrite(0x01);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ clear screen \u00a0\r\n\u00a0 delay(20);\r\n\u00a0 LcdCommandWrite(0x02);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ set cursor position to zero\r\n\u00a0 delay(20);\r\n\u00a0 LcdWriteString(msg,16);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ show our titles\r\n\u00a0\r\n\u00a0 \/\/ begin wire library and set address to temp register\r\n\u00a0 Wire.begin(); \u00a0\r\n\u00a0 Wire.beginTransmission(TEMP_ADDR);\r\n\u00a0 Wire.send(TEMP_REG);\r\n\u00a0 Wire.endTransmission();\r\n\u00a0\r\n}\r\n\r\nvoid loop (void)\r\n{ \u00a0\r\n\u00a0 int temp;\r\n\r\n\u00a0 ClockDisplay();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Show the time\r\n\u00a0 ClockAdjust();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Make any time adjustments\r\n\u00a0\r\n\u00a0 temp = ReadTemperature();\u00a0\u00a0\u00a0\u00a0 \/\/ read the temperature\r\n\u00a0 LcdPosition(1,11);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ position on second row character 8 \u00a0\r\n\u00a0 if (temp &gt;= 0)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ if its positive\r\n\u00a0 {\r\n\u00a0\u00a0\u00a0 LcdDataWrite(' ');\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ insert a space as no minus sign\r\n\u00a0 }\r\n\u00a0 LcdNumberWrite(temp);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ write the temp value\r\n\u00a0 LcdDataWrite(0xDF);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ degree symbol\r\n\u00a0 LcdDataWrite('C');\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ centigrade\r\n\u00a0\r\n\u00a0 delay(200);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ laze about a bit\r\n}\r\n<\/pre>\n<div id=\"_mcePaste\" style=\"overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;\">\n<pre>\/*<\/pre>\n<pre>\u00a0 Thermometer and Clock<\/pre>\n<pre>\u00a0 LCD part based on previous examples by Tomek and Dojodave<\/pre>\n<pre>*\/<\/pre>\n<pre>#include &lt;Wire.h&gt;<\/pre>\n<pre>\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<\/pre>\n<pre>\/*<\/pre>\n<pre>\u00a0 Temperature module commands and registers over I2C<\/pre>\n<pre>*\/<\/pre>\n<pre>int\u00a0 TMP_RD = 0x91;<\/pre>\n<pre>int\u00a0 TMP_WR = 0x90; \/\/Assume ADR0 is tied to VCC<\/pre>\n<pre>int\u00a0 TEMP_REG = 0x00;<\/pre>\n<pre>int\u00a0 TEMP_ADDR = 0b1001000;<\/pre>\n<pre>int ReadTemperature()<\/pre>\n<pre>{<\/pre>\n<pre>\u00a0 int\u00a0 val_h = 0;<\/pre>\n<pre>\u00a0 int\u00a0 val_l = 0;<\/pre>\n<pre>\u00a0 Wire.requestFrom(TEMP_ADDR, 2);<\/pre>\n<pre>\u00a0 val_h = Wire.receive();<\/pre>\n<pre>\u00a0 val_l = Wire.receive();<\/pre>\n<pre>\u00a0 \/\/\u00a0 convert temp reading into degrees C<\/pre>\n<pre>\u00a0 int tempint = ((val_h &lt;&lt; 8) | val_l) &gt;&gt; 4;\u00a0\u00a0 \u00a0\u00a0 \/\/ combine and shift<\/pre>\n<pre>\u00a0 float tempflt = float( tempint ) * .0625;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ calculate actual temperature per chip doc<\/pre>\n<pre>\u00a0 return int(tempflt);<\/pre>\n<pre>}<\/pre>\n<pre>\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<\/pre>\n<pre>\/*<\/pre>\n<pre>\u00a0\u00a0 Clock functions<\/pre>\n<pre>*\/<\/pre>\n<pre>\/\/ adjust button digital pins<\/pre>\n<pre>int\u00a0 HOURS = 9;<\/pre>\n<pre>int\u00a0 MINS = 8;<\/pre>\n<pre>\/\/ our base milliseconds count and corresponding time<\/pre>\n<pre>unsigned long\u00a0\u00a0\u00a0 ulBaseMillis = 0;<\/pre>\n<pre>int\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 iBaseH = 0;<\/pre>\n<pre>int\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 iBaseM = 0;<\/pre>\n<pre>int\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 iBaseS = 0;<\/pre>\n<pre>unsigned long\u00a0\u00a0\u00a0 ulLastMillis = 0;<\/pre>\n<pre>int\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 iLastH = 0;<\/pre>\n<pre>int\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 iLastM = 0;<\/pre>\n<pre>int\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 iLastS = 0;<\/pre>\n<pre>unsigned long\u00a0\u00a0 ulmSperS = 1000;<\/pre>\n<pre>unsigned long\u00a0\u00a0 ulmSperM = (ulmSperS * 60);<\/pre>\n<pre>unsigned long\u00a0\u00a0 ulmSperH = (ulmSperM * 60);<\/pre>\n<pre>void PrintDigits(int iVal)<\/pre>\n<pre>{<\/pre>\n<pre>\u00a0 \/\/ utility function for digital clock display: prints colon and leading 0<\/pre>\n<pre>\u00a0 if (iVal &lt; 10)<\/pre>\n<pre>\u00a0 {<\/pre>\n<pre>\u00a0\u00a0\u00a0 LcdDataWrite('0');<\/pre>\n<pre>\u00a0 }<\/pre>\n<pre>\u00a0 LcdNumberWrite(iVal);<\/pre>\n<pre>}<\/pre>\n<pre>boolean ClockAdjust()<\/pre>\n<pre>{<\/pre>\n<pre>\u00a0 boolean\u00a0\u00a0\u00a0 bRet = false;<\/pre>\n<pre>\u00a0 if (digitalRead(HOURS) == LOW)\u00a0\u00a0 \/\/ read the input switch<\/pre>\n<pre>\u00a0 {<\/pre>\n<pre>\u00a0\u00a0\u00a0 iBaseH++;<\/pre>\n<pre>\u00a0\u00a0\u00a0 if (iBaseH &gt; 23)<\/pre>\n<pre>\u00a0\u00a0\u00a0 {<\/pre>\n<pre>\u00a0\u00a0\u00a0\u00a0\u00a0 iBaseH = 0;<\/pre>\n<pre>\u00a0\u00a0\u00a0 }<\/pre>\n<pre>\u00a0\u00a0\u00a0 bRet = true;<\/pre>\n<pre>\u00a0 }<\/pre>\n<pre>\u00a0 if (digitalRead(MINS) == LOW)\u00a0\u00a0 \/\/ read the input switch<\/pre>\n<pre>\u00a0 {<\/pre>\n<pre>\u00a0\u00a0\u00a0 iBaseM++;<\/pre>\n<pre>\u00a0\u00a0\u00a0 if (iBaseM &gt; 59)<\/pre>\n<pre>\u00a0\u00a0\u00a0 {<\/pre>\n<pre>\u00a0\u00a0\u00a0\u00a0\u00a0 iBaseM = 0;<\/pre>\n<pre>\u00a0\u00a0\u00a0 }<\/pre>\n<pre>\u00a0\u00a0\u00a0 bRet = true;<\/pre>\n<pre>\u00a0 }<\/pre>\n<pre>\u00a0 return bRet; \/\/ did we adjust<\/pre>\n<pre>}<\/pre>\n<pre>\/\/ calc time difference from start and carry on<\/pre>\n<pre>\/\/ we always recalc from scratch to avoid creep<\/pre>\n<pre>void ClockDisplay()<\/pre>\n<pre>{<\/pre>\n<pre>\u00a0 unsigned long\u00a0 ulNow = millis();<\/pre>\n<pre>\u00a0 unsigned long\u00a0 ulDiff = ulNow - ulBaseMillis;<\/pre>\n<pre>\u00a0 if (ulNow &lt; ulLastMillis)\u00a0\u00a0\u00a0 \/\/ deal with wrap<\/pre>\n<pre>\u00a0 {<\/pre>\n<pre>\u00a0\u00a0\u00a0 ulDiff = (4294967295 - ulLastMillis) + ulNow;<\/pre>\n<pre>\u00a0\u00a0\u00a0 ulBaseMillis = ulLastMillis;<\/pre>\n<pre>\u00a0\u00a0\u00a0 iBaseH = iLastH;<\/pre>\n<pre>\u00a0\u00a0\u00a0 iBaseM = iLastM;<\/pre>\n<pre>\u00a0\u00a0\u00a0 iBaseS = iLastS;<\/pre>\n<pre>\u00a0\u00a0\u00a0 ulNow = ulBaseMillis + ulDiff;\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ time since last time we knew<\/pre>\n<pre>\u00a0 }<\/pre>\n<pre>\u00a0 \/\/ calc hms since base<\/pre>\n<pre>\u00a0 int iHours = ulDiff \/ ulmSperH;<\/pre>\n<pre>\u00a0 int iMins = (ulDiff - (iHours * ulmSperH)) \/ ulmSperM;<\/pre>\n<pre>\u00a0 int iSecs = (ulDiff - (iHours * ulmSperH) - (iMins * ulmSperM)) \/ ulmSperS;<\/pre>\n<pre>\u00a0 int\u00a0\u00a0\u00a0\u00a0\u00a0 iH = iBaseH + iHours;<\/pre>\n<pre>\u00a0 int\u00a0\u00a0\u00a0\u00a0\u00a0 iM = iBaseM + iMins;<\/pre>\n<pre>\u00a0 int\u00a0\u00a0\u00a0\u00a0\u00a0 iS = iBaseS + iSecs;<\/pre>\n<pre>\u00a0 if (iS &gt; 59)<\/pre>\n<pre>\u00a0 {<\/pre>\n<pre>\u00a0\u00a0\u00a0 iM += iS\/60;<\/pre>\n<pre>\u00a0\u00a0\u00a0 iS = iS % 60;<\/pre>\n<pre>\u00a0 }<\/pre>\n<pre>\u00a0 if (iM &gt; 59)<\/pre>\n<pre>\u00a0 {<\/pre>\n<pre>\u00a0\u00a0\u00a0 iH += iM\/60;<\/pre>\n<pre>\u00a0\u00a0\u00a0 iM = iM % 60;<\/pre>\n<pre>\u00a0 }<\/pre>\n<pre>\u00a0 if (iH &gt; 23)<\/pre>\n<pre>\u00a0 {<\/pre>\n<pre>\u00a0\u00a0\u00a0 iH = iH % 24;<\/pre>\n<pre>\u00a0 }<\/pre>\n<pre>\u00a0 \/\/ remember so we can cope with a wrap<\/pre>\n<pre>\u00a0 ulLastMillis = ulNow;<\/pre>\n<pre>\u00a0 iLastH = iH;<\/pre>\n<pre>\u00a0 iLastM = iM;<\/pre>\n<pre>\u00a0 iLastS = iS;<\/pre>\n<pre>\u00a0 \/\/ move to pos<\/pre>\n<pre>\u00a0 LcdPosition(1,0);<\/pre>\n<pre>\u00a0 PrintDigits(iH);<\/pre>\n<pre>\u00a0 LcdDataWrite(':');<\/pre>\n<pre>\u00a0 PrintDigits(iM);<\/pre>\n<pre>\u00a0 LcdDataWrite(':');<\/pre>\n<pre>\u00a0 PrintDigits(iS);<\/pre>\n<pre>}<\/pre>\n<pre>\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<\/pre>\n<pre>\/*<\/pre>\n<pre>\u00a0\u00a0 LCD functions<\/pre>\n<pre>*\/<\/pre>\n<pre>\/\/ pins to be used on Arduino for LCD display<\/pre>\n<pre>int DOUT = 11;<\/pre>\n<pre>int STR = 12;<\/pre>\n<pre>int CLK = 10;<\/pre>\n<pre>\/\/ the Qx in the order they are connected on the chip<\/pre>\n<pre>int RS = 0x40;<\/pre>\n<pre>int RW = 0x20;<\/pre>\n<pre>int EnableSet = 0x10;<\/pre>\n<pre>int EnableClr = 0xEF;<\/pre>\n<pre>int DMASK = 0x0F;<\/pre>\n<pre>\/\/ shift byte and strobe to display<\/pre>\n<pre>void sendByteOut(int value)<\/pre>\n<pre>{<\/pre>\n<pre>\u00a0 digitalWrite(STR,LOW);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ set the strobe LOW<\/pre>\n<pre>\u00a0 shiftOut(DOUT, CLK, LSBFIRST, value);<\/pre>\n<pre>\u00a0 digitalWrite(STR, HIGH);<\/pre>\n<pre>\u00a0 delayMicroseconds(100);<\/pre>\n<pre>\u00a0 digitalWrite(STR,LOW);<\/pre>\n<pre>}<\/pre>\n<pre>void LcdClockByte(int output)<\/pre>\n<pre>{<\/pre>\n<pre>\u00a0 output &amp;= EnableClr;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ set Enable LOW<\/pre>\n<pre>\u00a0 sendByteOut(output);<\/pre>\n<pre>\u00a0 delayMicroseconds(2);<\/pre>\n<pre>\u00a0 output |= EnableSet;\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Set Enable HIGH<\/pre>\n<pre>\u00a0 sendByteOut(output);<\/pre>\n<pre>\u00a0 delayMicroseconds(2);<\/pre>\n<pre>\u00a0 output &amp;= EnableClr;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ set Enable LOW<\/pre>\n<pre>\u00a0 sendByteOut(output);<\/pre>\n<pre>\u00a0 delayMicroseconds(100);<\/pre>\n<pre>}<\/pre>\n<pre>void LcdWrite(int value, boolean bData)<\/pre>\n<pre>{<\/pre>\n<pre>\u00a0 int iData = bData ? RS : 0;<\/pre>\n<pre>\u00a0 int output = value &gt;&gt; 4;\u00a0\u00a0\u00a0\u00a0 \/\/send the upper\u00a0 4 databits (from 8)<\/pre>\n<pre>\u00a0 output |= iData;<\/pre>\n<pre>\u00a0 LcdClockByte(output);<\/pre>\n<pre>\u00a0 output = value &amp; 0x0F;\u00a0\u00a0 \/\/ send lower 4 bytes<\/pre>\n<pre>\u00a0 output |= iData;<\/pre>\n<pre>\u00a0 LcdClockByte(output);<\/pre>\n<pre>}<\/pre>\n<pre>void LcdCommandWrite(int value)<\/pre>\n<pre>{<\/pre>\n<pre>\u00a0 LcdWrite(value,false);<\/pre>\n<pre>}<\/pre>\n<pre>void LcdDataWrite(int value)<\/pre>\n<pre>{<\/pre>\n<pre>\u00a0 LcdWrite(value,true);<\/pre>\n<pre>}<\/pre>\n<pre>void LcdInit()<\/pre>\n<pre>{<\/pre>\n<pre>\u00a0 delay(100);<\/pre>\n<pre>\u00a0 \/\/ initialize LCD after a short pause<\/pre>\n<pre>\u00a0 \/\/ 4 pin initialization - needed twice<\/pre>\n<pre>\u00a0 LcdCommandWrite(0x28); \/\/ function set: 4 pin initialization, 2 lines, 5x8 characters<\/pre>\n<pre>\u00a0 delay(10);<\/pre>\n<pre>\u00a0 LcdCommandWrite(0x28); \/\/ function set: 4 pin initialization, 2 lines, 5x8 characters<\/pre>\n<pre>\u00a0 delay(10);<\/pre>\n<pre>\u00a0 LcdCommandWrite(0x0C); \/\/ display on:\u00a0 on with no cursor<\/pre>\n<pre>\u00a0 delay(10);<\/pre>\n<pre>\u00a0 LcdCommandWrite(0x01); \/\/ clear display<\/pre>\n<pre>\u00a0 delay(10);<\/pre>\n<pre>\u00a0 LcdCommandWrite(0x06); \/\/ entry mode set: increment automatically, no display shift<\/pre>\n<pre>\u00a0 delay(10);<\/pre>\n<pre>\u00a0 LcdCommandWrite(0x80); \/\/ display control: address top left<\/pre>\n<pre>\u00a0 delay(10);<\/pre>\n<pre>}<\/pre>\n<pre>\/\/ checks out how many digits there are in a number, keep dividing by 10 until there's nothing left<\/pre>\n<pre>int countDigits(int nr)<\/pre>\n<pre>{<\/pre>\n<pre>\u00a0 int\u00a0 iNum = 0;<\/pre>\n<pre>\u00a0 while (nr &gt; 0)<\/pre>\n<pre>\u00a0 {<\/pre>\n<pre>\u00a0\u00a0\u00a0 iNum++;<\/pre>\n<pre>\u00a0\u00a0\u00a0 nr = nr\/10;<\/pre>\n<pre>\u00a0 }<\/pre>\n<pre>\u00a0 return iNum;<\/pre>\n<pre>}<\/pre>\n<pre>\/\/ this function help us to write numbers with more than one digit<\/pre>\n<pre>\/\/ up to 20<\/pre>\n<pre>void LcdNumberWrite(int nr)<\/pre>\n<pre>{<\/pre>\n<pre>\u00a0 int\u00a0 iDigits;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ how many digits<\/pre>\n<pre>\u00a0 int\u00a0 iIndex;<\/pre>\n<pre>\u00a0 int\u00a0 cNum[20];\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ build number in here<\/pre>\n<pre>\u00a0 if (nr == 0)<\/pre>\n<pre>\u00a0 {<\/pre>\n<pre>\u00a0\u00a0\u00a0 LcdDataWrite('0');\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ zero is a special case<\/pre>\n<pre>\u00a0 }<\/pre>\n<pre>\u00a0 else<\/pre>\n<pre>\u00a0 {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ if negative write a minus sign<\/pre>\n<pre>\u00a0\u00a0\u00a0 if (nr &lt; 0)<\/pre>\n<pre>\u00a0\u00a0\u00a0 {<\/pre>\n<pre>\u00a0\u00a0\u00a0\u00a0\u00a0 LcdDataWrite('-');<\/pre>\n<pre>\u00a0\u00a0\u00a0 }<\/pre>\n<pre>\u00a0\u00a0\u00a0 nr = abs(nr);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ make positive<\/pre>\n<pre>\u00a0\u00a0\u00a0 iDigits = countDigits(nr);\u00a0\u00a0\u00a0\u00a0 \/\/ count number of digits<\/pre>\n<pre>\u00a0\u00a0\u00a0 iIndex = iDigits-1;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ start at the end<\/pre>\n<pre>\u00a0\u00a0\u00a0 while (nr &gt; 0)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ store each digit working up the powers of 10<\/pre>\n<pre>\u00a0\u00a0\u00a0 {<\/pre>\n<pre>\u00a0\u00a0\u00a0\u00a0\u00a0 cNum[iIndex] = '0' + (nr % 10);<\/pre>\n<pre>\u00a0\u00a0\u00a0\u00a0\u00a0 nr = nr\/10;<\/pre>\n<pre>\u00a0\u00a0\u00a0\u00a0\u00a0 iIndex--;<\/pre>\n<pre>\u00a0\u00a0\u00a0 }<\/pre>\n<pre>\u00a0\u00a0\u00a0 \/\/ now write all the digits out<\/pre>\n<pre>\u00a0\u00a0\u00a0 for(iIndex = 0; iIndex &lt; iDigits; iIndex++)<\/pre>\n<pre>\u00a0\u00a0\u00a0 {<\/pre>\n<pre>\u00a0\u00a0\u00a0\u00a0\u00a0 LcdDataWrite(cNum[iIndex]);<\/pre>\n<pre>\u00a0\u00a0\u00a0 }<\/pre>\n<pre>\u00a0 }<\/pre>\n<pre>}<\/pre>\n<pre>\/\/ write a string from an array<\/pre>\n<pre>void LcdWriteString(int* msg, int len)<\/pre>\n<pre>{<\/pre>\n<pre>\u00a0 for (int count = 0; count &lt; len; count++)<\/pre>\n<pre>\u00a0 {<\/pre>\n<pre>\u00a0\u00a0\u00a0 LcdDataWrite(msg[count]);<\/pre>\n<pre>\u00a0 }<\/pre>\n<pre>}<\/pre>\n<pre>\/\/ position the cursor<\/pre>\n<pre>void LcdPosition(int iRow, int iCol)<\/pre>\n<pre>{<\/pre>\n<pre>\u00a0 int\u00a0 iPos = ((iRow * 0x40) + iCol) | 0x80;<\/pre>\n<pre>\u00a0 LcdCommandWrite(iPos);<\/pre>\n<pre>}<\/pre>\n<pre>void setup (void)<\/pre>\n<pre>{<\/pre>\n<pre>\u00a0 int msg[] = {'T','i','m','e',' ',' ',' ',' ',' ',' ',' ',' ','T','e','m','p'};<\/pre>\n<pre>\u00a0 Serial.begin(9600);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ for debug<\/pre>\n<pre>\u00a0 pinMode(CLK,OUTPUT);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ LCD control lines<\/pre>\n<pre>\u00a0 pinMode(DOUT,OUTPUT);<\/pre>\n<pre>\u00a0 pinMode(STR,OUTPUT);<\/pre>\n<pre>\u00a0 pinMode(HOURS,INPUT);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ hours adjust switch<\/pre>\n<pre>\u00a0 digitalWrite(HOURS, HIGH);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ turn on pullup resistor<\/pre>\n<pre>\u00a0 pinMode(MINS,INPUT);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ mins adjust switch<\/pre>\n<pre>\u00a0 digitalWrite(MINS, HIGH);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ turn on pullup resistor<\/pre>\n<pre>\u00a0 LcdInit();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ set up the LCD<\/pre>\n<pre>\u00a0 delay(20);<\/pre>\n<pre>\u00a0 LcdCommandWrite(0x01);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ clear screen<\/pre>\n<pre>\u00a0 delay(20);<\/pre>\n<pre>\u00a0 LcdCommandWrite(0x02);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ set cursor position to zero<\/pre>\n<pre>\u00a0 delay(20);<\/pre>\n<pre>\u00a0 LcdWriteString(msg,16);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ show our titles<\/pre>\n<pre>\u00a0 \/\/ begin wire library and set address to temp register<\/pre>\n<pre>\u00a0 Wire.begin();<\/pre>\n<pre>\u00a0 Wire.beginTransmission(TEMP_ADDR);<\/pre>\n<pre>\u00a0 Wire.send(TEMP_REG);<\/pre>\n<pre>\u00a0 Wire.endTransmission();<\/pre>\n<pre>}<\/pre>\n<pre>void loop (void)<\/pre>\n<pre>{<\/pre>\n<pre>\u00a0 int temp;<\/pre>\n<pre>\u00a0 ClockDisplay();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Show the time<\/pre>\n<pre>\u00a0 ClockAdjust();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Make any time adjustments<\/pre>\n<pre>\u00a0 temp = ReadTemperature();\u00a0\u00a0\u00a0\u00a0 \/\/ read the temperature<\/pre>\n<pre>\u00a0 LcdPosition(1,11);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ position on second row character 8<\/pre>\n<pre>\u00a0 if (temp &gt;= 0)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ if its positive<\/pre>\n<pre>\u00a0 {<\/pre>\n<pre>\u00a0\u00a0\u00a0 LcdDataWrite(' ');\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ insert a space as no minus sign<\/pre>\n<pre>\u00a0 }<\/pre>\n<pre>\u00a0 LcdNumberWrite(temp);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ write the temp value<\/pre>\n<pre>\u00a0 LcdDataWrite(0xDF);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ degree symbol<\/pre>\n<pre>\u00a0 LcdDataWrite('C');\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ centigrade<\/pre>\n<pre>\u00a0 delay(200);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ laze about a bit<\/pre>\n<pre>}<\/pre>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\/* \u00a0 Thermometer and Clock \u00a0\u00a0 \u00a0 \u00a0 LCD part based on previous examples by Tomek and Dojodave *\/ #include &lt;Wire.h&gt; \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ \/* \u00a0 Temperature module commands and registers over I2C *\/ \u00a0 int\u00a0 TMP_RD = 0x91; int\u00a0 TMP_WR = 0x90; \/\/Assume ADR0 is tied to VCC int\u00a0 TEMP_REG = 0x00; int\u00a0 TEMP_ADDR = 0b1001000; [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":16,"menu_order":0,"comment_status":"open","ping_status":"open","template":"","meta":{"footnotes":""},"class_list":["post-19","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/19","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=19"}],"version-history":[{"count":6,"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/19\/revisions"}],"predecessor-version":[{"id":23,"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/19\/revisions\/23"}],"up":[{"embeddable":true,"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=\/wp\/v2\/pages\/16"}],"wp:attachment":[{"href":"https:\/\/paulsarduino.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=19"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}