A placa Arduino One não possui conversor D/A. A idéia é então usar o módulo I2C MPC 4725 :

Este módulo contêm um conversor D/A de 12-bits, o que significa que aceita valores de entrada entre 0 à , gerando tensão de saída (Pino OUT) respectivamente entre 0 à 5 Volts (quando a placa é alimentada com 5 Volts no pino VCC).
Este módulo se comunica com um microcontrolador externo usando I2C via pinos SCL e SDA, onde
No entanto para acessar este módulo via IDE tradicional do Arduino se faz necessário instalar sua biblioteca:
Revisando páginas exemplo na internet usando este módulo perbemos que o mesmo foi originalmente disponibilizado pela empresa Adafruit: MCP4725 Breakout Board - 12-Bit DAC with I2C Interface. Esta mesma empresa disponibilizou uma biblioteca (em código C) para trabalhar com este módulo: GitHub Public: Adafruit_MCP4725.
Para instalar as bibliotecas fazer:
Adafruit_MCP4725.cpp (arquivo que codifica os métodos da classe Adafruit_MCP4725) e Adafruit_MCP4725.h (arquivo que inclui as definições de métodos da classe Adafruit_MCP4725)./Users/<user>/Documents/Arduino/libraries/ou mais fácil:.zip. Basta na IDE do Arduino, navegar na barra do menu até "Sketch > Incluir Biblioteca > Adicionar Biblioteca .ZIP" (Sketch > Include Library > Add .ZIP Library), como mostra a figura abaixo:
Também será necessário baixar a bibluoteca Adafruit_BusIO. Se pode tentar usar o Gerenciador da Biblioteca, ou baixar o arquivo .zip à partir de: https://github.com/adafruit/Adafruit_BusIO (Localizar a opção <> Code v e clicar na mesma, fazendo abrir a abra "Local" e escolhendo por fim "Download ZIP").
Ao final deste processo, você deve ter instalado algo do tipo (à partir da pasta: /Users/<user>/Documents/Arduino/):
x
├── libraries│ ├── Adafruit_BusIO│ │ ├── Adafruit_BusIO_Register.cpp│ │ ├── Adafruit_BusIO_Register.h│ │ ├── Adafruit_I2CDevice.cpp│ │ ├── Adafruit_I2CDevice.h│ │ ├── Adafruit_I2CRegister.h│ │ ├── Adafruit_SPIDevice.cpp│ │ ├── Adafruit_SPIDevice.h│ │ ├── CMakeLists.txt│ │ ├── LICENSE│ │ ├── README.md│ │ ├── component.mk│ │ ├── examples│ │ │ ├── i2c_address_detect│ │ │ │ └── i2c_address_detect.ino│ │ │ ├── i2c_readwrite│ │ │ │ └── i2c_readwrite.ino│ │ │ ├── i2c_registers│ │ │ │ └── i2c_registers.ino│ │ │ ├── i2corspi_register│ │ │ │ └── i2corspi_register.ino│ │ │ ├── spi_modetest│ │ │ │ └── spi_modetest.ino│ │ │ ├── spi_readwrite│ │ │ │ └── spi_readwrite.ino│ │ │ ├── spi_register_bits│ │ │ │ └── spi_register_bits.ino│ │ │ └── spi_registers│ │ │ └── spi_registers.ino│ │ └── library.properties│ └── Adafruit_MCP4725│ ├── Adafruit_MCP4725.cpp│ ├── Adafruit_MCP4725.h│ ├── README.md│ ├── code-of-conduct.md│ ├── examples│ │ ├── sinewave│ │ │ └── sinewave.ino│ │ └── trianglewave│ │ └── trianglewave.ino│ ├── library.properties│ ├── license.txt│ └── trianglewave.pngSerá necessário re-iniciar a IDE do Arduino para estas bibliotecas poderem ser reconhecidas.
Obs.: esta biblioteca requer a biblioteca <Wire.h> do Arduino para poder trabalhar com I2C.
Como deve ter sido percebido, dentro da pasta /libraries há exemplos de como acessar com estes módulos.
Os seguintes pinos físicos do módulo devem ser assim conectados:
Este módulo se conecta a um microcontrolador usando comunicação I2C. A princípio, este módulo pode ser encontrado em 6 endereços (ID) diferentes: 0x60, 0x61, 0x62, 0x63, 0x64, 0x65.
Se pino A0 do DAC está desconectado --> normalmente este módulo é encontrado no endereço: 0x62.
Se pino A0 do DAC está conectado à Vdd --> este módulo é encontrado em: 0x63
Ref.: https://learn.adafruit.com/mcp4725-12-bit-dac-tutorial/wiring
Sugestão de programação:
Antes do bloco:
xxxxxxxxxxvoid setup() { // put your setup code here, to run once: }Você deve acrescentar as linhas:
xxxxxxxxxx// necessário para comunicação I2C// necessário para acessar o DACAdafruit_MCP4725 dac; // para instanciar o objeto "dac" pertencente a classe "Adafruit_MCP4725"// pode ser útil declarar a variável global booleana abaixobool DAC_found = false; // indica problemas para acessar DACDepois disto para acessar o módulo, deve fazer:
void setup(){:x
void setup(){ Serial.begin(9600); // ativa porta serial delay(100); // espera porta inicializar Serial.println(""); Serial.println("Buscando Módulo DAC MCP4725"); delay(50); for (uint8_t ender = 0x60; ender <= 0x65; ender++){ Serial.print("Testando endereço: 0x"); Serial.print(ender, HEX); DAC_found = dac.begin(ender); if (DAC_found){ Serial.println(" <-- Encontrado, Ok"); digitalWrite(pino_monitor_DAC, HIGH); break; // sai do for } Serial.println(""); } if (!DAC_found){ Serial.print("Ops... Modulo DAC MCP4725 não encontrado"); } // seguem outros comandos seus...}x
ISR(TIMER2_COMPA_vect){ //timer2 interrupt // suas linhas de programa... DAC_found = dac.setVoltage(valor, false); // outras linhas de programa... // Você poderia fazer algo como: // if (!DAC_found) WarnLostDAC(); // a rotina 'WarnLostDAC()' desabilita uso desta interrupção, seta flag avisando de problemas.}Fim.