Vamos estudar uma maneira de criar saída analógica com MCP4725 e o ESP32-C3, usando código Arduino e o software Arduino IDE. O MCP4725 é um chip DAC (conversor digital para analógico) de 12 bits em uma configuração SOT23-6 (6 pinos). Feito pela Microchip e com o datasheet disponível aqui, esse pequeno chip funciona de 2,7 a 5,5 V e se comunica via i2c.
Estamos fornecendo 3,3 V porque estamos usando um ESP32-C3 mini como controlador. Como dito, a comunicação entre o MCP4725 e o ESP32-C3 é via i2c, usando apenas dois fios (SDA e SCL).
Hardware
Decidi escrever este artigo usando um ESP32-C3, mas nada impede que você use qualquer placa que tiver em mãos. Afinal, isso é apenas i2c, algo que qualquer Arduino pode fazer; O código deste artigo será compilado perfeitamente para você. Você pode ver o diagrama esquemático abaixo, multímetro incluído (para medir a voltagem).


Circuito bem simples, o GPIO 8 do ESP32-C3 é SDA e o GPIO 9 é SCL. Forneça 3,3V e GND e conecte um multímetro (em modo voltagem) em OUT e GND, além de um potenciômetro de 10k Ohm para referência de tensão. O potenciômetro é usado para gerar uma referência de tensão, para que nossa saída analógica o siga.
Código e testes
Estamos usando o Arduino IDE e o código Arduino para este exemplo. Para dispositivos como o MCP4725, que funciona via i2c, é interessante ter uma biblioteca cuidando das coisas para nós. Eu instalei uma biblioteca chamada “MCP4725” de Rob Tillaart, indo em “Sketch > Include library > Manage librarys” e digite “MCP4725”. Instale a do Rob Tillaart.
Eu então escrevi o código eu mesmo, com base em um exemplo disponível no IDE. Vá em “File > Examples > MCP4725 > MCP4725_test”. Minha versão modificada do código é vista abaixo.
// Created by Clovis Fritzen, FritzenLab.net
// Based on work from:
// FILE: mcp4725_minimal.ino
// AUTHOR: Rob Tillaart
// PURPOSE: Minimal sketch MCP4725 (#29)
// URL: https://github.com/RobTillaart/MCP4725
#include "Wire.h"
#include "MCP4725.h"
MCP4725 MCP(0x60);
long oldtime;
int rawAnalog;
int i= 0;
void setup()
{
Serial.begin(115200);
Wire.begin();
MCP.begin();
//analogReadResolution(12);
}
void loop()
{
if(millis() - oldtime > 100){
oldtime= millis();
rawAnalog= analogRead(A0);
MCP.setValue(rawAnalog);
i++;
if(i == 10){
Serial.println(rawAnalog);
i=0;
}
}
}
Tudo acontece a cada 100 ms (milissegundos), o resto do tempo o microcontrolador está livre para fazer o que você pedir. Não há delay(), então não há código de bloqueio. Eu basicamente leio a entrada analógica A0 (potenciômetro) e armazeno em “rawAnalog”, então faço “MCP.setValue(rawAnalog) para escrever o valor no MCP4725.
Como isso é feito a cada 100 ms, parece quase contínuo ao olho humano (especialmente no multímetro). Eu também imprimo o valor “rawAnalog” no monitor serial a cada 1000 ms (10x 100 ms).
Pra finalizar
Fiz um vídeo para ficar mais claro como o sistema funciona, aproveite. Também antes de ir, quer me ver testando outro DAC? Clique aqui. Também se você quiser comprar o MCP4725 use meu link de afiliado.





