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

main_v01.txt

Committer:
sinrab
Date:
2019-06-06
Revision:
10:60fa02641552
Parent:
0:ed1ba99f7b14

File content as of revision 10:60fa02641552:

#include "mbed.h"
#include "SPI_TFT_ILI9341.h"
#include "Consolas26x49.h"
#include "digi36x44.h"
SPI_TFT_ILI9341 TFT(D11, D12, D13, D8, D9, D10,"TFT"); // mosi, miso, sclk, cs, reset, dc
void grid(void);
//Ticker valueUI;
InterruptIn button(USER_BUTTON); // кнопка питания вкл\выкл
//-----------------------------------------------------------------------------------------------------------
//----------- my functions ---------//
void drawScreenStatic(void);        // прорисовка постоянных элементов
void drawScreenAction(void);        // прорисовка показаний
void bootCold(void);                // холодный старт
void map(void);                     // масштабирование
float avgAin0();                    // среднее значение с входа A0
float avgAin1();                    // среднее значение с входа A1
void dataProcessing(void);          // обработка и подготовка данных с аналоговых входов
void powerButton(void);             // при нажатии кнопки питания
void buttonUse(void);               // обработка нажатий кнопок
//-----------------------------------------------------------------------------------------------------------
float h = 0.0024; // сюда среднее значение при нулевом токе
int j = 3144; // сюда коэффициент
//-----------------------------------------------------------------------------------------------------------
DigitalIn buttonUp(D3);     // Up
DigitalIn buttonDown(D4);   // Down
DigitalIn buttonEnter(D5);  // Enter
int menu=1;                 // по умолчанию грузим первое меню
int complit=0;              // в начале меню не прорисовано
int pb=0;                   // для прорисовки кнопки
//-----------------------------------------------------------------------------------------------------------
DigitalOut powerMosfet(D2);         // выход управления нагрузкой
AnalogIn  ainA0(A0);
AnalogIn  ainA1(A1);
BusOut    unused(A5,A2,A3,A4);
//------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------
int main()                                                             //--------- Главная функция ---------//
{
    powerMosfet = 0;                    // при включении выход выключен
    bootCold();                         // холодный старт
    button.fall(&powerButton);
    //valueUI.attach(&drawMenuMainValues, 0.1);

    while(1) {
        dataProcessing();                   // обработка и подготовка данных с аналоговых входов
        buttonUse();                        // обработка нажатий кнопок
        drawScreenStatic();
        drawScreenAction();
    }
}                                                                      //--------- Главная функция ---------//
//------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------

//------------------------------------------------------------------------------------------------------------
void drawScreenStatic(void)                                                           // отрисовка главного экрана
{
    if (menu==1 & complit==0) {
        pb=0;
        TFT.set_orientation(3);
        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
        //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(165, 88);
        TFT.printf("mA");         // I=
        complit = 1;  // прорисовали!
    }
    if (menu==2 & complit==0) {
        TFT.background(0xECA7);
        TFT.foreground(Black);
        TFT.cls();
        TFT.rect(1,1,318,238,Red);
        complit = 1;  // прорисовали!
    }
}
//------------------------------------------------------------------------------------------------------------
void drawScreenAction(void)                                          // отрисовка главного экрана переменные
{
    if (menu==1) {
        TFT.background(Black);
        TFT.foreground(Green);

        TFT.set_font((unsigned char*) digi36x44);
        TFT.locate(10, 10);
        TFT.printf("%0.2f", avgAin0()*25); // выводим значение с A0 (напряжение)
        TFT.locate(10, 85);
        TFT.printf("%d", int(avgAin1()*2200)); // выводим значение с A1 (ток)

        if (powerMosfet==0 & pb==0) {
            TFT.background(0x09E1);
            TFT.foreground(Black);
            TFT.fillrect(225,160,309,231,0x09E1);
            TFT.set_font((unsigned char*) Consolas26x49);
            TFT.locate(231, 173);
            TFT.printf("OFF");
            pb=1;
        }
        if (powerMosfet==1 & pb==0) {
            TFT.background(Green);
            TFT.foreground(Black);
            TFT.fillrect(225,160,309,231,Green);
            TFT.set_font((unsigned char*) Consolas26x49);
            TFT.locate(242, 173);
            TFT.printf("ON");
            pb=1;
        }

    }
    if (menu==2) {
        TFT.background(Black);
        TFT.foreground(White);
        TFT.locate(10, 110);
        TFT.printf("menu 2");
    }
}
//------------------------------------------------------------------------------------------------------------
void bootCold(void)
{
    TFT.claim(stdout);      // send stdout to the TFT display

}
//------------------------------------------------------------------------------------------------------------
long map(long x, long in_min, long in_max, long out_min, long out_max)             // функция масштабирования
{
    return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
//------------------------------------------------------------------------------------------------------------
float avgAin0()                                                        // функция среднего значения с входа A0
{
    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] = ainA0;
        if (value[i] > max) max = value[i];
        if (value[i] < min) min = value[i];
        itg += value[i];
    }
    return itg/100;
}
//------------------------------------------------------------------------------------------------------------
float avgAin1()                                                        // функция среднего значения с входа A1
{
    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] = ainA1;
        if (value[i] > max) max = value[i];
        if (value[i] < min) min = value[i];
        itg += value[i];
    }
    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;
    pb=0;
}
//------------------------------------------------------------------------------------------------------------
void dataProcessing(void)                                 // обработка и подготовка данных с аналоговых входов
{

}
//------------------------------------------------------------------------------------------------------------
void buttonUse(void)                                                               // обработка нажатий кнопок
{
//----------------------------
    int one=0; // для обработки одной кнопки за раз
    if (menu==1 & one==0) {
        if (buttonEnter==0) {
            //wait(1);
            menu=2;
            complit=0;
        }
        if (buttonDown==0) {
            menu=3;
            complit=0;
        }
        one=1;
    }
//----------------------------
    if (menu==2 & one==0) {
        if (buttonEnter==0) {
            //wait(1);
            menu=1;
            complit=0;
        }
        one=1;
    }
//----------------------------
    if (menu==3 & one==0) {
        if (buttonEnter==0) {
            //wait(1);
            menu=1;
            complit=0;
        }
        one=1;
    }
}
//------------------------------------------------------------------------------------------------------------
void grid(void)
{
    TFT.cls();
    for (int i=0; i<240; i=i+5) {
        TFT.line(0,i,320,i, White);
    }
    for (int i=2; i<240; i=i+5) {
        TFT.line(4,i,320,i, White);
    }
    for (int i=3; i<240; i=i+5) {
        TFT.line(4,i,320,i, White);
    }

}