ADS1115_Handler

drivers
drivers/ADS1115_Handler.h
driver stable stable

Pilote du convertisseur analogique-numérique I2C ADS1115 (4 canaux, 16 bits). Fonctionnalités : /

Méthodes publiques

Méthode Description Paramètres Retour
ADS1115_Handler()
ADS1115_Handler();
Construit le handler avec l'adresse I2C par défaut (0x48). /
ADS1115_Handler()
ADS1115_Handler(uint8_t address);
Construit le handler pour une adresse I2C spécifique. / address: Adresse I2C du module ADS1115 (dépend du câblage ADDR) /
begin()
begin();
Initialise le composant avec le gain et la fréquence par défaut. / true
true si l'initialisation a réussi, false sinon /
begin()
begin(adsGain_t gain, ADS1115_DataRate dataRate = ADS1115_DR_128SPS);
Initialise le composant avec un gain et une fréquence d'échantillonnage donnés. / gain: Gain de l'ADS1115 (ex: GAIN_TWOTHIRDS pour ±6.144V)
dataRate: Fréquence d'échantillonnage (défaut: ADS1115_DR_128SPS)
true
true si l'initialisation a réussi, false sinon /
read()
read(uint8_t channel);
Lit la valeur brute (16 bits signés) d'un canal. / channel: Numéro du canal à lire (0 à 3) Valeur
Valeur brute lue par le convertisseur /
readMilliVolts()
readMilliVolts(uint8_t channel);
Lit la tension d'un canal, convertie en millivolts. / channel: Numéro du canal à lire (0 à 3) Tension
Tension mesurée en mV /
readVolts()
readVolts(uint8_t channel);
Lit la tension d'un canal, convertie en volts. / channel: Numéro du canal à lire (0 à 3) Tension
Tension mesurée en V /
setGain()
setGain(adsGain_t newGain);
Change le gain (donc la pleine échelle) du convertisseur. / newGain: Nouveau gain à appliquer /
setDataRate()
setDataRate(ADS1115_DataRate newDataRate);
Change la fréquence d'échantillonnage du convertisseur. / newDataRate: Nouvelle fréquence d'échantillonnage /
setAddress()
setAddress(uint8_t address);
Change l'adresse I2C utilisée pour communiquer avec le module. / address: Nouvelle adresse I2C /
isInitialized()
isInitialized() const;
Indique si begin() a été appelé avec succès. / true
true si le composant est initialisé /
getStatus()
getStatus() const;
Retourne l’état courant du périphérique /
getGain()
getGain() const;
getAddress()
getAddress() const;
getDataRate()
getDataRate() const;
getReadCount()
getReadCount() const;
getErrorCount()
getErrorCount() const;
printInfo()
printInfo();
Affiche sur le port série la configuration courante (adresse, gain, débit). /
printAllChannels()
printAllChannels();
Affiche sur le port série la tension mesurée sur les 4 canaux. /
beginContinuous()
beginContinuous(uint8_t channel, uint8_t alertPin, int16_t rawThreshold = 0);
Configure une conversion continue sur un canal, avec la broche ALERT/RDY du module utilisée comme comparateur matériel : elle s'active (niveau bas) dès que la valeur brute dépasse le seuil donné. Mode "traditionnel" et verrouillé (latch) : le pin reste actif jusqu'à ce que la valeur soit lue (cf. getLastConversion()). channel: Canal à convertir en continu (0 à 3)
alertPin: Broche du MCU reliée à la sortie ALERT/RDY du module
rawThreshold: Seuil brut (16 bits signés) déclenchant l'alerte. Laisser à 0 (valeur par défaut) pour un déclenchement quasi systématique à chaque conversion (utile en lecture "polling" non bloquante sans réel seuil de tension).
true
true si la configuration a réussi /
beginThresholdAlert()
beginThresholdAlert(uint8_t channel, uint8_t alertPin, float thresholdMilliVolts);
Equivalent de beginContinuous(), mais le seuil est exprimé directement en millivolts (converti en valeur brute selon le gain courant du convertisseur). / channel: Canal à surveiller (0 à 3)
alertPin: Broche du MCU reliée à ALERT/RDY
thresholdMilliVolts: Seuil de tension déclenchant l'alerte (mV)
true
true si la configuration a réussi /
dataReady()
dataReady();
Indique si une nouvelle conversion est disponible depuis le dernier appel (mode continu uniquement). Consomme le drapeau : un second appel immédiat renverra false tant qu'aucune nouvelle conversion n'est arrivée. / true
true si une nouvelle donnée est prête à être lue /
getLastConversion()
getLastConversion();
Récupère la dernière valeur brute convertie en mode continu. / Valeur
Valeur brute (16 bits signés), ou 0 si le mode continu n'est pas actif /
getLastConversionMilliVolts()
getLastConversionMilliVolts();
Récupère la dernière valeur convertie en mode continu, en millivolts. /
isContinuousMode()
isContinuousMode() const;
Indique si le mode continu (piloté par ALERT/RDY) est actif. /

Méthodes privées


            rawToVolts(int16_t raw);;
rawToMilliVolts(int16_t raw);;
milliVoltsToRaw(float milliVolts);;
applyConfiguration();;
onAlertInterrupt();;
adc(ADS1115_ADDRESS);;
begin(115200);;
println("Erreur d'initialisation ADS1115");;
while (1);;
printInfo();;
for (uint8_t ch = 0; ch < 4; ch++) {;
print("CH");;
print(ch);;
print(" : ");;
println(" mV");;
println("------------------");;
delay(1000);;
adc(ADS1115_ADDRESS);;
begin(115200);;
while (1);;
adc(ADS1115_ADDRESS);;
begin(115200);;
while (1);;
print("Seuil depasse : ");;
println(" mV");;

                    

Variables membres


            Adafruit_ADS1115 _ads;
bool _dataReadyFlag;

                    

Code source


        #pragma once

#include <Arduino.h>
#include <Adafruit_ADS1X15.h>

#include "../StatusDevice.h"

namespace crepp::drivers {

enum ADS1115_DataRate {
    ADS1115_DR_8SPS    = 0x0000,
    ADS1115_DR_16SPS   = 0x0020,
    ADS1115_DR_32SPS   = 0x0040,
    ADS1115_DR_64SPS   = 0x0060,
    ADS1115_DR_128SPS  = 0x0080,
    ADS1115_DR_250SPS  = 0x00A0,
    ADS1115_DR_475SPS  = 0x00C0,
    ADS1115_DR_860SPS  = 0x00E0
};

/**
 * @class ADS1115_Handler
 * @brief Pilote du convertisseur analogique-numérique I2C ADS1115 (4 canaux, 16 bits).
 *
 * @badge driver
 * @badge stable
 *
 * Fonctionnalités :
 * - Initialisation avec gain et fréquence d'échantillonnage configurables
 * - Lecture brute, en volts ou en millivolts sur chacun des 4 canaux
 * - Compteurs de lectures / erreurs pour le diagnostic
 */
class ADS1115_Handler {
public:
    /**
     * @brief Construit le handler avec l'adresse I2C par défaut (0x48).
     */
    ADS1115_Handler();

    /**
     * @brief Construit le handler pour une adresse I2C spécifique.
     * @param address Adresse I2C du module ADS1115 (dépend du câblage ADDR)
     */
    explicit ADS1115_Handler(uint8_t address);
    ~ADS1115_Handler() = default;

    /**
     * @brief Initialise le composant avec le gain et la fréquence par défaut.
     * @return true si l'initialisation a réussi, false sinon
     */
    bool begin();

    /**
     * @brief Initialise le composant avec un gain et une fréquence d'échantillonnage donnés.
     * @param gain Gain de l'ADS1115 (ex: GAIN_TWOTHIRDS pour ±6.144V)
     * @param dataRate Fréquence d'échantillonnage (défaut: ADS1115_DR_128SPS)
     * @return true si l'initialisation a réussi, false sinon
     */
    bool begin(adsGain_t gain, ADS1115_DataRate dataRate = ADS1115_DR_128SPS);

    /**
     * @brief Lit la valeur brute (16 bits signés) d'un canal.
     * @param channel Numéro du canal à lire (0 à 3)
     * @return Valeur brute lue par le convertisseur
     */
    int16_t read(uint8_t channel);

    /**
     * @brief Lit la tension d'un canal, convertie en millivolts.
     * @param channel Numéro du canal à lire (0 à 3)
     * @return Tension mesurée en mV
     */
    float readMilliVolts(uint8_t channel);

    /**
     * @brief Lit la tension d'un canal, convertie en volts.
     * @param channel Numéro du canal à lire (0 à 3)
     * @return Tension mesurée en V
     */
    float readVolts(uint8_t channel);

    /**
     * @brief Change le gain (donc la pleine échelle) du convertisseur.
     * @param newGain Nouveau gain à appliquer
     */
    void setGain(adsGain_t newGain);

    /**
     * @brief Change la fréquence d'échantillonnage du convertisseur.
     * @param newDataRate Nouvelle fréquence d'échantillonnage
     */
    void setDataRate(ADS1115_DataRate newDataRate);

    /**
     * @brief Change l'adresse I2C utilisée pour communiquer avec le module.
     * @param address Nouvelle adresse I2C
     */
    void setAddress(uint8_t address);

    /**
     * @brief Indique si begin() a été appelé avec succès.
     * @return true si le composant est initialisé
     */
    bool isInitialized() const;

    /**
     * @brief Retourne l’état courant du périphérique
     */
    StatusDevice getStatus() const;

    /// Gain actuellement configuré
    adsGain_t getGain() const;
    /// Adresse I2C actuellement configurée
    uint8_t getAddress() const;
    /// Fréquence d'échantillonnage actuellement configurée
    ADS1115_DataRate getDataRate() const;
    /// Nombre total de lectures effectuées depuis begin()
    uint32_t getReadCount() const;
    /// Nombre total d'erreurs de lecture rencontrées depuis begin()
    uint32_t getErrorCount() const;

    /**
     * @brief Affiche sur le port série la configuration courante (adresse, gain, débit).
     */
    void printInfo();

    /**
     * @brief Affiche sur le port série la tension mesurée sur les 4 canaux.
     */
    void printAllChannels();

    /**
     * @brief Configure une conversion continue sur un canal, avec la broche
     *        ALERT/RDY du module utilisée comme comparateur matériel : elle
     *        s'active (niveau bas) dès que la valeur brute dépasse le seuil
     *        donné. Mode "traditionnel" et verrouillé (latch) : le pin reste
     *        actif jusqu'à ce que la valeur soit lue (cf. getLastConversion()).
     * @param channel Canal à convertir en continu (0 à 3)
     * @param alertPin Broche du MCU reliée à la sortie ALERT/RDY du module
     * @param rawThreshold Seuil brut (16 bits signés) déclenchant l'alerte.
     *        Laisser à 0 (valeur par défaut) pour un déclenchement quasi
     *        systématique à chaque conversion (utile en lecture "polling"
     *        non bloquante sans réel seuil de tension).
     * @return true si la configuration a réussi
     */
    bool beginContinuous(uint8_t channel, uint8_t alertPin, int16_t rawThreshold = 0);

    /**
     * @brief Equivalent de beginContinuous(), mais le seuil est exprimé
     *        directement en millivolts (converti en valeur brute selon le
     *        gain courant du convertisseur).
     * @param channel Canal à surveiller (0 à 3)
     * @param alertPin Broche du MCU reliée à ALERT/RDY
     * @param thresholdMilliVolts Seuil de tension déclenchant l'alerte (mV)
     * @return true si la configuration a réussi
     */
    bool beginThresholdAlert(uint8_t channel, uint8_t alertPin, float thresholdMilliVolts);

    /**
     * @brief Indique si une nouvelle conversion est disponible depuis le
     *        dernier appel (mode continu uniquement). Consomme le drapeau :
     *        un second appel immédiat renverra false tant qu'aucune nouvelle
     *        conversion n'est arrivée.
     * @return true si une nouvelle donnée est prête à être lue
     */
    bool dataReady();

    /**
     * @brief Récupère la dernière valeur brute convertie en mode continu.
     * @return Valeur brute (16 bits signés), ou 0 si le mode continu n'est pas actif
     */
    int16_t getLastConversion();

    /**
     * @brief Récupère la dernière valeur convertie en mode continu, en millivolts.
     */
    float getLastConversionMilliVolts();

    /**
     * @brief Indique si le mode continu (piloté par ALERT/RDY) est actif.
     */
    bool isContinuousMode() const;

private:
    Adafruit_ADS1115 _ads;

    uint8_t _address = 0x48;
    adsGain_t _gain = GAIN_TWOTHIRDS;
    ADS1115_DataRate _dataRate = ADS1115_DR_128SPS;

    uint32_t _readCount = 0;
    uint32_t _errorCount = 0;
    bool _initialized = false;

    StatusDevice _status = StatusDevice::DEVICE_ERROR_INIT;

    /// Convertit une valeur brute en volts, selon le gain courant
    float rawToVolts(int16_t raw);
    /// Convertit une valeur brute en millivolts, selon le gain courant
    float rawToMilliVolts(int16_t raw);
    /// Convertit une tension en millivolts vers la valeur brute correspondante, selon le gain courant
    int16_t milliVoltsToRaw(float milliVolts);
    /// Applique au composant physique la configuration courante (gain, débit)
    bool applyConfiguration();

    uint8_t _alertPin = 255;
    uint8_t _continuousChannel = 0;
    bool _continuousMode = false;

    // Note : ce drapeau est statique, donc partagé par toutes les instances.
    // Une seule instance à la fois peut utiliser le mode continu piloté par
    // interruption (limitation acceptable : un seul ADS1115 par projet dans
    // la grande majorité des cas). Pour plusieurs modules simultanés en
    // mode continu, il faudrait un tableau de drapeaux indexé par broche.
    static volatile bool _dataReadyFlag;
    static void onAlertInterrupt();
};

/*
@example

@include
#include <crepp/drivers/ADS1115_Handler.h>
@end_include

@macro
#define ADS1115_ADDRESS 0x48
@end_macro

@instance
crepp::drivers::ADS1115_Handler adc(ADS1115_ADDRESS);
@end_instance

@setup
  Serial.begin(115200);

  if (!adc.begin(GAIN_TWOTHIRDS, ADS1115_DR_128SPS)) {
      Serial.println("Erreur d'initialisation ADS1115");
      while (1);
  }

  adc.printInfo();
@end_setup

@loop
  for (uint8_t ch = 0; ch < 4; ch++) {
      Serial.print("CH");
      Serial.print(ch);
      Serial.print(" : ");
      Serial.print(adc.readMilliVolts(ch));
      Serial.println(" mV");
  }

  Serial.println("------------------");
  delay(1000);
@end_loop

@end_example

@example
// Variante A : lecture non bloquante d'un seul canal, sans vrai seuil
// (ALERT/RDY s'active à quasiment chaque conversion, utile en polling)

@include
#include <crepp/drivers/ADS1115_Handler.h>
@end_include

@macro
#define ADS1115_ADDRESS 0x48
#define ADS1115_ALERT_PIN 13
#define ADS1115_CHANNEL 0
@end_macro

@instance
crepp::drivers::ADS1115_Handler adc(ADS1115_ADDRESS);
@end_instance

@setup
  Serial.begin(115200);

  if (!adc.beginContinuous(ADS1115_CHANNEL, ADS1115_ALERT_PIN)) {
      Serial.println("Erreur d'initialisation ADS1115 (mode continu)");
      while (1);
  }
@end_setup

@loop
  if (adc.dataReady()) {
      Serial.println(adc.getLastConversionMilliVolts());
  }
@end_loop

@end_example

@example
// Variante B : vraie alerte sur seuil de tension (ex: 2500 mV)
// ALERT/RDY ne s'active que lorsque la tension dépasse ce seuil.

@include
#include <crepp/drivers/ADS1115_Handler.h>
@end_include

@macro
#define ADS1115_ADDRESS 0x48
#define ADS1115_ALERT_PIN 13
#define ADS1115_CHANNEL 0
#define THRESHOLD_MV 2500.0f
@end_macro

@instance
crepp::drivers::ADS1115_Handler adc(ADS1115_ADDRESS);
@end_instance

@setup
  Serial.begin(115200);

  if (!adc.beginThresholdAlert(ADS1115_CHANNEL, ADS1115_ALERT_PIN, THRESHOLD_MV)) {
      Serial.println("Erreur d'initialisation ADS1115 (seuil)");
      while (1);
  }
@end_setup

@loop
  if (adc.dataReady()) {
      Serial.print("Seuil depasse : ");
      Serial.print(adc.getLastConversionMilliVolts());
      Serial.println(" mV");
  }
@end_loop

@end_example
*/

} // namespace crepp::drivers