//https://docs.cirkitdesigner.com/component/c1dd9b75-76f4-4953-8343-31bb2daa2cc8/ina226 // rev paulfujo 21-02-2025 sur Arduino Pro Mini #include int i,j,k; //const int Alert_input= 2; const int interruptPin = 2; const int Led= 13; const int BUZZER=6; // Broche de sortie pour le buzzer volatile bool alerte = false; #define INA226_ADDRESS 0x40 // Default I2C address for INA226 unsigned int shuntVoltage =0; float Amperes =0.000; unsigned int busVoltage =0; float Volts =0.000; unsigned int PowerRegister =0 ; // *25mW float Power=0.00; // Watt unsigned int CurrentRegister =0; unsigned int ALARME=0; //no alarme unsigned int dummy=0; long debutBip=0; void Alerte_ISR() { alerte = true; // Serial.println(" Aie"); //tone(pin, frequency, duration) tone(BUZZER, 1000,2000); debutBip=millis(); } void setup() { Serial.begin(115200); Wire.begin(); Serial.println("."); // pinMode(Alerte_input, INPUT_PULLUP); // Entrée avec pull-up interne pinMode(BUZZER, OUTPUT); pinMode(Led, OUTPUT); pinMode(interruptPin, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(interruptPin), Alerte_ISR, RISING); Serial.println(" clignote LED sur Arduino board"); for (i=0;i<4;i++) { digitalWrite(Led, LOW); delay(500); digitalWrite(Led, HIGH); delay(500); } Serial.println(" Test Buzzer sur pin 13\r\n"); tone(BUZZER, 1000,2000); Serial.println("_INA226_Test_2025 rev 21/02"); Serial.println(" "); // Configure INA226 Serial.println("Configuration (00h)"); Wire.beginTransmission(INA226_ADDRESS); Wire.write(0x00); // Point to configuration register Wire.write(0x41); // Configuration MSB Wire.write(0x27); // Configuration LSB Wire.endTransmission(); Serial.println("Calibration (05h)"); Wire.beginTransmission(INA226_ADDRESS); Wire.write(0x05); // Point to calibration register Wire.write(0x00); // Configuration MSB Wire.write(0x34); // Configuration LSB Wire.endTransmission(); Serial.println("Conf Alarme Shunt Over Limit and No Lacth (06h)"); Wire.beginTransmission(INA226_ADDRESS); Wire.write(0x06); Wire.write(0x80); // Configuration MSB SOL=1 Wire.write(0x01); // Configuration LSB LEN =1 Wire.endTransmission(); Serial.println("Init Value 20000 pour Alarme limit (07h) si > 500mA"); Wire.beginTransmission(INA226_ADDRESS); Wire.write(0x07); Wire.write(0x4E); // Configuration MSB 20000 soit ~500 mA Wire.write(0x20); // Configuration LSB Wire.endTransmission(); Serial.println(" "); } void loop() { // Read shunt (current) voltage Wire.beginTransmission(INA226_ADDRESS); Wire.write(0x01); // Point to shunt voltage register Wire.endTransmission(); Wire.requestFrom(INA226_ADDRESS, 2); // lecture 2 bytes shuntVoltage = (Wire.read() << 8) | Wire.read(); // Convert shunt voltage to Amps Amperes = shuntVoltage * 2.5/100000.0; Serial.print("Shunt Voltage: (01H) ");Serial.print(shuntVoltage); Serial.print(" Amps: ");Serial.print(Amperes); Serial.println(" A"); Wire.beginTransmission(INA226_ADDRESS); Wire.write(0x02); // Point to bus voltage register Wire.endTransmission(); Wire.requestFrom(INA226_ADDRESS, 2); busVoltage = (Wire.read() << 8) | Wire.read(); // Convert bus voltage to volts Volts = busVoltage * 1.26 / 1000; // coef 1.25 -> 1.26 Serial.print("Bus Voltage (2h): "); Serial.print(busVoltage); Serial.print(" Volts : "); Serial.print(Volts); Serial.println(" V"); Wire.beginTransmission(INA226_ADDRESS); Wire.write(0x04); // Current register Wire.endTransmission(); Wire.requestFrom(INA226_ADDRESS, 2); CurrentRegister = (Wire.read() << 8) | Wire.read(); // Convert to mA Serial.print("Current Register (04H) : "); Serial.print(CurrentRegister); Serial.println(" mA"); Wire.beginTransmission(INA226_ADDRESS); Wire.write(0x03); // Point to Power register Wire.endTransmission(); Wire.requestFrom(INA226_ADDRESS, 2); PowerRegister = (Wire.read() << 8) | Wire.read(); Power =PowerRegister * 25.0; // 25mV/LSB Serial.print("Power Register: "); Serial.print(PowerRegister); Serial.print(" POWER : "); Serial.print(Power/1000.0); Serial.println(" W"); Wire.beginTransmission(INA226_ADDRESS); Wire.write(0x06); // Alarme Flag Limit Wire.endTransmission(); Wire.requestFrom(INA226_ADDRESS, 2); Serial.print(" Read Alarm status "); ALARME = (Wire.read() << 8) | Wire.read(); dummy=(ALARME & 0x00F0)>>4; Serial.print(" ALARME : 0x"); Serial.print(ALARME,HEX); Serial.print(" , Etat AFF : "); Serial.println(dummy); // lecture registre INA226 en pooling // if ( (ALARME & 0x0010) ==0x0010) if(dummy==1) { digitalWrite(Led, HIGH); Serial.print(" Alarm limit occured\r\n"); } if ( alerte && (millis() - debutBip >= 1500) ) { noTone(BUZZER); //digitalWrite(Led, LOW); alerte = false; debutBip=millis(); } /* Serial.println(" Init Value 20000 for Alarme limit (07h), RAZ alarme"); Wire.beginTransmission(INA226_ADDRESS); Wire.write(0x07); Wire.write(0x4E); // Configuration MSB 20000 soit environ 500 mA Wire.write(0x20); // Configuration LSB Wire.endTransmission(); */ Serial.println(" "); delay(1000); digitalWrite(Led, LOW); } /* */