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:
2:d20b1ef35d3f
Parent:
1:7bc0f280c259
Child:
3:791cf9a867d1
--- a/main.cpp	Sat Nov 01 13:35:20 2014 +0000
+++ b/main.cpp	Sat Nov 01 18:20:43 2014 +0000
@@ -25,7 +25,7 @@
 //----------------------------------
 SPI_TFT_ILI9341 TFT(D11, D12, D13, D8, D9, D10,"TFT"); // mosi, miso, sclk, cs, reset, dc
 void grid(void);
-//Timer ton;// FPS
+Timer fps;// FPS
 //Ticker valueUI;
 InterruptIn button(USER_BUTTON); // кнопка питания вкл\выкл
 //----------------------------------------------------------------------------------------------------------- Ввести в меню опцию коррекции падения напряжения на токоизмерительном шунте.
@@ -46,7 +46,7 @@
 void drawScreen7(void);             // экран 7
 void drawScreen8(void);             // экран 8
 void bootCold(void);                // холодный старт
-void map(void);                     // масштабирование
+float map(float, float, float, float, float);   // масштабирование
 void SetDateTime(void);             // установка даты и времени
 int year=2014;
 int mon=11;
@@ -120,6 +120,8 @@
 int powerProtect=1; //защита от кз
 int pp=0;           //защита от кз для прорисовки меню
 float brightness = 1.0f; //яркость экрана
+int cc=0;               // значит идет C.V
+int pm=0;               // для одной прорисовки сс и сv
 PwmOut pinbrightness(D15);    // выход на ключ регулировки яркости экрана
 //-----------------------------------------------------------------------------------------------------------
 DigitalOut powerMosfet(D2);         // выход управления нагрузкой
@@ -180,30 +182,20 @@
         TFT.background(Black);
         TFT.cls();
         TFT.rect(0,0,319,239,0xECA7);     //рамка
-        TFT.rect(10,62,309,76,0x9000);    //аналоговая 1
-        TFT.rect(10,137,309,151,0x9000);  //авалоговая 2
+        TFT.rect(10,62,309,76,0xECA7);    //аналоговая 1
+        TFT.rect(10,137,309,151,0xECA7);  //авалоговая 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.locate(185, 13);
-        TFT.printf("V");          // U=
+        TFT.locate(193, 13);
+        TFT.printf("v");          // U=
         TFT.locate(165, 88);
-        TFT.printf("mA");         // I=
+        TFT.printf("ma");         // I=
         complit = 1;  // прорисовали!
 
-        TFT.fillrect(230,10,304,53,Green);           // c.v  c.c
-        TFT.fillrect(230,85,304,128,Green);
-        TFT.background(Green);
-        TFT.foreground(Black);
-        TFT.set_font((unsigned char*) Consolas19x35);
-        TFT.locate(241, 14);
-        TFT.printf("C.V");
-        TFT.locate(241, 89);
-        TFT.printf("C.C");
-
         TFT.fillrect(11,161,104,183,0x09E1); // подвал левый квадрат верхний заливка
 
         TFT.rect(10,160,105,232,0xECA7);       // левый
@@ -224,41 +216,64 @@
     }
 //-----------------------------------------------------------------------------
     if (powerProtect==0 & pp==0) {                 // защита от кз
-        TFT.fillrect(113,161,206,194,0x6000);
-        TFT.background(0x6000);
-        TFT.foreground(Black);
+        TFT.fillrect(113,161,206,194,0x4208);
+        TFT.background(0x4208);
+        TFT.foreground(0xA514);
         TFT.set_font((unsigned char*) Lucida13x21);
-        TFT.locate(113, 165);
+        TFT.locate(113, 168);
         TFT.printf("Protect");
         pp=1;
     }
     if (powerProtect==1 & pp==0) {
-        TFT.fillrect(113,161,206,194,Green);
-        TFT.background(Green);
-        TFT.foreground(Black);
+        TFT.fillrect(113,161,206,194,0x0180);
+        TFT.background(0x0180);
+        TFT.foreground(Green);
         TFT.set_font((unsigned char*) Lucida13x21);
-        TFT.locate(113, 165);
+        TFT.locate(113, 168);
         TFT.printf("Protect");
         pp=1;
     }
 
 
+    fps.reset();
+    fps.start();
+    
     TFT.background(Black);
-    TFT.foreground(Green);
+    
+    if (cc==1){                 //если C.C то меняем цвет значения напряжения
+        TFT.foreground(Red);
+    }else{
+        TFT.foreground(Green);
+    }
+    
     TFT.set_font((unsigned char*) digi36x44);
     TFT.locate(10, 10);
-    TFT.printf("%05.2f", Ureal); // выводим значение с A0 (напряжение)
+    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 (напряжение)
+    }else{
+          TFT.locate(10, 10);
+          TFT.printf("%5.2f", Ureal); // выводим значение с A0 (напряжение)
+    }
+    
+    TFT.pixel(82, 53, Black);
+    TFT.pixel(117, 53, Black);
+    
     TFT.locate(10, 85);
+    TFT.foreground(Green);
     TFT.printf("%04.0f", Ireal); // выводим значение с A1 (ток)
 
-    TFT.background(0x09E1);                      // выводим мощность
-    TFT.foreground(White);
+
+    TFT.background(0x2104);                      // выводим мощность
+    TFT.foreground(0xE71C);//текст
     TFT.set_font((unsigned char*) Lucida13x21);
     TFT.locate(11, 162);
     TFT.printf("%05.2f W", Ureal*Ireal/1000);
 
-    TFT.background(0x09E1);                      // выводим время включеной нагрузки t.read()
-    TFT.foreground(White);
+    TFT.background(0x2104);                      // выводим время включеной нагрузки t.read()
+    TFT.foreground(0xE71C);//текст
     TFT.set_font((unsigned char*) Lucida13x21);
     TFT.locate(11, 185);
     timeConvert();
@@ -267,24 +282,58 @@
 
 
     if (powerMosfet==0 & pb==0) {   // выводим OFF
-        TFT.background(0x09E1);
-        TFT.foreground(Black);
-        TFT.fillrect(215,161,308,231,0x09E1);
+        TFT.background(0x4208);
+        TFT.foreground(0xA514);
+        TFT.fillrect(215,161,308,231,0x4208);
         TFT.set_font((unsigned char*) Consolas26x49);
         TFT.locate(226, 174);
         TFT.printf("OFF");
         pb=1;
     }
     if (powerMosfet==1 & pb==0) {   // выводим ON
-        TFT.background(Green);
-        TFT.foreground(Black);
-        TFT.fillrect(215,161,308,231,Green);
+        TFT.background(0x0339);
+        TFT.foreground(Green);
+        TFT.fillrect(215,161,308,231,0x0339);//0x0339 0x0180
         TFT.set_font((unsigned char*) Consolas26x49);
         TFT.locate(237, 174);
         TFT.printf("ON");
         pb=1;
     }
+    
+    int xscale1 = map(Ureal, 0, 25, 0, 298);
+    if (xscale1>297) xscale1=298;
+    TFT.fillrect(11, 63, (xscale1+10), 75, 0x3320);  //0x04C9                            // аналоговая шкала Напряжение 
+    TFT.fillrect((xscale1+12), 63, 308, 75, Black);
+    int xscale2 = map(Ireal, 0, 2200, 0, 298);
+    if (xscale2>297) xscale2=298;
+    TFT.fillrect(11, 138, (xscale2+10), 150, 0x9A60);  //0x9A60                            // аналоговая шкала Ток
+    TFT.fillrect((xscale2+12), 138, 308, 150, Black);
 
+    fps.stop();
+    TFT.set_font((unsigned char*) Courier8x13);  // FPS
+    TFT.locate(140,205);
+    printf("%0.2f", (1/fps.read()));
+    
+    if(cc==1 & pm==0){                                    // c.c
+        TFT.fillrect(240,10,304,53,Black);//c.v стереть
+        TFT.fillrect(240,85,304,128,0x6000);//c.c
+        TFT.background(0x6000);
+        TFT.foreground(Red);
+        TFT.set_font((unsigned char*) Consolas19x35);
+        TFT.locate(246, 89);
+        TFT.printf("C.C");
+        pm=1;
+    }
+    if(cc==0 & pm==0){                                    // c.v
+        TFT.fillrect(240,85,304,128,Black);//c.c стереть
+        TFT.fillrect(240,10,304,53,0x0180);//c.v          
+        TFT.background(0x0180);
+        TFT.foreground(Green);
+        TFT.set_font((unsigned char*) Consolas19x35);
+        TFT.locate(246, 14);
+        TFT.printf("C.V");
+        pm=1;
+    }
 
 
 }
@@ -764,7 +813,7 @@
         TFT.background(back5);
         TFT.foreground(text5);
     }
-    printf(" 1                          \n");                // 1
+    printf(" U max                      \n");                // 1
     //------------------------------------*---------------------------
     if (mline==12) {
         TFT.background(back5_i);
@@ -845,7 +894,7 @@
 
 }
 //------------------------------------------------------------------------------------------------------------
-long map(long x, long in_min, long in_max, long out_min, long out_max)             // функция масштабирования
+float map(float x, float in_min, float in_max, float out_min, float out_max)             // функция масштабирования
 {
     return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
 }
@@ -1031,6 +1080,8 @@
         }
         if (buttonUp==0) {    // Up
             powerProtect=!powerProtect;
+            cc=!cc;                         // для проверки
+            pm=0;                           // С.C и C.V
             pp=0;
             wait(0.2);
         }