Embedded C project:18/12/2014

Dependencies:   DS1307 TextLCD mbed

main.cpp

Committer:
ninoderkinderen
Date:
2014-12-18
Revision:
0:8d87bc453349

File content as of revision 0:8d87bc453349:

//library's
#include "mbed.h"
#include "TextLCD.h"
#include "ds1307.h"
#include "EthernetNetIf.h"
//#include "HTTPClient.h"
//#include "NTPClient.h"
#include "HTTPServer.h"
#include "RPCFunction.h"
//Pin initialisatie
AnalogIn binnen(p19);//pin 19:Analog In
AnalogIn buiten(p20);//pin 20:Analog In
TextLCD lcd(p15, p16, p21, p22, p23, p24); //rs, e, d4-d7
InterruptIn knopUP(p6);//pin6:Interrupt
InterruptIn knopDOWN(p5);//pin5:Interrupt
InterruptIn knopINSTEL(p7);//pin7:Interrupt
InterruptIn knopBACK(p8);//pin8:Interrupt
DS1307 my1307(p9, p10);//pin9:sda I2C
DigitalOut relais(p30);//pin10:scl I2C
DigitalOut RGBblauw(p29);//pin29:digital out
DigitalOut RGBgroen(p28);//pin28:digital out
DigitalOut RGBrood(p27);//pin27:digital out
PwmOut Servo(p25);//p25:pwm out
Serial pc(USBTX,USBRX);//serial port:USB
DigitalOut led1(LED1, "led1");
/* HTTP Instellingen */
EthernetNetIf eth(                                                                  //We gaan de functie van ethernet opendoen om hierin de gewenste adressen in te kunnen gaan voegen.
    IpAddr(192,168,1,2),                                                            //Ip adres toedienen waarop de MBED verbonden word.
    IpAddr(255,255,255,0),                                                          //Subnetmasker voor de MBED.
    IpAddr(192,168,1,1),                                                            //Het IP adres waarop we gaan schrijven.
    IpAddr(192,168,1,1));                                                           //Het IP adres waarvan we gaan lezen.
    HTTPServer svr;                                                                 // Opstarten van de HTTP server met de bovenliggende eigenschappen.
/* END HTTP */
//variabelen
float i = 0;//waarde om binnentempertauur in te steken
float j = 0;//waarde om buitentemperatuur in te steken
int reftemp = 20;//referentietemperatuur
int load=0;//load program
int tellertijd =0;//uit tijdsuitlezing te geraken
int c=0;
//variabelen RTC
 int sec;
 int minu;
 int hours;
 int day;
 int date;
 int month;
 int year;
 //RTC read routine
 void test_rw(int test) {
} 
//interruptroutine: referentietemp instellen
void instellen()
{
    knopDOWN.rise(NULL);
    knopUP.rise(NULL);//interrupt disable
    wait(0.5);
    while(knopINSTEL == 0)
    {
        lcd.locate(0,0);
        lcd.printf(" Instellen Temp");
        lcd.locate(0,1);
        lcd.printf("   Temp = %iC", reftemp);//Printen ingestelde referentietemp
        if(knopUP == 1)//knopUP bediend --> reftemp +1
        {
            reftemp++;
            wait(0.4);
        }
        if(knopDOWN == 1)//knopDOWN bediend --> reftemp -1
        {
            reftemp--;
            wait(0.4);
        }
        if (reftemp == 33)//hysteresis reftemp
        {
            reftemp = 15;
        }
        if (reftemp == 14)//hysteresis reftemp
        {
            reftemp = 32;
        }
    }
}
//interruptroutine: tijdsweergave
void back()
{
    wait(0.3);
    tellertijd=0;
    lcd.cls();//LCD clead
    knopBACK.rise(NULL);
    knopUP.rise(NULL);//disable interrupt
    while(tellertijd < 50)//doorolopen wanneer knopBack NIET is ingedrukt,bij bediening uit routine
    {
        test_rw(my1307.gettime( &sec, &minu, &hours, &day, &date, &month, &year));//uitlezen tijd RTC
        //Dag uitschrijven op lcd
        if(day == 1)
        {lcd.locate(3,1);
        lcd.printf("Ma");}
        if(day == 2)
        {lcd.locate(3,1);
        lcd.printf("Di");}
        if(day == 3)
        {lcd.locate(3,1);
        lcd.printf("Wo");}
        if(day == 4)
        {lcd.locate(3,1);
        lcd.printf("Do");}
        if(day == 5)
        {lcd.locate(3,1);
        lcd.printf("Vr");}
        if(day == 6)
        {lcd.locate(3,1);
        lcd.printf("Za");}
        if(day == 7)
        {lcd.locate(3,1);
        lcd.printf("Zo");}
        test_rw(my1307.gettime( &sec, &minu, &hours, &day, &date, &month, &year));//uitlezen tijd RTC
        //Uur min sec //Dag datum maand jaar
                if(sec >= 9 && minu >= 9 && hours >= 9)
                {
                    lcd.locate(4,0);
                    lcd.printf("%d:%d:%d",hours,minu,sec);
                    lcd.locate(6,1);
                    lcd.printf("%d/%d/%d",date,month,year);
                }
                if(sec <= 9 && minu >= 9 && hours >= 9)
                {
                    lcd.locate(4,0);
                    lcd.printf("%d:%d:0%d",hours,minu,sec);
                    lcd.locate(6,1);
                    lcd.printf("%d/%d/%d",date,month,year);
                }
                if(sec >= 9 && minu <= 9 && hours >= 9)
                {
                    lcd.locate(4,0);
                    lcd.printf("%d:0%d:%d",hours,minu,sec);
                    lcd.locate(6,1);
                    lcd.printf("%d/%d/%d",date,month,year);
                }
                if(sec >= 9 && minu >= 9 && hours <= 9)
                {
                    lcd.locate(4,0);
                    lcd.printf("0%d:%d:%d",hours,minu,sec);
                    lcd.locate(6,1);
                    lcd.printf("%d/%d/%d",date,month,year);
                }
                if(sec <= 9 && minu <= 9 && hours >= 9)
                {
                    lcd.locate(4,0);
                    lcd.printf("%d:0%d:0%d",hours,minu,sec);
                    lcd.locate(6,1);
                    lcd.printf("%d/%d/%d",date,month,year);
                }
                if(sec <= 9 && minu >= 9 && hours <= 9)
                {
                    lcd.locate(4,0);
                    lcd.printf("0%d:%d:0%d",hours,minu,sec);
                    lcd.locate(6,1);
                    lcd.printf("%d/%d/%d",date,month,year);
                }
                if(sec >= 9 && minu <= 9 && hours <= 9)
                {
                    lcd.locate(4,0);
                    lcd.printf("0%d:0%d:%d",hours,minu,sec);
                    lcd.locate(6,1);
                    lcd.printf("%d/%d/%d",date,month,year);
                }
                if(sec <= 9 && minu <= 9 && hours <= 9)
                {
                    lcd.locate(4,0);
                    lcd.printf("0%d:0%d:0%d",hours,minu,sec);
                    lcd.locate(6,1);
                    lcd.printf("%d/%d/%d",date,month,year);
                }
                wait(0.2);
                tellertijd++;
    }
}
//interruptroutine: start programma
void start()
{
    knopINSTEL.rise(NULL);
    knopBACK.rise(NULL);
    knopDOWN.rise(NULL);
    knopUP.rise(NULL);//disable interrupt
    lcd.cls();//LCD clear
    /*OPSTART ROUTINE START*/
    lcd.locate(0,0);
    lcd.printf("SYSTEM START");
    lcd.locate(0,1);
    lcd.printf("LOAD PROGRAM");
    wait(2);
    lcd.cls();
    lcd.locate(0,0);
    lcd.printf("SYSTEM START");
    lcd.locate(0,1);
    lcd.printf("LOAD: %d",load);
    for(int l=0;l<=40;l++)
    {
        load = l;
        lcd.locate(0,1);
        lcd.printf("LOAD: %d",load);
        wait(0.1);
    }
    wait(1);
    for(int l=40;l<=70;l++)
    {
        load = l;
        lcd.locate(0,1);
        lcd.printf("LOAD: %d",load);
        wait(0.2);
    }
    wait(1);
    for(int l=70;l<=100;l++)
    {
        load = l;
        lcd.locate(0,1);
        lcd.printf("LOAD: %d",load);
        wait(0.2);
    }
    wait(1);
    lcd.cls();
    lcd.locate(0,0);
    lcd.printf("SYSTEM START");
    lcd.locate(0,1);
    lcd.printf("PROGRAM START");
    wait(3);
    /*OPSTARTROUTINE END*/
}
//interruptroutine: programma stoppen
void afsluiten()
{
    knopUP.rise(&start);//interrupt koppelen met routine
    knopINSTEL.rise(NULL);
    knopBACK.rise(NULL);
    knopDOWN.rise(NULL);//disabel interrupt
    lcd.cls();//lcd clear
    /*AFSLUITROUTINE START*/
    lcd.locate(0,0);
    lcd.printf("SYSTEM SHUTDOWN");
    wait(2);
    relais = 0;//relais uit
    RGBrood = 0;
    RGBgroen = 0;
    RGBblauw = 0; //RGB uit
    while(knopUP == 0)
    {
        lcd.cls();
        lcd.locate(0,0);
        lcd.printf("SYSTEM OFF");
        wait(0.2);
    }
    /*AFSLUITROUTINE END*/
}
/*MAIN PROGRAM*/
int main()
{
          
    wait(1);
    while(1) 
    {   EthernetErr ethErr;
        int count = 0;
        do {
         printf("Setting up %d...\n\r", ++count);
            ethErr = eth.setup();
            if (ethErr) printf("Timeout\n\r", ethErr);
         } while (ethErr != ETH_OK);

        printf("Connected OK\n\r");
        const char* hwAddr = eth.getHwAddr();

         IpAddr ethIp = eth.getIp();
            printf("IP address : %d.%d.%d.%d\n\r", ethIp[0], ethIp[1], ethIp[2], ethIp[3]);
            
            LocalFileSystem fs("webfs");
            
            svr.addHandler<SimpleHandler>("/hello");
            svr.addHandler<FSHandler>("");
            
    svr.bind(80);
    printf("Server listening\n\r");
        knopINSTEL.rise(&instellen);
        knopBACK.rise(&back);
        knopDOWN.rise(&afsluiten);//interrupts koppelen met routines(bovenaan gedeclareerd)
        i=0;
        j=0;//variabele temperatuurwaardes 0 zetten
        for(int a=0;a<5;a++)
        {
            for(int t=0;t<100;t++) 
            {
                i=i+binnen.read(); //uitlezen temp 
            }
            for(int k=0;k<100;k++) 
            {
                j=j+buiten.read(); //uitlezen temp 
            }
            wait(0.1);
        }
        i = (i*3.3)/5;
        j = (j*3.3)/5;//berekening juiste temperatuur: Waarde*3.3V/5(for lus van 5)
        lcd.cls();//lcd clear
        lcd.locate(0,0);
        lcd.printf("Binnen:%4.1fC", i);
        lcd.locate(0,1);
        lcd.printf("Buiten:%4.1fC", j);//LCD print temperaturen
        wait(1);
        pc.printf("\n\n\rTemperatuur binnen: %4.1f C",i);
        pc.printf("\n\n\rTemperatuur buiten: %4.1f C",j);
        pc.printf("\n\n\r------------------------------------------");//PC print temperaturen
        wait(0.5);
        if(i > (reftemp + 2) && i <= (reftemp +4))//Temperatuur te HOOG: reftemp >2 en reftemp <=4
        {
            wait(2);
            relais = 1;//relais aan
            RGBrood = 1;
            RGBgroen = 1;
            RGBblauw = 0;//rgb rood + groen = oranje
            wait(1);
            Servo.period_ms(20);//servo pwm periode
            Servo = (130 * 0.000511 + 0.026); // rechts-half servo
        }
        else if(i > (reftemp + 3.5))//Temperatuur te HOOG: reftemp > 3.5 (hysteresis ingebouwd)
        {
            wait(2);
            relais = 1;//relais aan
            RGBrood = 1;
            RGBgroen = 0;
            RGBblauw = 0;//rgb rood
            wait(1);
            Servo.period_ms(20);//servo pwm periode
            Servo = (160 * 0.000511 + 0.026); // rechts servo
        }
        else if(i < (reftemp - 2) && i >= (reftemp -4))//Temperatuur te LAAG: reftemp>2 & reftemp <4
        {
            wait(2);
            relais = 0;//relais uit
            RGBrood = 1;
            RGBgroen = 0;
            RGBblauw = 1;//rgb rood + blauw= paars
            wait(1);
            Servo.period_ms(20);//servo pwm periode
            Servo = (55 * 0.000511 + 0.026); // links-half servo
        }
        else if(i < (reftemp - 3.5))//Temperatuur te LAAG: reftemp>4
        {
            wait(2);
            relais = 0;//relais uit
            RGBrood = 0;
            RGBgroen = 0;
            RGBblauw = 1;//rgb blauw
            wait(1);
            Servo.period_ms(20);//servo pwm period
            Servo = (5 * 0.000511 + 0.026); // links servo
        }
        else//Temperatuur OKE: reftemp binnen hysteresis +2 & -2
        {
            wait(1);
            relais = 0;
            RGBrood = 0;
            RGBgroen = 1;
            RGBblauw = 0;//rgb groen
            wait(1);
            Servo.period_ms(20);//servo pwm period
            Servo = (90 * 0.000511 + 0.026); // 0-positie servo
        }
        wait(1);
            printf("Doorlopen\r\n");
            FILE *fp = fopen("/webfs/mydata.htm","w");
            fprintf(fp,"<HTML>\r\n");                                               //HTML opstarten
            fprintf(fp,"<HEAD>\r\n");                                               //Head van het bestand open zetten.
            fprintf(fp,"<script type=\"text/javascript\">window.setTimeout(function(){ document.location.reload(true); }, 3000);</script>");//Script laden  
            fprintf(fp,"<link rel=\"stylesheet\" href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css\">");//Stijl van het document laden
            fprintf(fp,"<style>\r\n");//De style toepassen die is opgevraagd          
            fprintf(fp,"tbody {background:#FF8866;}");//Achtergrond veranderen van kleur
            fprintf(fp,"</style>\r\n");//De aangemaakt stijl terug sluiten
            fprintf(fp,"</HEAD>\r\n");//Sluiten van de HEAD
            fprintf(fp,"<BODY>\r\n");//Sluiten van de BODY
            fprintf(fp,"<div class=\"container\">\r\n");      
            fprintf(fp,"<div class=\"panel panel-success\">");
            fprintf(fp,"<table class=\"table\">");//Aanmaken van tabel
            fprintf(fp,"<thead><tr><th>binnen</th><th>buiten</th></tr></thead>"); 
            fprintf(fp,"<tbody><tr><td>%.1f &deg;C</td>",i);
            fprintf(fp,"<td>%.1f &deg;C</td></tr></tbody></table></div>",j);
            fprintf(fp,"</div>");
            printf("Variabelen printen\r\n");
            fprintf(fp,"</BODY>\r\n");
            fprintf(fp,"</HTML>\r\n");
            printf(" %f + %f",i,j);
            printf("Sessie stoppen \r\n"); 
            fclose(fp);
            wait(1);
    }
}