ads1115

blackzoom
Offline
Зарегистрирован: 26.05.2018

всем привет. как ads1115 настроить  на 860 sps ?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Например, вот так:

  uint16_t config = ADS1115_CONFIG_CQUE_NONE       |
                    ADS1115_CONFIG_CLAT_NONLAT     |
                    ADS1115_CONFIG_CPOL_ACTVLOW    |
                    ADS1115_CONFIG_CMODE_TRAD      |
                    ADS1115_CONFIG_DR_860SPS       |
                    ADS1115_CONFIG_MODE_CONTINUOUS |
                    ADS1115_CONFIG_PGA_1_024V      |
                    ADS1115_CONFIG_MUX_DIFF_0_1;

  Wire.beginTransmission(ADS1115_I2C_ADDRESS);
  Wire.write(ADS1115_REG_CONFIG);
  Wire.write((uint8_t)(config >> 8));
  Wire.write((uint8_t)(config & 0xFF));
  Wire.endTransmission();

 

blackzoom
Offline
Зарегистрирован: 26.05.2018

sadman41 пишет:

Например, вот так:

  uint16_t config = ADS1115_CONFIG_CQUE_NONE       |
                    ADS1115_CONFIG_CLAT_NONLAT     |
                    ADS1115_CONFIG_CPOL_ACTVLOW    |
                    ADS1115_CONFIG_CMODE_TRAD      |
                    ADS1115_CONFIG_DR_860SPS       |
                    ADS1115_CONFIG_MODE_CONTINUOUS |
                    ADS1115_CONFIG_PGA_1_024V      |
                    ADS1115_CONFIG_MUX_DIFF_0_1;

  Wire.beginTransmission(ADS1115_I2C_ADDRESS);
  Wire.write(ADS1115_REG_CONFIG);
  Wire.write((uint8_t)(config >> 8));
  Wire.write((uint8_t)(config & 0xFF));
  Wire.endTransmission();

 

а для среды разработки arduino ide как это будет выглядеть?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Это из скетча Arduino и вытащено. 

Отдельной команды/регистра для скорости оцифровки нет. Поэтому или пишете каждый раз в конфигурационный регистр сразу все параметры работы чипа, либо читаете их оттуда, исправляете и пишете заново. Только вот не помню - чип дает конфиг читать или нет... 

Уровня вашей подготовки я не знаю, поэтому точной рекомендации не могу дать. 

5N62V
Offline
Зарегистрирован: 25.02.2016

sadman41  а где дефайны к этому лежат?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

5N62V пишет:

sadman41  а где дефайны к этому лежат?

Да там же, в моем скетче :))

// ADC ADS1115 settings
#define ADS1115_I2C_ADDRESS                  (0x48)

#define ADS1115_CONFIG_PGA_6_144V            (0x0000)  // +/-6.144V range = Gain 2/3
#define ADS1115_CONFIG_PGA_4_096V            (0x0200)  // +/-4.096V range = Gain 1
#define ADS1115_CONFIG_PGA_2_048V            (0x0400)  // +/-2.048V range = Gain 2 (default)
#define ADS1115_CONFIG_PGA_1_024V            (0x0600)  // +/-1.024V range = Gain 4
#define ADS1115_CONFIG_PGA_0_512V            (0x0800)  // +/-0.512V range = Gain 8
#define ADS1115_CONFIG_PGA_0_256V            (0x0A00)  // +/-0.256V range = Gain 16

#define ADS1115_CONFIG_DR_8SPS               (0x0000)  // 8 samples per second
#define ADS1115_CONFIG_DR_16SPS              (0x0020)  // 16 samples per second
#define ADS1115_CONFIG_DR_32SPS              (0x0040)  // 32 samples per second
#define ADS1115_CONFIG_DR_64SPS              (0x0060)  // 64 samples per second
#define ADS1115_CONFIG_DR_128SPS             (0x0080)  // 128 samples per second (default)
#define ADS1115_CONFIG_DR_250SPS             (0x00A0)  // 250 samples per second
#define ADS1115_CONFIG_DR_475SPS             (0x00C0)  // 475 samples per second
#define ADS1115_CONFIG_DR_860SPS             (0x00E0)  // 860 samples per second

#define ADS1115_CONFIG_MUX_DIFF_0_1          (0x0000)  // Differential P[ositive] = AIN0, N[egative] = AIN1 (default)
#define ADS1115_REG_CONVERT                  (0x00)
#define ADS1115_REG_CONFIG                   (0x01)
#define ADS1115_CONFIG_CQUE_NONE             (0x0003)  // Disable the comparator and put ALERT/RDY in high state (default)
#define ADS1115_CONFIG_CLAT_NONLAT           (0x0000)  // Non-latching comparator (default)
#define ADS1115_CONFIG_CPOL_ACTVLOW          (0x0000)  // ALERT/RDY pin is low when active (default)
#define ADS1115_CONFIG_CMODE_TRAD            (0x0000)  // Traditional comparator with hysteresis (default)
#define ADS1115_CONFIG_MODE_CONTINUOUS       (0x0000)  // Continuous conversion mode

А чтение так:

  Wire.beginTransmission(ADS1115_I2C_ADDRESS);
  Wire.write(ADS1115_REG_CONVERT);
  Wire.endTransmission();
  Wire.requestFrom(ADS1115_I2C_ADDRESS, 2);
  sample =  (Wire.read() << 8) | Wire.read();

 

Tolik4
Offline
Зарегистрирован: 05.01.2018

Здравствуйте, а можно пожалуйста простой скетч целиком: дифференциальное чтение 0_1,  Continuous conversion mode, с возможностью смены усиления? Нашел такой же по сути вопрос на форуме адафрут, но на аглицком разобраться тяжеловато( https://forums.adafruit.com/viewtopic.php?f=22&t=76452 

Tolik4
Offline
Зарегистрирован: 05.01.2018

Скопировал ваш код, добавил библиотеку <Wire.h>, переменная sample типа int, читаю каждые 100мс, вывожу в сериал, вижу -1 при любом напряжении на входе ацп. Модуль и подключение проверенные.

#include <Wire.h>

// ADC ADS1115 settings
#define ADS1115_I2C_ADDRESS                  (0x48)

#define ADS1115_CONFIG_PGA_6_144V            (0x0000)  // +/-6.144V range = Gain 2/3
#define ADS1115_CONFIG_PGA_4_096V            (0x0200)  // +/-4.096V range = Gain 1
#define ADS1115_CONFIG_PGA_2_048V            (0x0400)  // +/-2.048V range = Gain 2 (default)
#define ADS1115_CONFIG_PGA_1_024V            (0x0600)  // +/-1.024V range = Gain 4
#define ADS1115_CONFIG_PGA_0_512V            (0x0800)  // +/-0.512V range = Gain 8
#define ADS1115_CONFIG_PGA_0_256V            (0x0A00)  // +/-0.256V range = Gain 16

#define ADS1115_CONFIG_DR_8SPS               (0x0000)  // 8 samples per second
#define ADS1115_CONFIG_DR_16SPS              (0x0020)  // 16 samples per second
#define ADS1115_CONFIG_DR_32SPS              (0x0040)  // 32 samples per second
#define ADS1115_CONFIG_DR_64SPS              (0x0060)  // 64 samples per second
#define ADS1115_CONFIG_DR_128SPS             (0x0080)  // 128 samples per second (default)
#define ADS1115_CONFIG_DR_250SPS             (0x00A0)  // 250 samples per second
#define ADS1115_CONFIG_DR_475SPS             (0x00C0)  // 475 samples per second
#define ADS1115_CONFIG_DR_860SPS             (0x00E0)  // 860 samples per second

#define ADS1115_CONFIG_MUX_DIFF_0_1          (0x0000)  // Differential P[ositive] = AIN0, N[egative] = AIN1 (default)
#define ADS1115_REG_CONVERT                  (0x00)
#define ADS1115_REG_CONFIG                   (0x01)
#define ADS1115_CONFIG_CQUE_NONE             (0x0003)  // Disable the comparator and put ALERT/RDY in high state (default)
#define ADS1115_CONFIG_CLAT_NONLAT           (0x0000)  // Non-latching comparator (default)
#define ADS1115_CONFIG_CPOL_ACTVLOW          (0x0000)  // ALERT/RDY pin is low when active (default)
#define ADS1115_CONFIG_CMODE_TRAD            (0x0000)  // Traditional comparator with hysteresis (default)
#define ADS1115_CONFIG_MODE_CONTINUOUS       (0x0000)  // Continuous conversion mode

int sample = 0;

void setup() {
  Serial.begin(115200);
  delay(100);
}

void loop() {

  Wire.beginTransmission(ADS1115_I2C_ADDRESS);
  Wire.write(ADS1115_REG_CONVERT);
  Wire.endTransmission();
  Wire.requestFrom(ADS1115_I2C_ADDRESS, 2);
  sample =  (Wire.read() << 8) | Wire.read();
  Serial.println(sample);
  delay(100);

}
sadman41
Онлайн
Зарегистрирован: 19.10.2016

А Wire.begin кто будет делать? И чуть выше постом инициализация МС была приведена - без нее наврядли вам будет диффрежим, усиление и безостановочная конвертация.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Если вы хотите получить готовый скетч, то это вам в "Ищу исполнителя" надо обращаться.

Tolik4
Offline
Зарегистрирован: 05.01.2018

И вправду, тупняк имеет место быть) Циферки забегали, буду разбираться дальше, спасибо большое!

Tolik4
Offline
Зарегистрирован: 05.01.2018

Снова здравствуйте, код из постов выше работает отлично, еще раз спасибо sadman41. Теперь возник вопрос: как считывать показания поочередно с обоих диф входов? По возможности одномоментно или максимально к этому приближено.

b707
Онлайн
Зарегистрирован: 26.05.2017

Tolik4 - для тех, кто не хочет копаться в регистрах -  у ads1115 сущестувует готовая ардуино библиотека, где уровень сложности пригоден для младших школьников...

Tolik4
Offline
Зарегистрирован: 05.01.2018

С нее и начал, но там нет управления с помощью Conversion Ready Pin, настроек скорости и непрерывного преобразования. Я бы и не прочь разобраться с регистрами и не надоедать людям на форумах, но из даташита понять как происходит управление АЦП по I2C сложновато, а статьи с разбором подобного случая для чайников не нашел( Буду признателен ссылке на нечто подобное, если знаете где почитать о таком.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

У меня такой необходимости не возникало, поэтому могу только предположить (по функциональной схеме), что надо постоянно переключаться на разные пары входов и пропускать по паре семплов (на установленной частоте замеров) перед считыванием показаний. Т.е. в конфиг, что выше, переменно совать вот это и делать небольшой дилей:

#define ADS1115_CONFIG_MUX_DIFF_0_1          (0x0000)  // Differential P[ositive] = AIN0, N[egative] = AIN1 (default)
#define ADS1115_CONFIG_MUX_DIFF_2_3          (0x0003)  // Differential P[ositive] = AIN2, N[egative] = AIN3 

 

Tolik4
Offline
Зарегистрирован: 05.01.2018

Т.е. в цикле перед каждым измерением нужно передавать конфиг полностью? Или можно передатьтолько настройки мультиплексора?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Так, как три бита Вам наврядли удастся передать, то придётся полностью.

Tolik4
Offline
Зарегистрирован: 05.01.2018

Ясно, спасибо, буду пробовать

Tolik4
Offline
Зарегистрирован: 05.01.2018

Добрался до железок, попробовал, в итоге заработало. Только не 0x0003, а 0x3000 - подсмотрено в библиотеке адафрут :) . Беда в том что между измерениями разных каналов приходится ставить делей пропорциональный частоте измерений. Для 860спс достаточно 2мс, а вот для 32спс задержка где-то между 50мс и 100мс(точно не подбирал, на 50 еще не работает, на 100 все ок), а это уже слишком много. Получается чтобы максимально приблизить во времени измерения двух разных датчиков самым верным решением будет поставить 2 АЦП, по одному для каждого датчика и опрашивать их подряд без изменения конфига. Или может есть еще какие-то варианты?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Варианты в каком разрезе? Для оцифровки двух каналов одновременно нужны два АЦП - чудес в мире Ардуины не происходит. Может и спаренные выпускают - я не интересовался.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

У блюпилл за 100руб  как раз 2 АЦП, но нет дифф-входов.

Tolik4
Offline
Зарегистрирован: 05.01.2018

И не 15битных к тому же( Делал на ней примерно то же, но для динамических процессов. Благо скорость АЦП позволяет и памяти под массив измерений не в пример больше ардуины.

ardustar
Offline
Зарегистрирован: 30.04.2020

Доброе вермя суток всем.

Странное поведение ads1015, устанавливаю конфигурационный регистр на разные частоты снятия сигнала,

сначвла снимает быстро, а затем к измерению с номером 3072 время в мс 4783 (т.е 5 секунд) и это для любого значения

23:41:25.143 -> 3072 4783 -9

Вот к примеру, сначала снимает данные нормально, а далее увеличивается интервал между измерениями.

КАК СНИМАТЬ ДАННЫЕ НА 860 samples per second ?

475 samples per second
Config =   1010_11000011
22:18:44.133 -> 0 5 15
22:18:44.166 -> 1 8 -105
22:18:44.166 -> 2 12 -32
22:18:44.166 -> 3 15 8
22:18:44.166 -> 4 18 180
22:18:44.199 -> 5 21 32
22:18:44.199 -> 6 24 15
22:18:44.199 -> 7 30 -45
22:18:44.233 -> 8 40 39
22:18:44.233 -> 9 50 -48
22:18:44.233 -> 10 61 42
22:18:44.266 -> 11 71 -40
22:18:44.266 -> 12 82 30
22:18:44.266 -> 13 93 -27

#include <Wire.h>           
  #define ADS1015_I2C_ADDRESS  (0x48)  //адрес ads1015
  #define ADS1015_REG_CONVERT  (0x00)
  #define ADS1015_REG_CONFIG     (0x01)
   byte b1,b2;           //для конфигурирования АЦП и для чтения данных из АЦП
   uint32_t i = 0;    // Cчетчик
   uint16_t val = 0;      
  //-------------------------------------------------------------------------------
   void setup() {
   Serial.begin(9600);
   config_ads105();            // Конфигурирование и запуск преобразования ads1015
     get_config();               // Прочитать конфиг биты и вывести на экран
       Wire.begin();              // begin I2C
   }
  //--------------------------------------------------------------------------------
   
   void loop() {               

    Wire.beginTransmission(ADS1015_I2C_ADDRESS); // Начали читать данные из регистра преобразования
    Wire.write(ADS1015_REG_CONVERT);              // указал в  записан 0 т.е. регистр преобразования
    Wire.endTransmission();
   
    Wire.requestFrom(ADS1015_I2C_ADDRESS, 2);    // читаем из АЦП два байта                                   
    val = ((Wire.read()<< 8 )| Wire.read()) >> 4;  // собираем два байта в кучу в переменную int val
    delay(1);
     //Shift 12-bit results right 4 bits for the ADS1015,
    // making sure we keep the sign bit intact
    if (val > 0x07FF)
    {
      // negative number - extend the sign to 16th bit
      val |= 0xF000;
    }
   
 //  Wire.endTransmission();
     Serial.print(i++); Serial.print(" "); Serial.print(millis()); Serial.print(" "); Serial.println((int16_t)val);
    
  }
  //-------------------------------------------------------------------------------
   void config_ads105(){        // Конфигурирование и запуск преобразования ads1015
      
    Wire.beginTransmission(ADS1015_I2C_ADDRESS);  //конфигурируем АЦП записью трех байт
    Wire.write(ADS1015_REG_CONFIG);     // Указатель регистра
    Wire.write(0b10001010);     // биты с 15 по 8 конфигурации
    Wire.write(0b11000011);     // биты с 7 по 0 конфигурации
    Wire.endTransmission();
   
    delay(1);
   }
   
  //-------------------------------------------------------------------------------
   void get_voltage(){                   // Прочитать регистр преобразования, пересчитать в напряжение
 Wire.beginTransmission(ADS1015_I2C_ADDRESS); // Начали читать данные из регистра преобразования
    Wire.write(ADS1015_REG_CONVERT);              // указал в  записан 0 т.е. регистр преобразования
    Wire.endTransmission();
   
    Wire.requestFrom(ADS1015_I2C_ADDRESS, 2);    // читаем из АЦП два байта                                   
    val = ((Wire.read()<< 8 )| Wire.read())>> 4;  // собираем два байта в кучу в переменную int val
    delay(1);
     //Shift 12-bit results right 4 bits for the ADS1015,
    // making sure we keep the sign bit intact
    if (val > 0x07FF)
    {
      // negative number - extend the sign to 16th bit
      val |= 0xF000;
    }

  Serial.println((int16_t)val );
   }
  //--------------------------------------------------------------------------------
   void get_config(){                    // взять все биты конфига и вывести на экран
                         
    Wire.beginTransmission(ADS1015_I2C_ADDRESS); // Начали читать данные из регистра конфига
    Wire.write(ADS1015_REG_CONFIG );              // pointer записан 1 т.е. регистр config
    Wire.endTransmission();
   
    Wire.requestFrom(ADS1015_I2C_ADDRESS, 2);    // читаем из АЦП два байта
    b1 = Wire.read();  //
    b2 = Wire.read();  //
    delay(1);
  //  Wire.endTransmission();
   
    Serial.print("Config =   ");           //выводим на экран все биты конфига
    Serial.print(b1,BIN);  Serial.print("_");   Serial.println(b2,BIN);
    
   }
 

475 samples per second

Config =   1010_11000011
22:18:44.133 -> 0 5 15
22:18:44.166 -> 1 8 -105
22:18:44.166 -> 2 12 -32
22:18:44.166 -> 3 15 8
22:18:44.166 -> 4 18 180
22:18:44.199 -> 5 21 32
22:18:44.199 -> 6 24 15
22:18:44.199 -> 7 30 -45
22:18:44.233 -> 8 40 39
22:18:44.233 -> 9 50 -48
22:18:44.233 -> 10 61 42
22:18:44.266 -> 11 71 -40
22:18:44.266 -> 12 82 30
22:18:44.266 -> 13 93 -27
22:18:44.299 -> 14 104 22
22:18:44.299 -> 15 115 11
22:18:44.299 -> 16 128 -19
22:18:44.332 -> 17 140 59
22:18:44.332 -> 18 151 -40
22:18:44.332 -> 19 163 25
22:18:44.365 -> 20 175 0
22:18:44.365 -> 21 185 14
22:18:44.365 -> 22 197 73
22:18:44.398 -> 23 208 -108
22:18:44.398 -> 24 222 36
22:18:44.398 -> 25 233 -23
22:18:44.432 -> 26 245 14
22:18:44.432 -> 27 258 72
22:18:44.432 -> 28 269 -113
22:18:44.465 -> 29 282 32
22:18:44.465 -> 30 293 -19
22:18:44.498 -> 31 306 5
22:18:44.498 -> 32 316 47
22:18:44.498 -> 33 328 -28
22:18:44.531 -> 34 340 49
22:18:44.531 -> 35 352 -39
22:18:44.531 -> 36 364 20
22:18:44.564 -> 37 375 5
22:18:44.564 -> 38 386 3
22:18:44.564 -> 39 397 61
22:18:44.598 -> 40 408 -33
22:18:44.598 -> 41 420 46
22:18:44.598 -> 42 432 -36
22:18:44.631 -> 43 444 21
22:18:44.631 -> 44 456 2
22:18:44.631 -> 45 466 8
22:18:44.664 -> 46 477 66
22:18:44.664 -> 47 488 -23
22:18:44.664 -> 48 500 45
22:18:44.697 -> 49 512 -34
22:18:44.697 -> 50 525 23
22:18:44.730 -> 51 536 11
22:18:44.730 -> 52 547 -14
22:18:44.730 -> 53 560 63
22:18:44.763 -> 54 571 -44
22:18:44.763 -> 55 583 24
22:18:44.763 -> 56 595 0
22:18:44.797 -> 57 606 15
22:18:44.797 -> 58 617 71
22:18:44.797 -> 59 628 -99
22:18:44.830 -> 60 641 40
22:18:44.830 -> 61 652 -35
22:18:44.830 -> 62 665 16
22:18:44.863 -> 63 676 37
22:18:44.863 -> 64 688 -22
22:18:44.863 -> 65 700 51
22:18:44.896 -> 66 711 -39
22:18:44.896 -> 67 724 26
22:18:44.929 -> 68 736 0
22:18:44.929 -> 69 746 13
22:18:44.929 -> 70 757 82
22:18:44.962 -> 71 769 -109
22:18:44.962 -> 72 782 32
22:18:44.962 -> 73 794 -25
22:18:44.996 -> 74 806 0
22:18:44.996 -> 75 817 53
22:18:44.996 -> 76 828 -41
22:18:45.029 -> 77 840 45
22:18:45.029 -> 78 851 -35
22:18:45.029 -> 79 865 23
22:18:45.062 -> 80 876 9
22:18:45.062 -> 81 886 7
22:18:45.062 -> 82 897 63
22:18:45.095 -> 83 908 -20
22:18:45.095 -> 84 921 43
22:18:45.095 -> 85 932 -37
22:18:45.128 -> 86 945 25
22:18:45.128 -> 87 956 19
22:18:45.128 -> 88 967 -13
22:18:45.161 -> 89 979 62
22:18:45.161 -> 90 992 -47
22:18:45.195 -> 91 1004 28
22:18:45.195 -> 92 1016 31
22:18:45.195 -> 93 1029 -109
22:18:45.228 -> 94 1043 29
22:18:45.228 -> 95 1056 -3
22:18:45.261 -> 96 1069 -57
22:18:45.261 -> 97 1082 38
22:18:45.261 -> 98 1094 -25
22:18:45.294 -> 99 1107 -20
22:18:45.294 -> 100 1123 44

Ну заканчивается вот этим
23:39:30.391 -> 2000 29696 1

 

128 samples per second

23:43:37.023 -> Config =   1010_1000011
23:43:37.023 -> 0 4 -4
23:43:38.614 -> 1024 1596 0
23:43:40.206 -> 2048 3189 5
23:43:41.797 -> 3072 4782 -2

860 samples per second

23:41:20.378 -> Config =   1010_11100011
23:41:20.378 -> 0 4 -6
23:41:21.977 -> 1024 1596 0
23:41:23.543 -> 2048 3189 -33 

23:41:25.143 -> 3072 4783 -9

b707
Онлайн
Зарегистрирован: 26.05.2017

совсем сообралжку выключил? - вывод каждого символа в Сериал занимает 1 миллисекунду и именно вывод данных в сериал у тебя отнимает 99% времени.

И совершенно неудивительно, что это время растет -  ведь в начале  нужно вывести строчку что-то типа "1 12 22" (7 символов), а через тысячу измерений уже "1024 12565 46" - 13 символов. Если посмотреть твои логи - так и есть, в начале измерения идут через 5-6 мс. а потом - через 12-15.

И от скорости ADC это вовсе не зависит, догадайся сам почему :)

ardustar
Offline
Зарегистрирован: 30.04.2020

Ну а вот вывожу через 1024 измерения?

if( i>>10)<<10==i){

Serial.print(i); Serial.print(" "); Serial.print(millis()); Serial.print(" "); Serial.println((int16_t)val);

}

i++;

 

860 samples per second

23:41:20.378 -> Config =   1010_11100011
23:41:20.378 -> 0 4 -6
23:41:21.977 -> 1024 1596 0
23:41:23.543 -> 2048 3189 -33 

23:41:25.143 -> 3072 4783 -9

b707
Онлайн
Зарегистрирован: 26.05.2017

ты, похоже., в корне не понимаешь, как оно работает. ADC работает асинхронно. Число измерений в секунду - вот эти твои "128 samples per second" или 860... - показывает только, с какой скоростью ADC делает измерения и кладет их в свой внутренний буфер. А с какой скоростью ты будешь их оттуда забирать - зависит только от твоего кода. Причем процессы никак не связаны между собой. Ты можешь забирать данные как реже частоты ADC - в этом случае ты будешь брать, скажем, только каждое третье измерение, так и чаще  - в таком случае ты будешь получать по несколько раз одно и то же число.

В обоих случаях скорость получения 1000 значений ВООБЩЕ НЕ СВЯЗАНА со скоростью работы ADC - и определяется только временем исполнения твоего кода в loop() Именно это ты и наблюдаешь - у тебя время одного цикла порядка 1.5мс, из которых 1мс - это delay(1), а остальное - время запроса и получения данных по I2C и прочие накладные расходы