Project verwarmingsregelaar

Dependencies:   DS1307 Servo TextLCD mbed

Fork of Project_02_programma by Robin Bogaerts

main.cpp

Committer:
r0446849
Date:
2014-12-18
Revision:
1:8aada2d4df12
Parent:
0:b0e0ec2415bc

File content as of revision 1:8aada2d4df12:

//Project_02
#include "mbed.h"
#include "TextLCD.h"
#include "Servo.h"
#include "ds1307.h"

DigitalOut ledr(p5);                        //RGB led rood
DigitalOut ledg(p6);                        //RGB led groen
DigitalOut ledb(p7);                        //RGB led blauw
DigitalOut relais(p8);                      //Relais
DS1307 my1307(p9,p10);                      //start DS1307 class and give it pins for connections of the DS1307 device
InterruptIn push1(p11);                     //drukknop onder interrupt mogelijk (hoger)
InterruptIn push2(p12);                     //drukknop onder interrupt mogelijk (lager)
InterruptIn push3(p13);                     //drukknop onder interrupt mogelijk (bevestigen)
InterruptIn push4(p14);                     //drukknop onder interrupt mogelijk (anuleren)
AnalogIn temp01(p19);                       //LM35 Binnen
AnalogIn temp02(p20);                       //LM35 Buiten
PwmOut myservo(p22);                        //Servo motor met pwm
PwmOut LCDBack(p21);                        //backlight LCD control
TextLCD lcd(p25, p26, p27, p28, p29, p30);  //LCD

float licht=0;                      //backlight
float vorig_licht=0;                //backlight onthouden van waarde
float i=0;                          //temperatuur 01
float j=0;                          //temperatuur 02
float ingesteld=21;                 //ingestelde temperatuur
float vorige_instelling=21;         //ingestelde temperatuur onthouden van waarde

int sec;                            //RTC
int min;                            //RTC
int hours;                          //RTC
int day;                            //RTC
int date;                           //RTC
int month;                          //RTC
int year;                           //RTC

void test_rw(int test) {                    //RTC Klok
}

void menu(void){    
    lcd.cls();                              //Menu load screen (anti dender, als de knop te lang word
    lcd.locate(0,0);                        //ingedrukt kan dit per ongeluk al een volgende functie
    lcd.printf("******Menu******");         //starten vandaar dit load screen om dit te vermijden.
    lcd.locate(0,1);                        //men kan ook gewoon een wait plaatsen van een seconde.)
    lcd.printf("Laden .");                  //en clear LCD
    wait(0.5);  
    lcd.locate(0,1);
    lcd.printf("Laden ..");
    wait(0.5);
    lcd.locate(0,1);
    lcd.printf("Laden ...");
    wait(0.5);
    while(push4 == 0){                                  //while anuleren niet is in gedrukt
        while(push1 == 0 && push2 == 0 && push4 == 0){  //while drukknoppen 1,2 en 4 niet ingedrukt zijn
            ledr = 0;                                   //aansturing RGB led
            ledg = 0;
            ledb = 0;
            lcd.cls();                                  //keuze menu weergeven en clear LCD
            lcd.locate(0,0);                            //Plaats LCD cursor op de juiste plaats
            lcd.printf("******Menu******");
            lcd.locate(0,1);
            lcd.printf("1: Helderheid");
            wait(1);
            lcd.cls();                                  //clear LCD
            lcd.locate(0,0);
            lcd.printf("******Menu******");
            lcd.locate(0,1);
            lcd.printf("4: Terug");
            wait(1);
        }
        if(push1 == 1){                         //als drukknop 1 word ingedrukt
            lcd.cls();                          //Drukknop info weergeven en clear LCD
            lcd.locate(0,0);
            lcd.printf("Menu: Helderheid");
            lcd.locate(0,1);
            lcd.printf("<+ -> bev. anu.");
            wait(0.5); 
            vorig_licht = licht;                //vergrendel de vorige waarde van licht indien er word geanuleerd
            while(push3 == 0 && push4 == 0){    //while drukknoppen 3 en 4 niet ingedrukt zijn
                LCDBack = licht;                //geef de backlight de waarde van licht
                if(push1 == 1){                 //Als drukknop 1 word ingedrukt
                    licht = licht - 0.05;       //Licht doen toenemen, de variabele word verkleint
                    ledr = 1;                   //aansturen led voor indicatie toename
                    ledg = 1;
                    ledb = 0;
                    if(licht <= 0){             //Als licht kleiner of gelijk aan 0 is word de waarde automatisch
                        licht = 0;              //terug 0, dit zorgt er voor dat de waarde steeds tussen 0 en 1 blijft.
                    }
                    wait(0.2);
                }
                if(push2 == 1){                 //Als drukknop 2 word ingedrukt
                    licht = licht + 0.05;       //Licht doen afnemen, de variabele word vergroot
                    ledr = 0;                   //aansturen led voor indicatie afname
                    ledg = 1;
                    ledb = 1;
                    if(licht >= 1){             //Als licht groter of gelijk aan 1 is word de waarde automatisch
                        licht = 1;              //terug 1, dit zorgt er voor dat de waarde steeds tussen 0 en 1 blijft.
                    }
                    wait(0.2);
                }
                wait(0.5);    
            }
            if(push4 == 1){                     //Als drukknop 4 ingedrukt word (Anulatie)
                licht = vorig_licht;            //licht krijgt de vorige waarde terug
            }
        }
    }
    if(push3 == 1){                 //Als drukknop 3 ingedrukt word (Bevestiging)
        lcd.cls();                  //indicatie bevestiging op LCD en clear LCD
        lcd.locate(0,0);
        lcd.printf("Invoer");
        lcd.locate(0,1);
        lcd.printf("bevestigd");
        wait(2);
    }
    push1.rise(NULL);           //Verwijder interupt flags
    push2.rise(NULL);
    push3.rise(NULL);
    push4.rise(NULL);
    LCDBack = licht;            //Backlight aansturen
    lcd.cls();                  //indicatie voor verlaten van menu en clear LCD
    lcd.locate(0,0);
    lcd.printf("Terug naar");
    lcd.locate(0,1);
    lcd.printf("programma");
    wait(2);

}

void instelling(){
    wait(2);    
    lcd.cls();                                      //clear LCD                                          
    lcd.printf("instelling %1.1f", ingesteld);      //plaats ingestelde waarde op LCD
    vorige_instelling = ingesteld;                  //vergrendel de vorige waarde van ingesteld indien er word geanuleerd
    while(push3 == 0 && push4 == 0){                //while drukknoppen 3 en 4 niet ingedrukt zijn
        ledr = 0;                                   //aansturen led
        ledg = 0;
        ledb = 0;
        lcd.locate(0,1);                            //bepaal cursor locatie LCD
        lcd.printf("naar --> %1.1f", ingesteld);    //plaats de nieuwe waarde op het LCD
        if(push1 == 1){                             //Als drukknop 1 ingedrukt word
            ingesteld = ingesteld + 0.5;            //ingestelde waarde laten toenemen
            ledr = 1;                               //aansturen led voor indicatie toename
            ledg = 0;
            ledb = 0;
            wait(0.5);
        }
        if(push2 == 1){                             //Als drukknop 2 ingedrukt word
            ingesteld = ingesteld - 0.5;            //ingestelde waarde laten afnemen
            ledr = 0;                               //aansturen led voor indicatie afname
            ledg = 0;
            ledb = 1;
            wait(0.5);
        }
        wait(0.5);    
    }
    if(push4 == 1){                                 //Als drukknop 4 ingedrukt word (Anulatie)
        ingesteld = vorige_instelling;              //de ingestelde waarde verkrijgt de vorige waarde terug
    }
    push1.rise(NULL);       //Verwijder interupt flags
    push2.rise(NULL);
    push3.rise(NULL);
    push4.rise(NULL);
    lcd.cls();                  //indicatie voor verlaten van menu en clear LCD
    lcd.locate(0,0);
    lcd.printf("Terug naar");
    lcd.locate(0,1);
    lcd.printf("programma");
    wait(2);
}

int main(){
    int junk = 0;                           //RTC Klok
    
    myservo = (5 * 0.000511 + 0.026);       //Motor op 90 graden zetten, dit is de begin toestand.
    lcd.cls();                              //clear LCD
    lcd.printf("Welkom");                   //Welkom scherm
    lcd.locate(0,1);
    lcd.printf("Opstarten ...");
    wait(3);
    while(1){
        push1.rise(&instelling);            //drukknooppen 1 tot en met 3 onder interrupt
        push2.rise(&instelling);
        push3.rise(&menu);
        
        test_rw(my1307.gettime( &sec, &min, &hours, &day, &date, &month, &year));       //uitlezen waarde RTC
        
        junk = 0x39;                            // just a junk value do read and write test to DS1307 ram
        test_rw(my1307.write( 0x20, junk));     // this should write the value of junk to register 0x20 (a ram location) in the ds1307.
        junk = 0;                               // clear junk to show that when the register is read from the correct value is obtained
        test_rw(my1307.read( 0x20, &junk));     // this should read register 0x20
        
        LCDBack = licht;                        //Backlight aansturen
        lcd.cls();                              //clear LCD
        lcd.locate(0,0);
        lcd.printf("%d/%d/%d   %d:%d",date,month,year,hours,min);           //print de datum en de tijd
        lcd.locate(0,1);
        lcd.printf("<+ -> menu");
        wait(5);
        i=0;                                                                //maak de float i 0. (nodig voor de temperatuursmeting)
        for(int t=0; t<100; t++) i=i+temp01.read();                         //en meten van temperatuur binnen
        j=0;                                                                //maak de float j 0. (nodig voor de temperatuursmeting)
        for(int u=0; u<100; u++) j=j+temp02.read();                         //en meten van temperatuur buiten
        lcd.cls();
        lcd.locate(0,0);
        lcd.printf("Binnen: %4.1fC ", i*3.3);                               //print de temperatuurswaarde op de LCD
        lcd.locate(0,1);
        lcd.printf("Buiten: %4.1fC ", j*3.3);       
        wait(5);
        if(i*3.3 < ingesteld){                  //Als de temperatuur kleiner is dan de ingestelde waarde
            ledr = 0;                           //aansturen RGB led
            ledg = 1;
            ledb = 0;
            relais = 1;                         //Relais hoog maken
            //myservo = 0;
            lcd.cls();                          //clear LCD             
            lcd.locate(0,0);
            lcd.printf("ingesteld: %1.1f", ingesteld);              //print de ingestelde waarde op het LCD
            lcd.locate(0,1);
            lcd.printf("Verwarming: aan");                          //print de status van de verwarming op het LCD
            
            myservo = (170 * 0.000511 + 0.026);                     //Motor op 0 graden zetten, dit is de begin toestand.
            wait(2);
                        
        }
        if(i*3.3 >= ingesteld){                 //Als de temperatuur grotere of gelijk is aan de ingestelde waarde
            ledr = 1;                           //aansturen RGB led
            ledg = 0;
            ledb = 0;
            relais = 0;                         //Relais laag maken
            //myservo = 1;
            lcd.cls();                          //clear LCD
            lcd.locate(0,0);
            lcd.printf("ingesteld: %1.1f", ingesteld);              //print de ingestelde waarde op het LCD
            lcd.locate(0,1);
            lcd.printf("Verwarming: uit");                          //print de status van de verwarming op het LCD
            
            myservo = (5 * 0.000511 + 0.026);                       //Motor op 0 graden zetten, dit is de begin toestand.
            wait(2);
            
        }
        wait(3);
    }
}