voltmeter.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #pragma once
  2. #include "Arduino.h"
  3. #define ADS115_ADDR 0x49
  4. #define EEPROM_ADDR 0x53
  5. #define ADS1115_RA_CONVERSION 0x00
  6. #define ADS1115_RA_CONFIG 0x01
  7. #define ADS1115_PGA_6144 0x00
  8. #define ADS1115_PGA_4096 0x01
  9. #define ADS1115_PGA_2048 0x02 // default
  10. #define ADS1115_PGA_1024 0x03
  11. #define ADS1115_PGA_512 0x04
  12. #define ADS1115_PGA_256 0x05
  13. #define ADS1115_MV_6144 0.187500F
  14. #define ADS1115_MV_4096 0.125000F
  15. #define ADS1115_MV_2048 0.062500F // default
  16. #define ADS1115_MV_1024 0.031250F
  17. #define ADS1115_MV_512 0.015625F
  18. #define ADS1115_MV_256 0.007813F
  19. #define ADS1115_RATE_8 0x00
  20. #define ADS1115_RATE_16 0x01
  21. #define ADS1115_RATE_32 0x02
  22. #define ADS1115_RATE_64 0x03
  23. #define ADS1115_RATE_128 0x04 // default
  24. #define ADS1115_RATE_250 0x05
  25. #define ADS1115_RATE_475 0x06
  26. #define ADS1115_RATE_860 0x07
  27. #define VOLTMETER_MEASURING_DIR -1
  28. #define ADS1115_MUX_P0N1 0x00 // voltmeter only support
  29. #define ADS1115_COMP_MODE_HYSTERESIS 0x00 // default
  30. #define ADS1115_COMP_MODE_WINDOW 0x01
  31. #define ADS1115_MODE_CONTINUOUS 0x00
  32. #define ADS1115_MODE_SINGLESHOT 0x01 // default
  33. #define VOLTMETER_PRESSURE_COEFFICIENT 0.015918958F
  34. #define VOLTMETER_PAG_6144_CAL_ADDR 208
  35. #define VOLTMETER_PAG_4096_CAL_ADDR 216
  36. #define VOLTMETER_PAG_2048_CAL_ADDR 224
  37. #define VOLTMETER_PAG_1024_CAL_ADDR 232
  38. #define VOLTMETER_PAG_512_CAL_ADDR 240
  39. #define VOLTMETER_PAG_256_CAL_ADDR 248
  40. #define VOLTMETER_FILTER_NUMBER 10
  41. typedef enum {
  42. PAG_6144 = ADS1115_PGA_6144,
  43. PAG_4096 = ADS1115_PGA_4096,
  44. PAG_2048 = ADS1115_PGA_2048, // default
  45. PAG_1024 = ADS1115_PGA_1024,
  46. PAG_512 = ADS1115_PGA_512,
  47. PAG_256 = ADS1115_PGA_256,
  48. } voltmeterGain_t;
  49. typedef enum {
  50. RATE_8 = ADS1115_RATE_8,
  51. RATE_16 = ADS1115_RATE_16,
  52. RATE_32 = ADS1115_RATE_32,
  53. RATE_64 = ADS1115_RATE_64,
  54. RATE_128 = ADS1115_RATE_128, // default
  55. RATE_250 = ADS1115_RATE_250,
  56. RATE_475 = ADS1115_RATE_475,
  57. RATE_860 = ADS1115_RATE_860,
  58. } voltmeterRate_t;
  59. typedef enum {
  60. SINGLESHOT = ADS1115_MODE_SINGLESHOT,
  61. CONTINUOUS = ADS1115_MODE_CONTINUOUS,
  62. } voltmeterMode_t;
  63. class Voltmeter {
  64. private:
  65. void i2cBegin();
  66. bool i2cReadBytes(uint8_t addr, uint8_t reg_addr, uint8_t* buff,
  67. uint16_t len);
  68. bool i2cWriteBytes(uint8_t addr, uint8_t reg_addr, uint8_t* buff,
  69. uint16_t len);
  70. bool i2cReadU16(uint8_t addr, uint8_t reg_addr, uint16_t* value);
  71. bool i2cWriteU16(uint8_t addr, uint8_t reg_addr, uint16_t value);
  72. float getResolution(voltmeterGain_t gain);
  73. uint16_t getCoverTime(voltmeterRate_t rate);
  74. uint8_t getPGAEEEPROMAddr(voltmeterGain_t gain);
  75. uint8_t _ads1115_addr;
  76. uint8_t _eeprom_addr;
  77. public:
  78. voltmeterGain_t _gain;
  79. voltmeterRate_t _rate;
  80. voltmeterMode_t _mode;
  81. float resolution;
  82. uint16_t cover_time;
  83. int16_t adc_raw;
  84. float calibration_factor;
  85. public:
  86. Voltmeter(uint8_t ads1115_addr = ADS115_ADDR,
  87. uint8_t eeprom_addr = EEPROM_ADDR);
  88. void setGain(voltmeterGain_t gain);
  89. void setRate(voltmeterRate_t rate);
  90. void setMode(voltmeterMode_t mode);
  91. float getVoltage(bool calibration = true);
  92. int16_t getConversion(uint16_t timeout = 125);
  93. int16_t getAdcRaw();
  94. bool isInConversion();
  95. void startSingleConversion();
  96. bool EEPORMWrite(uint8_t address, uint8_t* buff, uint8_t len);
  97. bool EEPORMRead(uint8_t address, uint8_t* buff, uint8_t len);
  98. void setCalibration(int8_t voltage, uint16_t actual);
  99. bool saveCalibration2EEPROM(voltmeterGain_t gain, int16_t hope,
  100. int16_t actual);
  101. bool readCalibrationFromEEPROM(voltmeterGain_t gain, int16_t* hope,
  102. int16_t* actual);
  103. };