PDA

View Full Version : SHARP GP2Y10 optical dust sensor



louislouis
- 7th January 2018, 19:34
Hello,

I wanted to create a simple air filter/purifier for my workshop from box fan and 3M square filters.
For that reason I wanted to measure the dust particles in air. I found some infos about that SHARP
optical dust sensor for Arduino, but unfortunately nothing for PIC MCUs in Picbasic.
Then I writed the code in PBP. The code is simple, use PIC16F690, 8x2 LCD and SHARP optical dust sensor.
Here is the code, sensor wiring diagram and characteristics:



;************************************************* ***************
;* Name : GP2Y1010AU0F SHARP dust sensor *
;* Author : Louis *
;* Notice : Copyright (c) 2018 Louis *
;* : All Rights Reserved *
;* Date : 7. 1. 2018 *
;* Version : v1.0 *
;* Notes : PIC16F690 *
;************************************************* ***************

#CONFIG
cfg = _INTRC_OSC_NOCLKOUT
cfg&= _WDT_ON
cfg&= _PWRTE_OFF
cfg&= _MCLRE_OFF
cfg&= _CP_OFF
cfg&= _CPD_OFF
cfg&= _BOD_ON
cfg&= _IESO_ON
cfg&= _FCMEN_ON
__CONFIG cfg
#ENDCONFIG

DEFINE OSC 4 ; Use a 4 MHZ internal clock
ADCON1 = 0
ANSEL = %01000000 ; Set AN6 analog rest digital
TRISA = %000000 ; Set RA0 - RA5 output
TRISB = %0000 ; Set RRB4 - RB7 output
TRISC = %00000100 ; Set RC2 input, rest output
CM1CON0 = 0 ; Disable comparator 1
CM2CON0 = 0 ; Disable comparator 2
OPTION_REG.7=1 ; Disable weak pull ups

DEFINE ADC_BITS 8 ; Set number of bits in result
DEFINE ADC_CLOCK 3 ; Set clock source (rc = 3)
DEFINE ADC_SAMPLEUS 50 ; Set sampling time in microseconds

conv1 con 19 ; 5000/256 = 19,53 decimal part
conv2 con 35 ; fractional part

;----[ Change these to match your LCD ]---------------------------------------

LCD_DB4 VAR PORTA.0
LCD_DB5 VAR PORTA.1
LCD_DB6 VAR PORTA.2
LCD_DB7 VAR PORTA.4
LCD_RS VAR PORTA.5
LCD_E VAR PORTC.3
LCD_Lines CON 2 ; # of Lines on LCD, 1 or 2 (Note: use 2 for 4 lines)
LCD_DATAUS CON 50 ; Data delay time in us
LCD_COMMANDUS CON 2000 ; Command delay time in us
INCLUDE "LCD_AnyPin.pbp" ; Include MUST be AFTER LCD Pin assignments

out var portb.6 ; Sharp LED enable pin
dens var word ; Final particle density in ug/m3
adval var word ; ADC raw data
volts1 var word ; First part of result in mV
volts2 var word ; Second part of result in mV

main:
high out ; power on the sensor LED
pauseus 280 ; sampling time 280us
adcin 6,adval ; read ADC value on AN6 pin
pauseus 40 ; delta time
low out ; power off the sensor LED
pauseus 9680 ; sleep time

;--------- ADC value to mV conversion ------------

volts1 = adval * conv1 ; multiply by 19
volts2 = adval * conv2 ; multiply by 35
volts2 = volts2 /100
volts1 = (volts1 + volts2)/10 ; result in mV
if volts1<59 then volts1 = 59 ; sensor linear char. begin from 0.6V

; --------- calculate particles in ug/m3 -----------

; 0.60V = 0ug/m3 particles start of sensor linearity MIN value
; 1.20V = 100ug/m3 particles
; 1.77V = 200ug/m3 particles
; 2.35V = 300ug/m3 particles
; 2.95V = 400ug/m3 particles
; 3.52V = 500ug/m3 particles
; 3.70V = 530ug/m3 particles end of sensor linearity MAX value

let dens = ((17 * volts1) -1000)/10

;--------- display values on 8x2 LCD ----------

Lcdout $fe, 1 ; clear display
lcdout $FE,$80,"Particle" ; first line
lcdout $FE,$C0, dec dens,%11100100,"g/m3" ; second line
if dens > 529 then ; if the value reaches max then display message
lcdout $FE,$80,"MAX Over"
endif

pause 500 ; pause 0.5 sec.
goto main ; jump to main
end