#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <OneWire.h>
#include <EEPROM.h>
#include <Keypad.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
OneWire ds(6); // Вход датчика 18b20
// AD7793 x16 Umax=73mV CH1_DIFF Fads=4.17Hz
#define SCLK 2
#define CS 3
#define DIN 4
#define DOUT 5
#define AVDD_MONITOR 0b111 // CONF
#define TEMP_SENSOR 0b110 // CONF
#define CH1 0b000 // CONF
#define CH2 0b001 // CONF
#define CH3 0b011 // CONF
#define BIPOLAR 0b00000000 // CONF
#define UNIPOLAR 0b00010000 // CONF
#define GAIN_1 0b000 // CONF
#define GAIN_2 0b001 // CONF
#define GAIN_4 0b010 // CONF
#define GAIN_8 0b011 // CONF
#define GAIN_16 0b100 // CONF
#define GAIN_32 0b101 // CONF
#define GAIN_64 0b110 // CONF
#define GAIN_128 0b111 // CONF
#define F_ADC_500 0b0001 // MODE
#define F_ADC_250 0b0010 // MODE
#define F_ADC_125 0b0011 // MODE
#define F_ADC_62_5 0b0100 // MODE
#define F_ADC_50_0 0b0101 // MODE
#define F_ADC_39_2 0b0110 // MODE
#define F_ADC_33_3 0b0111 // MODE
#define F_ADC_19_6 0b1000 // MODE
#define F_ADC_16_7 0b1001 // MODE
#define F_ADC_12_5 0b1011 // MODE
#define F_ADC_10_0 0b1100 // MODE
#define F_ADC_8_33 0b1101 // MODE
#define F_ADC_6_25 0b1110 // MODE
#define F_ADC_4_17 0b1111 // MODE
// XA K
const float a[] = {0, 2.5173462 * 10, -1.1662878, -1.08336338, -8.9773540 / 10, -3.7342377 / 10, -8.6632643 / 100, -1.0450598 / 100, -5.1920577 / 10000};
const float a1[] = {0, 2.508355 * 10, 7.860106 / 100, -2.503131 / 10, 8.315270 / 100, -1.228034 / 100, 9.804036 / 10000, -4.413030 / 100000, 1.057734 / 1000000, -1.052755 * pow(10, -8)};
const float a2[] = {-1.318058 * 100, 4.830222 * 10, -1.646031, 5.464731 / 100, -9.6550715 / 10000, 8.802193 / 1000000, -3.110810 / 100000000};
// XK L
const float b[] = {1.1573067 / 10000, 1.5884573 * 10, 4.0458554 / 100, 0.3170064, 0.1666128, 5.146958 / 100, 9.5288883 / 1000, 1.0301283 / 1000, 6.0654431 / 100000, 1.5131878 / 1000000};
const float b1[] = {7.2069422 / 1000, 1.5775525 * 10, -0.2261183, 9.4286756 / 1000, -3.5394655 / 10000, 1.0050886 / 100000, -1.9323678 / 10000000, 2.3816891 / 1000000000, -1.7130654 * pow(10, -11), 5.4857331 * pow(10, -14)};
//BAT
const float R1 = 47000.0; // Резистор R1 (Ом)
const float R2 = 10000.0; // Резистор R2 (Ом)
const float divider = R2 / (R1 + R2); // Коэффициент делителя напряжения
const float Vref = 1.1; // Опорное напряжение
const float Umax = 4.2; // Максимальное напряжение батареи
const float Umin = 3.2; // Минимальное напряжение батареи
//KEY
const byte ROW_NUM = 4; // количество строк клавиатуры
const byte COLUMN_NUM = 4; // количество столбцов клавиатуры
char keys[ROW_NUM][COLUMN_NUM] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'.','0','#','D'}
};
byte pin_rows[ROW_NUM] = {A1, A2, A3, 8};
byte pin_column[COLUMN_NUM] = {13, 12, 11, 10};
Keypad keypad = Keypad(makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM);
int menu = 0;
unsigned long lastButtonPress = 0;
float enteredSmin = 0.0;
float enteredSmax = 0.0;
float enteredDmin = 0.0;
float enteredDmax = 0.0;
float enteredSvol = 0.0;
boolean decimalEntered = false;
int decimalPlaces = 0;
float temp_ds, u, u0, t_iz;
unsigned long times = millis() + 10000;
//int menu;
int previousMenu = -1;
bool start = 1;
bool firstBoot = true;
unsigned long previousMillis = 0;
/// калибровка
float gis = 0.2;
float i_1ma = 1.0137;
float r_0_kall = 1.98;
// Объявление функции calculateResult
float calculateResult(float svol, float enteredSmin, float enteredSmax, float enteredDmin, float enteredDmax) {
// Здесь вставьте логику для расчета результата 1
// Например:
float result1 = (svol + enteredSmin + enteredSmax) * (enteredDmin + enteredDmax);
//return result;
}
float getValueFromKeypad() {
char keyValue;
String valueStr = "";
while (true) {
keyValue = keypad.getKey();
if (keyValue) {
if (keyValue == '#') {
// '#' нажата, выход из цикла
break;
} else {
// Добавляем нажатую клавишу к строке значения
valueStr += keyValue;
display.print(keyValue);
}
}
}
// Преобразуем строку значения в тип float
return valueStr.toFloat();
}
// Символ "П"
byte symbolP[] = {0x1F,0x11,0x11,0x11,0x11,0x11,0x11,0x00};
// Функция для рисования индикатора батареи
void drawBattery(int percentage) {
int barsToFill = map(percentage, 0, 60, 0, 8);
// Рисуем контур батареи
display.drawRect(SCREEN_WIDTH - 14, 0, 14, 8, SSD1306_WHITE);
// Рисуем плюсовой контакт
display.drawLine(SCREEN_WIDTH - 15, 2, SCREEN_WIDTH - 15, 5, SSD1306_WHITE);
// Рисуем линию
display.drawLine(0, 9, 127, 9, SSD1306_WHITE);
// Заполняем батарею от правого края влево в зависимости от процента заряда
for (int i = 0; i < barsToFill; ++i) {
display.fillRect(SCREEN_WIDTH - 2 - i, 0, 2, 8, SSD1306_WHITE);
}
}
enum InputField { SminField, SmaxField, DminField, DmaxField };
InputField currentInputField = SminField;
int currentScreen = 0;
void setup() {
Serial.begin(9600);
// initialize OLED display with address 0x3C for 128x64
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
while (true);
}
// Инициализация пинов для AD7793
pinMode(SCLK, OUTPUT);
pinMode(CS, OUTPUT);
pinMode(DIN, OUTPUT);
pinMode(DOUT, INPUT);
digitalWrite(SCLK, HIGH);
digitalWrite(CS, HIGH);
digitalWrite(DIN, HIGH);
delay(100);
reset();
write_byte(0x08, (0x20 << 8) | F_ADC_4_17, 16); // MODE REGISTER
write_byte(0x10, ((UNIPOLAR | GAIN_1) << 8) | 0x90 | AVDD_MONITOR, 16); // CONFIGURATION REGISTER
// Калибровка
write_byte(0x08, (0xC0 << 8) | 0x0A, 16);
delay(10); // MODE REGISTER System Zero-Scale Calibration
write_byte(0x08, (0xE0 << 8) | 0x0A, 16);
delay(10); // MODE REGISTER System Full-Scale Calibration
Serial.print("Stat ");
Serial.println(read_byte(0x40, 8), BIN); // STATUS REGISTER
Serial.print("ID ");
Serial.println(read_byte(0x60, 8), BIN); // ID REGISTER
Serial.print("Ofst ");
Serial.println(read_byte(0x70, 24)); // OFFSET REGISTER
Serial.print("ful ");
Serial.println(read_byte(0x78, 24)); // FULL-SCALE REGISTER
write_byte(0x28, 0b00001011, 8); // IO REGISTER 2mA
pinMode(7, INPUT);
menu = EEPROM.read(0);
analogReference(INTERNAL);
analogRead(A0); // Холостое считывание после смены опорного напряжения
float v = (float)(analogRead(A0) * Vref / 1024) / divider;
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.display();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(20, 25);
display.print(F("Voltage: "));
display.print(v);
display.print(F(" V"));
display.setCursor(45, 35);
display.print(F("AD7793"));
display.display();
delay(1000);
display.clearDisplay();
firstBoot = false;
}
// Вспомогательная функция для обработки ввода числовых значений
float processNumericInput(float currentValue, char key) {
if (key == '.') {
// Обработка ввода точки
decimalPlaces = 1; // Установка десятичных разрядов после точки
} else if (key >= '0' && key <= '9') {
// Ввод цифр, обновляем соответствующую переменную
if (decimalPlaces > 0) {
currentValue = currentValue + (key - '0') * pow(10, -decimalPlaces);
decimalPlaces++;
} else {
currentValue = currentValue * 10 + (key - '0');
}
}
return currentValue;
}
void loop(){
//if (menu != previousMenu) {display.clearDisplay(); delay(10); previousMenu = menu;} // Очистка экрана при смене меню
// Измеряем напряжение на A0
float v = (float)(analogRead(A0) * Vref / 1024) / divider;
//display.clearDisplay();
/// termopara //
// READ ADC //////////////////////////////////////////////////////////////////
if((millis()-times>1000||start==1)&&menu<1){
write_byte(0x08,(0x20<<8)|F_ADC_4_17, 16);// MODE REGISTER
write_byte(0x10,((BIPOLAR|GAIN_16)<<8)|0x90|CH1, 16); // CONFIGURATION REGISTER
long adc = read_byte(0x58,24);
u = (1170.00/0x800000*(adc-0x800000))/16;
// BIPOLAR
Serial.print("Data b_B ");Serial.println(adc-0x800000);//DATA REGISTER
Serial.print("Data V_B ");Serial.println((1170.00/0x800000*(adc-0x800000))/16,3);//DATA REGISTER
// DS18B20
if(millis()-times>1000||start==1){temp_ds = dsRead(0);times=millis();}
start=0;
}
//TERMOMETR //
// READ ADC //////////////////////////////////////////////////////////////////
if(millis()-times>1000&&menu==1){
write_byte(0x08,(0x20<<8)|F_ADC_4_17, 16);// MODE REGISTER
write_byte(0x10,((UNIPOLAR|GAIN_1)<<8)|0x90|CH2, 16); // CONFIGURATION REGISTER
long adc = read_byte(0x58,24);
u = (1170.00/0xFFFFFF*adc)/i_1ma/2 + r_0_kall;// 2mA
if(millis()-times>5000||start==1){temp_ds = dsRead(0);times=millis();}
start=0;
// UNIPOLAR
Serial.print("Data b_U ");Serial.println(adc);//DATA REGISTER
Serial.print("Data V_U ");Serial.println((1170.00/0xFFFFFF*adc)/1,3);//DATA REGISTER
}
// LCD ///////////////////////////////////////////////////////////////////////
static unsigned long lastButtonPress = 0;
const unsigned long buttonDebounceDelay = 100; // Задержка для подавления дребезга кнопки
if (millis() - lastButtonPress > buttonDebounceDelay) {
if (digitalRead(7) == LOW) {menu++;EEPROM.update(0, menu);}
if (menu > 2) {menu = 0;}
// Прошла достаточная задержка после предыдущего нажатия
lastButtonPress = millis(); // Обновляем время последнего нажатия
}
Serial.print("Current Menu: ");
Serial.println(menu);
if (menu == 2) {
if (currentScreen == 1) {
// Логика для нового экрана (после ввода Dmax)
display.clearDisplay();
display.setCursor(55, 0);
display.print(F("KCC"));
display.setCursor(45, 13);
display.print(F("SENSOR"));
display.setCursor(45, 37);
display.print(F("DEVICE"));
display.setCursor(0, 25);
display.print(F("Svol:"));
display.setCursor(0, 33);
display.print(enteredSvol);
//display.setCursor(0, 43);
//display.print(F("Result 1:"));
//display.print(result1);
char key = keypad.getKey();
if (key != NO_KEY) {
if ((key >= '0' && key <= '9') || key == '.') {
// Ввод цифр и точек, обновляем переменную Svol
enteredSvol = processNumericInput(enteredSvol, key);
} else if (key == '#') {
// Подтверждение ввода Svol
// Здесь вы можете добавить логику для расчетов на основе Svol и других переменных
// Например, вычисление 5 значений и вывод их на экран
float result1 = calculateResult(enteredSvol, enteredSmin, enteredSmax, enteredDmin, enteredDmax);
//float result2 = calculateResult2(enteredSvol, enteredDmax, /*другие параметры*/);
// ... аналогично для остальных расчетов
// Вывод результатов на экран
display.clearDisplay();
display.setCursor(0, 43);
display.print(F("Result 1:"));
display.print(result1);
// Аналогично для остальных результатов
// Сброс переменных после расчетов, если это необходимо
//enteredSvol = 0.0;
//enteredDmax = 0.0;
// ... сброс других переменных
// Переход обратно на предыдущий экран
currentScreen = 1;
}
}
}
else if(currentScreen == 0) {
display.clearDisplay();
display.setCursor(55, 0);
display.print(F("KCC"));
display.setCursor(45, 13);
display.print(F("SENSOR"));
display.setCursor(45, 37);
display.print(F("DEVICE"));
display.setCursor(0, 25);
display.print(F("Smin:"));
display.print(enteredSmin); // Выводим введенное значение
display.setCursor(65, 25);
display.print(F("Smax:"));
display.print(enteredSmax); // Выводим введенное значение
display.setCursor(0, 49);
display.print(F("Dmin:"));
display.print(enteredDmin); // Выводим введенное значение
display.setCursor(65, 49);
display.print(F("Dmax:"));
display.print(enteredDmax); // Выводим введенное значение
}
// Логика ввода с клавиатуры
char key = keypad.getKey();
if (key != NO_KEY) {
if (key == 'C') {
// Сброс всех введенных данных
enteredSmin = 0.0;
enteredSmax = 0.0;
enteredDmin = 0.0;
enteredDmax = 0.0;
//enteredSvol = processNumericInput(enteredSvol, key);
currentInputField = SminField; // Начинаем с самого начала
decimalPlaces = 0; // Сброс десятичных разрядов
currentScreen = 0; // Возвращаемся к экрану 0
} else if (key == '#') {
// Переход к следующему полю после подтверждения ввода
switch (currentInputField) {
case SminField:
currentInputField = SmaxField;
break;
case SmaxField:
currentInputField = DminField;
break;
case DminField:
currentInputField = DmaxField;
break;
case DmaxField:
// Переход к новому экрану после ввода Dmax
currentScreen = 1; // Используйте значение, которое соответствует новому экрану
// Здесь вы можете добавить логику для вывода новых значений или чего-то еще на новом экране
break;
}
} else if ((key >= '0' && key <= '9') || key == '.') {
// Ввод цифр и точек, обновляем соответствующую переменную
switch (currentInputField) {
case SminField:
enteredSmin = processNumericInput(enteredSmin, key);
break;
case SmaxField:
enteredSmax = processNumericInput(enteredSmax, key);
break;
case DminField:
enteredDmin = processNumericInput(enteredDmin, key);
break;
case DmaxField:
enteredDmax = processNumericInput(enteredDmax, key);
// Переход к новому экрану после ввода Dmax
//currentScreen = 1; // Используйте значение, которое соответствует новому экрану
// Здесь вы можете добавить логику для вывода новых значений или чего-то еще на новом экране
break;
}
}
}
}
if (menu < 1) {
display.clearDisplay();
delay (10);
display.setCursor(37, 13);display.print(F("TERMOPARA"));
display.setCursor(0, 25);display.print(F("T "));
display.drawBitmap(4, 25, symbolP, 8, 8, SSD1306_WHITE);
display.print(F(":"));
display.print(u, 2);
display.print(F(" mV "));
txa();
display.setCursor(0, 40); display.print(F("TXA: "));
if (t_iz == -1000) {
display.print(F("LOW "));
} else if (t_iz == 1000) {
display.print(F("HIGH "));
} else {
display.print(t_iz, 1);
display.print(char(247));
display.print(F("C "));
}
txk(); display.setCursor(0, 55); display.print(F("TXK: "));
if (t_iz == -1000) {
display.print(F("LOW "));
} else if (t_iz == 1000) {
display.print(F("HIGH "));
} else {
display.print(t_iz, 1);
display.print(char(247));
display.print(F("C "));
}
}
else if (menu == 1) {
display.clearDisplay();
delay (10);
display.setCursor(0, 25);display.print(F("TC :"));
display.print(u, 2);display.print(F(" Om "));
display.setCursor(37, 13); display.print(F("TERMOMETR "));
p50();display.setCursor(0, 40); display.print(F("50 "));
display.drawBitmap(9, 40, symbolP, 8, 8, SSD1306_WHITE);
display.print(F(":"));
if (t_iz == -1000) {
display.print(F("LOW "));
} else if (t_iz == 1000) {
display.print(F("HIGH "));
} else {
display.print(t_iz, 1);
display.print(char(247));
}
m50(); display.setCursor(65, 40); display.print(F("50M:"));
if (t_iz == -1000) {
display.print(F("LOW "));
} else if (t_iz == 1000) {
display.print(F("HIGH "));
} else {
display.print(t_iz, 1);
display.print(char(247));
}
p21(); display.setCursor(0, 55); display.print(F("21 "));
display.drawBitmap(9, 55, symbolP, 8, 8, SSD1306_WHITE);
display.print(F(":"));
if (t_iz == -1000) {
display.print(F("LOW "));
} else if (t_iz == 1000) {
display.print(F("HIGH "));
} else {
display.print(t_iz, 1);
display.print(char(247));
}
m23(); display.setCursor(65, 55); display.print(F("23M:"));
if (t_iz == -1000) {
display.print(F("LOW "));
} else if (t_iz == 1000) {
display.print(F("HIGH "));
} else {
display.print(t_iz, 1);
display.print(char(247));
}
}
//BAT
// Отображаем напряжение
//display.setCursor(95, 10);
//display.print(F("Voltage: "));
//display.print(v);
//display.print(F("V"));
// Рассчитываем процент заряда
int batteryPercentage = map((int)(v * 100), (int)(Umin * 100), (int)(Umax * 100), 0, 100);
batteryPercentage = constrain(batteryPercentage, 0, 100);
// Отображаем процент заряда на OLED-дисплее
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(89, 0);
//display.print(F("Battery: "));
display.print(batteryPercentage);
display.print(F("%"));
// Рисуем индикатор батареи
drawBattery(batteryPercentage);
// Температура с датчика DS18B20
display.setCursor(0, 0); display.print(temp_ds, 1);
display.print(char(247)); display.print(F("C"));
display.display();
delay(10);
}
void write_byte(byte reg, long data, int bit_){
digitalWrite(CS,LOW);
for(int i = 7; i >= 0; i--){
digitalWrite(SCLK,LOW);
digitalWrite(DIN, (reg >> i) & 1);
digitalWrite(SCLK,HIGH);
}
for(int i = bit_-1; i >= 0; i--){
digitalWrite(SCLK,LOW);
digitalWrite(DIN, (data >> i) & 1);
digitalWrite(SCLK,HIGH);
}
digitalWrite(CS,HIGH);
}
long read_byte(byte reg, int bit_){
digitalWrite(CS,LOW);
while(digitalRead(DOUT)!=LOW);
for(int i = 7; i >= 0; i--){
digitalWrite(SCLK,LOW);
digitalWrite(DIN, (reg >> i) & 1);
digitalWrite(SCLK,HIGH);
}
while(digitalRead(DOUT)!=LOW);
long data_out=0;
long dat;
for(int i = bit_-1; i >= 0; i--){
digitalWrite(SCLK,LOW);
digitalWrite(SCLK,HIGH);
dat = digitalRead(DOUT);
data_out |= (dat<<i);
}
digitalWrite(CS,HIGH);
return data_out;
}
void reset(){
digitalWrite(CS,LOW);
for(int i = 31; i >= 0; i--){
digitalWrite(SCLK,LOW);
digitalWrite(DIN, HIGH);
digitalWrite(SCLK,HIGH);
}
digitalWrite(CS,HIGH);
}
float dsRead(byte x) {
byte data[2], addr[8][8], kol = 0;
while (ds.search(addr[kol])) { // поиск датчиков, определение адреса и кол-ва датчиков
kol++;}
ds.reset_search(); // Сброс поиска датчика
ds.reset(); // Инициализация, выполняется сброс шины
ds.select(addr[x]); // Обращение к датчику по адресу
ds.write(0x44, 0); // Измерение температуры с переносом данных в память
ds.reset(); // Инициализация, выполняется сброс шины
ds.select(addr[x]); // Обращение к датчику по адресу
ds.write(0xBE); // Обращение памяти
data[0] = ds.read();// Чтение памяти byte low
data[1] = ds.read();// Чтение памяти byte high
float value = ((data[1] << 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод
}
void txa(){u0=u+temp_ds*0.0400;// окружающая температура 0.0400 мВ на 1 гр.Цельсия от 0 до 40 гр.Цельсия для TXA(K)
if(u0<0){t_iz=(a[0]*pow(u0,0))+(a[1]*pow(u0,1))+(a[2]*pow(u0,2))+(a[3]*pow(u0,3))+(a[4]*pow(u0,4))+(a[5]*pow(u0,5))+(a[6]*pow(u0,6))+(a[7]*pow(u0,7))+(a[8]*pow(u0,8));}
if(u0>=0&&u0<=20.64){t_iz=(a1[0]*pow(u0,0))+(a1[1]*pow(u0,1))+(a1[2]*pow(u0,2))+(a1[3]*pow(u0,3))+(a1[4]*pow(u0,4))+(a1[5]*pow(u0,5))+(a1[6]*pow(u0,6))+(a1[7]*pow(u0,7))+(a1[8]*pow(u0,8))+(a1[9]*pow(u0,9));}
if(u0>20.64){t_iz=(a2[0]*pow(u0,0))+(a2[1]*pow(u0,1))+(a2[2]*pow(u0,2))+(a2[3]*pow(u0,3))+(a2[4]*pow(u0,4))+(a2[5]*pow(u0,5))+(a2[6]*pow(u0,6));}
if(u<-6.35){t_iz=-1000;} if(u>54.9){t_iz=1000;}
}
void txk(){u0=u+temp_ds*0.06476;// окружающая температура 0.06476 мВ на 1 гр.Цельсия от 0 до 40 гр.Цельсия для TXK(L)
if(u0<0){t_iz=(b[0]*pow(u0,0))+(b[1]*pow(u0,1))+(b[2]*pow(u0,2))+(b[3]*pow(u0,3))+(b[4]*pow(u0,4))+(b[5]*pow(u0,5))+(b[6]*pow(u0,6))+(b[7]*pow(u0,7))+(b[8]*pow(u0,8))+(b[9]*pow(u0,9));}
if(u0>=0){t_iz=(b1[0]*pow(u0,0))+(b1[1]*pow(u0,1))+(b1[2]*pow(u0,2))+(b1[3]*pow(u0,3))+(b1[4]*pow(u0,4))+(b1[5]*pow(u0,5))+(b1[6]*pow(u0,6))+(b1[7]*pow(u0,7))+(b1[8]*pow(u0,8))+(b1[9]*pow(u0,9));}
if(u<-9.49){t_iz=-1000;} if(u>66.47){t_iz=1000;}
}
void p50(){if(u>=50.00){t_iz=(sqrt(0.000015752961+0.0000023364*(1-u/50.00))-0.003969 )/-0.0000011682;}
if(u<50.00){t_iz=251.903*(pow(u/50.00-1,1)) + 8.80035*(pow(u/50.00-1,2)) - 2.91506 *(pow(u/50.00-1,3)) + 1.67611*(pow(u/50.00-1,4));}
if(u<8.65){t_iz=-1000;} if(u>182.23){t_iz=1000;}
}
void p21(){if(u>=46.00){t_iz=(sqrt(0.000015752961+0.0000023364*(1-u/46.00))-0.003969 )/-0.0000011682;}
if(u<46.00){t_iz=251.903*(pow(u/46.00-1,1)) + 8.80035*(pow(u/46.00-1,2)) - 2.91506 *(pow(u/46.00-1,3)) + 1.67611*(pow(u/46.00-1,4));}
if(u<07.95){t_iz=-1000;} if(u>153.3){t_iz=1000;}
}
void m50(){if(u>=50.00){t_iz=(u/50-1)/0.00428;}
if(u<50.00){t_iz=233.87*(pow(u/50-1,1))+7.9370*(pow(u/50-1,2))-2.0062*(pow(u/50-1,3))-0.3953*(pow(u/50-1,4));}
if(u<39.24){t_iz=-1000;} if(u>92.79){t_iz=1000;}
}
void m23(){if(u>=53){t_iz=(u/53-1)/0.00426;}
if(u<53.00){t_iz=233.87*(pow(u/53-1,1))+7.9370*(pow(u/53-1,2))-2.0062*(pow(u/53-1,3))-0.3953*(pow(u/53-1,4));}
if(u<41.71){t_iz=-1000;} if(u>93.64){t_iz=1000;}
}