Мій Ампер Метр

Вступ
Дуже давно хотів створити свій Ампрметр. Сучасні мультиметри можуть вимірювати струм постійний до 10А, окрім токових кліщів. Кліщі способні вимірювати великий струм як постійний так і змінний. Я частіше всього працюю з постійним, тому при вимірюванні інколи приходиться вимірювати струм більше 10А (наприклад макс. струмо віддачу акумуляторної збірки).
В мене прецезійний мультиметр який вимірюе 6000раз в секунду, і через такий пристрій зовсім не хочеться пропускати струм навіть більше 3А, та і рідні провода на щупах теж не дуже готові до цього. А ще варіант коли вимірюешь струм та паралельно з цим слідкуешь за напругою на акумяторі, вже одним мультиметром не справитись. Тому вирішив створити свій Амперметр на базі ардуіно за допомогою датчика ACS758 50A.
Він може вимірювати струм до 50А і зовсім ні як силова частина не зв'язана з аналоговом вихідом який йде до ардуіни. Вихід датчика - аналоговий, за відсутності струму значення напруги на виході дорівнює 2.5В (при живленні 5В). При перебігу струму напруга на виході збільшиться або зменшиться (залежно від напруги) на 40 мВ на 1А струму. Тому злегкістю зможемо считувати цю напругу та виводити на дісплей.
Необхідні компоненти
- Ардуіна нано -- 1252 (код товару)
- Oled дісплей 0,96 (жовто-блакитні символи i2c) -- 1103 (код товару)
- Датчик струму ACS758 50A -- шукати на просторах інтернету
- Кнопка люба наприклад -- 1450 (код товару)
- CKCS BS01 Міні підвищуючий модуль DC-DC -- 1208 (код товару)
- Акумулятор 18650 -- 1451 (код товару)
- Tp4056 -- 1599 (код товару)
- Конденсатор 0,1мкф
Схема підключення

Кнопка на піні 2 слугує для обнуління значення. Так як модуль гріеться трохи то 0А в залежності від вихідної напруги в теорії 2,5в але на практиці це не так. Конденсатор між а1 та Gnd служить для того щоб значення з аналогово входу не стрибали.
Скетч
Перед завантаженням коду треба зробити пару вимірювань за допомогою мультиметра. Чим точніше замір буде тим точніше буде наш Амперметр.
Вимірювати треба при живленні від акумулятора а не від юсб!
Отже перше що потрібно виміряти опорне живлення. Щупи мультиметра поставити на пін GND та пін REF Arduino. Там буде щось типу 5в +-. І це значення в 13 строкі коду треба вписати. Тепер треба виміряти наш 0А. Для цього один щуп мультиметра до А1 інший до GND, повинні побачити щось типу 2,5в +-. Вписуймо це значення в 11строку коду.

Тепер переконавшись що всі бібліотеки для дісплея встановлені, відключаємо напругу від акумулятора та підключаємо до компьютера Ардуінку.
Завантажуємо скеч.
Програмний код
Ось повний код скетчу для Arduino:
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#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.uа
© 2025 Мій Проект. Автор: Ardu_miha. Використання матеріалів дозволено лише з посиланням на джерело.
Написати коментар