PHP код:
/*
Программа термоконтроля за системой охлаждения ДВС. Использует плавную регулировку по ШИМ.
Может применяться и в других проектах, где исходные данные будет выдавать термистор (терморезистор).
В качестве исходных данных - 1 проводной температурный датчик (термистор(терморезистор))
двигателя с которого берется информация на штатную приборную панель автомобиля.
Т.к. датчик имеет нелинейную зависимость сопротивления (падения напряжения),
то необходима аппроксимация по заранее известным точкам. Чем выше температура,
тем ниже сопротивление и больше падение напряжения.
Для достоверной работы программы нужно ввести значения проходящего через датчик напряжения при
различных температурах, желательно во всем диапазоне его работы.
За аппроксимацию спасибо SBorovkov.
*/
#include <Metro.h> //Библиотека регулярных действий по интервалу времени
#include <LCD3Wire.h>
#include <avr/pgmspace.h> //Подключаем макрос PROGMEM
#define LCD_LINES 2 // number of lines in your display
#define DOUT_PIN 11 // Dout pin
#define STR_PIN 12 // Strobe pin
#define CLK_PIN 10 // Clock pin
//create object to control an LCD.
LCD3Wire lcd = LCD3Wire(LCD_LINES, DOUT_PIN, STR_PIN, CLK_PIN);
//*********************Параметры для работы термоконтроля ОЖ двигателя
#define EngineTemp1Count 14 //Количество точек аппроксимации
#define DestinationEngineTemp 90 //Определяем нужную температуру двигателя
#define EngineTempSensorPin 0 // Аналоговый вход для температурного датчика ОЖ ДВС
#define EnginePowerVentPin 6 //ШИМ выход на вентиляторы основного радиатора ДВС
//Задаем точки аппроксимации. Первая цифра - р\азность из 1024 и значения на входе от датчика
//(сделано для того чтобы развернуть график зависимости и сделать так чтобы с ростом температуры значение увеличивалось)
//не переводил в напряжение чтобы не морочиться и оперировать целыми числами с достаточной точностью;
//вторая цифра - значение температуры (заранее измеренное) при данном значении на выходе с датчика.
uint16_t EngineTemp1[EngineTemp1Count][2] PROGMEM = {{0,0}, {471,46}, {635,56}, {702,64}, {723,71}, {729,75}, {764,80}, {793,85}, {811, 90}, {836, 95}, {862, 102}, {872, 110}, {882, 120}, {890, 130}};
//************************Процедуры по таймеру*************************
Metro PWMengineMetro = Metro(10); //Плавное изменение мощности вентиляторов каждые ХХ миллисекунд
Metro LCDoutMetro = Metro(10); //Выводим информацию на ЖК каждые ХХ миллисекунд
....................................................лишнее убрали........................
//***********************Выводим все что нам нужно на ЖК дисплей
if (LCDoutMetro.check() == 1){
// lcd.clear();
lcd.cursorTo(1,0);
lcd.printIn("VLT:");
lcd.cursorTo(1,4);
char buf[10];
lcd.printIn(itoa(EngineVoltIn, buf, 10)); //Входное напряжение с датчика
lcd.cursorTo(1,8);
if (EngineVoltIn > 2.70) {
lcd.printIn("*TMP:");
lcd.cursorTo(1,13);
lcd.printIn("MIN"); //Ниже минимальной точки аппроксимации
}
else if (EngineVoltIn < 0.65){
lcd.printIn("*TMP:");
lcd.cursorTo(1,13);
lcd.printIn("MAX"); //Выше максимальной точки аппроксимации
}
else {
lcd.printIn("*TMP:");
lcd.cursorTo(1,13);
lcd.printIn(itoa(EngineRealTemp, buf, 10)); //Аппроксимированная температура
lcd.printIn(" ");
}
lcd.cursorTo(2,0);
lcd.printIn("POWER:");
lcd.cursorTo(2,9);
lcd.printIn(itoa(EnginePowerVentPercent, buf, 10)); //Мощность вентиляторов
lcd.printIn(" ");
lcd.cursorTo(2,12);
lcd.printIn("%");
lcd.cursorTo(2,13);
lcd.printIn(itoa(EngineTargetVentPercent, buf, 10)); //Заданная мощность вентиляторов
lcd.printIn(" ");
}
}
Я так понял что этой библиотеке обязательно нужно преобразовать численное значение в символы... маразм... ну все бы ничего, да не могу вывести таким способом переменную EngineVoltIn типа float... вернее он выводит но без десятичных значений - только целое число. Как это победить? И обновляется информация на дисплее крайне медленно... ШИМ набирает с 0 до 100% за 2-3 минуты ))))) хотя должен за 2-3 секунды, а то и быстрее... Если закомментить вывод инфы на ЖК, то так и происходит. Что за грабли?