ESP32 ADC
Introduction to ADC functions, and Joystick, Thermistor, Photoresistor, Gas sensors (MQ-2, MQ-3, MQ-135), eNose.
ADC (Analog Digital Converter)

Vin is input voltage for ADC to sample
Vref is reference voltage for ADC to compare with Vin
3-bit ADC example:

12-bit ADC : output is a 12-bit binary code, so its value = 0 ~ 4095

ADC architecture
Direct-Conversion ADC

Successive-Approximation ADC

Sigma-Delta ADC

ESP32 ADC
Analog Input Tutorial
Vout = Vin * R2 / (R1+R2)
With a potentiometer
![]()  | 
![]()  | 
With a photoresistor
![]()  | 
![]()  | 
NodeMCU-32S pinout

Sketch> ESP32> ESP32_ADC
- Connect NodeMCU-32S with a NTC-Thermistor and a 10K ohm to GND

 - Download ESP32_ADC.ino
to ~/Documents/Arduino/examples/

 - Verify, then Tools>Serial Monitor>

 
Sketch> ESP32 > ESP32_ADC_Joystick

Examples> 03.Analog>
- 
    
AnalogInOutSerial - Read an analog input pin, map the result, and then use that data to dim or brighten an LED.
 - 
    
AnalogWriteMega - Fade 12 LEDs on and off, one by one, using an Arduino Mega board.
 - 
    
Calibration - Define a maximum and minimum for expected analog sensor values.
 - 
    
Fading - Use an analog output (PWM pin) to fade an LED.
 - 
    
Smoothing - Smooth multiple readings of an analog input.
 
Examples> 03.Analog> AnalogInput
- Connect NodeMCU-32S with a NTC-Thermistor and a 10K ohm pulldown.

 - AnalogInput.ino read sensor value as delay to turn LED on & off
 - To show sensorValue
    
- setup() to add `Serial.begin(9600);
 - loop() to add 
Serial.println(sensorValue);
 
 - Verify, then Tools>Serial Monitor>

 
Examples> 03.Analog> AnalogInOutSerial
- 
    
Connect NodeMCU-32S with a NTC Thermistor and a 10K ohm pulldown.

 - 
    
Modify AnalogInOutSerial.ino
- analogOutPin = 2
 - replace analogWrite to ledcWrite (for ESP32 PWM)
 
 
const byte ledPin = 2;  // for ESP32 built-in LED
// setting PWM properties
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 10; //Resolution 8, 10, 12, 15
ledcSetup(ledChannel, freq, resolution); // configure LED PWM functionalitites
ledcAttachPin(analogOutPin, ledChannel); // attach the channel to the GPIO2 to be controlled
ledcWrite(ledChannel, 102); //PWM Value varries from 0 to 1023 
- 
    
Compile

 - 
    
Verify, then Tools>Serial Monitor>

 
NTC Thermistor
Negative Temperature Coefficient = Rising Temperature will decrease Resistance
NTC thermistors can also be characterised with the B (or β) parameter equation,
where the temperatures and the B parameter are in kelvins, and R0 is the resistance at temperature T0 (25 °C = 298.15 K).
Solving for R yields
取log
log(R) = log(R0) + B * (1/T – 1/T0)
1/T = 1/T0 + (log(R) – log(R0)) / B
T = 1 / (1/T0 + (log(R) – log(R0)) /B)
[Homework] Thermistor.ino
- write above formula in C++
 - create Thermistor.ino with the following codes
 
Read ADC (get ADCvalue)
int16_t ADCvalue;
void setup(){
  Serial.begin(9600);
}
void loop() {
  ADCvalue = analogRead(A0);
  Thermistor(ADCvalue);
}
Read Thermistor (use ADCvalue to calculate R & T)
void Thermistor(int16_t ADCvalue)
{
  double T, Temp;
  double T0 = 301.15;  // 273.15 + 28 (room temperature) 室溫換成絕對溫度
  double lnR;
  int16_t R;          // Thermistor resistence 
  int16_t R0 = 8805;  // calibrated by reading R at room temperature (=28 degree Celsius )
  int16_t B  = 3950;
  int16_t Pullup = 9930; // 10K ohm
	
  // R / (Pullup + R)   = adc / 4096
  R = (Pullup * ADCvalue) / (4096 - ADCvalue);
	
  // B = (log(R) - log(R0)) / (1/T - 1/T0) 
  T = 1 / (1/T0 + (log(R)-log(R0)) / B );
  Temp = T - 273.15;	
		
  Serial.println(Temp);
}
[Homework] Thermistor_accuracy.ino
- Create Thermistor_accuracy.ino
 - Verify on NodeMCU-32S and, compare it to Thermistor.ino output
 
From Sketch/ESP32_ADC.ino
V = ReadVoltage(A0); //accuracy improved
double ReadVoltage(byte pin){
  double reading = analogRead(pin); // Reference voltage is 3v3 so maximum reading is 3v3 = 4095 in range 0 to 4095
  if(reading < 1 || reading > 4095) return 0;
  // return -0.000000000009824 * pow(reading,3) + 0.000000016557283 * pow(reading,2) + 0.000854596860691 * reading + 0.065440348345433;
  return -0.000000000000016 * pow(reading,4) + 0.000000000118171 * pow(reading,3)- 0.000000301211691 * pow(reading,2)+ 0.001109019271794 * reading + 0.034143524634089;
} // Added an improved polynomial, use either, comment out as required
Then,
V / 5 = R / (10K + R)
V = 5 * R / (10000+R)
V * (10000 + R) = 5 * R
10000 * V = 5 * R - V * R
10000 * V = (5 - V) * R
R = 10000 * V / (5-V) 
V = ReadVoltage(A0); // ADC accuracy improved for ESP32
R = 9990 * V / (5 - V); // assuming 9990 is the measured resistance of 10K resistor by a multi-meter.
T = 1 / (1/T0 + (log(R)-log(R0)) / B ); // R0=8805 measured in room tempature at 28 celsius degree.
Temp = T - 273.15;
Serial.println(Temp);
Photoresistor

LDR arduino library
Photocell (Light Dependent Resistor) Library for Arduino
Sketchbook> GL5516>

- Download files from github.com/rkuo2000/arduino/examples/GL5516
    
- GL5516.ino
 - LightDependentResistor.cpp
 - LightDependentResistor.h
 
 

- Verify with NodeMCU-32S, and open Serial Monitor on ArduinoIDE

 
MQ Gas sensors

MQ2 300~10000ppm 煙幕感應器 (液化氧、丁烷、丙烷、甲烷、酒精、氫氣)
接線方式:VCC:接電源正極(5V)、GND:接電源負極、DO:TTL開關信號輸出、AO:模擬信號輸出
注意:感測器通電後,需要預熱20秒左右,測量的數據才穩定,感測器發熱屬於正常現象,因為內部有電熱絲,如果燙手就不正常了
MQ3 酒精蒸氣,乙醇,氣體檢測模組
- The typical sensitivity characteristics of the MQ-3 for several gases. in their: Temp: 20°C、 Humidity: 65%、 O2 concentration 21% RL=200kΩ
    
- Ro: sensor resistance at 0.4mg/L of Alcohol in the clean air.
 - Rs:sensor resistance at various concentrations of gases.
 
 
MQ-135 空氣品質檢測 有害氣體感測器模組
用於建築物/辦公室的空氣質量控制設備,適用於檢測NH3,NOx,酒精,苯,煙,CO2等。

Sketch> MQ3>
- NodeMCU-32 GPIO36(A0) is connected to MQ3 sensor AO pin
 
![]()  | 
![]()  | 
- 
    
MQ3 Vcc connected to 5V, required 15 minutes burn-in

 - 
    
Open Tools>Serial-Monitor>

 - 
    
Open Tools>Serial-Plotter> to see waveform

 - 
    
3 test cases: Fresh Air, Your Breathe, Marker are applied to MQ3 sensor

 
Electronic Nose
Detection of Fruits in Warehouse
Paper: Detection of fruits in warehouse using Electronic nose

Estimating Gas Concentration
Paper: Estimating Gas Concentration using Artificial Neural Network for Electronic Nose

This site was last updated June 01, 2023.








