Мой Амперметр
Содержание

Введение
Очень давно хотел создать свой амперметр. Современные мультиметры могут измерять постоянный ток до 10А, кроме токовых клещей. Клещи способны измерять большой ток как постоянный, так и переменный. Я чаще всего работаю с постоянным, поэтому при измерении иногда приходится измерять ток больше 10А (например, максимальную токоотдачу аккумуляторной сборки).
У меня прецизионный мультиметр, который измеряет 6000 раз в секунду, и через такой прибор совсем не хочется пропускать ток даже больше 3А, да и родные провода на щупах тоже не очень готовы к этому. А ещё вариант, когда измеряешь ток и параллельно следишь за напряжением на аккумуляторе, уже одним мультиметром не справиться. Поэтому решил создать свой амперметр на базе Arduino с использованием датчика ACS758 50A.
Он может измерять ток до 50А, и силовая часть никак не связана с аналоговым выходом, который идёт к Arduino. Выход датчика — аналоговый, при отсутствии тока значение напряжения на выходе равно 2.5В (при питании 5В). При протекании тока напряжение на выходе увеличивается или уменьшается (в зависимости от направления) на 40 мВ на 1А тока. Поэтому мы легко сможем считывать это напряжение и выводить на дисплей.
Необходимые компоненты
- Arduino Nano — 1252 (код товара)
- OLED-дисплей 0.96 (жёлто-голубые символы, I2C) — 1103 (код товара)
- Датчик тока ACS758 50A — искать в интернете
- Кнопка, любая, например — 1450 (код товара)
- CKCS BS01 Мини повышающий модуль DC-DC — 1208 (код товара)
- Аккумулятор 18650 — 1451 (код товара)
- TP4056 — 1599 (код товара)
- Конденсатор 0.1 мкФ
Схема подключения

Кнопка на пине 2 служит для обнуления значения. Так как модуль немного нагревается, то 0А в зависимости от выходного напряжения в теории 2.5В, но на практике это не так. Конденсатор между A1 и GND нужен для того, чтобы значения с аналогового входа не скакали.
Скетч
Перед загрузкой кода нужно сделать пару измерений с помощью мультиметра. Чем точнее будет измерение, тем точнее будет наш амперметр.
Измерять нужно при питании от аккумулятора, а не от USB!
Итак, первое, что нужно измерить — опорное напряжение. Щупы мультиметра ставим на пин GND и пин REF Arduino. Там будет что-то около 5В +/-. Это значение нужно вписать в строку 13 кода. Теперь нужно измерить наш 0А. Для этого один щуп мультиметра на A1, другой на GND, должны увидеть что-то около 2.5В +/-. Вписываем это значение в строку 11 кода.

Теперь, убедившись, что все библиотеки для дисплея установлены, отключаем напряжение от аккумулятора и подключаем Arduino к компьютеру.
Загружаем скетч.
Программный код
Вот полный код скетча для Arduino:
#include
#include
#include
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
const int currentSensorPin = A1; // Пин датчика тока (ACS758)
const int buttonPin = 2; // Пин кнопки калибровки
float zeroCurrentVoltage = 2.559; // Напряжение при 0A (по умолчанию)
const float sensitivity = 0.040;
float OpornV = 5.159;
#define SCALE_Y 15
#define SCALE_HEIGHT 9
#define SCALE_START 10
#define SCALE_WIDTH 108
#define MAX_CURRENT 5.0
#define BATTERY_PIN A0
unsigned long lastBatteryMeasureTime = 0;
const unsigned long batteryMeasureInterval = 30000;
float batteryVoltage = 0.0;
void setup() {
Serial.begin(9600);
pinMode(buttonPin, INPUT_PULLUP);
digitalWrite(buttonPin, HIGH);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Ошибка дисплея"));
for(;;);
}
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(5, 5);
display.println("Amper");
display.setCursor(23, 30);
display.println("Metr");
display.display();
digitalWrite(buttonPin, LOW);
delay(2000);
digitalWrite(buttonPin, HIGH);
batteryVoltage = analogRead(BATTERY_PIN) * (OpornV / 1023.0);
lastBatteryMeasureTime = millis();
}
void loop() {
unsigned long currentTime = millis();
if(digitalRead(buttonPin) == LOW) {
delay(50);
if(digitalRead(buttonPin) == LOW) {
zeroCurrentVoltage = analogRead(currentSensorPin) * (OpornV / 1023.0);
while(digitalRead(buttonPin) == LOW) delay(10);
delay(200);
}
}
float current = (analogRead(currentSensorPin) * (OpornV / 1023.0) - zeroCurrentVoltage) / sensitivity;
if(currentTime - lastBatteryMeasureTime >= batteryMeasureInterval) {
batteryVoltage = analogRead(BATTERY_PIN) * (OpornV / 1023.0);
lastBatteryMeasureTime = currentTime;
}
display.clearDisplay();
drawCurrentScale(current);
display.setTextSize(3);
display.setCursor(0, 30);
if(current >= 0) {
display.print(" ");
}
display.print(current, 3);
display.setTextSize(1);
display.setCursor(122, 44);
display.println("A");
display.setTextSize(1);
display.setCursor(80, 56);
display.println("max 50A");
display.setCursor(10, 56);
display.print(batteryVoltage, 1);
display.print("V");
display.display();
delay(250);
}
void drawCurrentScale(float current) {
int centerX = SCALE_START + SCALE_WIDTH/2;
display.drawLine(SCALE_START, SCALE_Y, SCALE_START + SCALE_WIDTH, SCALE_Y, WHITE);
if(current > 0) {
int pos = map(current * 100, 0, MAX_CURRENT * 100, centerX, SCALE_START + SCALE_WIDTH);
display.fillRect(centerX + 1, SCALE_Y + 1, pos - centerX - 1, SCALE_HEIGHT - 2, WHITE);
} else if(current < 0) {
int pos = map(current * 100, 0, -MAX_CURRENT * 100, centerX, SCALE_START);
display.fillRect(pos + 1, SCALE_Y + 1, centerX - pos - 1, SCALE_HEIGHT - 2, WHITE);
}
for(int i = -4; i <= 4; i += 2) {
int x = map(i, -MAX_CURRENT, MAX_CURRENT, SCALE_START, SCALE_START + SCALE_WIDTH);
display.drawLine(x, SCALE_Y, x, SCALE_Y + 5, WHITE);
display.setTextSize(1);
display.setCursor(x - (abs(i) < 10 ? 3 : 6), SCALE_Y - 10);
display.print(i);
}
int pointerPos = map(constrain(current * 100, -MAX_CURRENT * 100, MAX_CURRENT * 100),
-MAX_CURRENT * 100, MAX_CURRENT * 100,
SCALE_START, SCALE_START + SCALE_WIDTH);
display.fillRect(pointerPos - 1, SCALE_Y - 2, 3, SCALE_HEIGHT + 2, WHITE);
display.fillTriangle(
pointerPos, SCALE_Y - 2,
pointerPos - 2, SCALE_Y - 1,
pointerPos + 2, SCALE_Y - 1,
WHITE);
}
После загрузки скетча на дисплее должны увидеть короткую надпись и следующее:

Внизу слева напряжение аккумулятора, справа внизу напоминание о максимальном токе. Ну и сверху большими символами наш ток, а над этим значением горизонтальная шкала. В зависимости от значения тока будет двигаться наша шкала, как при положительном измерении, так и при отрицательном. Отключаем от компьютера и переходим на питание от аккумулятора. Перед началом измерения следует подержать кнопку обнуления пару секунд и дождаться значения 0.000. Всё, можно измерять, на конце с датчика я припаял провода AWG12, они могут пропускать через себя ток до 60А. С небольшим запасом взял.
Сборка и тестирование



Напечатал корпус на скорую руку и сделал настольным с возможностью регулировки угла наклона дисплея. А чтобы он меньше скользил по столу и от упругости проводов, залил свинец и цемент в нижнюю часть. Получилось очень красиво и уже на практике проверил. И был очень впечатлён точностью измерения и быстротой отклика.
Желаю и вам сделать такой красивый амперметр вместе с myproject.com.ua
© 2025 Мій Проект. Автор: Ardu_miha. Использование материалов разрешено только с ссылкой на источник.
Написать комментарий