Linear stabilizer voltage and current on lm358 and transictor. Digital control and indication on stm32f103rbt and tft01-22sp (ili9341). https://www.youtube.com/watch?v=DLC3KEtlr9I https://radiokot.ru/forum/viewtopic.php?f=11&t=112440

Dependencies:   mbed TFT_fonts SPI_TFT_ILI9341 beep _24LCXXX

Revision:
4:776f59129c24
Parent:
3:791cf9a867d1
Child:
5:0b3c71d7e475
--- a/main.cpp	Sat Nov 22 18:51:39 2014 +0000
+++ b/main.cpp	Wed Jan 21 17:34:22 2015 +0000
@@ -1,5 +1,7 @@
 #include "mbed.h"
 #include "SPI_TFT_ILI9341.h"
+#include "_24LCXXX.h"
+#include "beep.h"
 //----------------------------------
 #include "digi36x44.h"
 #include "Consolas26x49.h"
@@ -33,8 +35,16 @@
 SPI_TFT_ILI9341 TFT(D11, D12, D13, D8, D9, D10,"TFT"); // mosi, miso, sclk, cs, reset, dc
 void grid(void);
 Timer fps;// FPS
+Timeout timerforfanstart; //таймер для запуска мотора
+Timeout timerforpoweriddle; //таймер для паузы срабатывания кнопки
+Timeout iddletimesaver;    // таймер времени до включения заставки
+int fst=0;
+int fst2=0;
 //Ticker valueUI;
 InterruptIn button(A4); // кнопка питания вкл\выкл
+Beep buzzer(D5);        // звук
+I2C i2c(PB_9, PB_8);            // sda, scl для флэш памяти
+_24LCXXX eeprom(&i2c, 0x50);
 //----------------------------------------------------------------------------------------------------------- Ввести в меню опцию коррекции падения напряжения на токоизмерительном шунте.
 int t;        // секунд с момента включения
 int tstart;   // при включении нагрузки равна реальному времени
@@ -53,6 +63,24 @@
 void drawScreen7(void);             // экран 7
 void drawScreen8(void);             // экран 8
 void bootCold(void);                // холодный старт
+void loaddefaultsettings(void);     // загрузка настроек по умолчанию
+void loadsettings(void);            // загрузка настроек при старте
+void savedefaulttoflash(void);      // сохранить в флэш настройки по умолчанию (для активации работы флэш)
+void fans(void);                    // управление вентиляторами
+void fanstart(void);                // первичный старт вентилятора
+void keypoweriddle(void);           // для задержка опроса кнопки питания
+void ScreenSaver(void);            // ScreenSaver
+void screensaverstart(void);       // старт заставки
+void bootscreen(void);             // экран при старте
+int saveractive=0;
+int onesaver=0;
+int onepower=0;                      // для задержка опроса кнопки питания
+//-----------------
+void Protect(void);                  // функция обработки защиты
+int shl=0;
+int shm=0;
+int shortline=0;
+//-----------------
 float map(float, float, float, float, float);   // масштабирование
 void SetDateTime(void);             // установка даты и времени
 int year=2014;
@@ -62,12 +90,13 @@
 int min=42;
 int sec=0;
 time_t seconds;     //для часов реального времени
-float tempstart=42;   // температура старта вентилятора 
-float tempfull=60;    //             полной мощности вентилятора  tempstart tempfull tempcutoff
-float tempcutoff=80;  //             отключения нагрузки
-int umax=31;          // U max
-float rdown=0.240;    // R сопротивление шунта для расчета падения напряжения выхода от зависимости от тока нагрузки
-int rdown_on=0;       // по умолчанию без падения напряжения на резисторе шунта
+int tempstart=42;   //             температура старта вентилятора
+int tempfull=60;    //             полной мощности вентилятора  tempstart tempfull tempcutoff
+int tempcutoff=80;  //             отключения нагрузки
+int umax=31;          // U max, Volt
+float imax=2.6;       // I max, Amper
+float rdown=0.05;    // R сопротивление шунта для расчета падения напряжения выхода от зависимости от тока нагрузки
+int rdown_on=1;       // по умолчанию без падения напряжения на резисторе шунта
 char *ron = "On ";     // для вывода в меню главных настроек On
 char *roff = "Off";    // для вывода в меню главных настроек Off
 //---------------------------
@@ -75,51 +104,33 @@
 float avgAin1();                    // среднее значение с входа A1
 float avgAin2();                    // среднее значение с входа A2
 float avgAin3();                    // среднее значение с входа A3
-//float avgAin4();                    // среднее значение с входа A4
-//float avgAin5();                    // среднее значение с входа A5
 //----
 float in0 = 0;
 float in1 = 0;
 float in2 = 0;
 float in3 = 0;
-//float in4 = 0;
-//float in5 = 0;
 //----
 float U5 = 0;
 float Ireal = 0;
 float U30 = 0;
-//float Iset = 0;
-//float Uusb = 0;
-//float Iusb = 0;
 //---------------------------
 void dataProcessing(void);          // обработка и подготовка данных с аналоговых входов
 void powerButton(void);             // при нажатии кнопки питания
 void buttonUse(void);               // обработка нажатий кнопок
 //-----------------------------------------------------------------------------------------------------------
-float a0a = 0.0012;      // A0 - U 5 - avg при 0 - нижняя точка          U  5 вольт
-float a0k = 5.0079;        // A0 - U 5 - коэффициент - верхняя точка
-//---------------------------------------------------------------
-float a1a = 0.1437;   // A1 - I бп - avg при 0   - нижняя  точка    a1a = avgAin1() - 0.00004    
-float a1k = 3253;       // A1 - I бп - коэффициент - верхняя точка    a1k = 2000/(avgAin1() - a1a) при 2амперах
-//---------------------------------------------------------------
-float a2a = 0.00005;   // A2 - U 30 - avg при 0   - нижняя  точка         U  33 вольта
-float a2k = 32.94623;          // A2 - U 30 - коэффициент - верхняя точка
+float a0a = 0.000679;      // A0 - U 5 - avg при 0 - нижняя точка          U  5 вольт
+float a0k = 5.006402;        // A0 - U 5 - коэффициент - верхняя точка
 //---------------------------------------------------------------
-//float a3a = 0.0037;   // A3 - I уст - avg при 0   - нижняя  точка
-//float a3k = 1839.1;          // A3 - I уст - коэффициент - верхняя точка
+float a1a = 0.143353;   // A1 - I бп - avg при 0   - нижняя  точка    a1a = avgAin1() - 0.00004
+float a1k = 3.224676;       // A1 - I бп - коэффициент - верхняя точка    a1k = 2000/(avgAin1() - a1a) при 2амперах
 //---------------------------------------------------------------
-//float a4a = 0.0024;      // A4 - U usb - avg при 0 - нижняя точка
-//float a4k = 2.0;          // A4 - U usb - коэффициент - верхняя точка
-//---------------------------------------------------------------
-//float a5a = 0.0024;   // A5 - I usb - avg при 0   - нижняя  точка
-//int a5k = 3144;       // A5 - I usb - коэффициент - верхняя точка
+float a2a = 0.000015;   // A2 - U 30 - avg при 0   - нижняя  точка         U  33 вольта
+float a2k = 33.627953;          // A2 - U 30 - коэффициент - верхняя точка
 //---------------------------------------------------------------
 float noisea0; //типа уровень шума (разница между минимум и максимум за 100 измерений) для А0
 float noisea1; // - - для A1
 float noisea2; // - - для A2
 float noisea3; // - - для A3
-//float noisea4; // - - для A4
-//float noisea5; // - - для A5
 //-----------------------------------------------------------------------------------------------------------
 DigitalIn buttonUp(D3);     // Up
 DigitalIn buttonDown(D2);   // Down
@@ -136,6 +147,9 @@
 int mline7=0;               //                      7
 int mline8=0;               //                      8
 int mline11=0;               //                     11
+int mline12=0;               //                     12
+int mline13=0;               //                     13
+int mline14=0;               //                     14
 int nline=8;               // номер начальной строки в меню установки времени экран 3
 int pmenu=0;                //в главном меню изменение выбраной строки не действительно
 int powerProtect=1; //защита от кз
@@ -149,9 +163,11 @@
 float fanspeed = 0.0f;
 PwmOut fan(D7);              // выход вентилятора
 int temperature = 25;        // текущая температура
+int screensaver=0; // заставка 0 - нет, 1 - часы, 2- ...
+int beeper=0; //бипер выключен
 //-----------------------------------------------------------------------------------------------------------
 DigitalOut powerMosfet(D4);         // выход управления нагрузкой
-DigitalIn cc(D14); //вход СС    0 - СС, 1 - CV
+DigitalIn cc(PC_5); //вход СС    0 - СС, 1 - CV
 int ccc=0;
 DigitalOut ledcc(PC_6);       // светодиод C.C
 DigitalOut ledshort(PC_8);   // светодиод КЗ
@@ -161,16 +177,151 @@
 AnalogIn  ainA3(A3);
 //AnalogIn  ainA4(A4);
 //AnalogIn  ainA5(A5);
-//BusOut    unused(A5,A2,A3,A4);
+//BusOut unused(A4,A5);
+//-------------для screen7--
+int iiii=0;
+//--------------------------
 //------------------------------------------------------------------------------------------------------------
 //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+void loaddefaultsettings(void)
+{
+    a0a = 0.000679;
+    a0k = 5.006402;
+    a1a = 0.143353;
+    a1k = 3.224676;
+    a2a = 0.000015;
+    a2k = 33.627953;
+    imax=2.6;
+    rdown=0.05;
+    brightness = 1.0f;
+    beeper = 0;
+    rdown_on=1;
+    umax=31;
+    tempstart=42;
+    tempfull=60;
+    tempcutoff=80;
+    screensaver=0; 
+    ledcc=1;
+    wait(0.5);
+    ledcc=0;
+    wait(0.5);
+}
+//------------------------------------------------------------------------------------------------------------
+void loadsettings(void)
+{
+    int s;
+    int s1;
+    eeprom.nbyte_read(0, (char*)&s, sizeof(s));
+    eeprom.nbyte_read(4, (char*)&s1, sizeof(s1));
+    if (s==0 && s1==1) {       //если флэш активирована то грузим с неё
+        ledshort=1;     // 1 раз моргнуло - начало загрузки
+        wait(0.02);
+        ledshort=0;
+
+        eeprom.nbyte_read(8, (char*)&a0a, sizeof(a0a));    // a0a float - 4 байта
+        eeprom.nbyte_read(12, (char*)&a0k, sizeof(a0k));    // a0k float - 4 байта
+        eeprom.nbyte_read(16, (char*)&a1a, sizeof(a1a));   // a1a float - 4 байта
+        eeprom.nbyte_read(20, (char*)&a1k, sizeof(a1k));   // a1k float - 4 байта
+        eeprom.nbyte_read(24, (char*)&a2a, sizeof(a2a));   // a2a float - 4 байта
+        eeprom.nbyte_read(28, (char*)&a2k, sizeof(a2k));   // a2k float - 4 байта
+
+        eeprom.nbyte_read(32, (char*)&imax, sizeof(imax));             // imax float - 4 байта
+        eeprom.nbyte_read(36, (char*)&rdown, sizeof(rdown));           // rdown float - 4 байта
+        eeprom.nbyte_read(40, (char*)&brightness, sizeof(brightness)); // brightness float - 4 байта
+        eeprom.nbyte_read(44, (char*)&beeper, sizeof(beeper));     // beeper float - 4 байта
+
+        eeprom.nbyte_read(48, (char*)&rdown_on, sizeof(rdown_on));    // rdown_on float - 4 байт
+        eeprom.nbyte_read(52, (char*)&umax, sizeof(umax));        // umax float - 4 байт
+        eeprom.nbyte_read(56, (char*)&tempstart, sizeof(tempstart));   // tempstart float - 4 байт
+        eeprom.nbyte_read(60, (char*)&tempfull, sizeof(tempfull));    // tempfull float - 4 байт
+        eeprom.nbyte_read(64, (char*)&tempcutoff, sizeof(tempcutoff));  // tempcutoff float - 4 байт
+        eeprom.nbyte_read(68, (char*)&screensaver, sizeof(screensaver));  // screensaver float - 4 байт
+
+        wait(0.05); // 2 раза моргнуло удачно загрузили
+        ledshort=1;
+        wait(0.02);
+        ledshort=0;
+    }
+}
+//------------------------------------------------------------------------------------------------------------
+void savedefaulttoflash(void)
+{
+
+    a0a = 0.000679;
+    a0k = 5.006402;
+    a1a = 0.143353;
+    a1k = 3.224676;
+    a2a = 0.000015;
+    a2k = 33.627953;
+    imax=2.6;
+    rdown=0.05;
+    brightness = 1.0f;
+    beeper = 0;
+    rdown_on=1;
+    umax=31;
+    tempstart=42;
+    tempfull=60;
+    tempcutoff=80;
+    screensaver=0;
+
+
+    ledshort=1;  // 1 раз моргнуло - начало записи
+    wait(0.02);
+    ledshort=0;
+    wait(0.05);
+
+    int s=0;
+    int s1=1;
+    eeprom.nbyte_write(0, (char*)&s, sizeof(s));
+    eeprom.nbyte_write(4, (char*)&s1, sizeof(s1));
+
+    eeprom.nbyte_write(8, (char*)&a0a, sizeof(a0a));    // a0a float - 4 байта
+    eeprom.nbyte_write(12, (char*)&a0k, sizeof(a0k));    // a0k float - 4 байта
+    eeprom.nbyte_write(16, (char*)&a1a, sizeof(a1a));   // a1a float - 4 байта
+    eeprom.nbyte_write(20, (char*)&a1k, sizeof(a1k));   // a1k float - 4 байта
+    eeprom.nbyte_write(24, (char*)&a2a, sizeof(a2a));   // a2a float - 4 байта
+    eeprom.nbyte_write(28, (char*)&a2k, sizeof(a2k));   // a2k float - 4 байта
+
+    eeprom.nbyte_write(32, (char*)&imax, sizeof(imax));             // imax float - 4 байта
+    eeprom.nbyte_write(36, (char*)&rdown, sizeof(rdown));           // rdown float - 4 байта
+    eeprom.nbyte_write(40, (char*)&brightness, sizeof(brightness)); // brightness float - 4 байта
+    eeprom.nbyte_write(44, (char*)&beeper, sizeof(beeper));     // beeper float - 4 байта
+
+    eeprom.nbyte_write(48, (char*)&rdown_on, sizeof(rdown_on));    // rdown_on float - 4 байта
+    eeprom.nbyte_write(52, (char*)&umax, sizeof(umax));        // umax float - 4 байта
+    eeprom.nbyte_write(56, (char*)&tempstart, sizeof(tempstart));   // tempstart float - 4 байта
+    eeprom.nbyte_write(60, (char*)&tempfull, sizeof(tempfull));    // tempfull float - 4 байта
+    eeprom.nbyte_write(64, (char*)&tempcutoff, sizeof(tempcutoff));  // tempcutoff float - 4 байта
+    eeprom.nbyte_write(68, (char*)&screensaver, sizeof(screensaver));  // screensaver float - 4 байта
+
+    int l;
+    int l1;
+    eeprom.nbyte_read(0, (char*)&l, sizeof(l));
+    eeprom.nbyte_read(4, (char*)&l1, sizeof(l1));
+
+    if (l==s && l1==s1) {  //удачно сохранилось - 2 раза моргнуло
+        ledshort=1;
+        wait(0.02);
+        ledshort=0;
+    } else {
+        ledshort=1;
+        TFT.background(Black);
+        TFT.foreground(Red);
+        TFT.set_font((unsigned char*) Consolas19x35);
+        TFT.locate(10, 100);
+        TFT.printf("SAVE ERROR");
+        wait(5);
+        ledshort=0;
+    }
+}
 //------------------------------------------------------------------------------------------------------------
 void bootCold(void)
 {
+    i2c.frequency(100000);
     powerMosfet = 0;                    // при включении выход выключен
     ledcc=0;
     ledshort=0;
-    TFT.claim(stdout);      // send stdout to the TFT display
+    TFT.claim(stdout);
     set_time(1414838392);  // Set RTC time to Wed, 28 Oct 2009 11:35:37
     tstart = treal = time(NULL);
     pinbrightness.period(0.001);      // задаём частоту Шим подсветки 0.001 - 1000 герц
@@ -179,20 +330,50 @@
     TFT.background(Black);
     TFT.cls();
     wait(0.2);
-    pinbrightness = brightness;          // включаем подсветку
     fan = fanspeed; // устанавливаем скорость
-
 }
 //------------------------------------------------------------------------------------------------------------
+void bootscreen(void)
+{
+    
+    wait(0.5);
+    TFT.background(Black);
+    TFT.foreground(White);
+    TFT.set_font((unsigned char*) CourierNew13x23);
+    TFT.locate(0, 100);
+    TFT.printf("Load settings...\n");
+    pinbrightness = brightness;          // включаем подсветку
+    wait(0.5);
+    if (beeper==1) {
+        buzzer.beep(480,0.01);
+    }
+    
+    if (buttonEnter==0) {
+      TFT.printf("default.\n");
+      wait(0.5);
+      loaddefaultsettings();
+    }else{
+      TFT.printf("from flash.\n");
+      wait(1);
+      loadsettings();  
+    }
+}
+//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 int main()                                                             //--------- Главная функция ---------//
 {
     bootCold();                         // холодный старт
+    bootscreen();
     button.fall(&powerButton);          // прерывание кнопки включения нагрузки запускает функцию
 
     while(1) {
 
         dataProcessing();                   // обработка и подготовка данных с аналоговых входов
-        buttonUse();                        // обработка нажатий кнопок
+        fans();
+        Protect();
+        if (saveractive==0) {
+            buttonUse();                 // обработка нажатий кнопок
+        }
+        ScreenSaver();                      // заставка
         if (Screen == 1) drawScreen1();
         if (Screen == 2) drawScreen2();
         if (Screen == 3) drawScreen3();
@@ -204,8 +385,8 @@
 
     }
 }                                                                      //--------- Главная функция ---------//
+//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 //------------------------------------------------------------------------------------------------------------
-//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 //------------------------------------------------------------------------------------------------------------
 void drawScreen1(void)                                                                              // экран 1
 {
@@ -225,10 +406,10 @@
         //TFT.line(5,y,310,y, White);
         TFT.background(Black);
         TFT.foreground(colorline);                         // цвет слов
-        TFT.set_font((unsigned char*) Consolas26x49); 
+        TFT.set_font((unsigned char*) Consolas26x49);
         TFT.locate(193, 13);
         TFT.printf("v");                                // V
-        TFT.locate(165, 88);     
+        TFT.locate(165, 88);
         TFT.printf("ma");                               // mA
         complit = 1;  // прорисовали!
 
@@ -246,7 +427,7 @@
     }
 //-----------------------------------------------------------------------------
     if (powerProtect==0 & pp==0) {                                        // защита от кз
-        TFT.fillrect(113,161,206,191,Black);         //0
+        TFT.fillrect(113,161,206,191,Black);           //0
         TFT.background(Black);
         TFT.foreground(0x4208);
         TFT.set_font((unsigned char*) Lucida13x21);
@@ -263,8 +444,8 @@
         TFT.printf("Protect");
         pp=1;
     }
-    
-    if (cs==0 & csp==0){                                          // прорисовка короткого замыкания TFT.rect(112,198,207,232,colorline);
+
+    if (cs==0 & csp==0) {                                         // прорисовка короткого замыкания TFT.rect(112,198,207,232,colorline);
         TFT.fillrect(113,199,206,231,Black);               //0
         TFT.background(Black);
         TFT.foreground(0x4208);
@@ -272,8 +453,8 @@
         TFT.locate(130, 205);
         TFT.printf("SHORT");
         csp=1;
-        }
-    if (cs==1 & csp==0){                                     //1
+    }
+    if (cs==1 & csp==0) {                                    //1
         TFT.fillrect(113,199,206,231,0x6000);
         TFT.background(0x6000);
         TFT.foreground(Red);
@@ -281,36 +462,36 @@
         TFT.locate(130, 205);
         TFT.printf("SHORT");
         csp=1;
-        }
-    
+    }
+
 
 
     fps.reset();
     fps.start();
-    
+
     TFT.background(Black);
-    
-    if (cc==0){                                             //если C.C то меняем цвет значения напряжения
+
+    if (cc==0) {                                            //если C.C то меняем цвет значения напряжения
         TFT.foreground(Red);
-    }else{
+    } else {
         TFT.foreground(Green);
     }
-    
+
     TFT.set_font((unsigned char*) digi36x44);
     TFT.locate(10, 10);
     if(U5<0) U5=0;
-    if (U5<4.5f){
+    if (U5<4.5f) {
         //TFT.fillrect(10,10,46,54,Black);
         TFT.locate(10, 10);
         TFT.printf("%5.3f", U5);                           // выводим значение с A0 (напряжение)
-    }else{
-          TFT.locate(10, 10);
-          TFT.printf("%05.2f", U30);                         // выводим значение с A0 (напряжение)
+    } else {
+        TFT.locate(10, 10);
+        TFT.printf("%05.2f", U30);                         // выводим значение с A0 (напряжение)
     }
-    
+
     TFT.pixel(82, 53, Black);
     TFT.pixel(117, 53, Black);
-    
+
     TFT.locate(10, 85);
     TFT.foreground(Green);
     TFT.printf("%04.0f", Ireal);                                   // выводим значение с A1 (ток)
@@ -320,9 +501,10 @@
     TFT.foreground(0xE71C);//текст
     TFT.set_font((unsigned char*) Lucida13x21);
     TFT.locate(11, 162);
-    TFT.printf("%05.2f W", U5*Ireal/1000);
+    //TFT.printf("%05.2f W", U5*Ireal/1000);
+    TFT.printf("%f", fanspeed*100);
 
-    TFT.background(0x2104);                                       // выводим время включеной нагрузки 
+    TFT.background(0x2104);                                       // выводим время включеной нагрузки
     TFT.foreground(0xE71C);//текст
     TFT.set_font((unsigned char*) Lucida13x21);
     TFT.locate(7, 187);
@@ -330,7 +512,6 @@
     TFT.printf("%02d:%02d:%02d", h, m, s);
 
 
-
     if (powerMosfet==0 & pb==0) {                                       // выводим OFF
         TFT.background(Black);
         TFT.foreground(0xA514);
@@ -349,16 +530,17 @@
         TFT.printf("ON");
         pb=1;
     }
-    
-    int xscale1 = map(U5, 0, 32, 0, 298);
+
+    int xscale1 = map(U30, 0, umax, 0, 298);
     if (xscale1>297) xscale1=298;
-    TFT.fillrect(11, 63, (xscale1+10), 75, color_scale1);  //0x04C9                          // аналоговая шкала Напряжение 
+    TFT.fillrect(11, 63, (xscale1+10), 75, color_scale1);  //0x04C9                          // аналоговая шкала Напряжение
     TFT.fillrect((xscale1+12), 63, 308, 75, Black);
-    int xscale2 = map(Ireal, 0, 2600, 0, 298);
+
+    int xscale2 = map(Ireal, 0, imax*1000, 0, 298);
     if (xscale2>297) xscale2=298;
     TFT.fillrect(11, 138, (xscale2+10), 150, color_scale2);  //0x9A60                            // аналоговая шкала Ток
     TFT.fillrect((xscale2+11), 138, 308, 150, Black);
-    
+
     //int zxc = int(Iset);
     //if (zxc>295) zxc=295;
     //if (zxc<0) zxc=0;
@@ -368,13 +550,13 @@
     TFT.set_font((unsigned char*) Courier8x13);                                   // FPS
     TFT.locate(169,81);
     printf("%0.2f", (1/fps.read()));
-    
+
     TFT.background(0x2104);
     TFT.foreground(White);
-    TFT.set_font((unsigned char*) Lucida13x21);        //выводим t
-    TFT.locate(11, 211);                               
+    TFT.set_font((unsigned char*) Lucida13x21);                    //выводим Температуру
+    TFT.locate(11, 211);
     TFT.printf("  %d 'C ", temperature);
-    
+
     /*
     if (dinCC==1 & cc_one==1){
         cc=1;
@@ -387,16 +569,16 @@
         cc_one=1;
         }
         */
-    if(cc==1 & ccc==1){   // защелка для отображения сс сv
+    if(cc==1 & ccc==1) {  // защелка для отображения сс сv
         pm=0;
         ccc=0;
-        }
-    if(cc==0 & ccc==0){
+    }
+    if(cc==0 & ccc==0) {
         pm=0;
         ccc=1;
-        }
-    
-    if(cc==0 & pm==0){                                                             // c.c
+    }
+
+    if(cc==0 & pm==0) {                                                            // c.c
         TFT.fillrect(240,10,304,53,Black);//c.v стереть
         TFT.fillrect(240,85,304,128,0x6000);//c.c
         TFT.rect(240,85,304,128,0xC800);
@@ -407,10 +589,10 @@
         TFT.printf("C.C");
         pm=1;
     }
-    if(cc==1 & pm==0){                                                             // c.v
+    if(cc==1 & pm==0) {                                                            // c.v
         TFT.fillrect(240,85,304,128,Black);//c.c стереть
-        TFT.fillrect(240,10,304,53,0x0180);//c.v  
-        TFT.rect(240,10,304,53,0x04C0);        
+        TFT.fillrect(240,10,304,53,0x0180);//c.v
+        TFT.rect(240,10,304,53,0x04C0);
         TFT.background(0x0180);
         TFT.foreground(Green);
         TFT.set_font((unsigned char*) Consolas19x35);
@@ -436,23 +618,16 @@
     TFT.set_font((unsigned char*) Courier8x13);
     TFT.locate(0, 0);
     printf("--------- Data Analog In --------- \n");
-    printf("U.5 A0 noise= %0.2f, avg= %0.5f \n", noisea0, in0);
-    printf("U= %06.4f coeff. k=%0.5f, a=%0.6f \n", U5, a0k, a0a);    // A0  U real
-    printf("---------------------------------- \n");
-    printf("I.real A1 noise= %0.2f, avg= %0.5f \n", noisea1, in1);
-    printf("I= %06.2f coeff. k=%0.5f, a=%0.6f \n", Ireal, a1k, a1a);    // A1  I real
-    printf("---------------------------------- \n");
-    printf("U.30 A2 noise= %0.2f, avg= %0.5f \n", noisea2, in2);
-    printf("U= %06.3f coeff. k=%0.5f, a=%0.6f \n", U30, a2k, a2a);     // A2  U set
+    printf("U.5 A0 noise= %0.1f, avg= %0.5f \n", noisea0, in0);
+    printf("U= %06.4f \n coeff. k=%f, a=%f \n", U5, a0k, a0a);    // A0  U real
     printf("---------------------------------- \n");
-    printf("Temp A3 noise= %0.2f, avg= %0.5f \n", noisea3, in3);
-    //printf("I= %06.1f coeff. k=%0.0f, a=%0.4f \n", Iset, a3k, a3a);     // A3  I set
-    //printf("---------------------------------- \n");
-    //printf("U.usb A4 noise= %0.2f, avg= %0.5f \n", noisea4, in4);
-    //printf("U= %06.3f coeff. k=%0.0f, a=%0.4f \n", Uusb, a4k, a4a);     // A4  U usb
-    //printf("---------------------------------- \n");
-    //printf("I.usb A5 noise= %0.2f, avg= %0.5f \n", noisea5, in5);
-    //printf("I= %06.1f coeff. k=%0.0d, a=%0.4f \n", Iusb, a5k, a5a);     // A5  I usb
+    printf("I.real A1 noise= %0.1f, avg= %0.5f \n", noisea1, in1);
+    printf("I= %06.2f \n coeff. k=%f, a=%f \n", Ireal, a1k, a1a);    // A1  I real
+    printf("---------------------------------- \n");
+    printf("U.30 A2 noise= %0.1f, avg= %0.5f \n", noisea2, in2);
+    printf("U= %06.3f \n coeff. k=%f, a=%f \n", U30, a2k, a2a);     // A2  U set
+    printf("---------------------------------- \n");
+    printf("Temp A3 noise= %0.1f, avg= %0.5f \n", noisea3, in3);
 }
 //------------------------------------------------------------------------------------------------------------
 void drawScreen3(void)                                                                              // экран 3 установка часов
@@ -652,7 +827,7 @@
         TFT.background(back4);
         TFT.foreground(text4);
     }
-    printf(" U 5v = %06.3f set up dot \n", U5);               // U real A0 hi
+    printf(" U 5v = %06.3f set up     \n", U5);               // U real A0 hi
     //----------------------------------------------------------------
     if (kline==3) {
         TFT.background(back4_i);
@@ -661,7 +836,7 @@
         TFT.background(back4);
         TFT.foreground(text4);
     }
-    printf(" I real = %06.1f set zero   \n", Ireal);                // I real A1 zero 
+    printf(" I real = %06.1f set zero   \n", Ireal);                // I real A1 zero
     //----------------------------------------------------------------
     if (kline==4) {
         TFT.background(back4_i);
@@ -670,7 +845,7 @@
         TFT.background(back4);
         TFT.foreground(text4);
     }
-    printf(" I real = %06.1f set up dot \n", Ireal);                  // I real A1 hi
+    printf(" I real = %06.1f set up     \n", Ireal);                  // I real A1 hi
     //----------------------------------------------------------------
     if (kline==5) {
         TFT.background(back4_i);
@@ -679,7 +854,7 @@
         TFT.background(back4);
         TFT.foreground(text4);
     }
-    printf(" U 30v =  %06.3f set zero   \n", U30);                    // U set  A2 zero
+    printf(" U high v =  %06.3f set zero\n", U30);                    // U set  A2 zero
     //----------------------------------------------------------------
     if (kline==6) {
         TFT.background(back4_i);
@@ -688,7 +863,7 @@
         TFT.background(back4);
         TFT.foreground(text4);
     }
-    printf(" U 30v =  %06.3f set up dot \n", U30);                   // U set  A2 hi
+    printf(" U high v =  %06.3f set up  \n", U30);                   // U set  A2 hi
     //----------------------------------------------------------------
     if (kline==7) {
         TFT.background(back4_i);
@@ -697,7 +872,7 @@
         TFT.background(back4);
         TFT.foreground(text4);
     }
-    printf("---\n");                 // I set  A3 zero
+    printf(" -\n");                 // I set  A3 zero
     //----------------------------------------------------------------
     if (kline==8) {
         TFT.background(back4_i);
@@ -706,7 +881,7 @@
         TFT.background(back4);
         TFT.foreground(text4);
     }
-    printf("---\n");                  // I set  A3 hi
+    printf(" -\n");                  // I set  A3 hi
     //----------------------------------------------------------------
     if (kline==9) {
         TFT.background(back4_i);
@@ -715,7 +890,7 @@
         TFT.background(back4);
         TFT.foreground(text4);
     }
-    printf("---\n");                  // U usb A4 zero
+    printf(" -\n");                  // U usb A4 zero
     //----------------------------------------------------------------
     if (kline==10) {
         TFT.background(back4_i);
@@ -724,7 +899,7 @@
         TFT.background(back4);
         TFT.foreground(text4);
     }
-    printf("---\n");                  // U usb A4 hi
+    printf(" -\n");                  // U usb A4 hi
     //----------------------------------------------------------------
     if (kline==11) {
         TFT.background(back4_i);
@@ -733,7 +908,7 @@
         TFT.background(back4);
         TFT.foreground(text4);
     }
-    printf("---\n");                  // I usb A5 zero
+    printf(" -\n");                  // I usb A5 zero
     //----------------------------------------------------------------
     if (kline==12) {
         TFT.background(back4_i);
@@ -742,7 +917,7 @@
         TFT.background(back4);
         TFT.foreground(text4);
     }
-    printf("---\n");                 // I usb A5 hi
+    printf(" -\n");                 // I usb A5 hi
     //----------------------------------------------------------------
     if (kline==13) {
         TFT.background(back4_i);
@@ -816,16 +991,25 @@
         TFT.background(back5);
         TFT.foreground(text5);
     }
-    printf(" Backlight brightness =              %03.0f \n", fanspeed*100);                // 1
+    printf(" Backlight brightness =              %03.0f \n", brightness*100);                // 1
     //------------------------------------*---------------------------
     if (mline==3) {
-        TFT.background(back5_i);
-        TFT.foreground(text5_i);
+        if (pmenu==1) {
+            TFT.background(back5_iset);
+            TFT.foreground(text5_i);
+        } else {
+            TFT.background(back5_i);
+            TFT.foreground(text5_i);
+        }
     } else {
         TFT.background(back5);
         TFT.foreground(text5);
     }
-    printf(" Sound beep                                \n");                // 1
+    if (beeper==1) {
+        printf(" Sound beep                            %s \n", ron);
+    } else {
+        printf(" Sound beep                            %s \n", roff);
+    }
     //------------------------------------*---------------------------
     if (mline==4) {
         if (pmenu==1) {
@@ -839,7 +1023,7 @@
         TFT.background(back5);
         TFT.foreground(text5);
     }
-    printf(" Fan start - t                      %02.0f 'c \n", tempstart);                // 1 tempstart
+    printf(" Fan start - t                      %02d 'c \n", tempstart);                // 1 tempstart
     //------------------------------------*---------------------------
     if (mline==5) {
         if (pmenu==1) {
@@ -853,7 +1037,7 @@
         TFT.background(back5);
         TFT.foreground(text5);
     }
-    printf(" Fan full speed - t                 %02.0f 'c \n", tempfull);                // 1 tempfull
+    printf(" Fan full speed - t                 %02d 'c \n", tempfull);                // 1 tempfull
     //------------------------------------*---------------------------
     if (mline==6) {
         if (pmenu==1) {
@@ -867,7 +1051,7 @@
         TFT.background(back5);
         TFT.foreground(text5);
     }
-    printf(" Power cut off - t                  %02.0f 'c \n", tempcutoff);                // 1 tempcutoff
+    printf(" Power cut off - t                  %02d 'c \n", tempcutoff);                // 1 tempcutoff
     //------------------------------------*---------------------------
     if (mline==7) {
         if (pmenu==1) {
@@ -881,7 +1065,7 @@
         TFT.background(back5);
         TFT.foreground(text5);
     }
-    if (rdown_on==1){
+    if (rdown_on==1) {
         printf(" Voltmeter adjustment on R           %s \n", ron);           // падение на R вкл выкл
     } else {
         printf(" Voltmeter adjustment on R           %s \n", roff);
@@ -931,34 +1115,49 @@
         TFT.background(back5);
         TFT.foreground(text5);
     }
-    printf(" U max & U up dot calibration =      %02.0d v\n", umax);                // U max and U calibration
+    printf(" U max                                 %02.0d V \n", umax);                // U max
     //------------------------------------*---------------------------
     if (mline==12) {
-        TFT.background(back5_i);
-        TFT.foreground(text5_i);
+        if (pmenu==1) {
+            TFT.background(back5_iset);
+            TFT.foreground(text5_i);
+        } else {
+            TFT.background(back5_i);
+            TFT.foreground(text5_i);
+        }
     } else {
         TFT.background(back5);
         TFT.foreground(text5);
     }
-    printf(" Screen saver                              \n");                // 1
+    printf(" I max                                %03.1f A \n", imax);                // I max
     //------------------------------------*---------------------------
     if (mline==13) {
-        TFT.background(back5_i);
-        TFT.foreground(text5_i);
+        if (pmenu==1) {
+            TFT.background(back5_iset);
+            TFT.foreground(text5_i);
+        } else {
+            TFT.background(back5_i);
+            TFT.foreground(text5_i);
+        }
     } else {
         TFT.background(back5);
         TFT.foreground(text5);
     }
-    printf("                                             \n");                // 1
+    printf(" Screen saver                            %d \n", screensaver);                // Screen saver
     //------------------------------------*---------------------------
     if (mline==14) {
-        TFT.background(back5_i);
-        TFT.foreground(text5_i);
+        if (pmenu==1) {
+            TFT.background(back5_iset);
+            TFT.foreground(text5_i);
+        } else {
+            TFT.background(back5_i);
+            TFT.foreground(text5_i);
+        }
     } else {
         TFT.background(back5);
         TFT.foreground(text5);
     }
-    printf("                                             \n");                // 1
+    printf(" Load default settings and save to flash\n");                // 1
     //------------------------------------*---------------------------
     if (mline==15) {
         TFT.background(0xFB2C);
@@ -990,7 +1189,7 @@
     TFT.printf("%06.1f", Ireal);
     TFT.locate(10, 85);
     TFT.printf("%05.3f", U5);
-    
+
     TFT.locate(10, 150);
     TFT.printf("%d", int(U30));
 
@@ -1001,24 +1200,59 @@
 {
     if (complit==0) {
         TFT.background(Blue);
-        TFT.foreground(Black);
+        TFT.foreground(White);
         TFT.cls();
         complit = 1;  // прорисовали!
+        
+        TFT.line(0,40,319,40,Black);
+        TFT.line(0,80,319,80,Black);
+        TFT.line(0,120,319,120,Black);
+        TFT.line(0,160,319,160,Black);
+        TFT.line(0,200,319,200,Black);
     }
-
-
+    
+    TFT.background(Blue);
+    TFT.foreground(White);
+    iiii++;
+    if (iiii==320) {
+        iiii=0;
+        TFT.background(Blue);
+        TFT.foreground(White);
+        TFT.cls();
+        TFT.line(0,40,319,40,Black);
+        TFT.line(0,80,319,80,Black);
+        TFT.line(0,120,319,120,Black);
+        TFT.line(0,160,319,160,Black);
+        TFT.line(0,200,319,200,Black);
+    }
+    int b = noisea1*40; 
+    TFT.locate(5,5);
+    TFT.set_font((unsigned char*) Courier8x13);
+    printf("I A1 noise= %0.1f, avg= %0.5f \n", noisea1, in1);
+    printf(" I real = %06.1f set zero   \n", Ireal);
+    TFT.line(iiii,245-b,iiii,240-b, White);
+    //TFT.pixel(iiii,240-b,White);
+    
+    wait(0.01);
 }
 //------------------------------------------------------------------------------------------------------------
 void drawScreen8(void)                                                                   //экран 8
 {
     if (complit==0) {
-        TFT.background(Blue);
-        TFT.foreground(Black);
+        TFT.background(Black);
+        TFT.foreground(White);
         TFT.cls();
         complit = 1;  // прорисовали!
     }
 
-
+    TFT.set_font((unsigned char*) Lucida13x21);
+    char buffer[32];
+    seconds=time(NULL);
+    strftime(buffer, 32, "%H:%M:%S %d.%m.%Y", localtime(&seconds));
+    TFT.background(back5_i);
+    TFT.foreground(text5_i);
+    TFT.locate (30,25);
+    printf("%s", buffer);    //вывод реального времени
 }
 //------------------------------------------------------------------------------------------------------------
 float map(float x, float in_min, float in_max, float out_min, float out_max)             // функция масштабирования
@@ -1098,64 +1332,6 @@
     noisea3 = (max - min)*1000;
     return itg/100;
 }
-/*/------------------------------------------------------------------------------------------------------------
-float avgAin4()                                                        // функция среднего значения с входа A4
-{
-    float     value[100];
-    float     max;
-    float     min;
-    double    itg;
-    max = itg = 0.0;
-    min = 3.3;
-    for (int i=0; i<100; i++) {
-        value[i] = ainA4;
-        if (value[i] > max) max = value[i];
-        if (value[i] < min) min = value[i];
-        itg += value[i];
-    }
-    noisea4 = (max - min)*1000;
-    return itg/100;
-}
-//------------------------------------------------------------------------------------------------------------
-float avgAin5()                                                        // функция среднего значения с входа A5
-{
-    float     value[100];
-    float     max;
-    float     min;
-    double    itg;
-    max = itg = 0.0;
-    min = 3.3;
-    for (int i=0; i<100; i++) {
-        value[i] = ainA5;
-        if (value[i] > max) max = value[i];
-        if (value[i] < min) min = value[i];
-        itg += value[i];
-    }
-    noisea5 = (max - min)*1000;
-    return itg/100;
-}
-//------------------------------------------------------------------------------------------------------------/
-        void drawMainScale(void) {
-            a
-            int a = avg*1000;
-            b = mapIOIO(c, 0, 100, 0, 220);
-
-            TFT.fillrect(10, 10, (b+10), 20, Red);                              // аналоговая шкала 1
-            TFT.fillrect((b+10), 10, 230, 20, Black);
-        }
-//------------------------------------------------------------------------------------------------------------*/
-void powerButton(void)                                                           // при нажатии кнопки питания
-{
-    powerMosfet=!powerMosfet;
-    if (powerMosfet==1) {
-        tstart = treal = time(NULL);
-        h=m=s=0;
-    }
-    if (powerMosfet==0) {
-
-    }
-    pb=0;
-}
 //------------------------------------------------------------------------------------------------------------
 void dataProcessing(void)                                 // обработка и подготовка данных с аналоговых входов
 {
@@ -1176,14 +1352,18 @@
 // A4  U usb    U = (avgAin4() - a4a) * a4k
 // A5  I usb    I = (avgAin5() - a5a) * a5k
 
-    Ireal = a1k*(in1-a1a);
-    U5 = a0k*(in0-a0a);
-    U30 = a2k*(in2-a2a);
-    temperature = map(in3, 0.232, 0.188 , 0, 90);
-    //Iset = a3k*(in3-a3a);
-    //Uusb = a4k*(in4-a4a);
-    //Iusb = a5k*(in5-a5a);
-    
+    Ireal = a1k*1000*(in1-a1a);
+
+    temperature = map(in3, 0.232, 0.188 , 0, 90); //(in3, 0.232, 0.188 , 0, 90);
+
+    if (rdown_on==1) {
+        U5 = a0k*(in0-a0a)+Ireal*rdown/1000;
+        U30 = a2k*(in2-a2a)+Ireal*rdown/1000;
+    } else {
+        U5 = a0k*(in0-a0a);
+        U30 = a2k*(in2-a2a);
+    }
+
     if (cc==1) ledcc=0;
     if (cc==0) ledcc=1;
 
@@ -1197,6 +1377,22 @@
 //------------------------------------------------------------------------------------------------------------
 void buttonUse(void)                                                               // обработка нажатий кнопок
 {
+    if (beeper==1) {
+
+        if (buttonEnter==0) {
+            buzzer.beep(300,0.01);
+        }
+        if (buttonDown==0) {
+            buzzer.beep(300,0.01);
+        }
+        if (buttonUp==0) {
+            buzzer.beep(300,0.01);
+        }
+    }
+
+
+
+
     int one=0; // для обработки одной кнопки за раз
 //------------------------------------------------------------------
     if (Screen==1 & one==0) {                        //главный экран
@@ -1206,17 +1402,15 @@
             complit=0;
         }
         if (buttonDown==0) {  // Down
-            Screen=6;         // 2
+        if (powerMosfet==0){
+            a1a = in1 - 0.000100f;         // 2
+            Screen=7;
+            iiii=0;
             complit=0;
         }
+        }
         if (buttonUp==0) {    // Up
             powerProtect=!powerProtect;
-            
-            //cc=!cc;                         // для проверки
-            pm=0;                           // С.C и C.V
-            cs=!cs;                         // для проверки
-            csp=0;                          // короткого замыкания
-            
             pp=0;
             wait(0.2);
         }
@@ -1233,19 +1427,19 @@
     }
 //------------------------------------------------------------------
     if (Screen==3 & one==0) {             //экран 3
-    if(nline==7 & pmenu==1){
-        wait(0.2);
-        pmenu=0;
+        if(nline==7 & pmenu==1) {
+            wait(0.2);
+            pmenu=0;
         }
         if (buttonEnter==0 & pmenu==0) {           // Enter
             pmenu=1;
             wait(0.2);
-            if(nline==7){
+            if(nline==7) {
                 mon=mon-1;
                 SetDateTime();
                 mon=mon+1;
             }
-            if(nline==8){
+            if(nline==8) {
                 pmenu=0;
                 Screen=5;
                 complit=0;
@@ -1326,25 +1520,41 @@
 //------------------------------------------------------------------
     if (Screen==4 & one==0) {              //экран меню Калибровка
         if (buttonEnter==0) {             // Enter set!
-        
-            if (kline==1) a0a = in0 - 0.0012f;
-            if (kline==2) a0k = 1.900f/(in0-a0a);           //a0k = umax/(in0-a0a);
-            
-            if (kline==3) a1a = in1 - 0.0004f;        // a1a = avgAin1() - 0.00004 
-            if (kline==4) a1k = 200/(in1 - a1a);      //a1k = 1000/(avgAin1() - a1a) при 1амперах
-            
-            if (kline==5) a2a = in2 - 0.00005f;              // U 30v
-            if (kline==6) a2k = 19.0f/(in2-a2a);            // U30v
-            
-            
-            //if (kline==7) a3a = avgAin3() - 0.0004f;  //3
-            //if (kline==8) a3k = 296/(avgAin3() - a3a); //3 Iset
-            if (kline==9) Screen=5; //4
-            if (kline==10) Screen=5; //4
-            //if (kline==11) a5a = avgAin5() - 0.0004f; 
-            //if (kline==12) a5k = 5000/(avgAin5() - a5a);
-            if (kline==13) Screen=5;// load
-            if (kline==14) Screen=5; // save
+
+            if (kline==1) a0a = in0;
+            if (kline==2) a0k = 1.900f/(in0-a0a);         //a0k = umax/(in0-a0a);
+
+            if (kline==3) a1a = in1 - 0.000100f;         // a1a = avgAin1() - 0.00004
+            if (kline==4) a1k = 0.2f/(in1 - a1a);        //a1k = 1000/(avgAin1() - a1a) при 1амперах
+
+            if (kline==5) a2a = in2;                     // U high v
+            if (kline==6) a2k = 1.900f/(in2-a2a);        // U high v
+
+            if (kline==13) {          // load
+
+                a0a = 0.000679;
+                a0k = 5.006402;
+                a1a = 0.143353;
+                a1k = 3.224676;
+                a2a = 0.000015;
+                a2k = 33.627953;
+            }
+            if (kline==14) {                  // save
+                ledshort=1;  // 1 раз моргнуло - начало записи
+                wait(0.02);
+                ledshort=0;
+                wait(0.05);
+                eeprom.nbyte_write(8, (char*)&a0a, sizeof(a0a));    // a0a float - 4 байта
+                eeprom.nbyte_write(12, (char*)&a0k, sizeof(a0k));    // a0k float - 4 байта
+                eeprom.nbyte_write(16, (char*)&a1a, sizeof(a1a));   // a1a float - 4 байта
+                eeprom.nbyte_write(20, (char*)&a1k, sizeof(a1k));   // a1k float - 4 байта
+                eeprom.nbyte_write(24, (char*)&a2a, sizeof(a2a));   // a2a float - 4 байта
+                eeprom.nbyte_write(28, (char*)&a2k, sizeof(a2k));   // a2k float - 4 байта
+                ledshort=1;  // 2 раз моргнуло - записалось
+                wait(0.02);
+                ledshort=0;
+                wait(0.1);
+            }
             if (kline==15) Screen=5; //exit
             complit=0;
         }
@@ -1363,80 +1573,118 @@
 //------------------------------------------------------------------
     if (Screen==5 & one==0) {                  //экран 5 Настройки главная-------------------------------------------------------
         if (buttonEnter==0 & pmenu==0) {           // Enter
-            
+
             if (mline==1) {
                 Screen=3;
                 complit=0;
             }
-            
+
             if (mline==2) {
                 mline2=1;
                 pmenu=1;
                 one=1;
                 wait(0.2);
             }
-            
-            if (mline==3) Screen=1;
-            
+
+            if (mline==3) {             // sound beeper
+                beeper=!beeper;
+                ledshort=1;
+                wait(0.02);
+                ledshort=0;
+                wait(0.05);
+                eeprom.nbyte_write(44, (char*)&beeper, sizeof(beeper));     // beeper float - 4 байта
+                ledshort=1;
+                wait(0.02);
+                ledshort=0;
+                mline7=1;
+                pmenu=1;
+                one=1;
+                wait(0.2);
+            }
+
             if (mline==4) {             // вентилятор старт
                 mline4=1;
                 pmenu=1;
                 one=1;
                 wait(0.2);
             }
-            
+
             if (mline==5) {             // вентилятор full
                 mline5=1;
                 pmenu=1;
                 one=1;
                 wait(0.2);
             }
-            
+
             if (mline==6) {             // температура отключения нагрузки
                 mline6=1;
                 pmenu=1;
                 one=1;
                 wait(0.2);
             }
-            
+
             if (mline==7) {            // R падение U вкл выкл
                 rdown_on=!rdown_on;
+                ledshort=1;
+                wait(0.02);
+                ledshort=0;
+                wait(0.05);
+                eeprom.nbyte_write(48, (char*)&rdown_on, sizeof(rdown_on));    // rdown_on float - 4 байта
+                ledshort=1;
+                wait(0.02);
+                ledshort=0;
                 mline7=1;
                 pmenu=1;
                 one=1;
                 wait(0.2);
             }
-            
+
             if (mline==8) {            // сопротивление R номинал
                 mline8=1;
                 pmenu=1;
                 one=1;
                 wait(0.2);
             }
-            
+
             if (mline==9) {            // меню калибровки
                 Screen=4;
                 complit=0;
             }
-            
+
             if (mline==10) {          // меню analog in, noise
                 Screen=2;
                 complit=0;
             }
-            
+
             if (mline==11) {             // U максимальная
                 mline11=1;
                 pmenu=1;
                 one=1;
                 wait(0.2);
             }
-            
-            if (mline==12) Screen=1;
-            
-            if (mline==13) Screen=1;
-            
-            if (mline==14) Screen=1;
-            
+
+            if (mline==12) {           // I max
+                mline12=1;
+                pmenu=1;
+                one=1;
+                wait(0.2);
+            }
+
+            if (mline==13) {          // screen saver
+                mline13=1;
+                pmenu=1;
+                one=1;
+                wait(0.2);
+            }
+
+            if (mline==14) {        // загрузить в память настройки по умолчанию и нужно перезагрузиться
+                savedefaulttoflash();
+                mline14=1;
+                pmenu=1;
+                one=1;
+                wait(0.2);
+            }
+
             if (mline==15) {
                 Screen=1;
                 complit=0;
@@ -1456,119 +1704,221 @@
         //---------подменю яркость подсветки
         if (mline2==1) {
             int i=0;
-            if (buttonUp==0 & fanspeed<1) {
-                if(fanspeed >= 0.09f & i==0) {
-                    fanspeed+=0.1f;
-                    fan=fanspeed;
+            if (buttonUp==0 && brightness<1) {
+                if(brightness >= 0.09f && i==0) {
+                    brightness+=0.1f;
+                    pinbrightness=brightness;
                     i=1;
                 }
-                if(fanspeed < 0.09f & i==0) {
-                    fanspeed+=0.01f;
-                    fan=fanspeed;
+                if(brightness < 0.09f && i==0) {
+                    brightness+=0.01f;
+                    pinbrightness=brightness;
                     i=1;
                 }
 
             }
 
-            if (buttonDown==0 & fanspeed>0.01f) {
-                if(fanspeed <= 0.1f & i==0) {
-                    fanspeed-=0.01f;
-                    fan=fanspeed;
+            if (buttonDown==0 && brightness>0.01f) {
+                if(brightness <= 0.1f && i==0) {
+                    brightness-=0.01f;
+                    pinbrightness=brightness;
                     i=1;
                 }
-                if(fanspeed > 0.1f & i==0) {
-                    fanspeed-=0.1f;
-                    fan=fanspeed;
+                if(brightness > 0.1f && i==0) {
+                    brightness-=0.1f;
+                    pinbrightness=brightness;
                     i=1;
                 }
             }
 
             if (buttonEnter==0) {
+                ledshort=1;
+                wait(0.02);
+                ledshort=0;
+                wait(0.05);
+                eeprom.nbyte_write(40, (char*)&brightness, sizeof(brightness)); // brightness float - 4 байта
+                ledshort=1;
+                wait(0.02);
+                ledshort=0;
                 mline2=0;
                 pmenu=0;
             }
         }
-        //------------------------------------ tempstart 
+        //------------------------------------ tempstart
         if (mline4==1) {
-            if (buttonUp==0){
+            if (buttonUp==0) {
                 tempstart++;
                 wait(0.1);
             }
-            if (buttonDown==0){
+            if (buttonDown==0) {
                 tempstart--;
                 wait(0.1);
             }
             if (buttonEnter==0) {
+                ledshort=1;
+                wait(0.02);
+                ledshort=0;
+                wait(0.05);
+                eeprom.nbyte_write(56, (char*)&tempstart, sizeof(tempstart));   // tempstart float - 4 байта
+                ledshort=1;
+                wait(0.02);
+                ledshort=0;
                 mline4=0;
                 pmenu=0;
             }
         }
         //------------------------------------ tempfull
         if (mline5==1) {
-            if (buttonUp==0){
+            if (buttonUp==0) {
                 tempfull++;
                 wait(0.1);
             }
-            if (buttonDown==0){
+            if (buttonDown==0) {
                 tempfull--;
                 wait(0.1);
             }
             if (buttonEnter==0) {
+                ledshort=1;
+                wait(0.02);
+                ledshort=0;
+                wait(0.05);
+                eeprom.nbyte_write(60, (char*)&tempfull, sizeof(tempfull));    // tempfull float - 4 байта
+                ledshort=1;
+                wait(0.02);
+                ledshort=0;
                 mline5=0;
                 pmenu=0;
             }
         }
         //------------------------------------ tempcutoff
         if (mline6==1) {
-            if (buttonUp==0){
+            if (buttonUp==0) {
                 tempcutoff++;
                 wait(0.1);
             }
-            if (buttonDown==0){
+            if (buttonDown==0) {
                 tempcutoff--;
                 wait(0.1);
             }
             if (buttonEnter==0) {
+                ledshort=1;
+                wait(0.02);
+                ledshort=0;
+                wait(0.05);
+                eeprom.nbyte_write(64, (char*)&tempcutoff, sizeof(tempcutoff));  // tempcutoff float - 4 байта
+                ledshort=1;
+                wait(0.02);
+                ledshort=0;
                 mline6=0;
                 pmenu=0;
             }
         }
         //------------------------------------ падение на R вкл выкл
         if (mline7==1 & one==0) {
-                wait(0.1);
-                mline7=0;
-                pmenu=0;
+            wait(0.1);
+            mline7=0;
+            pmenu=0;
         }
         //------------------------------------ сопротивление резистора
         if (mline8==1) {
-            if (buttonUp==0){
+            if (buttonUp==0) {
                 rdown=rdown+0.001f;
                 wait(0.1);
             }
-            if (buttonDown==0){
+            if (buttonDown==0) {
                 rdown=rdown-0.001f;
                 wait(0.1);
             }
             if (buttonEnter==0) {
+                ledshort=1;
+                wait(0.02);
+                ledshort=0;
+                wait(0.05);
+                eeprom.nbyte_write(36, (char*)&rdown, sizeof(rdown));           // rdown float - 4 байта
+                ledshort=1;
+                wait(0.02);
+                ledshort=0;
                 mline8=0;
                 pmenu=0;
             }
         }
         //------------------------------------ U max
         if (mline11==1) {
-            if (buttonUp==0){
+            if (buttonUp==0) {
                 umax++;
                 wait(0.1);
             }
-            if (buttonDown==0){
+            if (buttonDown==0) {
                 umax--;
                 wait(0.1);
             }
             if (buttonEnter==0) {
+                ledshort=1;
+                wait(0.02);
+                ledshort=0;
+                wait(0.05);
+                eeprom.nbyte_write(52, (char*)&umax, sizeof(umax));        // umax float - 4 байта
+                ledshort=1;
+                wait(0.02);
+                ledshort=0;
                 mline11=0;
                 pmenu=0;
             }
         }
+        //------------------------------------ I max
+        if (mline12==1) {
+            if (buttonUp==0) {
+                imax=imax+0.1f;
+                wait(0.05);
+            }
+            if (buttonDown==0) {
+                imax=imax-0.1f;
+                wait(0.05);
+            }
+            if (buttonEnter==0) {
+                ledshort=1;
+                wait(0.02);
+                ledshort=0;
+                wait(0.05);
+                eeprom.nbyte_write(32, (char*)&imax, sizeof(imax));             // imax float - 4 байта
+                ledshort=1;
+                wait(0.02);
+                ledshort=0;
+                mline12=0;
+                pmenu=0;
+            }
+        }
+        //------------------------------------ screensaver
+        if (mline13==1) {
+            if (buttonUp==0) {
+                screensaver++;
+                if (screensaver==4) screensaver=0;
+                wait(0.1);
+            }
+            if (buttonDown==0) {
+                screensaver--;
+                if (screensaver==-1) screensaver=3;
+                wait(0.1);
+            }
+            if (buttonEnter==0) {
+                ledshort=1;
+                wait(0.02);
+                ledshort=0;
+                wait(0.05);
+                eeprom.nbyte_write(68, (char*)&screensaver, sizeof(screensaver));  // screensaver float - 1 байт
+                ledshort=1;
+                wait(0.02);
+                ledshort=0;
+                mline13=0;
+                pmenu=0;
+            }
+        }
+        //------------------------------------
+        if (mline14==1 & one==0) {
+            wait(0.1);
+            mline14=0;
+            pmenu=0;
+        }
         //------------------------------------
         one=1;
         //------------------------------------
@@ -1577,8 +1927,8 @@
 //------------------------------------------------------------------
     if (Screen==6 & one==0) {                  //экран 6
         if (buttonEnter==0) {  // Enter
-                Screen=1;
-                complit=0;
+            Screen=1;
+            complit=0;
         }
 
         if (buttonUp==0) {     // Up
@@ -1592,12 +1942,16 @@
 //------------------------------------------------------------------
     if (Screen==7 & one==0) {                  //экран 7
         if (buttonEnter==0) {  // Enter
+        
         }
 
         if (buttonUp==0) {     // Up
+        
         }
 
         if (buttonDown==0) {   // Down
+            Screen=1;
+            complit=0;
         }
         one=1;
 
@@ -1655,40 +2009,147 @@
     time_t epoch = mktime(&Clock);
     set_time(epoch);
 }
-//------------------------------------------------------------------------------------------------------------
-
-
+//------------------------------------------------------------------------------------------------------------*/
+void powerButton(void)                                                           // при нажатии кнопки питания
+{
+    if (onepower==0) {
+        timerforpoweriddle.attach(&keypoweriddle, 0.5);
 
-
+        if (saveractive==0) {
+            powerMosfet=!powerMosfet;
+            iddletimesaver.detach();
+            onesaver=0;
+            saveractive=0;
+        } else {
+            iddletimesaver.detach();
+            onesaver=0;
+            saveractive=0;
+        }
 
-
-
+        if (beeper==1) {
+            buzzer.beep(1600,0.05);
+        }
+        onepower=1;
+        pb=0;
 
-
-
-
-
+    }
+    if (powerMosfet==1) {
+        tstart = treal = time(NULL);
+        h=m=s=0;
+    }
+}
+//------------------------------------------------------------------------------------------------------------
+void fans(void)
+{
+    if (temperature < (tempstart-2)) {
+        fst=0;
+        fst2=0;
+        fan = 0.0f;
+    }
 
-
+    if (temperature >= tempstart && fst == 0) {
+        fan = 1.0f;
+        timerforfanstart.attach(&fanstart, 2.0);
+        fst=1;
+    }
 
+    if (fst2==1) {
+        fanspeed = map (temperature, tempstart, tempfull, 0.4, 1);
+        fan = fanspeed;
+    }
 
-
+    if (temperature >= tempcutoff) {
+        powerMosfet=0;
+        pb=0;
+    }
 
-
-
-
+}
+//------------------------------------------------------------------------------------------------------------
+void fanstart(void)
+{
+    fst2=1;
+}
+//------------------------------------------------------------------------------------------------------------
+void keypoweriddle(void)
+{
+    onepower=0;
+}
+//------------------------------------------------------------------------------------------------------------
+void Protect(void)
+{
+    // powerProtect==0  pp==0   защита от кз
+    // cs==0            csp==0  прорисовка короткого замыкания
+    if (U5<0.9f && cc==0) {
+        shortline=1;
+    } else {
+        shortline=0;
+    }
+    if (shm==!shortline) {
+        shl=0;
+    }
 
-
+    if (shortline==1 && shl==0) {
+        cs=1;
+        csp=0;
+        shl=1;
+        shm=shortline;
+        ledshort=1;
+    }
 
-
-
+    if (shortline==0 && shl==0) {
+        cs=0;
+        csp=0;
+        shl=1;
+        shm=shortline;
+        ledshort=0;
+    }
 
-
-
-
-
-
-
-
-
-
+    if (powerProtect==1) {
+        if (U5<0.9f && cc==0) {
+            powerMosfet=0;
+            pb=0;
+            if (beeper==1) {
+                buzzer.beep(480,0.3);
+            }
+        }
+    }
+}
+//------------------------------------------------------------------------------------------------------------
+void ScreenSaver(void)
+{
+    if (screensaver != 0) {
+        if (buttonEnter==0) {
+            iddletimesaver.detach();
+            onesaver=0;
+            saveractive=0;
+        }
+        if (buttonDown==0) {
+            iddletimesaver.detach();
+            onesaver=0;
+            saveractive=0;
+        }
+        if (buttonUp==0) {
+            iddletimesaver.detach();
+            onesaver=0;
+            saveractive=0;
+        }
+    }
+    if (Screen==8 && saveractive==0) {
+        Screen=1;
+        complit=0;
+    }
+    if (Screen == 1 && onesaver==0) {
+        if (powerMosfet == 0 && screensaver != 0) {
+            iddletimesaver.attach(&screensaverstart, 10.0);
+            onesaver=1;
+        }
+    }
+}
+//------------------------------------------------------------------------------------------------------------
+void screensaverstart(void)
+{
+    saveractive=1;
+    Screen=8;
+    complit=0;
+}
+//------------------------------------------------------------------------------------------------------------
\ No newline at end of file