Найти в Дзене
aviamihanika

Авиамодельный измеритель тока

Вторая версия авиамодельного измерителя тока для радиоуправляемых моделей на Arduino. Оборотами движка можно управлять прямо с измерителя. Измеряемый ток до 100А, напряжение от 2S до 6S.

Скетч:

// Скетч для модельного измерителя постоянного тока и напряжения

// Версия: 1

// Для датчика ACS758LCB-100U-PFF-T

// Диапазон измеряемого напряжения: 6.6 - 32V (2S - 6S)

// Диапазон измеряемого тока: 0.1 - 100A

// Диапазон измеряемой мощности: 0.6 - 3200W

// Экран:

// ------------------

// | THR:100 SEC:999 |

// | V:31.9 A:99.6 |

// ------------------

// THR - уровень газа (проценты, 0 - 100)

// SEC - время работы мотора при уровне газа >10% (секунды, 0 - 999)*

// * - счетчик секунд начинает работать при уровне газа >10%, при уровне газа <10% счетчик обнулится

// V - напряжение аккумулятора (вольты, 0 - 32)

// А - ток (амперы, 0 - 100)

//******************************************** LCD 1602 ***********************************************

#include <LiquidCrystal_I2C.h> // библиотека для подкл. дисплея по I2C

LiquidCrystal_I2C lcd(0x27,16,2); // (адрес, кол-во знаков по гориз., по вертикали)

//*************************************** ОСНОВНОЙ ТАЙМЕР *******************************************

int hours; // часы

int minutes; // минуты

int seconds; // секунды

int sec; // счетчик секунд (время работы мотора в секундах)

long lastTime; // сброс основного таймера

byte timerLcd; // таймер вывода информации на дисплей

//*************************************** ОСНОВНЫЕ ДАННЫЕ *******************************************

float volt; // измеряемое входное напряжение с делителя

float asc; // напряжение с датчика ACS758LCB-100U-PFF-T

int thr; // напряжение с потенциометра

int thrLcd; // уровень газа в процентах для вывода на дисплей

float curr; // измеряемый ток

//******************************************** PWM **************************************************

#include <Servo.h> // библиотека для работы с сервами

Servo pwmOut; // PWM выход

///////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////// GO! //////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////

void setup() {

//************************************ УПРАВЛЕНИЕ LCD 1602 ******************************************

lcd.begin(); // подключаем дисплей

lcd.backlight(); // backlight on

//********************************************** PWM ************************************************

pwmOut.attach(3); // подключение выхода PWM (пин D3)

pwmOut.writeMicroseconds(1000); // установка значения на выходе PWM после подачи питания

thr = map(analogRead(A2),0,1023,0,100); // измерение напряж. от потенциометра

while (thr > 0) { // если газ не в нуле, то:

lcd.setCursor(4,0); lcd.print("WARNING!"); // первая строка

lcd.setCursor(3,1); lcd.print("UBERI GAZ!"); // вторая строка

thr = map(analogRead(A2),0,1023,0,100); // измерение напряж. от потенциометра

}

lcd.clear(); // очистка дисплея

}

void loop() {

//*************************************** ОСНОВНОЙ ТАЙМЕР *******************************************

while(millis() - lastTime > 1000) { // если натикало > 1000 миллисекунд, то:

// обновляем lastTime и добавляем к счетчику Секунд +1

lastTime = millis();

seconds++;

sec++;

timerLcd++;

// как только счетчик секунд достигнет 60, обнуляем его и добавляем к счетчику Минут +1

if (seconds >= 60) {

seconds = 0;

minutes++;

}

// как только счетчик минут достигнет 60, обнуляем его и добавляем к счетчику Часов +1

if (minutes >= 60) {

minutes = 0;

hours++;

}

}

volt = analogRead(A0) * (4.98 * ((51 + 8.2) / 8.2) / 1023); // измерение напряж. аккумулятора

asc = analogRead(A1) * (4.87 / 1023); // измерение напряж. от датчика тока

thr = map(analogRead(A2),0,1023,1000,2000); // измерение напряж. от потенциометра

if (asc < 0.74) asc = asc - 0.074; // корректировка измерения тока

else asc = asc - 0.062; // корректировка измерения тока

curr = (asc * 24.4) - 12.1; // вычисление тока

if (curr < 0.4) curr = 0; // ограничение вычисления тока

pwmOut.writeMicroseconds(thr); // установка значения на выходе PWM

thrLcd = map(thr,1000,2000,0,100); // мепинг для вывода уровня газа на дисплей в процентах

if (thrLcd <= 5) sec = 0; // сброс и остановка счетчика секунд

//********************************** ВЫВОД ИНФОРМАЦИИ НА ДИСПЛЕЙ ************************************

if (timerLcd == 1) { // обновлять раз в секунду

lcd.setCursor(0,0); lcd.print("THR:"); lcd.print(thrLcd); lcd.print(" "); // первая строка

lcd.setCursor(9,0); lcd.print("SEC:"); lcd.print(sec); lcd.print(" "); // первая строка

if (volt >= 25.5) {

lcd.setCursor(0,1); lcd.print("V:WARN!"); // вторая строка

} else {

lcd.setCursor(0,1); lcd.print("V:"); lcd.print(volt, 1); lcd.print(" "); // вторая строка

}

if (curr >= 95.1) {

lcd.setCursor(9,1); lcd.print("A:WARN!"); // вторая строка

} else {

lcd.setCursor(9,1); lcd.print("A:"); lcd.print(curr, 1); lcd.print(" "); // вторая строка

}

timerLcd = 0; // сбросить значение

}

}

Канец скетча.