Вторая версия авиамодельного измерителя тока для радиоуправляемых моделей на 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; // сбросить значение
}
}
Канец скетча.