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

Committer:
sinrab
Date:
Thu Jun 06 10:22:13 2019 +0000
Revision:
10:60fa02641552
Parent:
0:ed1ba99f7b14
v1.0.1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sinrab 0:ed1ba99f7b14 1 #include "mbed.h"
sinrab 0:ed1ba99f7b14 2 #include "SPI_TFT_ILI9341.h"
sinrab 0:ed1ba99f7b14 3 #include "Consolas26x49.h"
sinrab 0:ed1ba99f7b14 4 #include "digi36x44.h"
sinrab 0:ed1ba99f7b14 5 SPI_TFT_ILI9341 TFT(D11, D12, D13, D8, D9, D10,"TFT"); // mosi, miso, sclk, cs, reset, dc
sinrab 0:ed1ba99f7b14 6 void grid(void);
sinrab 0:ed1ba99f7b14 7 //Ticker valueUI;
sinrab 0:ed1ba99f7b14 8 InterruptIn button(USER_BUTTON); // кнопка питания вкл\выкл
sinrab 0:ed1ba99f7b14 9 //-----------------------------------------------------------------------------------------------------------
sinrab 0:ed1ba99f7b14 10 //----------- my functions ---------//
sinrab 0:ed1ba99f7b14 11 void drawScreenStatic(void); // прорисовка постоянных элементов
sinrab 0:ed1ba99f7b14 12 void drawScreenAction(void); // прорисовка показаний
sinrab 0:ed1ba99f7b14 13 void bootCold(void); // холодный старт
sinrab 0:ed1ba99f7b14 14 void map(void); // масштабирование
sinrab 0:ed1ba99f7b14 15 float avgAin0(); // среднее значение с входа A0
sinrab 0:ed1ba99f7b14 16 float avgAin1(); // среднее значение с входа A1
sinrab 0:ed1ba99f7b14 17 void dataProcessing(void); // обработка и подготовка данных с аналоговых входов
sinrab 0:ed1ba99f7b14 18 void powerButton(void); // при нажатии кнопки питания
sinrab 0:ed1ba99f7b14 19 void buttonUse(void); // обработка нажатий кнопок
sinrab 0:ed1ba99f7b14 20 //-----------------------------------------------------------------------------------------------------------
sinrab 0:ed1ba99f7b14 21 float h = 0.0024; // сюда среднее значение при нулевом токе
sinrab 0:ed1ba99f7b14 22 int j = 3144; // сюда коэффициент
sinrab 0:ed1ba99f7b14 23 //-----------------------------------------------------------------------------------------------------------
sinrab 0:ed1ba99f7b14 24 DigitalIn buttonUp(D3); // Up
sinrab 0:ed1ba99f7b14 25 DigitalIn buttonDown(D4); // Down
sinrab 0:ed1ba99f7b14 26 DigitalIn buttonEnter(D5); // Enter
sinrab 0:ed1ba99f7b14 27 int menu=1; // по умолчанию грузим первое меню
sinrab 0:ed1ba99f7b14 28 int complit=0; // в начале меню не прорисовано
sinrab 0:ed1ba99f7b14 29 int pb=0; // для прорисовки кнопки
sinrab 0:ed1ba99f7b14 30 //-----------------------------------------------------------------------------------------------------------
sinrab 0:ed1ba99f7b14 31 DigitalOut powerMosfet(D2); // выход управления нагрузкой
sinrab 0:ed1ba99f7b14 32 AnalogIn ainA0(A0);
sinrab 0:ed1ba99f7b14 33 AnalogIn ainA1(A1);
sinrab 0:ed1ba99f7b14 34 BusOut unused(A5,A2,A3,A4);
sinrab 0:ed1ba99f7b14 35 //------------------------------------------------------------------------------------------------------------
sinrab 0:ed1ba99f7b14 36 //------------------------------------------------------------------------------------------------------------
sinrab 0:ed1ba99f7b14 37 int main() //--------- Главная функция ---------//
sinrab 0:ed1ba99f7b14 38 {
sinrab 0:ed1ba99f7b14 39 powerMosfet = 0; // при включении выход выключен
sinrab 0:ed1ba99f7b14 40 bootCold(); // холодный старт
sinrab 0:ed1ba99f7b14 41 button.fall(&powerButton);
sinrab 0:ed1ba99f7b14 42 //valueUI.attach(&drawMenuMainValues, 0.1);
sinrab 0:ed1ba99f7b14 43
sinrab 0:ed1ba99f7b14 44 while(1) {
sinrab 0:ed1ba99f7b14 45 dataProcessing(); // обработка и подготовка данных с аналоговых входов
sinrab 0:ed1ba99f7b14 46 buttonUse(); // обработка нажатий кнопок
sinrab 0:ed1ba99f7b14 47 drawScreenStatic();
sinrab 0:ed1ba99f7b14 48 drawScreenAction();
sinrab 0:ed1ba99f7b14 49 }
sinrab 0:ed1ba99f7b14 50 } //--------- Главная функция ---------//
sinrab 0:ed1ba99f7b14 51 //------------------------------------------------------------------------------------------------------------
sinrab 0:ed1ba99f7b14 52 //------------------------------------------------------------------------------------------------------------
sinrab 0:ed1ba99f7b14 53
sinrab 0:ed1ba99f7b14 54 //------------------------------------------------------------------------------------------------------------
sinrab 0:ed1ba99f7b14 55 void drawScreenStatic(void) // отрисовка главного экрана
sinrab 0:ed1ba99f7b14 56 {
sinrab 0:ed1ba99f7b14 57 if (menu==1 & complit==0) {
sinrab 0:ed1ba99f7b14 58 pb=0;
sinrab 0:ed1ba99f7b14 59 TFT.set_orientation(3);
sinrab 0:ed1ba99f7b14 60 TFT.background(Black);
sinrab 0:ed1ba99f7b14 61 TFT.cls();
sinrab 0:ed1ba99f7b14 62 TFT.rect(0,0,319,239,0xECA7); //рамка
sinrab 0:ed1ba99f7b14 63 TFT.rect(10,62,309,76,0x9000); //аналоговая 1
sinrab 0:ed1ba99f7b14 64 TFT.rect(10,137,309,151,0x9000); //авалоговая 2
sinrab 0:ed1ba99f7b14 65 //grid();
sinrab 0:ed1ba99f7b14 66 //int y = 51;
sinrab 0:ed1ba99f7b14 67 //TFT.line(5,y,310,y, White);
sinrab 0:ed1ba99f7b14 68 TFT.background(Black);
sinrab 0:ed1ba99f7b14 69 TFT.foreground(0xECA7); // цвет слов
sinrab 0:ed1ba99f7b14 70 TFT.set_font((unsigned char*) Consolas26x49);
sinrab 0:ed1ba99f7b14 71 TFT.locate(185, 13);
sinrab 0:ed1ba99f7b14 72 TFT.printf("V"); // U=
sinrab 0:ed1ba99f7b14 73 TFT.locate(165, 88);
sinrab 0:ed1ba99f7b14 74 TFT.printf("mA"); // I=
sinrab 0:ed1ba99f7b14 75 complit = 1; // прорисовали!
sinrab 0:ed1ba99f7b14 76 }
sinrab 0:ed1ba99f7b14 77 if (menu==2 & complit==0) {
sinrab 0:ed1ba99f7b14 78 TFT.background(0xECA7);
sinrab 0:ed1ba99f7b14 79 TFT.foreground(Black);
sinrab 0:ed1ba99f7b14 80 TFT.cls();
sinrab 0:ed1ba99f7b14 81 TFT.rect(1,1,318,238,Red);
sinrab 0:ed1ba99f7b14 82 complit = 1; // прорисовали!
sinrab 0:ed1ba99f7b14 83 }
sinrab 0:ed1ba99f7b14 84 }
sinrab 0:ed1ba99f7b14 85 //------------------------------------------------------------------------------------------------------------
sinrab 0:ed1ba99f7b14 86 void drawScreenAction(void) // отрисовка главного экрана переменные
sinrab 0:ed1ba99f7b14 87 {
sinrab 0:ed1ba99f7b14 88 if (menu==1) {
sinrab 0:ed1ba99f7b14 89 TFT.background(Black);
sinrab 0:ed1ba99f7b14 90 TFT.foreground(Green);
sinrab 0:ed1ba99f7b14 91
sinrab 0:ed1ba99f7b14 92 TFT.set_font((unsigned char*) digi36x44);
sinrab 0:ed1ba99f7b14 93 TFT.locate(10, 10);
sinrab 0:ed1ba99f7b14 94 TFT.printf("%0.2f", avgAin0()*25); // выводим значение с A0 (напряжение)
sinrab 0:ed1ba99f7b14 95 TFT.locate(10, 85);
sinrab 0:ed1ba99f7b14 96 TFT.printf("%d", int(avgAin1()*2200)); // выводим значение с A1 (ток)
sinrab 0:ed1ba99f7b14 97
sinrab 0:ed1ba99f7b14 98 if (powerMosfet==0 & pb==0) {
sinrab 0:ed1ba99f7b14 99 TFT.background(0x09E1);
sinrab 0:ed1ba99f7b14 100 TFT.foreground(Black);
sinrab 0:ed1ba99f7b14 101 TFT.fillrect(225,160,309,231,0x09E1);
sinrab 0:ed1ba99f7b14 102 TFT.set_font((unsigned char*) Consolas26x49);
sinrab 0:ed1ba99f7b14 103 TFT.locate(231, 173);
sinrab 0:ed1ba99f7b14 104 TFT.printf("OFF");
sinrab 0:ed1ba99f7b14 105 pb=1;
sinrab 0:ed1ba99f7b14 106 }
sinrab 0:ed1ba99f7b14 107 if (powerMosfet==1 & pb==0) {
sinrab 0:ed1ba99f7b14 108 TFT.background(Green);
sinrab 0:ed1ba99f7b14 109 TFT.foreground(Black);
sinrab 0:ed1ba99f7b14 110 TFT.fillrect(225,160,309,231,Green);
sinrab 0:ed1ba99f7b14 111 TFT.set_font((unsigned char*) Consolas26x49);
sinrab 0:ed1ba99f7b14 112 TFT.locate(242, 173);
sinrab 0:ed1ba99f7b14 113 TFT.printf("ON");
sinrab 0:ed1ba99f7b14 114 pb=1;
sinrab 0:ed1ba99f7b14 115 }
sinrab 0:ed1ba99f7b14 116
sinrab 0:ed1ba99f7b14 117 }
sinrab 0:ed1ba99f7b14 118 if (menu==2) {
sinrab 0:ed1ba99f7b14 119 TFT.background(Black);
sinrab 0:ed1ba99f7b14 120 TFT.foreground(White);
sinrab 0:ed1ba99f7b14 121 TFT.locate(10, 110);
sinrab 0:ed1ba99f7b14 122 TFT.printf("menu 2");
sinrab 0:ed1ba99f7b14 123 }
sinrab 0:ed1ba99f7b14 124 }
sinrab 0:ed1ba99f7b14 125 //------------------------------------------------------------------------------------------------------------
sinrab 0:ed1ba99f7b14 126 void bootCold(void)
sinrab 0:ed1ba99f7b14 127 {
sinrab 0:ed1ba99f7b14 128 TFT.claim(stdout); // send stdout to the TFT display
sinrab 0:ed1ba99f7b14 129
sinrab 0:ed1ba99f7b14 130 }
sinrab 0:ed1ba99f7b14 131 //------------------------------------------------------------------------------------------------------------
sinrab 0:ed1ba99f7b14 132 long map(long x, long in_min, long in_max, long out_min, long out_max) // функция масштабирования
sinrab 0:ed1ba99f7b14 133 {
sinrab 0:ed1ba99f7b14 134 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
sinrab 0:ed1ba99f7b14 135 }
sinrab 0:ed1ba99f7b14 136 //------------------------------------------------------------------------------------------------------------
sinrab 0:ed1ba99f7b14 137 float avgAin0() // функция среднего значения с входа A0
sinrab 0:ed1ba99f7b14 138 {
sinrab 0:ed1ba99f7b14 139 float value[100];
sinrab 0:ed1ba99f7b14 140 float max;
sinrab 0:ed1ba99f7b14 141 float min;
sinrab 0:ed1ba99f7b14 142 double itg;
sinrab 0:ed1ba99f7b14 143 max = itg = 0.0;
sinrab 0:ed1ba99f7b14 144 min = 3.3;
sinrab 0:ed1ba99f7b14 145 for (int i=0; i<100; i++) {
sinrab 0:ed1ba99f7b14 146 value[i] = ainA0;
sinrab 0:ed1ba99f7b14 147 if (value[i] > max) max = value[i];
sinrab 0:ed1ba99f7b14 148 if (value[i] < min) min = value[i];
sinrab 0:ed1ba99f7b14 149 itg += value[i];
sinrab 0:ed1ba99f7b14 150 }
sinrab 0:ed1ba99f7b14 151 return itg/100;
sinrab 0:ed1ba99f7b14 152 }
sinrab 0:ed1ba99f7b14 153 //------------------------------------------------------------------------------------------------------------
sinrab 0:ed1ba99f7b14 154 float avgAin1() // функция среднего значения с входа A1
sinrab 0:ed1ba99f7b14 155 {
sinrab 0:ed1ba99f7b14 156 float value[100];
sinrab 0:ed1ba99f7b14 157 float max;
sinrab 0:ed1ba99f7b14 158 float min;
sinrab 0:ed1ba99f7b14 159 double itg;
sinrab 0:ed1ba99f7b14 160 max = itg = 0.0;
sinrab 0:ed1ba99f7b14 161 min = 3.3;
sinrab 0:ed1ba99f7b14 162 for (int i=0; i<100; i++) {
sinrab 0:ed1ba99f7b14 163 value[i] = ainA1;
sinrab 0:ed1ba99f7b14 164 if (value[i] > max) max = value[i];
sinrab 0:ed1ba99f7b14 165 if (value[i] < min) min = value[i];
sinrab 0:ed1ba99f7b14 166 itg += value[i];
sinrab 0:ed1ba99f7b14 167 }
sinrab 0:ed1ba99f7b14 168 return itg/100;
sinrab 0:ed1ba99f7b14 169 }
sinrab 0:ed1ba99f7b14 170 /*/------------------------------------------------------------------------------------------------------------
sinrab 0:ed1ba99f7b14 171 void drawMainScale(void) {
sinrab 0:ed1ba99f7b14 172 a
sinrab 0:ed1ba99f7b14 173 int a = avg*1000;
sinrab 0:ed1ba99f7b14 174 b = mapIOIO(c, 0, 100, 0, 220);
sinrab 0:ed1ba99f7b14 175
sinrab 0:ed1ba99f7b14 176 TFT.fillrect(10, 10, (b+10), 20, Red); // аналоговая шкала 1
sinrab 0:ed1ba99f7b14 177 TFT.fillrect((b+10), 10, 230, 20, Black);
sinrab 0:ed1ba99f7b14 178 }
sinrab 0:ed1ba99f7b14 179 //------------------------------------------------------------------------------------------------------------*/
sinrab 0:ed1ba99f7b14 180 void powerButton(void) // при нажатии кнопки питания
sinrab 0:ed1ba99f7b14 181 {
sinrab 0:ed1ba99f7b14 182 powerMosfet=!powerMosfet;
sinrab 0:ed1ba99f7b14 183 pb=0;
sinrab 0:ed1ba99f7b14 184 }
sinrab 0:ed1ba99f7b14 185 //------------------------------------------------------------------------------------------------------------
sinrab 0:ed1ba99f7b14 186 void dataProcessing(void) // обработка и подготовка данных с аналоговых входов
sinrab 0:ed1ba99f7b14 187 {
sinrab 0:ed1ba99f7b14 188
sinrab 0:ed1ba99f7b14 189 }
sinrab 0:ed1ba99f7b14 190 //------------------------------------------------------------------------------------------------------------
sinrab 0:ed1ba99f7b14 191 void buttonUse(void) // обработка нажатий кнопок
sinrab 0:ed1ba99f7b14 192 {
sinrab 0:ed1ba99f7b14 193 //----------------------------
sinrab 0:ed1ba99f7b14 194 int one=0; // для обработки одной кнопки за раз
sinrab 0:ed1ba99f7b14 195 if (menu==1 & one==0) {
sinrab 0:ed1ba99f7b14 196 if (buttonEnter==0) {
sinrab 0:ed1ba99f7b14 197 //wait(1);
sinrab 0:ed1ba99f7b14 198 menu=2;
sinrab 0:ed1ba99f7b14 199 complit=0;
sinrab 0:ed1ba99f7b14 200 }
sinrab 0:ed1ba99f7b14 201 if (buttonDown==0) {
sinrab 0:ed1ba99f7b14 202 menu=3;
sinrab 0:ed1ba99f7b14 203 complit=0;
sinrab 0:ed1ba99f7b14 204 }
sinrab 0:ed1ba99f7b14 205 one=1;
sinrab 0:ed1ba99f7b14 206 }
sinrab 0:ed1ba99f7b14 207 //----------------------------
sinrab 0:ed1ba99f7b14 208 if (menu==2 & one==0) {
sinrab 0:ed1ba99f7b14 209 if (buttonEnter==0) {
sinrab 0:ed1ba99f7b14 210 //wait(1);
sinrab 0:ed1ba99f7b14 211 menu=1;
sinrab 0:ed1ba99f7b14 212 complit=0;
sinrab 0:ed1ba99f7b14 213 }
sinrab 0:ed1ba99f7b14 214 one=1;
sinrab 0:ed1ba99f7b14 215 }
sinrab 0:ed1ba99f7b14 216 //----------------------------
sinrab 0:ed1ba99f7b14 217 if (menu==3 & one==0) {
sinrab 0:ed1ba99f7b14 218 if (buttonEnter==0) {
sinrab 0:ed1ba99f7b14 219 //wait(1);
sinrab 0:ed1ba99f7b14 220 menu=1;
sinrab 0:ed1ba99f7b14 221 complit=0;
sinrab 0:ed1ba99f7b14 222 }
sinrab 0:ed1ba99f7b14 223 one=1;
sinrab 0:ed1ba99f7b14 224 }
sinrab 0:ed1ba99f7b14 225 }
sinrab 0:ed1ba99f7b14 226 //------------------------------------------------------------------------------------------------------------
sinrab 0:ed1ba99f7b14 227 void grid(void)
sinrab 0:ed1ba99f7b14 228 {
sinrab 0:ed1ba99f7b14 229 TFT.cls();
sinrab 0:ed1ba99f7b14 230 for (int i=0; i<240; i=i+5) {
sinrab 0:ed1ba99f7b14 231 TFT.line(0,i,320,i, White);
sinrab 0:ed1ba99f7b14 232 }
sinrab 0:ed1ba99f7b14 233 for (int i=2; i<240; i=i+5) {
sinrab 0:ed1ba99f7b14 234 TFT.line(4,i,320,i, White);
sinrab 0:ed1ba99f7b14 235 }
sinrab 0:ed1ba99f7b14 236 for (int i=3; i<240; i=i+5) {
sinrab 0:ed1ba99f7b14 237 TFT.line(4,i,320,i, White);
sinrab 0:ed1ba99f7b14 238 }
sinrab 0:ed1ba99f7b14 239
sinrab 0:ed1ba99f7b14 240 }