Fredrik Bjørken / Mbed 2 deprecated Alarmsystem-FINAL1

Dependencies:   mbed

Fork of Alarmsystem-FINAL1 by Brede Hesvik

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers system.cpp Source File

system.cpp

00001 
00002 #include "mbed.h"
00003 #include "loggforing.h"
00004 
00005 Serial pc(USBTX, USBRX);
00006 
00007 /* Disse arrayene er sammenhengende, hvor hvert element representerer hverandre. */
00008 AnalogIn krets[4] = {p15, p16, p17, p19};       //(krets 1, krets 2, krets 3, krets 4)
00009 int inbrudd[4] = {0, 0, 0, 0};                  //angir hvor mange brudd som har gått i kretsen.
00010 
00011 /* Hvert element represnterer hverandre i disse arayene. led[] brukes for å varsle for hvilken bryter som er aktivert */
00012 DigitalOut kr_status[8] = {p21, p22, p23, p24, p25, p26, p27, p28};  //(bryter 1 krets 1, bryter 2 krets 1, bryter 1 krets 2....)
00013 int led[8] = {1, 1, 1, 1, 1, 1, 1, 1};                               //Brukes som kontrollbetingelse, og settes til 0 hvis en alarm skal gå.
00014 int led_pa[8] = {1, 1, 1, 1, 1, 1, 1, 1};                            //Brukes i funksjonen led_status for å generere en blinke sekvens.
00015 
00016 DigitalIn servicebr(p12);    //servicebryter
00017 
00018 int logg_kr[4] = {8, 9, 10, 11};                //sender over verdi til logg funksjon for å loggfore om begge brytere på en krets er aktivert.
00019 
00020 /* Globale variabler som blir brukt i programmet */
00021 int kr;                 //verdi som blir tastet inn i funksjonen natid_krets.
00022 int toggle = 0;         //Inverterteres i led_status for å skape en blinkefunksjon.
00023 int tall;               //variabel som brukes i systempaa.
00024 
00025 Timer t;                   //Startes ved aktivering av systemet for å kunne logge tid på de ulike situasjonenen.
00026 Ticker kontroll;           //kaller opp overvaking()
00027 Ticker led_aktiver;        //kaller opp led_status()
00028 
00029 /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FUNKSJONSPROTOTYPER <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
00030 
00031 /* Komplett funksjon for systempa, inkl, loggforing og varsling av krets. 
00032 void systempaa(int aktiv);
00033 
00034 /* Funksjonen blir kalt med 1Hz(1.0s) i en tikker, for overvåkning av kretser. 
00035 void overvaking(void);
00036 
00037 /* Nullstiller hele systemet ved aktivering av servicebryter 
00038 void nullstilling(void);
00039 
00040 /* Funksjon for å lese av nåværende status på valgt krets. 
00041 void natid_status(int kr);
00042 
00043 /* Blinke funksjon til baragraph. 
00044 void led_status(void);
00045 /*
00046 
00047 /* Funksjonen motar en verdi for variable akitv, timer t; blir startet, led_status og overvaking blir kalt opp i 2 ticker i while-løkka.
00048 Funksjonen vil bli i while løkka så lenge aktiv er sann, når det blir satt til 0 eller usann vil den bryte ut av while-løkka, stopper timer,
00049 loggføre ved hvilken tid systemet er avsluttet. Deretter vil systemet avslutte. */
00050 void systempaa(int aktiv)
00051 {
00052     t.start();
00053     led_aktiver.attach(&led_status, 0.1);
00054     kontroll.attach(&overvaking, 1.0);
00055     while(aktiv); 
00056     t.stop();
00057     logg_system_av(t.read());
00058     t.reset();
00059 
00060 }
00061 
00062 
00063 /* Funksjonen kontrolerer de 4 kretsene i en for løkke fra 0-3 som er basert på elementene i arrayet krets[].
00064 Spennings verdiene over bryteren testes i 3 tester, første er bryter 1, andre er bryter 2, og siste test er begge brytere.
00065 Hvis det er oppdaget en feil i en krets, vil den sett en 0 inn i arrayet led[] utifra hvilken bryter som er aktivert.
00066 I betingelsen, blir det kontrolert slik at det er en 1 på den gitte plass til gitt bryter, hvis dette stemmer har ingen alarm gått. Er det en 0 der
00067 er alarmen aktivert og det er ikke behov for å kontrollere bryteren på nytt. Dette forhindrer at logg_inbrudd loggfører bruddet mer enn en gang.
00068 Arrayet inbrudd[] på 4 elementer blir brukt for å registrere antall brudd i kretsen.*/
00069 void overvaking()
00070 {
00071     for(int sloyfe = 0; sloyfe <=3 ; sloyfe++) {
00072         float v_test = krets[sloyfe];
00073         if(v_test*3.3 > 1.2) {
00074             if(3.3*v_test > 1.4 && 3.3*v_test < 1.7 && led[2*sloyfe] == 1) {
00075                 inbrudd[sloyfe]++;
00076                 led[2*sloyfe] = 0;
00077                 logg_inbrudd(2*sloyfe, t.read(), 3.3*v_test);
00078             } else if(3.3*v_test > 1.70 && 3.3*v_test < 2.0 && led[2*sloyfe +1] == 1) {
00079                 inbrudd[sloyfe]++;
00080                 led[2*sloyfe+1] = 0;
00081                 logg_inbrudd(2*sloyfe +1, t.read(), 3.3*v_test);
00082             } else if(3.3*v_test > 3.0 && (led[2*sloyfe] == 1 || led[2*sloyfe +1] == 1)) {
00083                 inbrudd[sloyfe]++;
00084                 led[2*sloyfe] = led[2*sloyfe+1] = 0;
00085                 logg_inbrudd(logg_kr[sloyfe], t.read(), 3.3*v_test);
00086             }
00087         }
00088     }
00089 }
00090 
00091 
00092 /* Funksjonen setter alle elementer fra 0-7 i array Led[] til 1 for å avslutte blinke sekvensen ettersom systemet blir satt til null.
00093 Funksjonen logg_servicebryter blir kalt opp hvis variabele servicebryter er sann for å loggføre tid det har blitt utført en reset av systemet ved brukt 
00094 av servicebryter. Stemmer ikke dette så blir det loggført at systemet har blitt nullstilt av bruker. */
00095 void nullstilling(int servicebryter)
00096 {
00097     pc.printf("Alle kretser blir nullstilt i lopet av 5 sek.\n\r ");
00098     wait(5.0);
00099     for(int i = 0; i < 8; i++) {
00100         led[i] = 1;
00101     }
00102     if(servicebryter) {
00103     logg_servicebryter(t.read());
00104     } else {
00105         logg_brukernullstill(t.read());
00106         }
00107 }
00108 
00109 
00110 /* Funksjonen oppgir totalt antall brudd i hele systemet tilsammen, du velger selv hvilken krets du vil lese av status på.
00111 Når du har valgt krets(et tall fra 1-4 får du oppgitt antall brudd i kretsen, hvor lenge den har hvert aktiv, spenning og om det er
00112 utløst en alarm eller ikke. Verdien kr som blir satt inn i array krets|], inbrudd[] og trekker ifra 1 slikat du får riktig element som representerer den
00113 kresten som du har valgt. Arrayet led[] kontrolleres senere for sjekke om det har blitt aktivert en alarm. */
00114 void natid_status(int kr)
00115 {
00116     int brudd;
00117     for(int i = 0; i < 4; i++) {
00118         brudd = brudd + inbrudd[i];
00119     }
00120     pc.printf("\n\rTotalt antall brudd i system: %d.\n\r", brudd);
00121     float spenning = krets[kr-1]; //gjør det mulig å lese av spenning.
00122     pc.printf("\n\rStatus for krets %d.\n\r", kr);
00123     pc.printf("Antall brudd: %d.\n\r", inbrudd[kr-1]);
00124     pc.printf("System aktivt: %.2f sekunder.\n\r", t.read());
00125     pc.printf("Spenning: %.2fV.\n\r", 3.3*spenning);
00126     if(led[(kr-1)*2] == 0 || led[kr*2-1] == 0) pc.printf("Alarm aktiv.\n\r");
00127     else pc.printf("Alarm ikke aktiv.\n\r");
00128 }
00129 
00130 
00131 /* Funksjonen blir kalt opp i en ticker på 10hz. Funksjonen henter verdiene fra arrayet led[] og setter det til kr_status[],
00132 etter for-løkka har gått 8 ganger blir toggle som er satt til 0 invertert. Neste gang funksjonen blir kalt opp vil verdiene fra arrayet
00133 led_pa[] satt til kr_status[]. Dette vil skape en blinke funksjon på baragraphen, slik at den veksler mellom 0 og 1 utifra de ulike elementene. */
00134 void led_status()
00135 {
00136     for(int i = 0; i < 8; i++) {
00137         if(toggle) {
00138             kr_status[i] = led[i];
00139         } else if(!toggle) {
00140             kr_status[i] = led_pa[i];
00141         }
00142     }
00143     toggle = !toggle;
00144 }
00145 
00146 
00147 /* Hvis det er tastet feil passord vil denne funksjonen sette alle elementene i led[] til 0 for å varsle om at 
00148 alarmen har gått. */
00149 void feil_passord()
00150 {
00151     for(int i = 0; i < 8; i++) {
00152         led[i] = 0;
00153     }
00154     logg_feilpass();
00155 }