Use with a Nucleo F401RE and a Sharp Optical Dust Sensor GP2Y1010AU0F to measure dust with a Nokia 5110 display to show result.

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
kirchnet
Date:
Sat Jun 14 02:25:52 2014 +0000
Commit message:
Use with a Nucleo F401RE and a Sharp Optical Dust Sensor GP2Y1010AU0F to measure dust with a Nokia 5110 display to show results.

Changed in this revision

NOKIA_5110.cpp Show annotated file Show diff for this revision Revisions of this file
NOKIA_5110.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NOKIA_5110.cpp	Sat Jun 14 02:25:52 2014 +0000
@@ -0,0 +1,173 @@
+// Project: Nokia5110 - Controlling a NK5110 display from an NXP LPC1768
+// File: NOKIA_5110.cpp
+// Author: Chris Yan
+// Created: January, 2012
+// Revised: January, 2014
+//  Desc: Supporting code for the NokiaLcd class
+
+#include "NOKIA_5110.h"
+#include "mbed.h"
+
+NokiaLcd::NokiaLcd(LcdPins pinout)
+{
+    // SPI
+    LcdSpi = new SPI(pinout.mosi, pinout.miso, pinout.sclk);
+    LcdSpi->format(LCD_SPI_BITS, LCD_SPI_MODE);
+    LcdSpi->frequency(LCD_FREQ);
+    
+    // Control Pins
+    Pins = new DigitalOut*[3];
+    Pins[PIN_RST]   = new DigitalOut(pinout.rst);
+    Pins[PIN_SCE]   = new DigitalOut(pinout.sce);
+    Pins[PIN_DC]    = new DigitalOut(pinout.dc);
+    
+    // Initial Command Instructions, note the initial command mode
+    FunctionSet.V   = CMD_FS_HORIZONTAL_MODE;
+    FunctionSet.H   = CMD_FS_EXTENDED_MODE;
+    FunctionSet.PD  = CMD_FS_ACTIVE_MODE;
+    FunctionChar    = CreateFunctionChar();
+    
+    TempControlChar = CMD_TC_TEMP_2;
+    DispControlChar = CMD_DC_NORMAL_MODE;
+    BiasChar        = CMD_BI_MUX_48;
+    VopChar         = CMD_VOP_7V38;
+}
+
+void NokiaLcd::ShutdownLcd()
+{
+    FunctionSet.PD  = CMD_FS_POWER_DOWN_MODE;
+
+    ClearLcdMem();
+    SendFunction( CMD_DC_CLEAR_DISPLAY );
+    SendFunction( CreateFunctionChar() );
+}
+
+void NokiaLcd::ClearLcdMem()
+{
+    for(int tick = 0; tick <= 503; tick++)
+        LcdSpi->write(0x00);
+}
+
+void NokiaLcd::TestLcd(char test_pattern)
+{
+    for(int tick = 0; tick <= 503; tick++)
+        LcdSpi->write(test_pattern);         // Command gets sent
+}
+
+void NokiaLcd::InitLcd()
+{
+    ResetLcd();
+    Pins[PIN_SCE]->write(0);     // Chip Select goes low
+    
+    // Redefine the FunctionChar in case it has changed
+    FunctionSet.V   = CMD_FS_HORIZONTAL_MODE;
+    FunctionSet.H   = CMD_FS_EXTENDED_MODE;
+    FunctionSet.PD  = CMD_FS_ACTIVE_MODE;
+    SendFunction( CreateFunctionChar() );   // Extended CMD set
+    SendFunction( VopChar );                // | Vop
+    SendFunction( TempControlChar );        // | Temp
+    SendFunction( BiasChar );               // | Bias
+
+    FunctionSet.H   = CMD_FS_BASIC_MODE;
+    SendFunction( CreateFunctionChar() );   // Basic CMD set
+    SendFunction( DispControlChar );        // | Display Mode
+    
+    ClearLcdMem();
+    Pins[PIN_DC]->write(1);     // Data/CMD goes back to Data mode
+}
+
+void NokiaLcd::ResetLcd()
+{
+    Pins[PIN_RST]->write(0);    // Reset goes low
+    Pins[PIN_RST]->write(1);    // Reset goes high
+}
+
+char NokiaLcd::CreateFunctionChar()
+{
+    return ( 0x20 | FunctionSet.PD | FunctionSet.V | FunctionSet.H );
+}
+
+void NokiaLcd::SendDrawData(char data)
+{
+    LcdSpi->write(data);         // Command gets sent
+}
+
+void NokiaLcd::DrawChar(char character)
+{
+    for( int i = 0; i < 6; i++)
+        SendDrawData( FONT_6x6[ ((character - 32)*6) + i] );
+}
+
+void NokiaLcd::DrawString(char* s)
+{
+    char len = strlen(s);
+    for( int idx = 0; idx < len; idx++ )
+    {
+        for( int i = 0; i < 6; i++)
+            SendDrawData( FONT_6x6[ ((s[idx] - 32)*6) + i] );
+    }
+}
+
+void NokiaLcd::DrawFrameChar(char character)
+{
+    for( int i = 0; i < 6; i++)
+        SendDrawData((( FONT_6x6[ ((character - 32)*6) + i]  ) << 1 ) | 0x81);
+}
+
+void NokiaLcd::DrawNegFrameChar(char character)
+{
+    for( int i = 0; i < 6; i++)
+        SendDrawData(~(( FONT_6x6[ ((character - 32)*6) + i]  ) << 1 ) | 0x81);
+}
+
+char* NokiaLcd::NumToStr(int num)
+{
+    if(num <= 0)
+        return "0";
+
+    double length = 0;
+    int tlen = 0;
+    int temp = 1;
+    char c;
+    
+    // Get number of digits
+    while( temp <= num )
+    {
+        temp *= 10;
+        length++;
+    }
+    tlen = length;
+    char* numString = new char[tlen+1];
+    
+    // Convert each place in number to a stand-alone representative number
+    temp = 0;
+    for(int idx = pow(10, length); idx>1; idx = (idx/10))
+    {
+        c = (char)( ((num % idx)-(num % (idx/10)))/(idx/10) + 48);
+        numString[temp] = c;
+        temp++;
+    }
+    numString[temp] = '\0';
+    return numString;
+}
+
+void NokiaLcd::SetXY(char x, char y)
+{
+    if( (x > 83) || (y > 5) )
+        return;
+
+    SendFunction( x | 0x80 );
+    SendFunction( y | 0x40 );
+}
+
+void NokiaLcd::SendFunction(char cmd) //TODO:Detection of what H should be
+{
+    Pins[PIN_DC]->write(0);     // Data/CMD goes low
+    LcdSpi->write(cmd);         // Command gets sent
+    Pins[PIN_DC]->write(1);     // Data/CMD goes back to Data mode
+}
+
+NokiaLcd::~NokiaLcd()
+{
+    ShutdownLcd();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NOKIA_5110.h	Sat Jun 14 02:25:52 2014 +0000
@@ -0,0 +1,238 @@
+// Project: Nokia5110 - Controlling a NK5110 display from an NXP LPC1768
+// File: NOKIA_5110.h
+// Author: Chris Yan
+// Created: January, 2012
+// Revised: January, 2014
+//  Desc: Commands, fonts, and class for using a
+//      Nokia 5110 LCD via the Phillips 8554 LCD driver.
+// 
+//  Typical Usage: User must fill the LcdPins struct with the pinout used to control the LCD and
+//      instantiate the NokiaLcd class - passing the created LcdPins struct to the constructor.
+//      The class function NokiaLcd::InitLcd may then be called to reset and start the LCD driver.
+//      A simple 6x6 font (6x8 in LCD space and ~5x5 character space) is included to facilitate 
+//      the NokiaLcd::DrawChar( char character ) function, which will copy the character 8 bits 
+//      at a time for 6 clock cycles.
+//                 Commands may be sent to the LCD via the NokiaLcd::SendFunction(char cmd) 
+//      function, but be aware that certain commands require the Function Set register's H-value
+//      to be either 1 or 0, depending on the command. This class does not check to see whether
+//      the H-value is of proper status. The Function Set register /may/ be changed via the 
+//      NokiaLcd::SendFunction(char cmd), but the code uses this internally and expects that
+//      most function registers have not been changed by the user.
+//
+//      Example:
+//          #include "mbed.h"
+//          #include "NOKIA_5110.h"
+//
+//          int main() {
+//              LcdPins myLcdPins = { p11, NC, p13, p10, p8, p9 };
+//              NokiaLcd myLcd( myLcdPins );    // SPI is started here (8-bits, mode 1)
+//              myLcd.InitLcd();                // LCD is reset and DDRAM is cleared
+//              myLcd.TestLcd( 0xAA );          // Draws a vertical pattern where every other pixel is on 
+//              wait(10);                       
+//              myLcd.ShutdownLcd();            // Clears the LCD's DDRAM and powers it down via CMD_FS_POWER_DOWN_MODE, H=0
+//              while(1)
+//              {   };
+//          }
+
+// Command Instructions
+//       H = 0
+#ifndef __NOKIA_5110_H__
+#define __NOKIA_5110_H__
+
+// Command Instructions
+//       H = 0
+#define CMD_DC_CLEAR_DISPLAY   0x08
+#define CMD_DC_NORMAL_MODE     0x0C
+#define CMD_DC_FILL_DISPLAY    0x09
+#define CMD_DC_INVERT_VIDEO    0x0D
+#define CMD_FS_HORIZONTAL_MODE 0x00
+#define CMD_FS_VERTICAL_MODE   0x02
+#define CMD_FS_BASIC_MODE      0x00
+#define CMD_FS_EXTENDED_MODE   0x01
+#define CMD_FS_ACTIVE_MODE     0x00
+#define CMD_FS_POWER_DOWN_MODE 0x04
+//       H = 1
+#define CMD_TC_TEMP_0          0x04
+#define CMD_TC_TEMP_1          0x05
+#define CMD_TC_TEMP_2          0x06
+#define CMD_TC_TEMP_3          0x07
+#define CMD_BI_MUX_24          0x15
+#define CMD_BI_MUX_48          0x13
+#define CMD_BI_MUX_100         0x10
+#define CMD_VOP_6V06           0xB2
+#define CMD_VOP_7V38           0xC8
+
+// LCD Characteristics
+#define LCD_FREQ 1000000
+#define LCD_SPI_MODE 0x01
+#define LCD_SPI_BITS 0x08
+#define LCD_X_MAX 84
+#define LCD_Y_MAX 48
+
+#define PIN_RST  0x00
+#define PIN_SCE  0x01
+#define PIN_DC   0x02
+
+#include "mbed.h"
+
+struct LcdPins
+{
+    PinName mosi;
+    PinName miso;
+    PinName sclk;
+    PinName dc;
+    PinName sce;
+    PinName rst;
+};
+
+struct LcdFunctionSet
+{
+    char PD;
+    char V;
+    char H;
+};
+
+typedef char LcdFunctionChar;
+typedef char LcdTempControl;
+typedef char LcdDispControl;
+typedef char LcdBiasChar;
+typedef char LcdVopChar;
+
+class NokiaLcd
+{
+    public:
+        NokiaLcd(LcdPins lcd_pinout);
+        ~NokiaLcd();
+        
+    public:
+        void InitLcd();
+        void ClearLcdMem();
+        void ShutdownLcd();
+        void SendFunction(char cmd);
+        void TestLcd(char test_pattern);
+        void SendDrawData(char data);
+        
+    public:
+        void DrawString(char* str);
+        void DrawChar(char character);
+        void SetXY(char x, char y);
+        void DrawFrameChar(char character);
+        void DrawNegFrameChar(char character);
+        char* NumToStr(int num);
+        
+    private:
+        char CreateFunctionChar();
+        void ResetLcd();
+        
+    private:
+        LcdFunctionChar FunctionChar;
+        LcdTempControl  TempControlChar;
+        LcdDispControl  DispControlChar;
+        LcdFunctionSet  FunctionSet;
+        LcdBiasChar     BiasChar;
+        LcdVopChar      VopChar;
+        DigitalOut**    Pins;
+        SPI*            LcdSpi;
+        
+};
+
+const char FONT_6x6[570] = //should be 564 total char
+{
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // SPACE   1   
+ 0x00, 0x06, 0x2F, 0x06, 0x00, 0x00, // !   2
+ 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, // "   3
+ 0x14, 0x3E, 0x14, 0x3E, 0x14, 0x00, // #   4
+ 0x2E, 0x2A, 0x3F, 0x2A, 0x3A, 0x00, // $   5
+ 0x26, 0x16, 0x08, 0x34, 0x32, 0x00, // %   6
+ 0x34, 0x2A, 0x3C, 0x18, 0x28, 0x00, // &   7
+ 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, // '   8
+ 0x00, 0x00, 0x1C, 0x36, 0x22, 0x00, // (   9
+ 0x22, 0x36, 0x1C, 0x00, 0x00, 0x00, // )   10
+ 0x24, 0x18, 0x0E, 0x18, 0x24, 0x00, // *   11
+ 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00, // +   12
+ 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, // ,   13
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, // -   14
+ 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, // .   15
+ 0x30, 0x18, 0x0C, 0x06, 0x00, 0x00, // /   16
+ 0x00, 0x1C, 0x22, 0x22, 0x1C, 0x00, // 0   17
+ 0x00, 0x24, 0x3E, 0x20, 0x00, 0x00, // 1   18
+ 0x3A, 0x2A, 0x2A, 0x2A, 0x2E, 0x00, // 2   19
+ 0x22, 0x2A, 0x2A, 0x2A, 0x3E, 0x00, // 3   20
+ 0x0E, 0x08, 0x08, 0x3E, 0x08, 0x00, // 4   21
+ 0x2E, 0x2A, 0x2A, 0x2A, 0x3A, 0x00, // 5   22
+ 0x3E, 0x2A, 0x2A, 0x2A, 0x3A, 0x00, // 6   23
+ 0x22, 0x12, 0x0A, 0x06, 0x02, 0x00, // 7   24
+ 0x3E, 0x2A, 0x2A, 0x2A, 0x3E, 0x00, // 8   25
+ 0x00, 0x2E, 0x2A, 0x2A, 0x3E, 0x00, // 9   26
+ 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, // :   27
+ 0x00, 0x20, 0x14, 0x00, 0x00, 0x00, // ;   28
+ 0x00, 0x00, 0x08, 0x14, 0x22, 0x00, // <   29
+ 0x14, 0x14, 0x14, 0x14, 0x14, 0x00, // =   30
+ 0x22, 0x14, 0x08, 0x00, 0x00, 0x00, // >   31
+ 0x06, 0x01, 0x2D, 0x06, 0x00, 0x00, // ?   32
+ 0x1E, 0x23, 0x19, 0x35, 0x3E, 0x00, // @   33
+ 0x3C, 0x0A, 0x0A, 0x0A, 0x3C, 0x00, // A   34
+ 0x3E, 0x2A, 0x2A, 0x2A, 0x1C, 0x00, // B   35
+ 0x1C, 0x22, 0x22, 0x22, 0x22, 0x00, // C   36
+ 0x3E, 0x22, 0x22, 0x22, 0x1C, 0x00, // D   37
+ 0x3E, 0x2A, 0x2A, 0x2A, 0x22, 0x00, // E   38
+ 0x3E, 0x0A, 0x0A, 0x0A, 0x02, 0x00, // F   39
+ 0x1C, 0x22, 0x2A, 0x2A, 0x18, 0x00, // G   40
+ 0x3E, 0x08, 0x08, 0x08, 0x3E, 0x00, // H
+ 0x22, 0x22, 0x3E, 0x22, 0x22, 0x00, // I
+ 0x10, 0x22, 0x22, 0x1E, 0x02, 0x00, // J
+ 0x3E, 0x08, 0x14, 0x22, 0x00, 0x00, // K
+ 0x00, 0x3E, 0x20, 0x20, 0x20, 0x00, // L   45
+ 0x3E, 0x04, 0x08, 0x04, 0x3E, 0x00, // M
+ 0x3C, 0x02, 0x02, 0x02, 0x3C, 0x00, // N
+ 0x1C, 0x22, 0x22, 0x22, 0x1C, 0x00, // O
+ 0x3E, 0x0A, 0x0A, 0x04, 0x00, 0x00, // P
+ 0x1C, 0x22, 0x32, 0x3C, 0x20, 0x00, // Q   50
+ 0x3E, 0x0A, 0x0A, 0x1A, 0x24, 0x00, // R
+ 0x24, 0x2A, 0x2A, 0x2A, 0x12, 0x00, // S
+ 0x02, 0x02, 0x3E, 0x02, 0x02, 0x00, // T
+ 0x1E, 0x20, 0x20, 0x20, 0x1E, 0x00, // U
+ 0x06, 0x18, 0x20, 0x18, 0x06, 0x00, // V   55
+ 0x0E, 0x30, 0x18, 0x30, 0x0E, 0x00, // W
+ 0x22, 0x14, 0x08, 0x14, 0x22, 0x00, // X
+ 0x02, 0x04, 0x38, 0x04, 0x02, 0x00, // Y
+ 0x22, 0x32, 0x2A, 0x26, 0x22, 0x00, // Z
+ 0x00, 0x00, 0x00, 0x3E, 0x22, 0x00, // [   60
+ 0x06, 0x0C, 0x18, 0x30, 0x00, 0x00, // backslash
+ 0x22, 0x3E, 0x00, 0x00, 0x00, 0x00, // ]
+ 0x00, 0x04, 0x02, 0x02, 0x04, 0x00, // ^
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, // _
+ 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, // `   65
+ 0x18, 0x24, 0x14, 0x38, 0x00, 0x00, // a
+ 0x1E, 0x28, 0x28, 0x10, 0x00, 0x00, // b
+ 0x18, 0x24, 0x24, 0x00, 0x00, 0x00, // c
+ 0x10, 0x28, 0x28, 0x1E, 0x00, 0x00, // d
+ 0x18, 0x2C, 0x2C, 0x08, 0x00, 0x00, // e   70
+ 0x00, 0x3C, 0x12, 0x04, 0x00, 0x00, // f
+ 0x24, 0x2A, 0x1E, 0x00, 0x00, 0x00, // g
+ 0x3E, 0x08, 0x30, 0x00, 0x00, 0x00, // h
+ 0x00, 0x3A, 0x00, 0x00, 0x00, 0x00, // i
+ 0x10, 0x20, 0x1A, 0x00, 0x00, 0x00, // j   75
+ 0x3E, 0x10, 0x2C, 0x20, 0x00, 0x00, // k
+ 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, // l
+ 0x38, 0x08, 0x18, 0x08, 0x30, 0x00, // m
+ 0x30, 0x08, 0x08, 0x30, 0x00, 0x00, // n
+ 0x10, 0x28, 0x28, 0x10, 0x00, 0x00, // o   80
+ 0x38, 0x14, 0x14, 0x08, 0x00, 0x00, // p
+ 0x08, 0x14, 0x14, 0x38, 0x00, 0x00, // q
+ 0x3C, 0x08, 0x04, 0x00, 0x00, 0x00, // r
+ 0x2C, 0x34, 0x00, 0x00, 0x00, 0x00, // s
+ 0x08, 0x3C, 0x28, 0x00, 0x00, 0x00, // t   85
+ 0x18, 0x20, 0x20, 0x18, 0x00, 0x00, // u
+ 0x08, 0x10, 0x20, 0x10, 0x08, 0x00, // v
+ 0x18, 0x20, 0x10, 0x20, 0x18, 0x00, // w
+ 0x28, 0x10, 0x28, 0x00, 0x00, 0x00, // x
+ 0x2C, 0x30, 0x1C, 0x00, 0x00, 0x00, // y   90
+ 0x24, 0x34, 0x2C, 0x24, 0x00, 0x00, // z
+ 0x00, 0x00, 0x08, 0x3E, 0x22, 0x00, // {
+ 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, // |
+ 0x22, 0x3E, 0x08, 0x00, 0x00, 0x00, // }
+ 0x10, 0x08, 0x18, 0x10, 0x08, 0x00, // ~   95
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Jun 14 02:25:52 2014 +0000
@@ -0,0 +1,147 @@
+#include "mbed.h"
+#include "NOKIA_5110.h"
+
+/*
+Sketch to use with a Nucleo F401RE and a
+Sharp Optical Dust Sensor GP2Y1010AU0F to measure dust with a
+Nokia 5110 display to show result. Will also show results via USB on PC terminal program
+
+NOTE THAT THIS SENSOR USES 5V AND THE NUCLEO 3.3V. USE AT YOUR OWN RISK.
+I SHALL NOT BE HELD RESPONSIBLE FOR ANY DAMAGE TO YOUR HARDWARE.
+
+For non-Nucleo mbed platforms you need to change the pins. 
+
+!!!IMPORTANT!!!
+A brief note on the sensor and board voltage   !!!IMPORTANT!!!
+STM specify in their datasheet (Feb 2014, DocID025644 Rev 2, page 38) that
+pin PA1 is "FT" meaning 5V tolerant. Moreover, I have measured voltages of
+no more than 3.71V in my experiments. So you should make your own decision
+whether and how you want to connect the sensor. Use at your own risk.
+I shall not be liable for any damage. 
+
+This sketch is based on code by the following authors: Cyrille Médard de Chardon (serialC), Christophe Trefois (Trefex)
+Their work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
+To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/ or send a letter
+to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
+Changelog:
+2014-Jun-08: Adapted to Nucleo
+2014-Jun-13: Added Nokia 5110 display
+
+Original documentation
+http://arduinodev.woofex.net/2012/12/01/standalone-sharp-dust-sensor/
+http://www.howmuchsnow.com/arduino/airquality/
+
+The code for the Nokia 5110 is adapted from work by Chris Yan as Revised: January, 2014
+
+For the scientifically inclined who are pressed for time there is a nice writeup about dust here:
+http://www.who.int/occupational_health/publications/en/oehairbornedust3.pdf
+
+Pin connections
+Sharp dust sensor GP2Y1010AU0F
+Data sheet: https://www.sparkfun.com/datasheets/Sensors/gp2y1010au_e.pdf
+App note:   http://sharp-world.com/products/device/lineup/data/pdf/datasheet/gp2y1010au_appl_e.pdf
+Remember to include the resistor and capacitor (polarity!) as described in the Sharp datasheet
+    Pin 1: Resistor - 5V (see datasheet)
+    Pin 2: Gnd (capacitor between 1 and 2 - see datasheet)
+    Pin 3: Digital D8
+    Pin 4: Gnd
+    Pin 5: +5V
+    Pin 6: Analog A0
+    Pins are counted left to right when looking at the connector from the front (i.e. so that you can see the pins)
+
+5110 Display
+    myPins.sce  = PB_6;
+    myPins.rst  = D2;
+    myPins.dc   = D3;
+    myPins.mosi = PA_7;//SPI_MOSI;
+    myPins.miso = NC;
+    myPins.sclk = PA_5;//SPI_SCK;
+I am not using the backlight. Feel free use another digital pin to power it
+*/
+
+Serial pc(SERIAL_TX, SERIAL_RX); //output for debugging
+ 
+DigitalOut myled(LED1);
+DigitalOut ledPower(D8);
+AnalogIn analog_value(A0);
+
+
+int samplingTime = 280;//280 microseconds
+int deltaTime = 40;//40 us to give total pulse width of 0.32ms
+int sleepTime = 9680;//LED off for 9680 us to take 1 measurement per second
+
+float dustDensityCN = 0,dustDensitySharp = 0, voMeasured=0, voCalc=0;
+ 
+int main() {
+  pc.printf("Starting sensor. It can take a few measurements until it becomes stable.\n");
+    LcdPins myPins;
+    myPins.sce  = PB_6;
+    myPins.rst  = D2;
+    myPins.dc   = D3;
+    myPins.mosi = PA_7;//SPI_MOSI;
+    myPins.miso = NC;
+    myPins.sclk = PA_5;//SPI_SCK;
+    pc.printf("LCD pins set ok\n");
+    NokiaLcd myLcd( myPins );
+    
+    // Start the LCD
+    myLcd.InitLcd();
+    myLcd.SetXY(char(0),char(0));
+    myLcd.DrawString("SHARP DUST SENSOR"); 
+
+    pc.printf("LCD started\n");
+
+  while(1) { 
+      myled = !myled;
+      ledPower=0; // power on the LED. Pull-down to activate
+      wait_us(samplingTime);
+      voMeasured = analog_value.read(); // Converts and read the analog input value  
+      wait_us(deltaTime);
+      ledPower=1; // turn the LED off. Pull up to turn off
+      wait_us(sleepTime);
+
+      voCalc = voMeasured*3.3;//Map 0:1 measured range to 0:3.3V
+  
+  // Original equation taken from Sharp data sheet measured in mg/m3
+  // Sharp don't give you a best fit line, so you have to guess
+     dustDensitySharp = 0.5/2.8 * (float(voCalc) - 0.7);
+
+  // Eqaution calibrated by Chris Nafis (c) 2012
+  // see http://www.howmuchsnow.com/arduino/airquality/
+  // measured in parts per 0.01 cf
+  // [I did not get meaningful values on my sensor with Chris' formula
+  // For me the Sharp graph works just fine. So make your own tests]
+     dustDensityCN = (float(voCalc) - 0.0356)*1.2;
+  
+      pc.printf(" - Measurment value: %1.3f", voMeasured);
+      pc.printf(" - Voltage calculated: %1.3f", voCalc);
+      pc.printf(" - Sharp's Dust Density [mg/m3]: %f", dustDensitySharp);
+      pc.printf(" - C. Nafis' Dust Density [pp.01cf](x10^4): %f\n", dustDensityCN,"\n");
+      
+        myLcd.SetXY(char(1),char(1));
+        myLcd.DrawString("Raw value:"); 
+        char measurestring[(((sizeof voMeasured) * 8) + 2)/3 + 2];
+        sprintf(measurestring, "%1.2f", voMeasured);
+        myLcd.DrawString(measurestring);
+
+        myLcd.SetXY(char(1),char(2));
+        myLcd.DrawString("Voltage:  "); 
+        char voltagestring[(((sizeof voCalc) * 8) + 2)/3 + 2];
+        sprintf(voltagestring, "%1.3f", voCalc);
+        myLcd.DrawString(voltagestring);
+
+        myLcd.SetXY(char(1),char(3));
+        myLcd.DrawString("Sharp dd: "); //Units: refer to printf above
+        char sharpstring[(((sizeof dustDensitySharp) * 8) + 2)/3 + 2];
+        sprintf(sharpstring, "%1.2f", dustDensitySharp);
+        myLcd.DrawString(sharpstring);
+
+        myLcd.SetXY(char(1),char(4));
+        myLcd.DrawString("Nafis dd: "); //Units: refer to printf above
+        char nafisstring[(((sizeof dustDensityCN) * 8) + 2)/3 + 2];
+        sprintf(nafisstring, "%1.2f", dustDensityCN);
+        myLcd.DrawString(nafisstring);
+ 
+  wait(1);
+}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sat Jun 14 02:25:52 2014 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/024bf7f99721
\ No newline at end of file