Система измерения тока и напряжения с помощью Arduino MEGA , платы АЦП 16-бит,датчика тока и напряжения

Всем привет. Нужно создать систему измерения для регистрации напряжения и тока.
Фото схемы прилагаю. Датчик тока ACS712, Датчик напряжения Arduino: Датчик напряжения, Модуль 16-битного АЦП ADS1115


Не могу понять как инициализировать плату АЦП и нужно ли нашёл в интернете определённые библиотеки <Adafruit_ADS1X15.h> , однако при измерении выходят не понятные мне значения. Хочу узнать нужно ли инициализировать плату ACP и как измерить значения.

#include <Adafruit_ADS1X15.h>
#include <Wire.h> 

float K = 0.09375;
float L = 430;
float u = 0.0;

Adafruit_ADS1115 ads;
void setup()
{ 
Serial.begin(9600);

ads.begin();
}
void loop()
{
while (Serial.available() == 0)
{
  ads.setGain(GAIN_TWO);

adc1 = ads.readADC_Differential_2_3();
I = float(adc1);
I = I * 0.0055;

    adc0 = ads.readADC_Differential_0_3();
    float u = float(adc0) * K/1000.0;
    u = u * L;
 }

Нашёл другой код для измерения однако и он выдаёт странные значения, например тока при нулевой нагрузке
image

#include <Adafruit_ADS1X15.h>
#include <Wire.h> 
#include  "ADS1115.h"
ADS1115 adc0(ADS1115_DEFAULT_ADDRESS); 

#define ADS1115_ADDRESS_ADDR_SDA    0x14  // address pin tied to SDA pin
#define ADS1115_ADDRESS_ADDR_SCL    0x15 // address pin tied to SCL pin
#define ADS1115_DEFAULT_ADDRESS ADS1115_ADDRESS_ADDR_GND
char command;
void setup()
{ 
Serial.begin(9600);
Wire.begin(); // join I2C bus adc0.initialize(); // initialize ADS1115 16 bit A/D chip

adc0.showConfigRegister();
adc0.setMode(ADS1115_MODE_CONTINUOUS);
}
void loop()
{
  
while (Serial.available() == 0)
{
adc0.setGain(ADS1115_PGA_6P144);
int sensorOneCounts=adc0.getConversionP0N1();
Serial.print("Voltage for sensor 1 is:");
Serial.println(sensorOneCounts*adc0.getMvPerCount());
}

Интересный подход! Нашёл в интернете один код - не нравится, нашёл второй - опять не то. Знаете, сколько в интернете ещё всяких “кодов”?

  1. Оставьте в схеме только 1 датчик (предлагаю датчик напряжения, как наиболее тупой - делитель из двух резисторов), АЦП и ардуину. Вместо этих “кодов из интернета” возьмите пример, идущий с адафрутовской библиотекой. И добивайтесь, чтобы заработало.
  2. Повторить для другого датчика.
  3. Объединить
  4. А дальше уже довешивать в скетч необходимые плюшки.

Ну брал я конечно не весь скетч а только ту часть, где измеряются значения.В первом скетче я и пробовал на 1 датчике получается так , что выдаётся плавующие значения.То есть подаю на датчик 300 вольт через делитель ,на входе у датчика напряжения где то 7В ,а он показывает после всех преобразований 50 100 150 200 250 300 350 и обратно 350 300 250 200 150 100 50 и так до минимума и так далее.

а входное напряжение 300в - случаем не переменное?

Постоянное забыл указать на входе стоит делитель он снижает напряжения с 600В до 16,72В для датчика

если у вас проблема с измерением, зачем вы выкладываете код с этими монстрозными свитч-кейсами аж на 15 источников?
Вам выше правильно написали - возьмите ОДИН датчик, подключите к ОДНОМУ входу и добейтесь, чтобы это работало.
А разбираться в вашей “простыне кода”, в которой 90% строк не имеют отношения к проблеме - кому это надо?

1 лайк

делитель не делает из переменного постоянное

Источники постоянного напряжения. Скетч вроде укоротил до части с измерением. Я пробовал отдельно подключать и 5В 12В и 50В. Меня интересует может кто сталкивался с связыванием платы АЦП и Ардуино и соответственно измерением напряжения и тока.

выложите укороченный скетч новым сообщением

#include <Wire.h> 
#include  "ADS1115.h"
ADS1115 adc0(ADS1115_DEFAULT_ADDRESS); 

#define ADS1115_ADDRESS_ADDR_SDA    0x14  // address pin tied to SDA pin
#define ADS1115_ADDRESS_ADDR_SCL    0x15 // address pin tied to SCL pin
#define ADS1115_DEFAULT_ADDRESS ADS1115_ADDRESS_ADDR_GND
char command;
void setup()
{ 
Serial.begin(9600);
Wire.begin(); // join I2C bus adc0.initialize(); // initialize ADS1115 16 bit A/D chip

adc0.showConfigRegister();
adc0.setMode(ADS1115_MODE_CONTINUOUS);
}
void loop()
{
  
while (Serial.available() == 0)
{
adc0.setGain(ADS1115_PGA_6P144);
int sensorOneCounts=adc0.getConversionP0N1();
Serial.print("Voltage for sensor 1 is:");
Serial.println(sensorOneCounts*adc0.getMvPerCount());
}
#include <Adafruit_ADS1X15.h>
#include <Wire.h> 

float K = 0.09375;
float L = 430;
float u = 0.0;

Adafruit_ADS1115 ads;
void setup()
{ 
Serial.begin(9600);

ads.begin();
}
void loop()
{
while (Serial.available() == 0)
{
  ads.setGain(GAIN_TWO);

adc1 = ads.readADC_Differential_2_3();
I = float(adc1);
I = I * 0.0055;

    adc0 = ads.readADC_Differential_0_3();
    float u = float(adc0) * K/1000.0;
    u = u * L;
 }

а почему два кода?

Многие измеряли. Схема нарисована для диф режима ацп. А не проще в одиночном режиме? И почему земля датчиков не связана с землёй ацп?

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

GND с датчика напряжения подключается к - источника напряжения.

Трудно взять пример из библиотеки, выбрать своё ацп, раскоментировать строку с нужным усилением и посмотреть как правильно работать?
И без земли правильного результата не будет.

1 лайк

Вы правы, спасибо! Дело оказалось не в скетче а в схеме подключении.