🛠 Ajouter un capteur I²C (température) sur A4/A5
Objetivos
Aprovechar el bus I²C/TWI nativo del ATmega328P: en la Pro Mini, SDA está en A4 y SCL en A5, en la misma fila de pines que las entradas analógicas. La última revisión de SparkFun incluso añade huellas SMD para soldar las resistencias de pull-up I²C — útil en montajes fijos, ya que muchos módulos ya las incluyen. Se lee un sensor de temperatura MCP9808 (dirección 0x18) con la biblioteca Wire y se muestran los grados Celsius.
Material
- 1 × Arduino Pro Mini (el bus I²C funciona igual a 5 V y 3,3 V — alimentar el sensor al mismo voltaje que la placa)
- 1 × módulo sensor I²C (MCP9808, o LM75/BME280/OLED SSD1306 — mismos pines)
- 4 × cables: VCC, GND, SDA→A4, SCL→A5
- Resistencias de pull-up de 4,7 kΩ hacia VCC en SDA y SCL si el módulo no las tiene (o soldar las de las huellas de la placa)
- Adaptador FTDI/CP2102 para el monitor serie
Código completo
// Capteur temperature I2C MCP9808 sur A4 (SDA) / A5 (SCL)
#include <Wire.h>
const uint8_t ADDR = 0x18; // adresse par defaut du MCP9808
void setup {
Serial.begin(57600);
Wire.begin; // maitre I2C, broches A4/A5 fixes sur 328P
if (Wire.requestFrom(ADDR, (uint8_t)1) == 0) {
Serial.println(F("Capteur absent ! Verifier SDA/SCL/adresse"));
}
}
void loop {
Wire.beginTransmission(ADDR);
Wire.write(0x05); // registre ambient temperature
Wire.endTransmission;
Wire.requestFrom(ADDR, (uint8_t)2);
if (Wire.available >= 2) {
int16_t brut = (Wire.read << 8) | Wire.read;
if (brut & 0x8000) brut -= 0x10000; // signe negatif
float t = (brut & 0x0FFF) * 0.0625; // resolution 1/16 degre
Serial.print(F("T = "));
Serial.print(t);
Serial.println(F(" C"));
}
delay(1000);
}
Verificación esperada
El monitor serie muestra una temperatura coherente (~20-25 °C en interiores), que sube cuando se aprieta el sensor entre los dedos. La prueba de presencia del setup no muestra ningún error si SDA/SCL están correctamente en A4/A5 y existen las pull-up. En la última revisión de la placa, las dos pequeñas huellas cerca de A4/A5 permiten soldar resistencias 0603 de 4,7 kΩ para un bus limpio en una instalación permanente.
Errores frecuentes
- Olvidar las pull-up en SDA/SCL: el bus permanece en nivel bajo, Wire.requestFrom devuelve 0 bytes; la mayoría de los módulos breakout las incluyen, los chips desnudos no.
- Conectar SDA en A5 y SCL en A4: el ATmega328P tiene sus pines TWI fijados en A4=SDA, A5=SCL, sin posibilidad de reasignación (a diferencia de otros MCU).
- Mezclar un módulo de 5 V y una Pro Mini de 3,3 V sin verificar el nivel lógico: el módulo de 5 V puede llevar SDA por encima de VCC y dañar el pin.
- Direccionamiento I²C: algunos módulos se presentan en 0x48 (LM75) en lugar de 0x18; en caso de silencio, escanear el bus pin por pin.
- Confundir A4/A5 con entradas analógicas libres: en cuanto se ejecuta Wire.begin, estos pines pertenecen al bus.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.inoArduinobouton-poussoir.inoArduinopwm-fade.inoArduinocapteur-lumiere-ldr.inoArduinoservo-balayage.inoArduinoruban-neopixel.inoArduino