Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Diff: main.cpp
- Revision:
- 0:c1d82c87628a
- Child:
- 1:499bd5b83b45
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Mar 06 10:13:16 2018 +0000 @@ -0,0 +1,318 @@ +#include "mbed.h" +#include <time.h> + +AnalogIn sloyfe[4] = {p17, p18, p19, p20}; // Analoge inngangene, *sløyfene* +DigitalOut led[4] = {LED1, LED2, LED3, LED4}; // Led til alarm blinking ved feil. +DigitalOut b[8] = {p21, p22, p23, p24, p25, p26, p27, p28}; // Status ledbar på sensorene i sløyfene. +DigitalIn sb(p16); // Service bryter. +Serial pc(USBTX, USBRX); //PC komunikasjon +Ticker alarm, system_paa, servic; // Tikkere, alarm er til å sjekke sløyfene, system på er til når alarmen er aktivert og service er for å sjekke servicebryter. +int blink[4]= {0, 0, 0, 0}; // Global variabel med 4 elementer. Hvert element styrer sin egen led! +int amount_faild = 0; // En variabel for å telle antall ganger feil inntastet passord. +void alarm_actived(); // Sjekker hva verdien på de analoge inngangene er og og utfører en case ut fra det for hver sløyfe. +void service(); // Funksjon for resetting av anlegge. Anlegget blir satt i vedlikeholdsmodus med null feil. +void alblink(); // Blinke funksjonen. +char passord[5] = {'5','5', '5', '5', '5'}; // Passordet. +int check_password1(); // Funksjon for å sjekke om inntastet passord er riktig. +void User_Of(int); // Valg menyen der User_Of velger et ønske. +void Dato_timer(); //Klokke funskjonen. +LocalFileSystem local("local"); // Fillogging + +int main() +{ + set_time(1519919737); // vasjon 27 feb + while(1) + { + pc.printf("Velkommen\n"); // Velkomst beskjed. + Dato_timer(); // Oppkaller klokke funksjonen for å sjekke om tiden er riktig. + int x = check_password1(); // Dersom passord er riktig blir det returnet en ener og tilegnet til variabelen x. + User_Of(x); // Valg funskjonen får verdien 1 fra varabelen x. + } +} + +void Dato_timer() +{ + time_t seconds = time(NULL); // Returnerer tiden lagret i time_t i sekunder. + pc.printf("Mbed klokka er naa: %s", ctime(&seconds)); // Viser hva tiden er, ctime tolker det til leselig tid for oss. + pc.printf("\n\n\n"); + pc.printf("Hvis det ikke stemmer tast 0 ellers tast noe annet\n", ctime(&seconds)); //Kun info. + if (pc.getc() == '0') // Sjekk om inntastet tegn er 0. + { + struct tm t; //Pakker all info inn og sender det til klokkefunksjonen. + pc.printf("Tast inn dato og klokkeslett:\n"); + pc.printf("YYYY MM DD HH MM SS[enter]\n"); + scanf("%d %d %d %d %d %d", &t.tm_year, &t.tm_mon, &t.tm_mday, &t.tm_hour, &t.tm_min, &t.tm_sec); // inhenter riktig rid fra User_Of. + + t.tm_year = t.tm_year - 2020; // Gjør om til riktig år. + t.tm_mon = t.tm_mon - 1; //Gjør om til riktig måned. + set_time(mktime(&t)); // Setter nye tiden til intastet tid. + + } + +} + +void User_Of(int riktigpassord) // meny funksjonen. +{ + servic.attach(&service, 60); // Tikker funksjon som service blir tilknyttet og utføres 2 ganger i sekundet. + while(riktigpassord == 1) // Hvis verdien fra x er 1 gå inn her. + { + time_t seconds = time(0); + pc.printf("For start tast 5: \n\t"); // Valg meny. + pc.printf("For stopp tast 6:\n\t"); + pc.printf("For reset tast 7:\n\t"); + pc.printf("For status av hele anlegget eller sloyfer tast 4:\n\t"); + pc.printf("For utlogging tast 8:\n\t"); + + servic.attach(&service, 5); + switch(pc.getc()) // Innhenter inntrykk fra User_Of. + { + case '5': // Dersom intastet tegn er 1, utfør dette. + { + FILE *fp = fopen("/local/SYSTEMLOG.txt", "a");// File blir peket til fp og fp blir åpnet for skriving. + fprintf(fp, "\r\n Systemet paa: %s", ctime(&seconds));//Kun en beskjed som blir loggført med klokketid. + fclose(fp); //Stenger filen fp. + pc.printf("System paa. \n\n");//Info til User_Of. + system_paa.attach(&alarm_actived, 2);// Tikker funksjon som alarm aktiv blir tilknyttet og skal utføres annen hvert sekund. + break;//Breaker her for at casen skal avslutte og ingen caser videre blir utført uten at det er blidt bedt om det. + } + case '6': + { + FILE *fp = fopen("/local/SYSTEMLOG.txt", "a");// File blir peket til fp og fp blir åpnet for skriving. + fprintf(fp," Systemet stoppet: %s\r\n", ctime(&seconds));//Kun en beskjed som blir loggført med klokketid. + fclose(fp); //Stenger filen fp. + pc.printf("System stoppet. \n\n"); + system_paa.detach(); //Fra kobler funskjonen system_paa fra tickeren. + for(int m=0; m < 4; m++){ blink[m]=0; led[m]=0;} + break;//Breaker her for at casen skal avslutte og ingen caser videre blir utført uten at det er blidt bedt om det. + } + case '7': + { + FILE *fp = fopen("/local/SYSTEMLOG.txt", "r");// File blir peket til fp og fp blir åpnet for skriving. + fprintf(fp, "\r\n Systemet resatt: %s", ctime(&seconds));//Kun en beskjed som blir loggført med klokketid. + fclose(fp);//Stenger filen fp. + pc.printf("\n\n System resatt. \n\n"); + int m=0; + while(m < 4) + { // Dersom denne lokale variabelen er mindre enn 4 hold deg i denne løkka. + blink[m]=0; // Dersom service bryter er 1 reset alarm. + b[m+m]=b[m+m+1]=0;// Sett alle diodene fra b[0+0] og b[0+0+1] = 0. Og for hver gang m økes med en verdi blir det da m+m og m+m+1. Partall og oddetall. + led[m]=0;// Sett alle led[] til 0. + m++;// Inkrementer denne lokale variabelen og repeter. + } + break;//Breaker her for at casen skal avslutte og ingen caser videre blir utført uten at det er blidt bedt om det. + } + case '4': + { + pc.printf("\n For status paa hele anlegget tast 1: \n"); + pc.printf("\n For status paa enkelt sloyfer tast 2: \n\n\t\t"); + switch(getchar())//Ny switch case i case 4 for status valg. + { + case '5': + { + for(int m=0; m<4; m++) + { + float a=sloyfe[m];// Lokal float variabel som får verdien fra sløyfene for hver verdi i har. + if(a >= 0.30 && a <= 0.55){ pc.printf("\n Sloyfe %d alt ok. \n R1 i sloyfe %d operativ. \n R2 i sloyfe %d operativ \n\n", m+1, m+1, m+1); }// Tester og hvis sant, printer en beskjed til User_Of. + else if(a >= 0.58 && a <= 0.62) { pc.printf("\n Brudd i sloyfe %d. \n Brudd i R1 sloyfe %d. \n", m+1, m+1); }// Tester og hvis sant, printer en beskjed til User_Of. + else if(a >= 0.64 && a <= 0.80) { pc.printf("\n Brudd i sloyfe %d. \n \n Brudd i R2 sloyfe %d. \n\n", m+1, m+1); }// Tester og hvis sant, printer en beskjed til User_Of. + else if(a < 0.25) { pc.printf("\n Brudd i hele sloyfe %d. \n", m+1); }// Tester og hvis sant, printer en beskjed til User_Of. + else if(a >=0.88) { pc.printf("\n Brudd i R1 og R2 i sloyfe %d. \n", m+1); }// Tester og hvis sant, printer en beskjed til User_Of. + } + break;//Breaker her for at casen skal avslutte og ingen caser videre blir utført uten at det er blidt bedt om det. + } + case '6': + { + pc.printf("\n For sloyfe 1 tast 1: \n For sloyfe 2 tast 2: \n For sloyfe 3 tast 3: \n For sloyfe 4 tast 4: \n\n\t\t");// Valg meny for status på sløye. + int x = getchar(); + if(x<50 || x>60){pc.printf("\n Ugyldig valg! \n"); break;}; + float a=sloyfe[x-50];//x-49 er pga getchar gir en ASCII verdi som er forskjellig fra ønskelig verdi, med -49 får vi riktig verdi til sløyfe element nummer. + if(a >= 0.30 && a <= 0.55){ pc.printf("\n R1 operativ. \n R2 operativ \n\n"); }// Tester og hvis sant, printer en beskjed til User_Of. + else if(a >= 0.58 && a <= 0.62) { pc.printf("\n Brudd i R1 sloyfe %d. \n", x-49); }// Tester og hvis sant, printer en beskjed til User_Of, x-48 for å få riktig verdi på sløyfe nummer. + else if(a >= 0.64 && a <= 0.80) { pc.printf("\n Brudd i R2 sloyfe %d. \n\n", x-49); }// Tester og hvis sant, printer en beskjed til User_Of, x-48 for å få riktig verdi på sløyfe nummer. + else if(a < 0.25) { pc.printf("\n Brudd i hele sloyfe %d. \n", x-48); }// Tester og hvis sant, printer en beskjed til User_Of, x-48 for å få riktig verdi på sløyfe nummer. + else if(a >=0.88) { pc.printf("\n Brudd i R1 og R2 i sloyfe %d. \n", x-48); }// Tester og hvis sant, printer en beskjed til User_Of, x-48 for å få riktig verdi på sløyfe nummer. + break;//Breaker her for at casen skal avslutte og ingen caser videre blir utført uten at det er blidt bedt om det. + } + default: //Dersom et annet tall enn hva som er spesifisert printes denne beskjeden ut. + { + printf("\n Ugyldig valg.\n"); + break;//Breaker her for at casen skal avslutte og ingen caser videre blir utført uten at det er blidt bedt om det. + } + } break;//Breaker her for at casen skal avslutte og ingen caser videre blir utført uten at det er blidt bedt om det. + } + case '8': + { + FILE *fp = fopen("/local/SYSTEMLOG.txt", "r");// File blir peket til fp og fp blir åpnet for skriving. + fprintf(fp, "\r\n Logget av systemet: %s", ctime(&seconds));//Kun en beskjed som blir loggført med klokketid. + fclose(fp);//Stenger filen fp. + pc.printf("\n\n\n\n\n\n\n\n\t\t\t\t Farvel.\n\n\n\n\n\n\n\n\n"); + riktigpassord=0;// Setter denne variabelen til 0 for at neste innlogging kun skjer hvis riktig passord er skrevet. + break;//Breaker her for at casen skal avslutte og ingen caser videre blir utført uten at det er blidt bedt om det. + } + case '0': + { + FILE *fp = fopen("/local/SYSTEMLOG.txt", "r");// File blir peket til fp og fp blir åpnet for lesing. + /*if (fp == NULL) // Dette er for å gi beskjed om at filen ikke klarte å åpne. + { + pc.printf + exit(1); + }*/// Dette har vi valgt å eksludere da ved testing er det tydelig at filen åpner å lukker seg på rikitg måte. + int c; + if (fp) //En test for å se om filen er åpen! + { + while ((c = getc(fp)) != EOF)// Så fremt det er flere tegn i fila forbli i while løkka. + { + pc.putc(c);// Printer ut tegn for tegn fra filen til TeraTerm. + } + } + fclose(fp);//Ferdig med lesing av filen og lukker filen. + break;//Breaker her for at casen skal avslutte og ingen caser videre blir utført uten at det er blidt bedt om det. + } + default: //Dersom et annet tall enn hva som er spesifisert printes denne beskjeden ut. + { + printf("\n Ugyldig valg.\n"); + break;//Det er valgfritt å breake her da default blir utført og programmet fortsetter videre. Men vi tar det med for det. + } + } + } +} +int check_password1() +{ + time_t seconds = time(NULL); // Henter tiden lagret i time_t i sekunder for videre bruk. + pc.printf("\n Skriv inn passord for adgang til alarmsystemet: "); + int riktigpass=0; int n=0; char sjekk[4];// Lokale varable blir opprettet for bruk i denne funksjonen. + while(1) + { + if(pc.readable() && n < 4) // Dersom noe blir tastet på tastauret gå inn. + { + sjekk[n++] = pc.getc();// Lagre inntastet tegn i sjekk arrayet i element n og inkrementer n med 1. + if(n == 4) { break; }// Dersom n er lik 4 break ut av while løkken. + } + } + for(n=0; n<4; n++) { if(sjekk[n]==passord[n]) { riktigpass++; } }// En for løkke for å sammenligne hvert intastet tegn med passord tegnene. + + if(riktigpass == 4) // Dersom passordet er riktig gå inn. + { + FILE *fp = fopen("/local/SYSTEMLOG.txt", "r");// File blir peket til fp og fp blir åpnet for skriving. + fprintf(fp, "\r\n Riktig passord inntastet: %s", ctime(&seconds));//Kun en beskjed som blir loggført med klokketid. + fclose(fp);//Stenger filen fp. + pc.printf("\n Riktig passord.\n\n"); + amount_faild=0; + return 1; + } + else + { // Dersom passordet er feil gå inn her. + amount_faild++; + FILE *fp = fopen("/local/SYSTEMLOG.txt", "r");// File blir peket til fp og fp blir åpnet for skriving. + fprintf(fp, "\r\n Feil passord inntastet, %d ganger: %s", amount_faild, ctime(&seconds));//Kun en beskjed som blir loggført med klokketid. + fclose(fp);//Stenger filen fp. + pc.printf("\n\nFeil Passord, prov igjen!\n\n"); } + return 0; +} + +void alblink()//Blinke funksjon for sløyfene. +{ + int n;// Lokal variabel + for(n=0; n < 5; n++) + { // For løkke for å sjekke om feil er tilstedet eller ikke. + if(blink[n]==1) { led[n] = !led[n]; } // Dersom feil på de forskjellige sløyfene blink med riktig led! + } +} + +void service()// service bryter funksjon. +{ + time_t seconds = time(NULL); // Henter tiden lagret i time_t i sekunder for videre bruk. + if(sb ==1) + { // Hvis service bryter aktiv gå inn. + FILE *fp = fopen("/local/SYSTEMLOG.txt", "r"); // File blir peket til fp og fp blir åpnet for skriving. + fprintf(fp, "\r\n Service bryter aktivert: %s", ctime(&seconds)); //Kun en beskjed som blir loggført med klokketid. + fclose(fp); //Stenger filen fp. + + pc.printf("\n\n Vedlikeholdsarbeid paa alegget. \n\n\n\n");// Fortell User_Of at anlegge er i vedlikeholdsmodus. + int m=0; //Lokal variabel. + while(sb==1) + { // Såfremt service bryteren er aktiv holdes programmet i denne while løkken. + while(m < 2) + { // Dersom denne lokale variabelen er mindre enn 4 hold deg i denne løkka. + blink[m] = 0; // Dersom service bryter er 1 reset alarm. + b[m+m]=b[m + m + 1] = 0; // Sett alle diodene fra b[0+0] og b[0+0+1] = 0. Og for hver gang m økes med en verdi blir det da m+m og m+m+1. Partall og oddetall. + led[m] = 0; // Sett alle led[] til 0. + m++; // Inkrementer denne lokale variabelen og repeter. + } + } + system_paa.detach(); // Frakobler system_paa fra ticker. + pc.printf("\n\n Tast 1 for igangsetting \n\n"); + } +} + +void alarm_actived()// . +{ + time_t seconds = time(NULL); // Henter tiden lagret i time_t i sekunder for videre bruk. + alarm.attach(&alblink, 0.1); // Tilkobler alblink funksjonen til ticker ved navnet alarm og denne funksjoenen kjøres 10 ganger i sekundet. + int analog_verdi=0; // Lokal variabel. + for(int i = 0; i < 4; i++) // En for løkke for å sjekke alle 4 sløyfene, og i for løkken er den en switch for å utføre riktig handling utfra hva analog_verdi er. + { + float a=sloyfe[i]; // Lokal float variabel som får verdien fra sløyfene for hver verdi i har. + if(a >= 0.30 && a <= 0.55) { analog_verdi = 1; } // Dersom alt i orden sett analog_verdi til 1. + else if(a >= 0.58 && a <= 0.62) { analog_verdi = 2; } // Dersom R1 brutt sett analog_verdi til 2. + else if(a >= 0.64 && a <= 0.80) { analog_verdi = 3; } // Dersom R2 brutt sett analog_verdi til 3. + else if(a < 0.25 || a >=0.88) { analog_verdi = 4; } // Dersom brudd på leder eller begge motstandene sett analog_verdi til 4. + + switch(analog_verdi) + { + case 1: + { // Dersom denne verdien er 1 gå inn her og utfør dette også gå ut av case 1 tilbake til for lokka. + + if(blink[i]==0 && led[i]==0) // Hvis det globale arrayet blink[i] og led[i] er av gå inn. + { + if(i==0) { led[i]=1; } // Dersom i=0 sett led[i] på. + else if(i==1) { led[i]=1; }// Dersom i=1 sett led[i] på. + else if(i==2) { led[i]=1; }// Dersom i=2 sett led[i] på. + else if(i==3) { led[i]=1; }// Dersom i=3 sett led[i] på. + } + break;// Ferdig med hva som er blitt bedt av den og avlutter case 1 går tilbake til for løkken. + } + case 2: + { + // Dersom denne verdien er 2 gå inn her og utfør dette også gå ut av case 2 tilbake til for løkken. + blink[i]=1;// Blink[i] får verdien 1 og led[i] begynner å blinke. + if(b[i+i]==0) + { + FILE *fp = fopen("/local/SYSTEMLOG.txt", "a");// File blir peket til fp og fp blir åpnet for skriving. + fprintf(fp, "\r\n Brudd i R1 i Sloyfe %d: %s", i+1, ctime(&seconds));//Kun en beskjed som blir loggført med klokketid. + fclose(fp);//Stenger filen fp. + b[i+i]=1;// Led på bargraf med element nr i+i blir satt til en for å indikere feil på R1 i denne sløyfen. Partall, altså b0, b2, b4 og b6. + } + break;// Ferdig med hva som er blitt bedt av den og avlutter case 2 går tilbake til for løkken. + } + case 3: + { + // Dersom denne verdien er 3 gå inn her og utfør dette også gå ut av case 3 tilbake til for løkken. + blink[i]=1;// Blink[i] får verdien 1 og led[i] begynner å blinke. + if(b[i+i+1]==0) + { + FILE *fp = fopen("/local/SYSTEMLOG.txt", "a");// File blir peket til fp og fp blir åpnet for skriving. + fprintf(fp, "\r\n Brudd i R2 i Sloyfe %d: %s", i+1, ctime(&seconds));//Kun en beskjed som blir loggført med klokketid. + fclose(fp);//Stenger filen fp. + b[i+i+1]=1;// Led på bargraf med element nr i+i+1 blir satt til en for å indikere feil på R2 i denne sløyfen. Oddetall altså b1, b3, b5 og b7. + } + break;// Ferdig med hva som er blitt bedt av den og avlutter case 3 går tilbake til for løkken. + } + case 4: + { + // Dersom denne verdien er 4 gå inn her og utfør dette også gå ut av case 4 tilbake til for løkken. + blink[i]=1;// Blink[i] får verdien 1 og led[i] begynner å blinke. + if(b[i+i] == 0 || b[i+i+1] == 0) + { + FILE *fp = fopen("/local/SYSTEMLOG.txt", "a");// File blir peket til fp og fp blir åpnet for skriving. + if(a < 0.25){fprintf(fp, "\r\n Brudd i hele Sloyfe %d: %s", i+1, ctime(&seconds));}//Kun en beskjed som blir loggført med klokketid. + else if(a >=0.88){fprintf(fp, "\r\n Brudd i R1 og R2 i Sloyfe %d: %s", i+1, ctime(&seconds));}//Kun en beskjed som blir loggført med klokketid. + fclose(fp);//Stenger filen fp. + b[i+i]=1;// Led på bargraf med element nr i+i blir satt til en for å indikere feil på R1 i denne sløyfen. Partall, altså b0, b2, b4 og b6. + b[i+i+1]=1;// Led på bargraf med element nr i+i+1 blir satt til en for å indikere feil på R2 i denne sløyfen. Oddetall altså b1, b3, b5 og b7. + } + break;// Ferdig med hva som er blitt bedt av den og avlutter case 4 går tilbake til for løkken. + } + } + } +} \ No newline at end of file