Sustav kontrole pristupa prostoru ostvaren je unosom numeričke lozinke s membranske tipkovnice. Ovisno o ispravnosti lozinke servo motor otključava vrata. Omogućeno je i mijenjanje same lozinke kao i prikaz datuma i vremena na LCD-u.

Dependencies:   mbed Servo RGB-LED KeypadLib TextLCD RTC-DS1307

Committer:
boki96
Date:
Sun Feb 02 10:22:43 2020 +0000
Revision:
0:a30e079fa744
The area access control system is implemented by entering a numeric password from the keyboard. Depending on the password, the servo motor unlocks the door. It is also possible to change the password itself, as well as display the date and time.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
boki96 0:a30e079fa744 1 #include "mbed.h"
boki96 0:a30e079fa744 2 #include "Rtc_Ds1307.h"
boki96 0:a30e079fa744 3 #include "keypad.h"
boki96 0:a30e079fa744 4 #include "TextLCD.h"
boki96 0:a30e079fa744 5 #include "Servo.h"
boki96 0:a30e079fa744 6 #include "rgb.h"
boki96 0:a30e079fa744 7
boki96 0:a30e079fa744 8 #define duljinaLozinke 4
boki96 0:a30e079fa744 9
boki96 0:a30e079fa744 10 RGBLed lediceRGB(PA_5, PA_6, PA_7);
boki96 0:a30e079fa744 11 Keypad tipkovnica(PB_4, PB_14, PB_5, PB_13, PA_8, PB_1, PB_10, PB_15);
boki96 0:a30e079fa744 12 TextLCD lcd(PC_10, PC_11, PC_12, PD_2, PC_3, PC_0);
boki96 0:a30e079fa744 13 Rtc_Ds1307 rtc(PB_9, PB_8);
boki96 0:a30e079fa744 14 Servo mojServo(PB_2);
boki96 0:a30e079fa744 15
boki96 0:a30e079fa744 16 Ticker blicanje;
boki96 0:a30e079fa744 17 Timer ledBlicanje;
boki96 0:a30e079fa744 18 Timer debounce;
boki96 0:a30e079fa744 19 InterruptIn tipkaloIzlaz(PB_3);
boki96 0:a30e079fa744 20 PwmOut piezoZvucnik(PC_7);
boki96 0:a30e079fa744 21
boki96 0:a30e079fa744 22 void pocetniPrikaz(void);
boki96 0:a30e079fa744 23 void postaviLozinku_pristup(void);
boki96 0:a30e079fa744 24 void led_flip(void);
boki96 0:a30e079fa744 25 void unosLozinkePristup(void);
boki96 0:a30e079fa744 26 void otkljucavanje(void);
boki96 0:a30e079fa744 27 void promjenaLozinkePristup(void);
boki96 0:a30e079fa744 28 void satDatum(void);
boki96 0:a30e079fa744 29
boki96 0:a30e079fa744 30 int lozinka_pristup[duljinaLozinke];
boki96 0:a30e079fa744 31 int unos_lozinkePristup[duljinaLozinke];
boki96 0:a30e079fa744 32 int lozinkaPromjena[duljinaLozinke];
boki96 0:a30e079fa744 33
boki96 0:a30e079fa744 34
boki96 0:a30e079fa744 35 int main() {
boki96 0:a30e079fa744 36 Rtc_Ds1307::Time_rtc tm = {};
boki96 0:a30e079fa744 37 tipkovnica.enablePullUp();
boki96 0:a30e079fa744 38 mojServo.write(0.0);
boki96 0:a30e079fa744 39 pocetniPrikaz();
boki96 0:a30e079fa744 40 postaviLozinku_pristup();
boki96 0:a30e079fa744 41 debounce.start();
boki96 0:a30e079fa744 42 tipkaloIzlaz.rise(&otkljucavanje);
boki96 0:a30e079fa744 43
boki96 0:a30e079fa744 44 while (1) {
boki96 0:a30e079fa744 45 char utipkano = tipkovnica.getKey();
boki96 0:a30e079fa744 46 switch (utipkano) {
boki96 0:a30e079fa744 47 case 'A':
boki96 0:a30e079fa744 48 promjenaLozinkePristup();
boki96 0:a30e079fa744 49 break;
boki96 0:a30e079fa744 50 case '#':
boki96 0:a30e079fa744 51 unosLozinkePristup();
boki96 0:a30e079fa744 52 break;
boki96 0:a30e079fa744 53 default:
boki96 0:a30e079fa744 54 {
boki96 0:a30e079fa744 55 if (rtc.getTime(tm)) {
boki96 0:a30e079fa744 56 lcd.locate(3, 0);
boki96 0:a30e079fa744 57 lcd.printf("%02d.%02d.%04d.", tm.date, tm.mon, tm.year);
boki96 0:a30e079fa744 58 lcd.locate(4, 1);
boki96 0:a30e079fa744 59 lcd.printf("%02d:%02d:%02d", tm.hour, tm.min, tm.sec);
boki96 0:a30e079fa744 60 }
boki96 0:a30e079fa744 61 }
boki96 0:a30e079fa744 62 }
boki96 0:a30e079fa744 63 }
boki96 0:a30e079fa744 64 }
boki96 0:a30e079fa744 65
boki96 0:a30e079fa744 66
boki96 0:a30e079fa744 67 void pocetniPrikaz(void) {
boki96 0:a30e079fa744 68 blicanje.attach(&led_flip, 0.5);
boki96 0:a30e079fa744 69 lcd.cls();
boki96 0:a30e079fa744 70 lcd.printf("DULJINA LOZINKE");
boki96 0:a30e079fa744 71 lcd.locate(0, 1);
boki96 0:a30e079fa744 72 lcd.printf(" %d ZNAKA ", duljinaLozinke);
boki96 0:a30e079fa744 73 wait(2.0);
boki96 0:a30e079fa744 74 lcd.cls();
boki96 0:a30e079fa744 75 lcd.printf("* POSTAVLJANJE *");
boki96 0:a30e079fa744 76 lcd.locate(0, 1);
boki96 0:a30e079fa744 77 lcd.printf("* LOZINKE *");
boki96 0:a30e079fa744 78 wait(2.0);
boki96 0:a30e079fa744 79 lcd.cls();
boki96 0:a30e079fa744 80 blicanje.detach();
boki96 0:a30e079fa744 81 lediceRGB.prikaz(0.0, 0.0, 0.0);
boki96 0:a30e079fa744 82
boki96 0:a30e079fa744 83 }
boki96 0:a30e079fa744 84
boki96 0:a30e079fa744 85 void led_flip(void) {
boki96 0:a30e079fa744 86 lediceRGB.prikaz(0.0, 0.0, 1.0);
boki96 0:a30e079fa744 87 ledBlicanje.start();
boki96 0:a30e079fa744 88 if (ledBlicanje.read_ms() >= 500) {
boki96 0:a30e079fa744 89 lediceRGB.prikaz(0.0, 0.0, 0.0);
boki96 0:a30e079fa744 90 ledBlicanje.reset();
boki96 0:a30e079fa744 91 }
boki96 0:a30e079fa744 92 }
boki96 0:a30e079fa744 93
boki96 0:a30e079fa744 94 void postaviLozinku_pristup(void) {
boki96 0:a30e079fa744 95 blicanje.attach(&led_flip, 0.2);
boki96 0:a30e079fa744 96 lcd.printf("POSTAVI LOZINKU");
boki96 0:a30e079fa744 97 lcd.locate(0, 1);
boki96 0:a30e079fa744 98 lcd.printf(" ZA PRISTUP ");
boki96 0:a30e079fa744 99 wait(1.5);
boki96 0:a30e079fa744 100 lcd.cls();
boki96 0:a30e079fa744 101 lcd.printf("POSTAVI LOZINKU");
boki96 0:a30e079fa744 102 lcd.locate(6, 1);
boki96 0:a30e079fa744 103
boki96 0:a30e079fa744 104 uint8_t i = 0;
boki96 0:a30e079fa744 105 do {
boki96 0:a30e079fa744 106 char utipkano = tipkovnica.getKey();
boki96 0:a30e079fa744 107 if (utipkano != KEY_RELEASED && utipkano >= '0' && utipkano <= '9') {
boki96 0:a30e079fa744 108 lozinka_pristup[i] = utipkano - 48;
boki96 0:a30e079fa744 109 lcd.printf("*");
boki96 0:a30e079fa744 110 wait(0.2);
boki96 0:a30e079fa744 111 ++i;
boki96 0:a30e079fa744 112 } else if ((utipkano != KEY_RELEASED) && (utipkano < '0' || utipkano > '9')) {
boki96 0:a30e079fa744 113 blicanje.detach();
boki96 0:a30e079fa744 114 lediceRGB.prikaz(1.0, 0.0, 0.0);
boki96 0:a30e079fa744 115 lcd.cls();
boki96 0:a30e079fa744 116 lcd.printf(" POGRESAN UNOS! ");
boki96 0:a30e079fa744 117 piezoZvucnik.period(0.006);
boki96 0:a30e079fa744 118 piezoZvucnik.write(0.1);
boki96 0:a30e079fa744 119 wait(1.0);
boki96 0:a30e079fa744 120 piezoZvucnik.write(0.0);
boki96 0:a30e079fa744 121 lcd.cls();
boki96 0:a30e079fa744 122 lediceRGB.prikaz(0.0, 0.0, 0.0);
boki96 0:a30e079fa744 123 lcd.printf("POSTAVI LOZINKU");
boki96 0:a30e079fa744 124 lcd.locate(6, 1);
boki96 0:a30e079fa744 125 i = 0;
boki96 0:a30e079fa744 126 blicanje.attach(&led_flip, 0.2);
boki96 0:a30e079fa744 127 }
boki96 0:a30e079fa744 128 } while (i < duljinaLozinke);
boki96 0:a30e079fa744 129
boki96 0:a30e079fa744 130 lcd.cls();
boki96 0:a30e079fa744 131 blicanje.detach();
boki96 0:a30e079fa744 132 lcd.printf(" LOZINKA ");
boki96 0:a30e079fa744 133 lcd.locate(0, 1);
boki96 0:a30e079fa744 134 lcd.printf(" JE POSTAVLJENA ");
boki96 0:a30e079fa744 135 piezoZvucnik.period(0.001);
boki96 0:a30e079fa744 136 piezoZvucnik.write(0.5);
boki96 0:a30e079fa744 137 lediceRGB.prikaz(0.0, 1.0, 0.0);
boki96 0:a30e079fa744 138 wait(2.0);
boki96 0:a30e079fa744 139 blicanje.detach();
boki96 0:a30e079fa744 140 lediceRGB.prikaz(0.0, 0.0, 0.0);
boki96 0:a30e079fa744 141 piezoZvucnik.write(0.0);
boki96 0:a30e079fa744 142 lcd.cls();
boki96 0:a30e079fa744 143 }
boki96 0:a30e079fa744 144
boki96 0:a30e079fa744 145 void unosLozinkePristup(void) {
boki96 0:a30e079fa744 146 lcd.cls();
boki96 0:a30e079fa744 147 lcd.printf("UNESITE LOZINKU");
boki96 0:a30e079fa744 148 blicanje.attach(&led_flip, 0.2);
boki96 0:a30e079fa744 149 lcd.cls();
boki96 0:a30e079fa744 150 lcd.printf(" UNOS LOZINKE ");
boki96 0:a30e079fa744 151 lcd.locate(6, 1);
boki96 0:a30e079fa744 152
boki96 0:a30e079fa744 153 uint8_t i = 0;
boki96 0:a30e079fa744 154 do {
boki96 0:a30e079fa744 155 char utipkano = tipkovnica.getKey();
boki96 0:a30e079fa744 156 if (utipkano != KEY_RELEASED && utipkano >= '0' && utipkano <= '9') {
boki96 0:a30e079fa744 157 unos_lozinkePristup[i] = utipkano - 48;
boki96 0:a30e079fa744 158 lcd.printf("*");
boki96 0:a30e079fa744 159 wait(0.2);
boki96 0:a30e079fa744 160 ++i;
boki96 0:a30e079fa744 161 }
boki96 0:a30e079fa744 162 } while (i < duljinaLozinke);
boki96 0:a30e079fa744 163 blicanje.detach();
boki96 0:a30e079fa744 164
boki96 0:a30e079fa744 165 uint8_t brojac = 0;
boki96 0:a30e079fa744 166 for (uint8_t i = 0; i < duljinaLozinke; ++i) {
boki96 0:a30e079fa744 167 if (unos_lozinkePristup[i] == lozinka_pristup[i])
boki96 0:a30e079fa744 168 brojac++;
boki96 0:a30e079fa744 169 }
boki96 0:a30e079fa744 170
boki96 0:a30e079fa744 171 if (brojac == duljinaLozinke) {
boki96 0:a30e079fa744 172 lediceRGB.prikaz(0.0, 1.0, 0.0);
boki96 0:a30e079fa744 173 lcd.cls();
boki96 0:a30e079fa744 174 lcd.printf(" PRISTUP ");
boki96 0:a30e079fa744 175 lcd.locate(4, 1);
boki96 0:a30e079fa744 176 lcd.printf("OMOGUCEN");
boki96 0:a30e079fa744 177 piezoZvucnik.period(0.001);
boki96 0:a30e079fa744 178 piezoZvucnik.write(0.5);
boki96 0:a30e079fa744 179 wait(2.0);
boki96 0:a30e079fa744 180 lcd.cls();
boki96 0:a30e079fa744 181 otkljucavanje();
boki96 0:a30e079fa744 182 } else if (brojac != duljinaLozinke) {
boki96 0:a30e079fa744 183 lediceRGB.prikaz(1.0, 0.0, 0.0);
boki96 0:a30e079fa744 184 lcd.cls();
boki96 0:a30e079fa744 185 lcd.printf(" PRISTUP ");
boki96 0:a30e079fa744 186 lcd.locate(3, 1);
boki96 0:a30e079fa744 187 lcd.printf("ONEMOGUCEN");
boki96 0:a30e079fa744 188 piezoZvucnik.period(0.004);
boki96 0:a30e079fa744 189 piezoZvucnik.write(0.1);
boki96 0:a30e079fa744 190 wait(2.0);
boki96 0:a30e079fa744 191 lediceRGB.prikaz(0.0, 0.0, 0.0);
boki96 0:a30e079fa744 192 piezoZvucnik.write(0.0);
boki96 0:a30e079fa744 193 lcd.cls();
boki96 0:a30e079fa744 194 }
boki96 0:a30e079fa744 195 }
boki96 0:a30e079fa744 196
boki96 0:a30e079fa744 197 void promjenaLozinkePristup(void) {
boki96 0:a30e079fa744 198 lcd.cls();
boki96 0:a30e079fa744 199 blicanje.attach(&led_flip, 0.2);
boki96 0:a30e079fa744 200 lcd.printf("PROMJENA LOZINKE");
boki96 0:a30e079fa744 201 lcd.locate(0, 1);
boki96 0:a30e079fa744 202 lcd.printf(" ZA PRISTUP ");
boki96 0:a30e079fa744 203 lcd.cls();
boki96 0:a30e079fa744 204 lcd.printf("TRENUTNA LOZINKA");
boki96 0:a30e079fa744 205 lcd.locate(6, 1);
boki96 0:a30e079fa744 206
boki96 0:a30e079fa744 207 uint8_t i = 0;
boki96 0:a30e079fa744 208 do {
boki96 0:a30e079fa744 209 char utipkano = tipkovnica.getKey();
boki96 0:a30e079fa744 210 if (utipkano != KEY_RELEASED && utipkano >= '0' && utipkano <= '9') {
boki96 0:a30e079fa744 211 lozinkaPromjena[i] = utipkano - 48;
boki96 0:a30e079fa744 212 lcd.printf("*");
boki96 0:a30e079fa744 213 wait(0.2);
boki96 0:a30e079fa744 214 ++i;
boki96 0:a30e079fa744 215 }
boki96 0:a30e079fa744 216 } while (i < duljinaLozinke);
boki96 0:a30e079fa744 217 blicanje.detach();
boki96 0:a30e079fa744 218
boki96 0:a30e079fa744 219 uint8_t brojac = 0;
boki96 0:a30e079fa744 220 for (uint8_t i = 0; i < duljinaLozinke; ++i) {
boki96 0:a30e079fa744 221 if (lozinkaPromjena[i] == lozinka_pristup[i])
boki96 0:a30e079fa744 222 brojac++;
boki96 0:a30e079fa744 223 }
boki96 0:a30e079fa744 224
boki96 0:a30e079fa744 225 if (brojac == duljinaLozinke) {
boki96 0:a30e079fa744 226 lediceRGB.prikaz(0.0, 1.0, 0.0);
boki96 0:a30e079fa744 227 wait(1.0);
boki96 0:a30e079fa744 228 lediceRGB.prikaz(0.0, 1.0, 0.0);
boki96 0:a30e079fa744 229 blicanje.attach(&led_flip, 0.2);
boki96 0:a30e079fa744 230 lcd.cls();
boki96 0:a30e079fa744 231 lcd.printf(" NOVA LOZINKA");
boki96 0:a30e079fa744 232 lcd.locate(6, 1);
boki96 0:a30e079fa744 233
boki96 0:a30e079fa744 234 uint8_t i = 0;
boki96 0:a30e079fa744 235 do {
boki96 0:a30e079fa744 236 char utipkano = tipkovnica.getKey();
boki96 0:a30e079fa744 237 if (utipkano != KEY_RELEASED && utipkano >= '0' && utipkano <= '9') {
boki96 0:a30e079fa744 238 lozinka_pristup[i] = utipkano - 48;
boki96 0:a30e079fa744 239 lcd.printf("*");
boki96 0:a30e079fa744 240 wait(0.2);
boki96 0:a30e079fa744 241 ++i;
boki96 0:a30e079fa744 242 }
boki96 0:a30e079fa744 243 } while (i < duljinaLozinke);
boki96 0:a30e079fa744 244 blicanje.detach();
boki96 0:a30e079fa744 245
boki96 0:a30e079fa744 246 lcd.cls();
boki96 0:a30e079fa744 247 lcd.locate(4, 0);
boki96 0:a30e079fa744 248 lcd.printf("LOZINKA");
boki96 0:a30e079fa744 249 lcd.locate(0, 1);
boki96 0:a30e079fa744 250 lcd.printf("JE PROMIJENJENA!");
boki96 0:a30e079fa744 251 piezoZvucnik.period(0.001);
boki96 0:a30e079fa744 252 piezoZvucnik.write(0.5);
boki96 0:a30e079fa744 253 lediceRGB.prikaz(0.0, 1.0, 0.0);
boki96 0:a30e079fa744 254 wait(2.0);
boki96 0:a30e079fa744 255 piezoZvucnik.write(0.0);
boki96 0:a30e079fa744 256 lediceRGB.prikaz(0.0, 0.0, 0.0);
boki96 0:a30e079fa744 257 lcd.cls();
boki96 0:a30e079fa744 258 } else if (brojac != duljinaLozinke) {
boki96 0:a30e079fa744 259 lediceRGB.prikaz(1.0, 0.0, 0.0);
boki96 0:a30e079fa744 260 lcd.cls();
boki96 0:a30e079fa744 261 lcd.printf("KRIVA LOZINKA...");
boki96 0:a30e079fa744 262 lcd.locate(0, 1);
boki96 0:a30e079fa744 263 lcd.printf("UNESITE PONOVNO!");
boki96 0:a30e079fa744 264 wait(1.0);
boki96 0:a30e079fa744 265 lediceRGB.prikaz(0.0, 0.0, 0.0);
boki96 0:a30e079fa744 266 lcd.cls();
boki96 0:a30e079fa744 267 }
boki96 0:a30e079fa744 268 }
boki96 0:a30e079fa744 269
boki96 0:a30e079fa744 270 void otkljucavanje(void) {
boki96 0:a30e079fa744 271 if (debounce.read_ms() > 200) {
boki96 0:a30e079fa744 272 piezoZvucnik.period(0.001);
boki96 0:a30e079fa744 273 piezoZvucnik.write(0.2);
boki96 0:a30e079fa744 274 wait(0.5);
boki96 0:a30e079fa744 275 lcd.cls();
boki96 0:a30e079fa744 276 lediceRGB.prikaz(0.0, 1.0, 0.0);
boki96 0:a30e079fa744 277 lcd.printf(" OTKLJUCAVANJE! ");
boki96 0:a30e079fa744 278 lcd.locate(0, 1);
boki96 0:a30e079fa744 279 lcd.printf("****************");
boki96 0:a30e079fa744 280 mojServo.write(90.0);
boki96 0:a30e079fa744 281 wait(1.5);
boki96 0:a30e079fa744 282 lcd.cls();
boki96 0:a30e079fa744 283 lcd.printf("****************");
boki96 0:a30e079fa744 284 lcd.locate(0, 1);
boki96 0:a30e079fa744 285 lcd.printf(" OTKLJUCANO ");
boki96 0:a30e079fa744 286 piezoZvucnik.write(0.0);
boki96 0:a30e079fa744 287
boki96 0:a30e079fa744 288 wait(10.0);
boki96 0:a30e079fa744 289
boki96 0:a30e079fa744 290 lcd.cls();
boki96 0:a30e079fa744 291 piezoZvucnik.period(0.001);
boki96 0:a30e079fa744 292 piezoZvucnik.write(0.5);
boki96 0:a30e079fa744 293 lediceRGB.prikaz(1.0, 0.0, 0.0);
boki96 0:a30e079fa744 294 lcd.printf(" ZAKLJUCAVANJE! ");
boki96 0:a30e079fa744 295 lcd.locate(0, 1);
boki96 0:a30e079fa744 296 lcd.printf("****************");
boki96 0:a30e079fa744 297 mojServo.write(0.0);
boki96 0:a30e079fa744 298 wait(1.5);
boki96 0:a30e079fa744 299 lcd.cls();
boki96 0:a30e079fa744 300 lcd.printf("****************");
boki96 0:a30e079fa744 301 lcd.locate(0, 1);
boki96 0:a30e079fa744 302 lcd.printf(" ZAKLJUCANO ");
boki96 0:a30e079fa744 303 wait(1.5);
boki96 0:a30e079fa744 304 lediceRGB.prikaz(0.0, 0.0, 0.0);
boki96 0:a30e079fa744 305 piezoZvucnik.write(0.0);
boki96 0:a30e079fa744 306 lcd.cls();
boki96 0:a30e079fa744 307 debounce.reset();
boki96 0:a30e079fa744 308 lcd.cls();
boki96 0:a30e079fa744 309 }
boki96 0:a30e079fa744 310 }