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
main.cpp
- Committer:
- datx98
- Date:
- 2018-03-06
- Revision:
- 0:c1d82c87628a
- Child:
- 1:499bd5b83b45
File content as of revision 0:c1d82c87628a:
#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. } } } }