nuova versione

Dependencies:   BSP_DISCO_F746NG CD74HC165E LCD_DISCO_F746NG Shifter2 TS_DISCO_F746NG mbed

Fork of Enrico_newproject by marco valli

main.cpp

Committer:
billycorgan123
Date:
2018-03-07
Revision:
2:6b24c77e16b6
Parent:
1:8a54b7de2617

File content as of revision 2:6b24c77e16b6:

#include "mbed.h"
#include "TS_DISCO_F746NG.h"
#include "LCD_DISCO_F746NG.h"

#include "Bloccoporta_acceso.c"
#include "Bloccoporta_spento.c"
#include "Girarrosto_acceso.c"
#include "Girarrosto_spento.c"
#include "Lampadina_acceso.c"
#include "Lampadina_spento.c"
#include "Ventilatore_turbo_acceso.c"
#include "Ventilatore_turbo_spento.c"
#include "Resistenza1_acceso.c"
#include "Resistenza1_spento.c"
#include "Resistenza2_acceso.c"
#include "Resistenza2_spento.c"
#include "Cooling_acceso.c"
#include "Cooling_spento.c"
#include "Ventilatore2_acceso.c"
#include "Ventilatore2_spento.c"

#include "Clean.c"
#include "Roast.c"
#include "Stop.c"

#include "functions.h"
#include "colors.c"
#include "Output.h"
#include "Shifter.h"

LCD_DISCO_F746NG lcd;
TS_DISCO_F746NG ts;

extern void clean(int, float, float);
extern void roast(int, int);
extern void stop();
extern void sportello_scarico(bool);
extern void object_update();

TS_StateTypeDef TS_State;
uint16_t X, Y;
uint8_t idx;
uint8_t status;
uint8_t cleared = 0;
uint8_t prev_nb_touches = 0;
int numerotappe=0;
uint8_t text[30];

Output Bloccoporta;             //
Output Girarrosto;              // palette agita caffé
Output Lampadina;               //
Output Ventilatore_turbo;       // ventilatore turbo
Output Scarico_caffe;           // motore scarico caffé
Output Resistenza1;             //
Output Resistenza2;             //
Output Cooling;                 // cooling
Output Ventilatore2;            // cassetto

AnalogIn Temperatura_forno(A0);
AnalogIn Temperatura_sonda1(A1);        //da dare un nome
AnalogIn Temperatura_sonda2(A2);        //da dare un nome
AnalogIn Temperatura_sonda3(A3);        //da dare un nome
AnalogIn Temperatura_sonda4(A4);        //da dare un nome
AnalogIn Temperatura_sonda5(A5);        //da dare un nome

CD74HC165E Sensore(D12, D10, D9);  //(PinName PL, PinName CP, PinName Q7);
bool* sensori;
bool switch1=sensori[0];                //da dare un nome
bool switch2=sensori[1];                //da dare un nome
bool switch3=sensori[2];                //da dare un nome
bool switch4=sensori[3];                //da dare un nome
bool switch5=sensori[4];                //da dare un nome
bool switch6=sensori[5];                //da dare un nome

int switch_aperto;
int switch_chiuso;

Shifter scheda_8relay;          //!! pinout defined in library

int main()
{
    setup_griglia();
    lcd.SetBackColor(light_sky_blue);
    lcd.SetFont(&Font24);
    lcd.SetTextColor(black);
    while(1) {
//acquisisco la pressione sullo schermo per attivare i vari oggetti
        ts.ResetTouchData(&TS_State);
        ts.GetState(&TS_State);
        X = TS_State.touchX[0];                             //acquisisco la X
        Y = TS_State.touchY[0];                             //acquisisco la Y

        if (X>=20 && X<120 && Y>=20 && Y<80)    {       //ROAST
            roast(160,900);
        }
        if (X>=20 && X<120 && Y>=90 && Y<150)   {       //CLEAN
            clean(7200, 430.0, 460.0);
        }
        if (X>=20 && X<120 && Y>=160 && Y<220)  {       //STOP

        }
        if (TS_State.touchDetected) wait(0.1);

        object_update();
        
        wait(0.1);
    }//close while(1)
}//close main

//CLEAN
void clean(int clean_time, float setpointLOW, float setpointHIGH)
{
    Timer timer;
    timer.start();
    int previous_time, actual_time;
    previous_time = timer.read();
    Lampadina.stato=0;
    Resistenza1.stato=1;
    Resistenza2.stato=1;
    Cooling.stato=1;            //accendo ventilazione raffreddamento
    Bloccoporta.stato=1;        // chiudo porta
    lcd.DisplayStringAt(0, LINE(10), (uint8_t *)"CLEAN ATTIVO    ", LEFT_MODE); 
    // dovrei verificare se il tappo caffé è chiuso ma per ora non ho switch, aggiungere oggetto switch1

    // dovrei verificare se sportello caffé chiuso, aggiungere oggetto switch2

    while(1) {
        actual_time = timer.read();
        uint8_t text[30];
        //acquisisco la pressione sullo schermo per attivare i vari oggetti
        ts.ResetTouchData(&TS_State);
        ts.GetState(&TS_State);
        int X = TS_State.touchX[0];                             //acquisisco la X
        int Y = TS_State.touchY[0];                             //acquisisco la Y
        if (X>=20 && X<120 && Y>=160 && Y<220) {                //STOP
            stop();
            break;
        }
        //countdown dal clean_time a zero
        if (actual_time-previous_time >=1) {
            lcd.SetTextColor(black);
            sprintf((char*)text, "%5d", clean_time);
            lcd.DisplayStringAt(130,100, (uint8_t *)&text, LEFT_MODE);
            previous_time = actual_time;
            clean_time--;
        }
        //se il tempo di clean è finito porto gli output a zero e aggiorno, poi esco dal ciclo
        if (clean_time<0) {
            stop();
            break;
        }

        // regolo temperatura clean       
        if (Temperatura_forno.read() < setpointLOW) {
            Resistenza1.stato=1;
            object_update();
            //acquisisco la pressione sullo schermo per attivare i vari oggetti
            ts.ResetTouchData(&TS_State);
            ts.GetState(&TS_State);
            int X = TS_State.touchX[0];                             //acquisisco la X
            int Y = TS_State.touchY[0];                             //acquisisco la Y
            if (X>=20 && X<120 && Y>=160 && Y<220) {                //STOP
                stop();
                break;
            }
        }
        if (Temperatura_forno.read() > setpointHIGH) {
            Resistenza1.stato=0;
            object_update();
            //acquisisco la pressione sullo schermo per attivare i vari oggetti
            ts.ResetTouchData(&TS_State);
            ts.GetState(&TS_State);
            int X = TS_State.touchX[0];                             //acquisisco la X
            int Y = TS_State.touchY[0];                             //acquisisco la Y
            if (X>=20 && X<120 && Y>=160 && Y<220) {                //STOP
                stop();
                break;
            }
        }
        object_update();
    }
}

//STOP
void stop()
{
    //imposto TUTTI gli output, poi aggiorno
    Bloccoporta.stato=1;
    Cooling.stato=1;
    Ventilatore_turbo.stato=0;
    Lampadina.stato=0;
    Resistenza1.stato=0;
    Resistenza2.stato=0;
    Girarrosto.stato=0;
    Scarico_caffe.fermo();
    Ventilatore2.stato=0;
    object_update();
    lcd.DisplayStringAt(0, LINE(10), (uint8_t *)"    S T O P     ", LEFT_MODE);
    //da correggere, mettere le 2 grandezze nella stessa dimensione
    while (Temperatura_forno.read()>150) {
        wait(1.0);
        // scrivo qualcosa a video??
    }
    Cooling.stato=0;                // spengo ventilazione raffreddamento
    Bloccoporta.stato=0;            // apro porta
    object_update();
}

//SPORTELLO_SCARICO
void sportello_scarico(bool isDoorOpen)
{
    if (isDoorOpen) {
        while (switch_aperto==0) {
            Scarico_caffe.avanti();
            object_update();
            lcd.DisplayStringAt(0, LINE(10), (uint8_t *)"MOTORE AVANTI   ", LEFT_MODE); 
        }
    } else {
        while (switch_aperto==0) {
            Scarico_caffe.indietro();
            object_update();
            lcd.DisplayStringAt(0, LINE(10), (uint8_t *)"MOTORE INDIETRO ", LEFT_MODE);
        }
    }
    Scarico_caffe.fermo();
    object_update();
}

//ROAST
void roast (int roast_temp, int roast_time)
{
    Timer timer;
    timer.start();
    int previous_time, actual_time;
    previous_time = timer.read();
    // ************* PREHEATING *****************
    lcd.DisplayStringAt(0, LINE(10), (uint8_t *)"ROAST PREHEATING", LEFT_MODE);
    bool pre=1;
    Lampadina.stato=1;                      // accendo lampadina
    Ventilatore_turbo.stato=1;              // accendo ventilazione raffreddamento
    Bloccoporta.stato=1;                    // chiudo porta
    // dovrei verificare se il tappo caffé è chiuso ma per ora non ho switch, aggiungere oggetto switch1
    // dovrei verificare se sportello caffé chiuso, aggiungere oggetto switch2

    while(Temperatura_forno.read()<roast_temp and pre) {
        Resistenza1.stato=1;
        Resistenza2.stato=1;
        object_update();
        actual_time = timer.read();
        uint8_t text[30];

        // scrivo a video qualcosa ....

        //acquisisco la pressione sullo schermo per attivare i vari oggetti
        ts.ResetTouchData(&TS_State);
        ts.GetState(&TS_State);
        int X = TS_State.touchX[0];                             //acquisisco la X
        int Y = TS_State.touchY[0];                             //acquisisco la Y
        if (X>=20 && X<120 && Y>=160 && Y<220) {                //STOP
            stop();
            break;
        }
    }

    pre=0;
    // ************* ROAST *******************
    lcd.DisplayStringAt(0, LINE(10), (uint8_t *)"ROAST           ", LEFT_MODE);
    Resistenza2.stato=0;                // spengo extra resistenza
    Girarrosto.stato=1;                 // faccio partire motore mescolatore
    Ventilatore_turbo.stato=1;          // faccio partire turbo
    object_update();

    // aspetto carico caffé
    /*
    while (switch_carico=aperto)
    {
        }
    */

    //se il tempo di roast è finito porto gli output a zero e aggiorno, poi esco dal ciclo
    while (roast_time>0) {
        actual_time = timer.read();
        uint8_t text[30];
        //acquisisco la pressione sullo schermo per attivare i vari oggetti
        ts.ResetTouchData(&TS_State);
        ts.GetState(&TS_State);
        int X = TS_State.touchX[0];                             //acquisisco la X
        int Y = TS_State.touchY[0];                             //acquisisco la Y
        if (X>=20 && X<120 && Y>=160 && Y<220) {                //STOP
            // stop();
            break;
        }
        //countdown dal roast_time a zero
        if (actual_time-previous_time >=1) {
            lcd.SetFont(&Font24);
            lcd.SetTextColor(black);
            sprintf((char*)text, "%5d", roast_time);
            lcd.DisplayStringAt(130,100, (uint8_t *)&text, LEFT_MODE);
            previous_time = actual_time;
            roast_time--;
            // regolo temperatura roast
            if (Temperatura_sonda1.read()<roast_temp-5) {
                Resistenza1.stato=1;
                // aggiorno stato video
            }
            if (Temperatura_sonda1.read()>roast_temp+5) {
                Resistenza1.stato=0;
                // aggiorno stato video
            }
            object_update();
        }

        // *************** scarico caffè ***********
        Resistenza1.stato=0;        //spengo forno
        Ventilatore2.stato=1;       // accendo raffreddamento cassetto
        object_update();
        wait(2);
        sportello_scarico(1);       // apro scarico
        wait(2);
        sportello_scarico(0);       // chiudo scarico
        // aspetto 1 minuto e spengo raffreddamento caffé
        wait(60);
    }
    // spengo tutto
    stop();
}

//OBJECT_UPDATE
void object_update()
{
    //update delle immagini e dello stato delle uscite
    //disegno lo stato dei vari oggetti
    Lampadina.draw_image    (&_acLampadina_acceso[0], &_acLampadina_spento[0], Lampadina.stato, 310, 0);
    Ventilatore_turbo.draw_image       (&_acVentilatore_turbo_acceso[0], &_acVentilatore_turbo_spento[0], Ventilatore_turbo.stato, 310, 60);
    Cooling.draw_image (&_acCooling_acceso[0], &_acCooling_spento[0], Cooling.stato, 310, 120);
    Ventilatore2.draw_image (&_acVentilatore2_acceso[0], &_acVentilatore2_spento[0], Ventilatore2.stato, 310, 180);
    Bloccoporta.draw_image  (&_acBloccoporta_acceso[0], &_acBloccoporta_spento[0], Bloccoporta.stato, 360, 0);
    Girarrosto.draw_image   (&_acGirarrosto_acceso[0], &_acGirarrosto_spento[0], Girarrosto.stato, 360, 60);
    Resistenza1.draw_image  (&_acResistenza1_acceso[0], &_acResistenza1_spento[0], Resistenza1.stato, 360, 120);
    Resistenza2.draw_image  (&_acResistenza2_acceso[0], &_acResistenza2_spento[0], Resistenza2.stato, 360, 180);
    //update uscita 74HC595
    bool array[16]= {Bloccoporta.stato, Girarrosto.stato, Lampadina.stato, Ventilatore_turbo.stato, Resistenza1.stato, Resistenza2.stato, Cooling.stato, Ventilatore2.stato, Scarico_caffe.DCmotorA1, Scarico_caffe.DCmotorA2, 0,0,0,0,0,0};
    for (int i=0; i<16; i++) scheda_8relay.setPin(i,array[i]);
    scheda_8relay.write();
    //update sensori ingresso
    sensori=Sensore.Read();
    /*
    for (int i=7; i>=0; i--) {  //D7,D6,.....,D1,D0
        sprintf((char*)text, "%d", sensori[0+i]);
        lcd.DisplayStringAt(10,LINE(i), (uint8_t *)&text, LEFT_MODE);    
        printf(" %d", sensori[0+i]);        
        }*/
}