ESP32 + analogRead() on Arduino

It works fine. I had it confused with analogWrite(). You can find the pins for analogRead in

On the esp32 devkit v1  GPIO’s 32, 33, 34, 35 are broken out.

  Analog input, serial output on esp32

 Reads an analog input pin, prints the results to the serial monitor.

Cut down from AnalogInOutSerial by Tom Igoe for Arduino.
Modified for use with esp32 
This example code is in the public domain.
// These constants won't change.  They're used to give names
// to the pins used:
const int analogPin = 32;  // Analog input pin , ours is connected to YL-83

int sensorValue = 0;        // value read from the adc
void setup() {
  // initialize serial communications at 9600 bps:

void loop() {
  // read the analog in value:
  sensorValue = analogRead(analogPin);
  // print the results to the serial monitor:
  //Serial.print("sensor = ");

  // wait 1 seconds before the next loop to minimise corrosion on the rain detector.


Mongoose OS on esp32

Heard about mongoose OS from . Scargills blog is always worth a read if you are interested in sbc, iot, home automation and node-red.

Mongoose OS is an open source Operating System for the IOT, supporting ESP32, ESP8266, STM32, TI CC3200 (Amazon AWS IoT integrated). Code in C or JavaScript.

This sounded interesting, and seemed a middle way between the arduino and esp32-IDF routes of programing the esp32. Also as it is built with IOT in mind is a good place to learn a bit more.

Installed following



This launches a gui in a webpage. I could select the usb port that the esp32 was on, but when i tried to flash mongoose onto it I got:

E0614 19:52:33.535553   15390 ui.go:453] Calling: FS.ListExt
Server Error: {"error":"Device is not connected"}

The solution is to flash from the command line:

~/.mos/bin/mos flash mos-esp32

Much happier:

Loaded mjs_base/esp32 version 1.0 (20170614-125632/???)
Using port /dev/ttyUSB0
Opening /dev/ttyUSB0...
Connecting to ESP32 ROM, attempt 1 of 10...
Running flasher @ 460800...
  Flasher is running
Flash size: 4194304, params: 0x0220 (dio,32m,40m)
   16320 @ 0x1000 -> 12288
   16384 @ 0x9000 -> 8192
  819824 @ 0x10000 -> 126976
  131072 @ 0x190000 -> 16384
   12288 @ 0x1000
    4096 @ 0x8000
    8192 @ 0x9000
    8192 @ 0xd000
    4096 @ 0x10000
  122880 @ 0x20000
   16384 @ 0x1a2000
Wrote 176128 bytes in 3.93 seconds (349.73 KBit/sec)
   16320 @ 0x1000
    3072 @ 0x8000
   16384 @ 0x9000
    8192 @ 0xd000
  819824 @ 0x10000
  131072 @ 0x190000
Booting firmware...
All done!

Then go back to the gui using


for final configuration (like the ssid and password).

One of the examples is a mqtt example that publishes the ram to a mqtt feed when the boot button is pressed on the esp32. With a bit of digging I found ‘api_adc.js’ that acts as a wrapper for the adc api, so I could use the YL-83 rain sensor on pin 32.


GPIO.set_button_handler(0, GPIO.PULL_UP, GPIO.INT_EDGE_NEG, 200, function() {
  let topic = Cfg.get('mqtt.user') + '/feeds/rain';
  //let message = JSON.stringify(Sys.free_ram());
  let message = JSON.stringify(;
  let ok =, message, 1);
  print('Published:', ok ? 'yes' : 'no', 'topic:', topic, 'message:', message);
}, null);

You can see the feed at after testing with drops of water.