i'm just starting with it, please be patient.
I plan to make a small indoor Air Quality meter with the WAVESHARE sharp module: (https://botland.com.pl/index.php?controller=attachment&id_attachment=1286).
I plug it into 3.3 ,GND, A0 and D6.
Everything seems to work fine, but the ADC raw values do not exceed: RAW Analog: 114
I read that ESP has 1.0V on ADC, the sensor has 5.0V - how can i make it work ? Is it possible to be done with software only, without any additional hardware?
Serial Output:
RAW Analog: 45 miliVOLT: 2016.99 DUST ug/m3: 403.40
RAW Analog: 44 miliVOLT: 1963.28 DUST ug/m3: 392.66
RAW Analog: 41 miliVOLT: 1802.15 DUST ug/m3: 360.43
RAW Analog: 40 miliVOLT: 1748.44 DUST ug/m3: 349.69
RAW Analog: 43 miliVOLT: 1909.57 DUST ug/m3: 381.91
RAW Analog: 38 miliVOLT: 1641.02 DUST ug/m3: 328.20
RAW Analog: 35 miliVOLT: 1479.88 DUST ug/m3: 295.98
RAW Analog: 36 miliVOLT: 1533.59 DUST ug/m3: 306.72
RAW Analog: 36 miliVOLT: 1533.59 DUST ug/m3: 306.72
...
RAW Analog: 115 miliVOLT: 5776.76 DUST ug/m3: 1155.35
RAW Analog: 114 miliVOLT: 5723.05 DUST ug/m3: 1144.61
RAW Analog: 114 miliVOLT: 5723.05 DUST ug/m3: 1144.61
RAW Analog: 115 miliVOLT: 5776.76 DUST ug/m3: 1155.35
RAW Analog: 89 miliVOLT: 4380.27 DUST ug/m3: 876.05
RAW Analog: 113 miliVOLT: 5669.34 DUST ug/m3: 1133.87
RAW Analog: 90 miliVOLT: 4433.98 DUST ug/m3: 886.80
RAW Analog: 72 miliVOLT: 3467.19 DUST ug/m3: 693.44
The sheets say max ug/m3 is 500, however i get 1133 and i believe it can be caused by the ADC as the code works perfectly on Arduino UNO..
Code below, taken from WaveShare and modified to fit ESP pins.
/*********************************************************************************************************
*
* File : DustSensor
* Hardware Environment:
* Build Environment : Arduino
* Version : V1.0.5-r2
* By : WaveShare
*
* (c) Copyright 2005-2011, WaveShare
* http://www.waveshare.net
* http://www.waveshare.com
* All Rights Reserved
*
*********************************************************************************************************/
#define COV_RATIO 0.2 //ug/mmm / mv
#define NO_DUST_VOLTAGE 400 //mv
#define SYS_VOLTAGE 5000
/*
I/O define
*/
const int iled = 13; //drive the led of sensor
const int vout = A0; //analog input
/*
variable
*/
float density, voltage;
int adcvalue;
/*
private function
*/
int Filter(int m)
{
static int flag_first = 0, _buff[10], sum;
const int _buff_max = 10;
int i;
if(flag_first == 0)
{
flag_first = 1;
for(i = 0, sum = 0; i < _buff_max; i++)
{
_buff[i] = m;
sum += _buff[i];
}
return m;
}
else
{
sum -= _buff[0];
for(i = 0; i < (_buff_max - 1); i++)
{
_buff[i] = _buff[i + 1];
}
_buff[9] = m;
sum += _buff[9];
i = sum / 10.0;
return i;
}
}
void setup(void)
{
pinMode(iled, OUTPUT);
digitalWrite(iled, LOW); //iled default closed
Serial.begin(9600); //send and receive at 9600 baud
Serial.print("*********************************** WaveShare ***********************************\n");
}
void loop(void)
{
/*
get adcvalue
*/
digitalWrite(iled, HIGH);
delayMicroseconds(280);
adcvalue = analogRead(vout);
digitalWrite(iled, LOW);
// adcvalue = Filter(adcvalue);
/*
covert voltage (mv)
*/
voltage = (SYS_VOLTAGE / 1024.0) * adcvalue * 11;
/*
voltage to density
*/
if(voltage >= NO_DUST_VOLTAGE)
{
voltage -= NO_DUST_VOLTAGE;
density = voltage * COV_RATIO;
}
else
density = 0;
/*
display the result
*/
Serial.print("RAW Analog: "+String(adcvalue)+" miliVOLT: "+String(voltage)+" DUST ug/m3: "+String(density)+"\n");
delay(1000);
}