Software for display SSD1306 96*16, temperturesensor LMT85, pir motion sensor, 2 relais, modbus RTU and 4 buttons.

Dependencies:   SetupModbus ssd1306_96*16

main.cpp

Committer:
mikevd1
Date:
2018-10-01
Revision:
10:add6daafab4c
Parent:
9:a0fc48dd29c9

File content as of revision 10:add6daafab4c:

#include "mbed.h"
#include "setup.h"
#include "ssd1306.h"
#include "rtos.h"

// Threads & mutex control
Thread thread;
Thread thread1;
Thread thread2;
Thread thread3; 
Thread *(prior);
Mutex uartControl, temperatuurControl, bewegingControl, lcdControl ; 

// relais K1 & K2 
DigitalOut RelaisK1(PA_7);
DigitalOut RelaisK2(PA_6);

// ADC Temperatuursensor & bewegingssensor
AnalogIn temperatuurSensor(PA_1);
AnalogIn bewegingsSensor(PB_0);
int maxTemp = 30 ;

// Display
DigitalOut resetLCD(PB_5);
SSD1306 lcd (I2C_SDA, I2C_SCL);
int menuKnopPlaatsing = 0 ; 
int displayIsOff = 1 ; 
Timer displayOff ; 

/*
    dataModbus includes:
        RelaisK1
        RelaisK2
        Bewegingssensor
        Temperatuursensor    
    modbusOnOff turns off the modbus
*/
dataModbus values ;
int modbusOnOff = 0 ; 

//Interrupts button switches rising edge
InterruptIn switch1(PA_2);
InterruptIn switch2(PA_3);
InterruptIn switch3(PA_4);
InterruptIn switch4(PA_5);

// Temperatuurarray
static float TemperatuurArray[202] = 
{ 
3277 , 3266 , 3254 , 3243 , 3232 , 3221 , 3210 , 3199 , 3186 , 3173 ,
3160 , 3147 , 3134 , 3121 , 3108 , 3095 , 3082 , 3069 , 3056 , 3043 ,
3030 , 3017 , 3004 , 2991 , 2978 , 2965 , 2952 , 2938 , 2925 , 2912 ,
2899 , 2886 , 2873 , 2859 , 2846 , 2833 , 2820 , 2807 , 2793 , 2780 ,
2767 , 2754 , 2740 , 2727 , 2714 , 2700 , 2687 , 2674 , 2660 , 2647 , 
2633 , 2620 , 2607 , 2593 , 2580 , 2567 , 2553 , 2540 , 2527 , 2513 ,
2500 , 2486 , 2473 , 2459 , 2446 , 2433 , 2419 , 2406 , 2392 , 2379 ,
2365 , 2352 , 2338 , 2325 , 2311 , 2298 , 2285 , 2271 , 2258 , 2244 , 
2231 , 2217 , 2204 , 2190 , 2176 , 2163 , 2149 , 2136 , 2122 , 2108 ,
2095 , 2081 , 2067 , 2054 , 2040 , 2026 , 2012 , 1999 , 1985 , 1971 , 
1958 , 1944 , 1930 , 1916 , 1902 , 1888 , 1875 , 1861 , 1847 , 1833 , 
1819 , 1805 , 1791 , 1777 , 1763 , 1749 , 1735 , 1721 , 1707 , 1693 , 
1679 , 1665 , 1651 , 1637 , 1623 , 1609 , 1595 , 1581 , 1567 , 1553 ,
1539 , 1525 , 1511 , 1497 , 1483 , 1469 , 1455 , 1441 , 1427 , 1413 , 
1399 , 1385 , 1371 , 1356 , 1342 , 1328 , 1314 , 1300 , 1286 , 1272 , 
1257 , 1243 , 1229 , 1215 , 1201 , 1186 , 1172 , 1158 , 1144 , 1130 ,
1115 , 1101 , 1087 , 1073 , 1058 , 1044 , 1030 , 1015 , 1001 , 987  ,
973  , 958  , 944  , 929  , 915  , 901  , 886  , 872  , 858  , 843  ,
829  , 814  , 800  , 786  , 771  , 757  , 742  , 728  , 713  , 699  ,
684  , 670  , 655  , 640  , 626  , 611  , 597  , 582  , 568  , 553  ,
538
};

/*
    knoppen functionaliteit:
        omhoog
        omlaag
        select
        back
*/
void omhoog(void) 
{
    menuKnopPlaatsing = 1 ; 
}
void omlaag(void) 
{
    menuKnopPlaatsing = 2 ; 
}
void select(void) 
{
    menuKnopPlaatsing = 3 ; 
}
void back(void) 
{
    menuKnopPlaatsing = 4 ; 
}
/*
    modbusRunning thread 
*/
void modbusRunning() 
{
    static int checkReturnValue = 0 ;
    // waardes initialiseren
    values.RelaisK1 = 0;    // ventilator
    values.RelaisK2 = 0;    // Lamp
    values.temperatuur = 0 ; 
    values.beweging = 0 ;    
    values.slaveID = 0x07 ; 

    while(true)
    {
        if ( modbusOnOff == 1 ) 
        {
            uartControl.lock();
            checkReturnValue = modbus_read(&values) ;
            switch(checkReturnValue)
            {
                case 1 :
                    RelaisK1 = 1 ; 
                    RelaisK2 = 1 ;
                    break ; 
                case 2 :
                    RelaisK1 = 0 ;
                    RelaisK2 = 1 ;
                    break ;
                case 3 :
                    RelaisK1 = 1 ;
                    RelaisK2 = 0 ; 
                    break ;
                case 4 :
                    RelaisK1 = 0 ; 
                    RelaisK2 = 0 ;
                    break ; 
                default:
                break;                          
            }
            uartControl.unlock();      
        }  
    }
}
/*
    temperatuurSensorRunning thread1 
*/
void temperatuurSensorRunning()
{
    static float average = 0 , sum = 0 , Average16[16] ; 
    static int  i = 0, arrayNumber = 0 ; 
    int temp = 0 ; 
    while(true)
    {
        // circulaire array van 16
        if ( arrayNumber == 16 )
        {
            arrayNumber = 0 ;    
        }
        temperatuurControl.lock();
        Average16[arrayNumber] = temperatuurSensor ; 
        temperatuurControl.unlock();        
        arrayNumber++;
        sum = 0 ;
        for( i = 0 ; i < 16 ; i++ )
        {
            //optellen en gemiddelde nemen
            sum += Average16[i];
        }
        //gemiddelde van 16 waardes vermenigvuldigen met de maximale waarde
        average = (sum / 16) * 3300 ; 
        i = 0 ; 
        int x = 1 ; 
        while(x)
        {
            if ( average > TemperatuurArray[i+1] && average < TemperatuurArray[i] ) 
            {
                // uit while loop juiste referentie waarde gevonden
                x = 0 ; 
                // message the temperatuur door int i
                temp = i ;
                temperatuurControl.lock(); 
                values.temperatuur = temp-52 ;    
                temperatuurControl.unlock();  
            }
            else 
            {
                i++;
            }
        }
        // modbus niet aan temperatuur wordt hier geregeld. 
        if ( values.temperatuur > maxTemp && modbusOnOff == 0 )
        {
            RelaisK1 = 1 ;   // ventilator
        }
        // modbus niet aan temperatuur wordt hier geregeld. 
        else if( values.temperatuur < maxTemp && modbusOnOff == 0)
        {
            RelaisK1 = 0 ;  // ventilator
        }
        else
        {}
    }
}
/*
    bewegingsSensorRunning thread2
*/
void bewegingsSensorRunning()
{
    float bewegingssensorADC = 0 ; 
    while(true)
    {
        bewegingControl.lock();
        bewegingssensorADC = bewegingsSensor ; 
        bewegingControl.unlock();
        if(  bewegingssensorADC < (float)0.4 ) 
        {
            // message beweging gedetecteerd
            // zet lamp aan
            bewegingControl.lock();
            values.beweging = 1 ; 
            bewegingControl.unlock();
            //wait_ms(200);
            //wait(1);
            if ( displayIsOff == 0 ) 
            {
                menuKnopPlaatsing = 1 ; 
                displayIsOff = 1 ;
            }
        }
        else 
        {
            // geen beweging gezien
            bewegingControl.lock();
            values.beweging = 0 ; 
            bewegingControl.unlock();
        }
        
        // modbus niet aan temperatuur wordt hier geregeld. 
        if( modbusOnOff == 0 && displayIsOff == 1 )
        { 
            RelaisK2 = 1 ;   // lamp
        }
        // modbus niet aan temperatuur wordt hier geregeld. 
        else if(modbusOnOff == 0 && displayIsOff == 0  )
        {
            RelaisK2 = 0 ;  // lamp
        }
        else
        {
        }        
    }
}
/*
    displayRunning thread3
*/
void displayRunning()
{ 
    resetLCD = 1 ;
    resetLCD = 0 ;
    resetLCD = 1 ;
    lcdControl.lock();
    lcd.speed(SSD1306::Fast);
    lcdControl.unlock();
    lcdControl.lock();
    lcd.init();
    lcdControl.unlock();
    lcdControl.lock();
    lcd.bitMap();
    lcd.redraw();
    lcdControl.unlock();
    int plaats = 1 ;  
    displayOff.start();
    while(true)
    {
        if ( menuKnopPlaatsing != 0 ) 
        {
            displayIsOff = 1 ;
            displayOff.start();
            displayOff.reset();
            // knop functionaliteit
            switch(menuKnopPlaatsing)
            {
                case 1 :
                    //omhoog
                    plaats--;
                break;
                case 2 :
                    //omlaag
                    plaats++; 
                break; 
                case 3 :
                    // select
                    switch(plaats)
                    {
                        case 1:
                            plaats = 7 ; 
                        break ; 
                        case 2:
                            plaats = 10; 
                        break;
                        case 10 :
                            plaats = 16 ;
                        break; 
                        case 11 :
                            plaats = 19 ; 
                        break;
                        case 12 :
                            plaats = 22 ; 
                        break;
                        case 13 :
                            plaats = 26 ; 
                        break;
                        case 22: 
                            // turn on relais  
                            RelaisK1 = 0 ; 
                        break;
                        case 23:
                            // turn off relais
                            RelaisK1 = 1 ; 
                        break; 
                        case 26:
                            // turn on relais K2
                            RelaisK2 = 0 ; 
                        break;
                        case 27:
                            // turn off relais K2
                            RelaisK2 = 1 ; 
                        break; 
                        case 7 :
                            plaats = 30 ; 
                        break;
                        case 5:
                            plaats = 33 ;
                        break;
                        case 33:
                            // start proces modbus
                            modbusOnOff = 1 ; 
                        break;
                        case 34:
                            // terminate proces modbus
                            modbusOnOff = 0 ;                             
                        break;
                        case 6:
                            plaats = 37 ;
                        break;
                        default:
                            //plaats = 1 ; 
                        break ; 
                    }
                break ; 
                case 4 :
                    //back
                    switch(plaats)
                    {
                        case 5:
                            plaats = 1 ; 
                        break ; 
                        case 6:
                            plaats = 1; 
                        break;
                        case 7:
                            plaats = 1;
                        break;
                        case 10:
                            plaats = 2 ; 
                        break ; 
                        case 11:
                            plaats = 2; 
                        break;
                        case 12:
                            plaats = 2; 
                        break;
                        case 13:
                            plaats = 2;
                        break;
                        case 16: 
                            plaats = 10 ; 
                        break; 
                        case 19:
                            plaats = 11 ; 
                        break; 
                        case 22:
                            plaats = 12 ;
                        break; 
                        case 23:
                            plaats = 12 ;
                        break;
                        case 26: 
                            plaats = 13 ; 
                        break; 
                        case 27: 
                            plaats = 13 ; 
                        break;                         
                        case 30:
                            plaats = 7 ;
                        break ;  
                        case 33:
                            plaats = 5 ;
                        break;
                        case 34:
                            plaats = 5 ;
                        break;
                        case 37 :
                            plaats = 6 ;
                        break; 
                        default:
                            plaats = 1 ; 
                        break ; 
                    }
                break ; 
                default :
                break; 
            }
            // loop maken omhoog/omlaag
            switch(plaats)
            {
                // menu deel 1
                case 0:
                    plaats = 2 ;
                break ;
                case 3:
                    plaats = 1 ;
                break ; 
                // menu deel 2
                case 4:
                    plaats = 7 ;
                break ;
                case 8:
                    plaats = 5 ;
                break ; 
                // menu deel 3
                case 9:
                    plaats = 13 ;
                break ;
                case 14:
                    plaats = 10 ;
                break ; 
                // menu deel 4
                case 15:
                    plaats = 16 ; 
                break;
                case 17:
                    plaats = 16 ; 
                break; 
                case 18 :
                    plaats = 19 ; 
                break;
                case 20 :
                    plaats = 19 ; 
                break; 
                case 21 :
                    plaats = 23 ; 
                break;
                case 24 :
                    plaats = 22 ;
                break;
                case 25 : 
                    plaats = 27 ; 
                break; 
                case 28 :
                    plaats = 26 ; 
                break;
                case 29:
                    plaats = 30 ;
                    values.slaveID++;
                break;
                case 31:
                    plaats = 30 ; 
                    values.slaveID--;
                break; 
                case 32:
                    plaats = 34 ; 
                break;
                case 35:
                    plaats = 33 ; 
                break;
                case 36:
                    plaats = 37 ; 
                    maxTemp++;
                break ; 
                case 38:
                    plaats = 37 ; 
                    maxTemp--;
                break; 
                default:
                break;                 
            }
            
            menuKnopPlaatsing = 0 ; 
            lcd.cls();
            lcd.locate(0,0);
            switch(plaats)
            {
                case 1 :
                    lcd.printf("settings[x]");
                    lcd.locate(1,0);
                    lcd.printf("data[]");
                break ;
                case 2 :
                    lcd.printf("settings[]");
                    lcd.locate(1,0);
                    lcd.printf("data[x]");
                break;
                case 5 :
                    lcd.printf("modbus");
                    lcd.locate(1,0);
                    lcd.printf("on/off[x]");
                break;
                case 6 :
                    lcd.printf("temp");
                    lcd.locate(1,0);
                    lcd.printf("max[x]");
                break;
                
                case 7 :
                    lcd.printf("modbus");
                    lcd.locate(1,0);
                    lcd.printf("adres[x]");
                break;
                case 10 :
                    lcd.printf("temp[x]");
                    lcd.locate(1,0);
                    lcd.printf("beweging[]");
                break;
                case 11 :
                    lcd.printf("temp[]");
                    lcd.locate(1,0);
                    lcd.printf("beweging[x]");
                break;
                case 12 :
                    lcd.printf("relaisK1[x]");
                    lcd.locate(1,0);
                    lcd.printf("relaisK2[]");
                break;
                case 13 :
                    lcd.printf("relaisK1[]");
                    lcd.locate(1,0);
                    lcd.printf("relaisK2[x]");
                break;
                case 16 :
                    lcd.printf("temp:");
                    lcd.locate(1,0);
                    lcd.printf("%d" , values.temperatuur);
                break;                
                case 19 :
                    lcd.printf("beweging:");
                    lcd.locate(1,0);
                    lcd.printf("%d" , values.beweging );
                break;
                case 22 :
                    lcd.printf("K1 aan[]");
                    lcd.locate(1,0);
                    lcd.printf("K1 uit[x]");
                break;
                case 23 :
                    lcd.printf("K1 aan[x]");
                    lcd.locate(1,0);
                    lcd.printf("K1 uit[]");
                break;
                case 26 :
                    lcd.printf("K2 aan[]");
                    lcd.locate(1,0);
                    lcd.printf("K2 uit[x]");
                break;                
                case 27 :
                    lcd.printf("K2 aan[x]");
                    lcd.locate(1,0);
                    lcd.printf("K2 uit[]");
                break;
                case 30 :
                    lcd.printf("modadres");
                    lcd.locate(1,0);
                    lcd.printf("%d" , values.slaveID);                
                break ;
                case 33:
                    lcd.printf("Mod aan[x]");
                    lcd.locate(1,0);
                    lcd.printf("Mod uit[]");                    
                break;
                case 34:
                    lcd.printf("Mod aan[]");
                    lcd.locate(1,0);
                    lcd.printf("Mod uit[x]");                    
                break;  
                
                case 37 :
                    lcd.printf("max temp");
                    lcd.locate(1,0);
                    lcd.printf("%d" , maxTemp);                
                break ;                
                
                                       
                default:
                    lcd.printf("error 1");
                break;    
            }
            lcd.redraw();
            wait(1); 
         }
         else
         {
            wait(1);   
            if(displayOff.read() > (float)60)
            {
                // turn off display after 60 seconds
                lcd.cls();
                lcd.cls();
                lcd.redraw();   
                displayOff.stop();
                displayOff.reset();
                plaats = 1 ; 
                displayIsOff = 0 ; 
            }
         } 
    }
}

int main() 
{
    // interrupt menu switches
    switch1.rise(omhoog);
    switch2.rise(omlaag);
    switch3.rise(select);
    switch4.rise(back);

    //prioriteit modbus hoog    
    prior = &thread ; 
    prior->set_priority(osPriorityHigh);
    //prioriteit temperatuur & beweging normaal    
    prior = &thread1 ; 
    prior->set_priority(osPriorityNormal);
    prior = &thread2 ; 
    prior->set_priority(osPriorityNormal);
    //prioriteit display laag
    prior = &thread3 ; 
    prior->set_priority(osPriorityBelowNormal);
    
    //Modbus
    thread.start(modbusRunning);
    //Temperatuursensor
    thread1.start(temperatuurSensorRunning);
    //Bewegingssensor
    thread2.start(bewegingsSensorRunning);
    // Display
    thread3.start(displayRunning);

}