Primjer kretanja kroz izbornike na SSD1306 OLED zaslonu uz pomoć 4 tipke.

Dependencies:   mbed OLED_SSD1306

Video rada projekta : https://youtu.be/hMW1pZ-a_38

Logika kretanja kroz izbornike https://os.mbed.com/media/uploads/oh_snaep/izrezak.jpg

Shema https://os.mbed.com/media/uploads/oh_snaep/shema-1.png

main.cpp

Committer:
oh_snaep
Date:
2022-01-31
Revision:
0:fa9ec70cc128

File content as of revision 0:fa9ec70cc128:

#include "mbed.h"
#include "ikone.h"
#include "SSD1306I2C.h"

Serial pc(USBTX, USBRX);

Timer debounce;
Timer gasenje_zaslona;

InterruptIn desno(D7);
InterruptIn potvrda(D5);
InterruptIn otkaz(D6);
InterruptIn lijevo(D4);

bool aktuator=false;
bool potvrda_ulaska_u_izbornik=false;
bool potvrda_ulaska_u_podizbornik=false;
uint8_t postavka_gasenja_zaslona=15; //5, 15, 30 sekundi
//bool postavka_izbornika=false;

void ispis_desno(void);
void ispis_potvrda(void);
void ispis_otkaz(void);
void ispis_lijevo(void);

SSD1306I2C display(0x3c, D14, D15);

DigitalOut myled(LED1);
void izbornik_tipke(void);

uint8_t izbornik=0;
uint8_t pod_izbornik=0;
uint8_t postavka_izbornika=0;

int main()
{

    desno.rise(ispis_desno);
    potvrda.rise(ispis_potvrda);
    otkaz.rise(ispis_otkaz);
    lijevo.rise(ispis_lijevo);
    display.init();
    display.resetDisplay();
    display.setFont(ArialMT_Plain_10);
    display.drawString(30,0,"Vanja Belosevic");
    display.drawString(35,20,"0246076901");
    display.drawString(38,40,"2021/2022");
    //display.drawStringMaxWidth(0,0,128,"Vanja Belosevic");
    //display.drawStringMaxWidth(0,20,128,"0246076901");
    //display.drawStringMaxWidth(0,40,128,"2021/2022");
    display.display();
    pc.printf("Mirko pokrenut!");
    wait(5);
    display.clear();
    gasenje_zaslona.start();

    while(1) {

        if(gasenje_zaslona >= postavka_gasenja_zaslona) {
            display.displayOff();
        } else {
            display.displayOn();
        }

        if(izbornik == 0 && potvrda_ulaska_u_podizbornik == false && potvrda_ulaska_u_izbornik == false) {
            display.clear();
            display.setFont(ArialMT_Plain_10);
            display.drawString(0,0,"Stanje aktuatora:");
            display.setFont(ArialMT_Plain_16);
            if(aktuator == false) {
                display.drawString(0,20,"OFF");
            } else if(aktuator == true) {
                display.drawString(0,20,"ON");
            }
        } else if(izbornik == 1 || (potvrda_ulaska_u_izbornik == true || potvrda_ulaska_u_podizbornik == true)) {
            if(potvrda_ulaska_u_izbornik == false && potvrda_ulaska_u_podizbornik == false) {
                display.clear();
                display.drawXbm(40,0,48,48,settings_48x48); //x početno, y početno, širina, visina, char polje od slike
            } else if(potvrda_ulaska_u_izbornik == true && potvrda_ulaska_u_podizbornik == false) {
                if(pod_izbornik == 0) {
                    display.clear();
                    display.setFont(ArialMT_Plain_10);
                    display.drawStringMaxWidth(0,0,128,"Odabir stanja aktuatora?");
                } else if(pod_izbornik == 1) {
                    display.clear();
                    display.setFont(ArialMT_Plain_10);
                    display.drawStringMaxWidth(0,0,128,"Odabir perioda automatskog gasenja zaslona?");
                }
            } else if(potvrda_ulaska_u_izbornik == false && potvrda_ulaska_u_podizbornik == true) {
                display.clear();
                display.setFont(ArialMT_Plain_10);
                if(pod_izbornik == 0) {
                    if(postavka_izbornika == 0) {
                        display.drawStringMaxWidth(0,0,128,"Aktuator :");
                        display.setFont(ArialMT_Plain_16);
                        display.drawString(60,30,"OFF?");
                    } else if(postavka_izbornika == 1) {
                        display.drawStringMaxWidth(0,0,128,"Aktuator :");
                        display.setFont(ArialMT_Plain_16);
                        display.drawString(60,30,"ON?");
                    }
                } else if(pod_izbornik == 1) {
                    if(postavka_izbornika == 0) {
                        display.drawStringMaxWidth(0,0,128,"Odabir :");
                        display.drawStringMaxWidth(0,30,128,"5 sekundi?");
                    } else if(postavka_izbornika == 1) {
                        display.drawStringMaxWidth(0,0,128,"Odabir :");
                        display.drawStringMaxWidth(0,30,128,"15 sekundi?");
                    } else if(postavka_izbornika == 2) {
                        display.drawStringMaxWidth(0,0,128,"Odabir :");
                        display.drawStringMaxWidth(0,30,128,"30 sekundi?");
                    }
                }
            }

        }
        izbornik_tipke();
        display.display();
    }
}

//wait(10.0);

//pc.printf("%d\n",x);


void ispis_desno()
{
    debounce.start();
    if(debounce.read_ms() >= 150) {
        pc.printf("desna tipka pritisnuta!\n");
        if(potvrda_ulaska_u_izbornik == false && potvrda_ulaska_u_podizbornik == false) {
            --izbornik;
            if(izbornik >= 2) izbornik = 1;
        } else if(potvrda_ulaska_u_izbornik == true && potvrda_ulaska_u_podizbornik == false) {
            //potvrda_ulaska_u_izbornik = false;
            --pod_izbornik;
            if(pod_izbornik >= 2) pod_izbornik = 1;
        } else if(potvrda_ulaska_u_podizbornik == true && potvrda_ulaska_u_izbornik == false) {
            --postavka_izbornika;
            if(pod_izbornik == 0) {
                if(postavka_izbornika >= 2) postavka_izbornika = 1;
            } else if (pod_izbornik==1) {
                if(postavka_izbornika >= 3) postavka_izbornika = 2;
            }
        }
        debounce.reset();
        display.displayOn();
        gasenje_zaslona.reset();
        pc.printf("Stanje varijable izbornik: %d\n",izbornik);
        pc.printf("Stanje varijable pod_izbornik: %d\n",pod_izbornik);
        pc.printf("Stanje varijable postavka_izbornika %d",postavka_izbornika);
        pc.printf("potvrda_ulaska_u_izbornik: %d\n",potvrda_ulaska_u_izbornik);
        pc.printf("potvrda_ulaska_u_podizbornik: %d\n",potvrda_ulaska_u_podizbornik);
    }

}

void ispis_potvrda()
{
    debounce.start();
    if(debounce.read_ms() >= 150) {
        pc.printf("tipka potvda pritisnuta!\n");
        debounce.reset();
        display.displayOn();
        gasenje_zaslona.reset();
        if(izbornik == 1 && potvrda_ulaska_u_izbornik == false && potvrda_ulaska_u_podizbornik == false) {
            potvrda_ulaska_u_izbornik = true;
            potvrda_ulaska_u_podizbornik = false;
            pod_izbornik = 0;
            postavka_izbornika = 0;
        } else if(potvrda_ulaska_u_izbornik == true && potvrda_ulaska_u_podizbornik == false) {
            potvrda_ulaska_u_podizbornik = true;
            potvrda_ulaska_u_izbornik = false;
        } else if(potvrda_ulaska_u_izbornik == false && potvrda_ulaska_u_podizbornik == true) {
            if(pod_izbornik == 0 && postavka_izbornika == 0) {
                aktuator = false;
            } else if(pod_izbornik == 0 && postavka_izbornika == 1) {
                aktuator = true;
            } else if(pod_izbornik == 1 && postavka_izbornika == 0) {
                postavka_gasenja_zaslona=5;
            } else if(pod_izbornik == 1 && postavka_izbornika == 1) {
                postavka_gasenja_zaslona=15;
            } else if(pod_izbornik == 1 && postavka_izbornika == 2) {
                postavka_gasenja_zaslona=30;
            }
            potvrda_ulaska_u_podizbornik = false;
            potvrda_ulaska_u_izbornik = true;
        }
        pc.printf("potvrda_ulaska_u_izbornik: %d\n",potvrda_ulaska_u_izbornik);
        pc.printf("potvrda_ulaska_u_podizbornik: %d\n",potvrda_ulaska_u_podizbornik);
    }
}

void ispis_otkaz()
{
    debounce.start();
    if(debounce.read_ms() >= 150) {
        pc.printf("tipka otkaz pritisnuta!\n");
        debounce.reset();
        display.displayOn();
        gasenje_zaslona.reset();

        if(potvrda_ulaska_u_izbornik == true && potvrda_ulaska_u_podizbornik == false) {
            pod_izbornik=0;
            izbornik=1;
            potvrda_ulaska_u_izbornik = false;
        } else if(potvrda_ulaska_u_izbornik == false && potvrda_ulaska_u_podizbornik == true) {
            potvrda_ulaska_u_podizbornik = false;
            potvrda_ulaska_u_izbornik = true;
            pod_izbornik=0;
            postavka_izbornika=0;
            izbornik=1;
        }
        pc.printf("potvrda_ulaska_u_izbornik: %d\n",potvrda_ulaska_u_izbornik);
        pc.printf("potvrda_ulaska_u_podizbornik: %d\n",potvrda_ulaska_u_podizbornik);
    }
}

void ispis_lijevo()
{
    debounce.start();
    if(debounce.read_ms() >= 150) {
        pc.printf("lijeva tipka pritisnuta!\n");

        if(potvrda_ulaska_u_izbornik == false && potvrda_ulaska_u_podizbornik == false) {
            ++izbornik;
            if(izbornik >= 2) izbornik = 0;
        } else if(potvrda_ulaska_u_izbornik == true && potvrda_ulaska_u_podizbornik == false) {
            ++pod_izbornik;
            if(pod_izbornik >= 2) pod_izbornik = 0;
        } else if(potvrda_ulaska_u_podizbornik == true && potvrda_ulaska_u_izbornik == false) {
            ++postavka_izbornika;
            if(pod_izbornik == 0) {
                if(postavka_izbornika >= 2) postavka_izbornika = 0;
            } else if (pod_izbornik==1) {
                if(postavka_izbornika >= 3) postavka_izbornika = 0;
            }
        }
        debounce.reset();
        display.displayOn();
        gasenje_zaslona.reset();
        pc.printf("Stanje varijable izbornik: %d\n",izbornik);
        pc.printf("Stanje varijable pod_izbornik: %d\n",pod_izbornik);
        pc.printf("Stanje varijable postavka_izbornika: %d\n",postavka_izbornika);
        pc.printf("potvrda_ulaska_u_izbornik: %d\n",potvrda_ulaska_u_izbornik);
        pc.printf("potvrda_ulaska_u_podizbornik: %d\n",potvrda_ulaska_u_podizbornik);
    }

}

//trajni izbornik na dnu zaslona, sadrži ikone za korištenje tipki
void izbornik_tipke()
{
    display.drawHorizontalLine(0,52,128);
    display.drawXbm(0,55,12,9,strelica_lijevo_12x9);
    display.drawXbm(108,55,12,9,strelica_desno_12x9);
    display.drawXbm(42,55,9,9,x_9x9);
    display.drawXbm(75,55,11,9,check_11x9);
    //display.display();
}