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:
3:791cf9a867d1
Parent:
2:d20b1ef35d3f
Child:
4:776f59129c24
--- a/main.cpp	Sat Nov 01 18:20:43 2014 +0000
+++ b/main.cpp	Sat Nov 22 18:51:39 2014 +0000
@@ -1,9 +1,10 @@
 #include "mbed.h"
 #include "SPI_TFT_ILI9341.h"
-#include "Consolas26x49.h"
+//----------------------------------
 #include "digi36x44.h"
+#include "Consolas26x49.h"
+#include "Consolas19x35.h"
 #include "Courier8x13.h"
-#include "Consolas19x35.h"
 #include "CourierNew13x23.h"
 #include "Lucida13x21.h"
 //----------------------------------
@@ -23,11 +24,17 @@
 #define text2 0x0000
 #define back2 0x9E7F
 //----------------------------------
+#define colorline 0xECA7            // цвет рамок    0xECA7 - песочный    0x018C - темносиний    0xFFE0 - желтый
+#define color_text_on Green         // ON текст
+#define color_back_on 0x0339        // ON фон
+#define color_scale1 0x3320           // шкала U
+#define color_scale2 0x9A60           // шкала I
+//----------------------------------
 SPI_TFT_ILI9341 TFT(D11, D12, D13, D8, D9, D10,"TFT"); // mosi, miso, sclk, cs, reset, dc
 void grid(void);
 Timer fps;// FPS
 //Ticker valueUI;
-InterruptIn button(USER_BUTTON); // кнопка питания вкл\выкл
+InterruptIn button(A4); // кнопка питания вкл\выкл
 //----------------------------------------------------------------------------------------------------------- Ввести в меню опцию коррекции падения напряжения на токоизмерительном шунте.
 int t;        // секунд с момента включения
 int tstart;   // при включении нагрузки равна реальному времени
@@ -55,82 +62,105 @@
 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;       // по умолчанию без падения напряжения на резисторе шунта
+char *ron = "On ";     // для вывода в меню главных настроек On
+char *roff = "Off";    // для вывода в меню главных настроек Off
 //---------------------------
 float avgAin0();                    // среднее значение с входа A0
 float avgAin1();                    // среднее значение с входа A1
 float avgAin2();                    // среднее значение с входа A2
 float avgAin3();                    // среднее значение с входа A3
-float avgAin4();                    // среднее значение с входа A4
-float avgAin5();                    // среднее значение с входа A5
+//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 in4 = 0;
+//float in5 = 0;
 //----
-float Ureal = 0;
+float U5 = 0;
 float Ireal = 0;
-float Uset = 0;
-float Iset = 0;
-float Uusb = 0;
-float Iusb = 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.000677;      // A0 - U бп - avg при 0 - нижняя точка
-float a0k = 33.61;        // A0 - U бп - коэффициент - верхняя точка
+float a0a = 0.0012;      // A0 - U 5 - avg при 0 - нижняя точка          U  5 вольт
+float a0k = 5.0079;        // A0 - U 5 - коэффициент - верхняя точка
 //---------------------------------------------------------------
-float a1a = 0.0024;   // A1 - I бп - avg при 0   - нижняя  точка    a1a = avgAin1() - 0.00004
-int a1k = 3144;       // A1 - I бп - коэффициент - верхняя точка    a1k = 2000/(avgAin1() - a1a) при 2амперах
+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.0024;   // A2 - U уст - avg при 0   - нижняя  точка
-float a2k = 4;          // A2 - U уст - коэффициент - верхняя точка
+float a2a = 0.00005;   // A2 - U 30 - avg при 0   - нижняя  точка         U  33 вольта
+float a2k = 32.94623;          // A2 - U 30 - коэффициент - верхняя точка
 //---------------------------------------------------------------
-float a3a = 0.0024;   // A3 - I уст - avg при 0   - нижняя  точка
-float a3k = 4;          // A3 - I уст - коэффициент - верхняя точка
+//float a3a = 0.0037;   // A3 - I уст - avg при 0   - нижняя  точка
+//float a3k = 1839.1;          // A3 - I уст - коэффициент - верхняя точка
 //---------------------------------------------------------------
-float a4a = 0.0024;      // A4 - U usb - avg при 0 - нижняя точка
-float a4k = 2.0;          // A4 - U usb - коэффициент - верхняя точка
+//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 a5a = 0.0024;   // A5 - I usb - avg при 0   - нижняя  точка
+//int a5k = 3144;       // A5 - I usb - коэффициент - верхняя точка
 //---------------------------------------------------------------
 float noisea0; //типа уровень шума (разница между минимум и максимум за 100 измерений) для А0
 float noisea1; // - - для A1
 float noisea2; // - - для A2
 float noisea3; // - - для A3
-float noisea4; // - - для A4
-float noisea5; // - - для A5
+//float noisea4; // - - для A4
+//float noisea5; // - - для A5
 //-----------------------------------------------------------------------------------------------------------
 DigitalIn buttonUp(D3);     // Up
-DigitalIn buttonDown(D4);   // Down
-DigitalIn buttonEnter(D5);  // Enter
+DigitalIn buttonDown(D2);   // Down
+DigitalIn buttonEnter(A5);  // Enter
 int Screen=1;               // по умолчанию грузим первое меню
 int complit=0;              // в начале меню не прорисовано
 int pb=0;                   // для прорисовки кнопки
 int kline=15;                // номер начальной строки в меню калибровки экран 4
 int mline=15;                // номер начальной строки в меню Настройки главная экран 5
 int mline2=0;               //в главном меню строка 2 не выбрана
+int mline4=0;               //                      4
+int mline5=0;               //                      5
+int mline6=0;               //                      6
+int mline7=0;               //                      7
+int mline8=0;               //                      8
+int mline11=0;               //                     11
 int nline=8;               // номер начальной строки в меню установки времени экран 3
 int pmenu=0;                //в главном меню изменение выбраной строки не действительно
 int powerProtect=1; //защита от кз
 int pp=0;           //защита от кз для прорисовки меню
-float brightness = 1.0f; //яркость экрана
-int cc=0;               // значит идет C.V
+//int cc=0;               // значит идет C.V
 int pm=0;               // для одной прорисовки сс и сv
-PwmOut pinbrightness(D15);    // выход на ключ регулировки яркости экрана
+int cs=0;               // короткое замыкание
+int csp=0;              // для одной прорисовки короткого замыкания
+float brightness = 1.0f; //яркость экрана
+PwmOut pinbrightness(D6);    // выход на ключ регулировки яркости экрана
+float fanspeed = 0.0f;
+PwmOut fan(D7);              // выход вентилятора
+int temperature = 25;        // текущая температура
 //-----------------------------------------------------------------------------------------------------------
-DigitalOut powerMosfet(D2);         // выход управления нагрузкой
+DigitalOut powerMosfet(D4);         // выход управления нагрузкой
+DigitalIn cc(D14); //вход СС    0 - СС, 1 - CV
+int ccc=0;
+DigitalOut ledcc(PC_6);       // светодиод C.C
+DigitalOut ledshort(PC_8);   // светодиод КЗ
 AnalogIn  ainA0(A0);
 AnalogIn  ainA1(A1);
 AnalogIn  ainA2(A2);
 AnalogIn  ainA3(A3);
-AnalogIn  ainA4(A4);
-AnalogIn  ainA5(A5);
+//AnalogIn  ainA4(A4);
+//AnalogIn  ainA5(A5);
 //BusOut    unused(A5,A2,A3,A4);
 //------------------------------------------------------------------------------------------------------------
 //--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@@ -138,15 +168,19 @@
 void bootCold(void)
 {
     powerMosfet = 0;                    // при включении выход выключен
+    ledcc=0;
+    ledshort=0;
     TFT.claim(stdout);      // send stdout to the TFT display
     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 герц
+    fan.period(0.01);
     TFT.set_orientation(3);
     TFT.background(Black);
     TFT.cls();
     wait(0.2);
     pinbrightness = brightness;          // включаем подсветку
+    fan = fanspeed; // устанавливаем скорость
 
 }
 //------------------------------------------------------------------------------------------------------------
@@ -176,63 +210,79 @@
 void drawScreen1(void)                                                                              // экран 1
 {
     if (complit==0) {
+        pm=0;
+        ccc=0;
         pb=0;
         pp=0;
         TFT.set_orientation(3);
         TFT.background(Black);
         TFT.cls();
-        TFT.rect(0,0,319,239,0xECA7);     //рамка
-        TFT.rect(10,62,309,76,0xECA7);    //аналоговая 1
-        TFT.rect(10,137,309,151,0xECA7);  //авалоговая 2
+        TFT.rect(0,0,319,239,colorline);     //рамка
+        TFT.rect(10,62,309,76,colorline);    //аналоговая рамка 1
+        TFT.rect(10,137,309,151,colorline);  //авалоговая рамка 2
         //grid();
         //int y = 51;
         //TFT.line(5,y,310,y, White);
         TFT.background(Black);
-        TFT.foreground(0xECA7);           // цвет слов
-        TFT.set_font((unsigned char*) Consolas26x49);
+        TFT.foreground(colorline);                         // цвет слов
+        TFT.set_font((unsigned char*) Consolas26x49); 
         TFT.locate(193, 13);
-        TFT.printf("v");          // U=
-        TFT.locate(165, 88);
-        TFT.printf("ma");         // I=
+        TFT.printf("v");                                // V
+        TFT.locate(165, 88);     
+        TFT.printf("ma");                               // mA
         complit = 1;  // прорисовали!
 
-        TFT.fillrect(11,161,104,183,0x09E1); // подвал левый квадрат верхний заливка
+        TFT.fillrect(7,161,104,183,0x2104); // подвал левый квадрат верхний заливка
+        TFT.fillrect(7,185,104,207,0x2104); //                      средний
+        TFT.fillrect(7,207,104,231,0x2104); //                      нижний
 
-        TFT.rect(10,160,105,232,0xECA7);       // левый
-        TFT.line(11,184,104,184,0xECA7);      // левый разделительная линия вверхняя
-        TFT.line(11,208,104,208,0xECA7);      // левый разделительная линия нижняя
-        TFT.rect(112,160,207,232,0xECA7);      //средний рамка и линия
-        TFT.line(113,195,206,195,0xECA7);
-        TFT.rect(214,160,309,232,0xECA7);      //правый рамка
-
-        TFT.background(0x09E1);
-        TFT.foreground(White);
-        TFT.set_font((unsigned char*) Lucida13x21);
-
-
-        TFT.locate(11, 209);
-        TFT.printf("  42 'C ");
+        TFT.rect(6,160,105,232,colorline);       // левый квадрат
+        TFT.line(7,184,104,184,colorline);      // левый разделительная линия вверхняя
+        TFT.line(7,208,104,208,colorline);      //                            нижняя
+        TFT.rect(112,160,207,192,colorline);      //средний квадрат верх
+        TFT.rect(112,198,207,232,colorline);      //                низ
+        TFT.rect(214,160,313,232,colorline);      //правый квадрат
 
     }
 //-----------------------------------------------------------------------------
-    if (powerProtect==0 & pp==0) {                 // защита от кз
-        TFT.fillrect(113,161,206,194,0x4208);
-        TFT.background(0x4208);
-        TFT.foreground(0xA514);
+    if (powerProtect==0 & pp==0) {                                        // защита от кз
+        TFT.fillrect(113,161,206,191,Black);         //0
+        TFT.background(Black);
+        TFT.foreground(0x4208);
         TFT.set_font((unsigned char*) Lucida13x21);
-        TFT.locate(113, 168);
+        TFT.locate(115, 165);
+        TFT.printf("Protect");
+        pp=1;
+    }
+    if (powerProtect==1 & pp==0) {                     //1
+        TFT.fillrect(113,161,206,191,0x0180);
+        TFT.background(0x0180);
+        TFT.foreground(Green);
+        TFT.set_font((unsigned char*) Lucida13x21);
+        TFT.locate(115, 165);
         TFT.printf("Protect");
         pp=1;
     }
-    if (powerProtect==1 & pp==0) {
-        TFT.fillrect(113,161,206,194,0x0180);
-        TFT.background(0x0180);
-        TFT.foreground(Green);
+    
+    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);
         TFT.set_font((unsigned char*) Lucida13x21);
-        TFT.locate(113, 168);
-        TFT.printf("Protect");
-        pp=1;
-    }
+        TFT.locate(130, 205);
+        TFT.printf("SHORT");
+        csp=1;
+        }
+    if (cs==1 & csp==0){                                     //1
+        TFT.fillrect(113,199,206,231,0x6000);
+        TFT.background(0x6000);
+        TFT.foreground(Red);
+        TFT.set_font((unsigned char*) Lucida13x21);
+        TFT.locate(130, 205);
+        TFT.printf("SHORT");
+        csp=1;
+        }
+    
 
 
     fps.reset();
@@ -240,7 +290,7 @@
     
     TFT.background(Black);
     
-    if (cc==1){                 //если C.C то меняем цвет значения напряжения
+    if (cc==0){                                             //если C.C то меняем цвет значения напряжения
         TFT.foreground(Red);
     }else{
         TFT.foreground(Green);
@@ -248,14 +298,14 @@
     
     TFT.set_font((unsigned char*) digi36x44);
     TFT.locate(10, 10);
-    if(Ureal<0) Ureal=0;
-    if (Ureal<9.995f){
-        TFT.fillrect(10,10,46,54,Black);
-        TFT.locate(46, 10);
-        TFT.printf("%4.2f", Ureal); // выводим значение с A0 (напряжение)
+    if(U5<0) U5=0;
+    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("%5.2f", Ureal); // выводим значение с A0 (напряжение)
+          TFT.printf("%05.2f", U30);                         // выводим значение с A0 (напряжение)
     }
     
     TFT.pixel(82, 53, Black);
@@ -263,60 +313,93 @@
     
     TFT.locate(10, 85);
     TFT.foreground(Green);
-    TFT.printf("%04.0f", Ireal); // выводим значение с A1 (ток)
+    TFT.printf("%04.0f", Ireal);                                   // выводим значение с A1 (ток)
 
 
-    TFT.background(0x2104);                      // выводим мощность
+    TFT.background(0x2104);                                         // выводим мощность W
     TFT.foreground(0xE71C);//текст
     TFT.set_font((unsigned char*) Lucida13x21);
     TFT.locate(11, 162);
-    TFT.printf("%05.2f W", Ureal*Ireal/1000);
+    TFT.printf("%05.2f W", U5*Ireal/1000);
 
-    TFT.background(0x2104);                      // выводим время включеной нагрузки t.read()
+    TFT.background(0x2104);                                       // выводим время включеной нагрузки 
     TFT.foreground(0xE71C);//текст
     TFT.set_font((unsigned char*) Lucida13x21);
-    TFT.locate(11, 185);
+    TFT.locate(7, 187);
     timeConvert();
     TFT.printf("%02d:%02d:%02d", h, m, s);
 
 
 
-    if (powerMosfet==0 & pb==0) {   // выводим OFF
-        TFT.background(0x4208);
+    if (powerMosfet==0 & pb==0) {                                       // выводим OFF
+        TFT.background(Black);
         TFT.foreground(0xA514);
-        TFT.fillrect(215,161,308,231,0x4208);
+        TFT.fillrect(215,161,312,231,Black);
         TFT.set_font((unsigned char*) Consolas26x49);
-        TFT.locate(226, 174);
+        TFT.locate(227, 174);
         TFT.printf("OFF");
         pb=1;
     }
-    if (powerMosfet==1 & pb==0) {   // выводим ON
-        TFT.background(0x0339);
-        TFT.foreground(Green);
-        TFT.fillrect(215,161,308,231,0x0339);//0x0339 0x0180
+    if (powerMosfet==1 & pb==0) {                                      // выводим ON
+        TFT.background(color_back_on);
+        TFT.foreground(color_text_on);
+        TFT.fillrect(215,161,312,231,color_back_on);
         TFT.set_font((unsigned char*) Consolas26x49);
-        TFT.locate(237, 174);
+        TFT.locate(238, 174);
         TFT.printf("ON");
         pb=1;
     }
     
-    int xscale1 = map(Ureal, 0, 25, 0, 298);
+    int xscale1 = map(U5, 0, 32, 0, 298);
     if (xscale1>297) xscale1=298;
-    TFT.fillrect(11, 63, (xscale1+10), 75, 0x3320);  //0x04C9                            // аналоговая шкала Напряжение 
+    TFT.fillrect(11, 63, (xscale1+10), 75, color_scale1);  //0x04C9                          // аналоговая шкала Напряжение 
     TFT.fillrect((xscale1+12), 63, 308, 75, Black);
-    int xscale2 = map(Ireal, 0, 2200, 0, 298);
+    int xscale2 = map(Ireal, 0, 2600, 0, 298);
     if (xscale2>297) xscale2=298;
-    TFT.fillrect(11, 138, (xscale2+10), 150, 0x9A60);  //0x9A60                            // аналоговая шкала Ток
-    TFT.fillrect((xscale2+12), 138, 308, 150, Black);
+    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;
+    //TFT.fillrect(11+zxc,138, 13+zxc, 150, Red);                                // шкала I set
 
     fps.stop();
-    TFT.set_font((unsigned char*) Courier8x13);  // FPS
-    TFT.locate(140,205);
+    TFT.set_font((unsigned char*) Courier8x13);                                   // FPS
+    TFT.locate(169,81);
     printf("%0.2f", (1/fps.read()));
     
-    if(cc==1 & pm==0){                                    // c.c
+    TFT.background(0x2104);
+    TFT.foreground(White);
+    TFT.set_font((unsigned char*) Lucida13x21);        //выводим t
+    TFT.locate(11, 211);                               
+    TFT.printf("  %d 'C ", temperature);
+    
+    /*
+    if (dinCC==1 & cc_one==1){
+        cc=1;
+        pm=0;
+        cc_one=0;
+        }
+    if (dinCC==0 & cc_one==0){
+        cc=0;
+        pm=0;
+        cc_one=1;
+        }
+        */
+    if(cc==1 & ccc==1){   // защелка для отображения сс сv
+        pm=0;
+        ccc=0;
+        }
+    if(cc==0 & ccc==0){
+        pm=0;
+        ccc=1;
+        }
+    
+    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);
         TFT.background(0x6000);
         TFT.foreground(Red);
         TFT.set_font((unsigned char*) Consolas19x35);
@@ -324,9 +407,10 @@
         TFT.printf("C.C");
         pm=1;
     }
-    if(cc==0 & 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.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);
@@ -352,23 +436,23 @@
     TFT.set_font((unsigned char*) Courier8x13);
     TFT.locate(0, 0);
     printf("--------- Data Analog In --------- \n");
-    printf("U.real A0 noise= %0.2f, avg= %0.5f \n", noisea0, in0);
-    printf("U= %06.4f coeff. k=%0.4f, a=%0.6f \n", Ureal, a0k, a0a);    // A0  U real
+    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.0d, a=%0.4f \n", Ireal, a1k, a1a);    // A1  I real
+    printf("I= %06.2f coeff. k=%0.5f, a=%0.6f \n", Ireal, a1k, a1a);    // A1  I real
     printf("---------------------------------- \n");
-    printf("U.set A2 noise= %0.2f, avg= %0.5f \n", noisea2, in2);
-    printf("U= %06.3f coeff. k=%0.0f, a=%0.4f \n", Uset, a2k, a2a);     // A2  U set
+    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("---------------------------------- \n");
-    printf("I.set 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("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
 }
 //------------------------------------------------------------------------------------------------------------
 void drawScreen3(void)                                                                              // экран 3 установка часов
@@ -559,7 +643,7 @@
         TFT.background(back4);
         TFT.foreground(text4);
     }
-    printf(" U real = %06.3f set zero   \n", Ureal);                // U real A0 zero
+    printf(" U 5v = %06.3f set zero   \n", U5);                // U real A0 zero
     //----------------------------------------------------------------
     if (kline==2) {
         TFT.background(back4_i);
@@ -568,7 +652,7 @@
         TFT.background(back4);
         TFT.foreground(text4);
     }
-    printf(" U real = %06.3f set up dot \n", Ureal);               // U real A0 hi
+    printf(" U 5v = %06.3f set up dot \n", U5);               // U real A0 hi
     //----------------------------------------------------------------
     if (kline==3) {
         TFT.background(back4_i);
@@ -577,7 +661,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);
@@ -595,7 +679,7 @@
         TFT.background(back4);
         TFT.foreground(text4);
     }
-    printf(" U set =  %06.3f set zero   \n", Uset);                    // U set  A2 zero
+    printf(" U 30v =  %06.3f set zero   \n", U30);                    // U set  A2 zero
     //----------------------------------------------------------------
     if (kline==6) {
         TFT.background(back4_i);
@@ -604,7 +688,7 @@
         TFT.background(back4);
         TFT.foreground(text4);
     }
-    printf(" U set =  %06.3f set up dot \n", Uset);                   // U set  A2 hi
+    printf(" U 30v =  %06.3f set up dot \n", U30);                   // U set  A2 hi
     //----------------------------------------------------------------
     if (kline==7) {
         TFT.background(back4_i);
@@ -613,7 +697,7 @@
         TFT.background(back4);
         TFT.foreground(text4);
     }
-    printf(" I set =  %06.1f set zero   \n", Iset);                 // I set  A3 zero
+    printf("---\n");                 // I set  A3 zero
     //----------------------------------------------------------------
     if (kline==8) {
         TFT.background(back4_i);
@@ -622,7 +706,7 @@
         TFT.background(back4);
         TFT.foreground(text4);
     }
-    printf(" I set =  %06.1f set up dot \n",Iset);                  // I set  A3 hi
+    printf("---\n");                  // I set  A3 hi
     //----------------------------------------------------------------
     if (kline==9) {
         TFT.background(back4_i);
@@ -631,7 +715,7 @@
         TFT.background(back4);
         TFT.foreground(text4);
     }
-    printf(" U usb =  %06.3f set up dot \n", Uusb);                  // U usb A4 zero
+    printf("---\n");                  // U usb A4 zero
     //----------------------------------------------------------------
     if (kline==10) {
         TFT.background(back4_i);
@@ -640,7 +724,7 @@
         TFT.background(back4);
         TFT.foreground(text4);
     }
-    printf(" U usb =  %06.3f set zero   \n", Uusb);                  // U usb A4 hi
+    printf("---\n");                  // U usb A4 hi
     //----------------------------------------------------------------
     if (kline==11) {
         TFT.background(back4_i);
@@ -649,7 +733,7 @@
         TFT.background(back4);
         TFT.foreground(text4);
     }
-    printf(" I usb =  %06.1f set up dot \n", Iusb);                  // I usb A5 zero
+    printf("---\n");                  // I usb A5 zero
     //----------------------------------------------------------------
     if (kline==12) {
         TFT.background(back4_i);
@@ -658,7 +742,7 @@
         TFT.background(back4);
         TFT.foreground(text4);
     }
-    printf(" I usb =  %06.1f set up dot \n", Iusb);                 // I usb A5 hi
+    printf("---\n");                 // I usb A5 hi
     //----------------------------------------------------------------
     if (kline==13) {
         TFT.background(back4_i);
@@ -708,8 +792,8 @@
     TFT.foreground(text5);
     TFT.locate(0, 0);
     TFT.set_font((unsigned char*) Courier8x13);
-    printf("          Settings          \n");
-    printf("--------------------------- \n");
+    printf("                 Settings               \n");
+    printf("--------------------------------------- \n");
     //----------------------------------------------------------------
     if (mline==1) {
         TFT.background(back5_i);
@@ -718,7 +802,7 @@
         TFT.background(back5);
         TFT.foreground(text5);
     }
-    printf(" Set Time                     \n");                // 1
+    printf(" Set Time                                   \n");                // 1
     //----------------------------------------------------------------
     if (mline==2) {
         if (pmenu==1) {
@@ -732,7 +816,7 @@
         TFT.background(back5);
         TFT.foreground(text5);
     }
-    printf(" Backlight brightness = %03.0f \n", brightness*100);                // 1
+    printf(" Backlight brightness =              %03.0f \n", fanspeed*100);                // 1
     //------------------------------------*---------------------------
     if (mline==3) {
         TFT.background(back5_i);
@@ -741,52 +825,81 @@
         TFT.background(back5);
         TFT.foreground(text5);
     }
-    printf(" Sound beep                   \n");                // 1
+    printf(" Sound beep                                \n");                // 1
     //------------------------------------*---------------------------
     if (mline==4) {
-        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(" Fan start - t                      %02.0f 'c \n", tempstart);                // 1 tempstart
     //------------------------------------*---------------------------
     if (mline==5) {
-        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(" Fan start - t 'c            \n");                // 1
+    printf(" Fan full speed - t                 %02.0f 'c \n", tempfull);                // 1 tempfull
     //------------------------------------*---------------------------
     if (mline==6) {
-        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(" Fan full speed - t 'c      \n");                // 1
+    printf(" Power cut off - t                  %02.0f 'c \n", tempcutoff);                // 1 tempcutoff
     //------------------------------------*---------------------------
     if (mline==7) {
-        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(" Voltmeter adjustment on R \n");                // 1
+    if (rdown_on==1){
+        printf(" Voltmeter adjustment on R           %s \n", ron);           // падение на R вкл выкл
+    } else {
+        printf(" Voltmeter adjustment on R           %s \n", roff);
+    }
     //------------------------------------*---------------------------
     if (mline==8) {
-        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(" Current sense shunt, R om  \n");                // 1
+    printf(" Current sense shunt,        R = %05.3f om\n", rdown);                // значения сопротивления шунта
     //------- -----------------------------*---------------------------
     if (mline==9) {
         TFT.background(back5_i);
@@ -795,7 +908,7 @@
         TFT.background(back5);
         TFT.foreground(text5);
     }
-    printf(" Calibration I, U           \n");                // 1
+    printf(" Calibration I, U                          \n");                // 1
     //------------------------------------*---------------------------
     if (mline==10) {
         TFT.background(back5_i);
@@ -804,16 +917,21 @@
         TFT.background(back5);
         TFT.foreground(text5);
     }
-    printf(" Data analog in, noise      \n");                // 1
+    printf(" Data analog in, noise                    \n");                // 1
     //------------------------------------*---------------------------
     if (mline==11) {
-        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(" U max                      \n");                // 1
+    printf(" U max & U up dot calibration =      %02.0d v\n", umax);                // U max and U calibration
     //------------------------------------*---------------------------
     if (mline==12) {
         TFT.background(back5_i);
@@ -822,7 +940,7 @@
         TFT.background(back5);
         TFT.foreground(text5);
     }
-    printf(" 1                          \n");                // 1
+    printf(" Screen saver                              \n");                // 1
     //------------------------------------*---------------------------
     if (mline==13) {
         TFT.background(back5_i);
@@ -831,7 +949,7 @@
         TFT.background(back5);
         TFT.foreground(text5);
     }
-    printf(" 1                          \n");                // 1
+    printf("                                             \n");                // 1
     //------------------------------------*---------------------------
     if (mline==14) {
         TFT.background(back5_i);
@@ -840,7 +958,7 @@
         TFT.background(back5);
         TFT.foreground(text5);
     }
-    printf("pmenu=%d, mline2=%d, mline=%d \n", pmenu, mline2, mline);                // 1
+    printf("                                             \n");                // 1
     //------------------------------------*---------------------------
     if (mline==15) {
         TFT.background(0xFB2C);
@@ -849,11 +967,11 @@
         TFT.background(back5);
         TFT.foreground(text5);
     }
-    printf(" Exit                         \n");
+    printf(" Exit                                       \n");
     //--------------------------------------*-------------------------
     TFT.background(back5);
     TFT.foreground(text5);
-    printf("--------------------------- \n");
+    printf("--------------------------------------- \n");
 
 
 }
@@ -861,11 +979,20 @@
 void drawScreen6(void)                                                                   //экран 6
 {
     if (complit==0) {
-        TFT.background(Blue);
-        TFT.foreground(Black);
+        TFT.background(Black);
+        TFT.foreground(White);
         TFT.cls();
         complit = 1;  // прорисовали!
     }
+    TFT.set_font((unsigned char*) digi36x44);
+    TFT.foreground(Green);
+    TFT.locate(10, 10);
+    TFT.printf("%06.1f", Ireal);
+    TFT.locate(10, 85);
+    TFT.printf("%05.3f", U5);
+    
+    TFT.locate(10, 150);
+    TFT.printf("%d", int(U30));
 
 
 }
@@ -971,7 +1098,7 @@
     noisea3 = (max - min)*1000;
     return itg/100;
 }
-//------------------------------------------------------------------------------------------------------------
+/*/------------------------------------------------------------------------------------------------------------
 float avgAin4()                                                        // функция среднего значения с входа A4
 {
     float     value[100];
@@ -1007,7 +1134,7 @@
     noisea5 = (max - min)*1000;
     return itg/100;
 }
-/*/------------------------------------------------------------------------------------------------------------
+//------------------------------------------------------------------------------------------------------------/
         void drawMainScale(void) {
             a
             int a = avg*1000;
@@ -1039,8 +1166,8 @@
     in1 = avgAin1();
     in2 = avgAin2();
     in3 = avgAin3();
-    in4 = avgAin4();
-    in5 = avgAin5();
+    //in4 = avgAin4();
+    //in5 = avgAin5();
 
 // A0  U real   U = (avgAin0() - a0a) * a0k
 // A1  I real   I = (avgAin1() - a1a) * a1k
@@ -1049,12 +1176,16 @@
 // A4  U usb    U = (avgAin4() - a4a) * a4k
 // A5  I usb    I = (avgAin5() - a5a) * a5k
 
-    Ureal = a0k*(in0-a0a);
     Ireal = a1k*(in1-a1a);
-    Uset = a2k*(in2-a2a);
-    Iset = a3k*(in3-a3a);
-    Uusb = a4k*(in4-a4a);
-    Iusb = a5k*(in5-a5a);
+    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);
+    
+    if (cc==1) ledcc=0;
+    if (cc==0) ledcc=1;
 
     /*t.stop();// FPS
     TFT.background(Black);// FPS
@@ -1075,13 +1206,17 @@
             complit=0;
         }
         if (buttonDown==0) {  // Down
-            Screen=3;         // 2
+            Screen=6;         // 2
             complit=0;
         }
         if (buttonUp==0) {    // Up
             powerProtect=!powerProtect;
-            cc=!cc;                         // для проверки
+            
+            //cc=!cc;                         // для проверки
             pm=0;                           // С.C и C.V
+            cs=!cs;                         // для проверки
+            csp=0;                          // короткого замыкания
+            
             pp=0;
             wait(0.2);
         }
@@ -1191,21 +1326,26 @@
 //------------------------------------------------------------------
     if (Screen==4 & one==0) {              //экран меню Калибровка
         if (buttonEnter==0) {             // Enter set!
-            if (kline==1) a0a = in0 - 0.0001f;
-            if (kline==2) a0k = 20/(in0-a0a);
-            if (kline==3) Screen=5;
-            if (kline==4) Screen=5;
-            if (kline==5) Screen=5;
-            if (kline==6) Screen=5;
-            if (kline==7) Screen=5;
-            if (kline==8) Screen=5;
-            if (kline==9) Screen=5;
-            if (kline==10) Screen=5;
-            if (kline==11) Screen=5;
-            if (kline==12) Screen=5;
-            if (kline==13) Screen=5;
-            if (kline==14) Screen=5;
-            if (kline==15) Screen=5;
+        
+            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==15) Screen=5; //exit
             complit=0;
         }
 
@@ -1223,34 +1363,80 @@
 //------------------------------------------------------------------
     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==4) Screen=1;
-            if (mline==5) Screen=1;
-            if (mline==6) Screen=1;
-            if (mline==7) Screen=1;
-            if (mline==8) Screen=1;
+            
+            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;
+                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) Screen=1;
+            
+            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==15) {
                 Screen=1;
                 complit=0;
@@ -1270,29 +1456,29 @@
         //---------подменю яркость подсветки
         if (mline2==1) {
             int i=0;
-            if (buttonUp==0 & brightness<1) {
-                if(brightness >= 0.09f & i==0) {
-                    brightness+=0.1f;
-                    pinbrightness=brightness;
+            if (buttonUp==0 & fanspeed<1) {
+                if(fanspeed >= 0.09f & i==0) {
+                    fanspeed+=0.1f;
+                    fan=fanspeed;
                     i=1;
                 }
-                if(brightness < 0.09f & i==0) {
-                    brightness+=0.01f;
-                    pinbrightness=brightness;
+                if(fanspeed < 0.09f & i==0) {
+                    fanspeed+=0.01f;
+                    fan=fanspeed;
                     i=1;
                 }
 
             }
 
-            if (buttonDown==0 & brightness>0.01f) {
-                if(brightness <= 0.1f & i==0) {
-                    brightness-=0.01f;
-                    pinbrightness=brightness;
+            if (buttonDown==0 & fanspeed>0.01f) {
+                if(fanspeed <= 0.1f & i==0) {
+                    fanspeed-=0.01f;
+                    fan=fanspeed;
                     i=1;
                 }
-                if(brightness > 0.1f & i==0) {
-                    brightness-=0.1f;
-                    pinbrightness=brightness;
+                if(fanspeed > 0.1f & i==0) {
+                    fanspeed-=0.1f;
+                    fan=fanspeed;
                     i=1;
                 }
             }
@@ -1302,13 +1488,97 @@
                 pmenu=0;
             }
         }
+        //------------------------------------ tempstart 
+        if (mline4==1) {
+            if (buttonUp==0){
+                tempstart++;
+                wait(0.1);
+            }
+            if (buttonDown==0){
+                tempstart--;
+                wait(0.1);
+            }
+            if (buttonEnter==0) {
+                mline4=0;
+                pmenu=0;
+            }
+        }
+        //------------------------------------ tempfull
+        if (mline5==1) {
+            if (buttonUp==0){
+                tempfull++;
+                wait(0.1);
+            }
+            if (buttonDown==0){
+                tempfull--;
+                wait(0.1);
+            }
+            if (buttonEnter==0) {
+                mline5=0;
+                pmenu=0;
+            }
+        }
+        //------------------------------------ tempcutoff
+        if (mline6==1) {
+            if (buttonUp==0){
+                tempcutoff++;
+                wait(0.1);
+            }
+            if (buttonDown==0){
+                tempcutoff--;
+                wait(0.1);
+            }
+            if (buttonEnter==0) {
+                mline6=0;
+                pmenu=0;
+            }
+        }
+        //------------------------------------ падение на R вкл выкл
+        if (mline7==1 & one==0) {
+                wait(0.1);
+                mline7=0;
+                pmenu=0;
+        }
+        //------------------------------------ сопротивление резистора
+        if (mline8==1) {
+            if (buttonUp==0){
+                rdown=rdown+0.001f;
+                wait(0.1);
+            }
+            if (buttonDown==0){
+                rdown=rdown-0.001f;
+                wait(0.1);
+            }
+            if (buttonEnter==0) {
+                mline8=0;
+                pmenu=0;
+            }
+        }
+        //------------------------------------ U max
+        if (mline11==1) {
+            if (buttonUp==0){
+                umax++;
+                wait(0.1);
+            }
+            if (buttonDown==0){
+                umax--;
+                wait(0.1);
+            }
+            if (buttonEnter==0) {
+                mline11=0;
+                pmenu=0;
+            }
+        }
         //------------------------------------
         one=1;
+        //------------------------------------
 
     }
 //------------------------------------------------------------------
     if (Screen==6 & one==0) {                  //экран 6
         if (buttonEnter==0) {  // Enter
+                Screen=1;
+                complit=0;
         }
 
         if (buttonUp==0) {     // Up