// ============================================
// ESP32 + ADS1115 + MCP41010 Virtual Project
// ADS1115: 16-bit ADC via I2C (SDA=D21, SCL=D22)
// MCP41010: Digital Potentiometer via SPI
// ============================================
#include <Wire.h>
#include <SPI.h>
#define ADS1115_ADDR 0x48
#define ADS_REG_CONV 0x00
#define ADS_REG_CFG 0x01
// MCP41010 SPI Pins
#define MCP_CS 5
#define MCP_MOSI 23
#define MCP_SCK 18
byte mcp_wiper = 0;
void mcp41010_set(byte value) {
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
digitalWrite(MCP_CS, LOW);
SPI.transfer(0x11);
SPI.transfer(value);
digitalWrite(MCP_CS, HIGH);
SPI.endTransaction();
}
int16_t ads1115_readSingleEnded(uint8_t channel) {
uint16_t mux;
switch (channel) {
case 0: mux = 0x4000; break;
case 1: mux = 0x5000; break;
case 2: mux = 0x6000; break;
case 3: mux = 0x7000; break;
default: mux = 0x4000;
}
// Config: OS=1, MUX, PGA=+/-4.096V, MODE=single, DR=128SPS
uint16_t config = 0x8000 | mux | 0x0200 | 0x0100 | 0x0080;
Wire.beginTransmission(ADS1115_ADDR);
Wire.write(ADS_REG_CFG);
Wire.write((config >> 8) & 0xFF);
Wire.write(config & 0xFF);
Wire.endTransmission();
delay(9); // wait for conversion
Wire.beginTransmission(ADS1115_ADDR);
Wire.write(ADS_REG_CONV);
Wire.endTransmission();
Wire.requestFrom((uint8_t)ADS1115_ADDR, (uint8_t)2);
int16_t raw = 0;
if (Wire.available() >= 2) {
raw = (Wire.read() << 8) | Wire.read();
}
return raw;
}
void setup() {
Serial.begin(115200);
delay(500);
Serial.println();
Serial.println("==========================================");
Serial.println(" ESP32 + ADS1115 + MCP41010 Virtual Proj");
Serial.println("==========================================");
Wire.begin(21, 22);
// SPI for MCP41010
SPI.begin(MCP_SCK, -1, MCP_MOSI, MCP_CS);
pinMode(MCP_CS, OUTPUT);
digitalWrite(MCP_CS, HIGH);
Serial.println("[OK] ADS1115 + MCP41010 initialized!");
Serial.println();
Serial.println("DAC% | MCP Val | ADC Raw | Voltage");
Serial.println("-----|---------|---------|--------");
}
void loop() {
// Sweep MCP41010 wiper 0-255
for (int step = 0; step <= 255; step += 32) {
mcp_wiper = step;
mcp41010_set(mcp_wiper);
delay(50);
int16_t raw = ads1115_readSingleEnded(0);
float voltage = raw * 4.096f / 32767.0f;
Serial.print(step * 100 / 255);
Serial.print("% | ");
Serial.print(step);
Serial.print(" | ");
Serial.print(raw);
Serial.print(" | ");
Serial.print(voltage, 4);
Serial.println(" V");
}
Serial.println("--- Sweep done ---");
delay(2000);
}