SBorovkov, спасибо за информацию.
Честно скажу, большинство я не понял того что вы написали... Не хватает базы, но интуитивно все получилось. Единственное, нужно будет все же сделать реальные замеры вплоть до крайних точек температурного диапазона и увеличить до 16-20 точек аппроксимацию.
Ниже текущий код.. может есть у кого что добавить/изменить?
PHP код:
#include <LiquidCrystal.h>
#include <avr/pgmspace.h>
#define Temp1Count 10 //Увеличил до 10 значений
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
int analog = 0; // Аналоговый вход для температурного датчика
int K = 1; //Калибровочный коэффициент по входу от датчика
int t; //Температура
int P; //Мощность вентиляторов
int V; //Значение напряжения на входе
int T = 75; //Определяем нужную температуру двигателя
uint16_t Temp1[Temp1Count][2] PROGMEM = {{471,46}, {655,58}, {713,65}, {772,74}, {775,80}, {802,90}, {823,100}, {839,110}, {852, 120}, {861, 130}}; //Точки аппроксимации
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
lcd.print(" WELCOME TO ");
lcd.setCursor(0,1);
lcd.print("*THERMOCONTROL*");
delay(2000);
lcd.clear();
}
void loop() {
int i;
uint16_t InTemp;
uint16_t RealTemp;
uint16_t InLeftTemp;
InTemp = 1024 - analogRead(0);
i=Temp1Count;
do
{
i--;
InLeftTemp=pgm_read_word(&Temp1[i][0]);
}
while ((i>=0)&&(InTemp<InLeftTemp));
uint16_t InRightTemp=pgm_read_word(&Temp1[i+1][0]);
uint16_t OutLeftTemp=pgm_read_word(&Temp1[i][1]);
uint16_t OutRightTemp=pgm_read_word(&Temp1[i+1][1]);
RealTemp=OutLeftTemp+(OutRightTemp-OutLeftTemp)*(InTemp-InLeftTemp)/(InRightTemp-InLeftTemp);
if (RealTemp==130);
//Спасибо SBorovkov
float V = (5.00 / 1024.00 * analogRead(analog)) * K; //Переводим входные данные к абсолютному напряжению
if (t < T - 5) P = 0;
if (t >= T - 5) P = 50;
if (t >= T - 4) P = 70;
if (t >= T - 3) P = 90;
if (t >= T - 2) P = 120;
if (t >= T - 1) P = 160;
if (t >= T) P = 200;
if (t >= T + 1) P = 255;
analogWrite (6, P); //Запускаем вентиляторы
Serial.println(P, DEC); //Выводим информацию на всякий случай
lcd.clear();
lcd.setCursor(0,0);
lcd.print("VLT:");
lcd.setCursor(4,0);
lcd.print(V);
lcd.setCursor(8,0);
lcd.print("*TP:");
lcd.setCursor(12,0);
lcd.print(RealTemp);
lcd.setCursor(15,0);
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("PWR:");
lcd.setCursor(4,1);
lcd.print(100.00/255.00*P);
// lcd.setCursor(7,1);
lcd.print("%");
delay(300);
}