ESP32 + analogRead()

The ESP32 is the new chip-on-the-block for Internet of Things, having both wi-fi and bluetooth. I have a breakout board from They are coming down in price and can be found for under £7. This breaks out many(but not all) of the pins. I wanted to use a temperature sensor TMP36 and use analogRead() like in That example was for the ESP8266.

However, being relatively new, the ESP32 does not support reading an analog input using that simple analogRead() that you find in the arduino ide.

Actually, I just worked out it dosen’t support analogWrite() at  the moment, analogRead() works fine. However, it gave me a chance to learn about other environments for the esp32.

So it’s off to download and install the “Espressif IoT Development Framework”

Read the docs on ADC

The ADC driver API currently only supports ADC1 (9 channels, attached to GPIOs 32-39).

The only goes to GPIO 35, so we have 4 to play with. Compiling and flashing the adc1_test, in /examples/peripherals/adc/main/adc1_test.c
ADC1_CHANNEL_4 is used, from the docs ADC1 channel 4 is GPIO32

<pre class="lang:c decode:true">/* ADC1 Example

   This example code is in the Public Domain (or CC0 licensed, at your option.)

   Unless required by applicable law or agreed to in writing, this
   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
   CONDITIONS OF ANY KIND, either express or implied.
#include <stdio.h>;
#include <string.h>;
#include <stdlib.h>;
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/gpio.h"
#include "driver/adc.h"

#define ADC1_TEST_CHANNEL (4)

void adc1task(void* arg)
    // initialize ADC

void app_main()
    xTaskCreate(adc1task, "adc1task", 1024*3, NULL, 10, NULL);

The analog read worked, but the temperature sensor was a bit funny. So I tested it with a rain-detector, which seemed to give reasonable results.



Leave a Reply

Your email address will not be published. Required fields are marked *