Use with a Nucleo F401RE and a Sharp Optical Dust Sensor GP2Y1010AU0F to measure dust with a Nokia 5110 display to show result.
Diff: main.cpp
- Revision:
- 0:99fdd85b4929
--- /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