![](/media/cache/group/tvz-logo.png.50x50_q85.png)
Automatsko upravljanje kliznom ogradom
Dependencies: mbed
Zadatak
Program ima zadatak upravljati otvaranjem i zatvaranjem klizne ograde. Otvaranje ograde potrebno je moći pokrenuti signalom za otvaranje (npr. pomoću daljinskog upravljaca), dok se zatvaranje ograde izvodi automatski po isteku unaprijed zadanog vremena. Kod zatvaranja ograde potrebno je prepoznati ukoliko neki predmet ili osoba predstavljaju prepreku zatvaranju ograde.
Opis rada
Niže na slici vidljiv je dijagram tijeka programa.
Shema
Ovaj rad se sastoji od:
- 1 x Nucleo -F302R8 programska plocica
- 4 x LED dioda 5mm
- 4 x Otpornik 499Ohm 1/4W
- 1 x DIP sklopka 4p
- Male to Male zica za plocicu
Kod stvarne izvedbe upravljanja ogradom bi DIP sklopku zamjenili krajnji prekidaci na pocetnom i krajnjem polozaju ograde, ulazni signal za otvaranje ograde davao bi se pomocu nekog od komunikacijskih protokola kao npr. IR komunikacija, RF komunikacija, internet itd. Umjesto LED dioda spaja se motor s pripadajucom opremom za pokretanje i promjenu smjera, signalizacijsko svjetlo te motorna kočnica.
Fizicka shema spoja
Elektricna shema spoja
Funkcionalan rad
main.cpp@0:f89cdb519c2e, 2020-12-02 (annotated)
- Committer:
- kerepd
- Date:
- Wed Dec 02 14:42:59 2020 +0000
- Revision:
- 0:f89cdb519c2e
Program za upravljanje kliznom ogradom;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kerepd | 0:f89cdb519c2e | 1 | #include "mbed.h" |
kerepd | 0:f89cdb519c2e | 2 | #include "Ograda.h" |
kerepd | 0:f89cdb519c2e | 3 | |
kerepd | 0:f89cdb519c2e | 4 | |
kerepd | 0:f89cdb519c2e | 5 | Ograda motor(D2,D3,D4,D5); |
kerepd | 0:f89cdb519c2e | 6 | InterruptIn sw_start(D6, PullDown); |
kerepd | 0:f89cdb519c2e | 7 | InterruptIn sw_end(D7, PullDown); |
kerepd | 0:f89cdb519c2e | 8 | InterruptIn sensor(D8, PullDown); |
kerepd | 0:f89cdb519c2e | 9 | InterruptIn signal_rx(USER_BUTTON, PullUp); |
kerepd | 0:f89cdb519c2e | 10 | int pomocna=0; |
kerepd | 0:f89cdb519c2e | 11 | Serial pc(USBTX, USBRX); |
kerepd | 0:f89cdb519c2e | 12 | Timer debounce; |
kerepd | 0:f89cdb519c2e | 13 | |
kerepd | 0:f89cdb519c2e | 14 | |
kerepd | 0:f89cdb519c2e | 15 | void TerraTerm() // ispisivanje podataka u TerraTerm pomoću serijske komunikacije |
kerepd | 0:f89cdb519c2e | 16 | { |
kerepd | 0:f89cdb519c2e | 17 | pc.printf("Ograda zatvorena =1, nije zatvorena=0: %d \n \r ", sw_start.read()); |
kerepd | 0:f89cdb519c2e | 18 | pc.printf("Ograda otvorena =1, djelomicno otvorena=0: %d \n \n\r ", sw_end.read()); |
kerepd | 0:f89cdb519c2e | 19 | pc.printf("Senzor = %d \n \n\r ", sensor.read()); |
kerepd | 0:f89cdb519c2e | 20 | } |
kerepd | 0:f89cdb519c2e | 21 | |
kerepd | 0:f89cdb519c2e | 22 | |
kerepd | 0:f89cdb519c2e | 23 | void zaustavi() //funkcija za zaustavljanje motora |
kerepd | 0:f89cdb519c2e | 24 | { |
kerepd | 0:f89cdb519c2e | 25 | debounce.start(); |
kerepd | 0:f89cdb519c2e | 26 | if (debounce.read_ms()>200) |
kerepd | 0:f89cdb519c2e | 27 | { |
kerepd | 0:f89cdb519c2e | 28 | motor.zaustavi(); |
kerepd | 0:f89cdb519c2e | 29 | pc.printf("Zaustavaljanje motora i gasenje signalizacije \n \r "); |
kerepd | 0:f89cdb519c2e | 30 | pomocna=1; //služi za povratak u glavnu funkciju |
kerepd | 0:f89cdb519c2e | 31 | TerraTerm(); //ispis ulaza |
kerepd | 0:f89cdb519c2e | 32 | debounce.reset(); |
kerepd | 0:f89cdb519c2e | 33 | } |
kerepd | 0:f89cdb519c2e | 34 | |
kerepd | 0:f89cdb519c2e | 35 | } |
kerepd | 0:f89cdb519c2e | 36 | |
kerepd | 0:f89cdb519c2e | 37 | |
kerepd | 0:f89cdb519c2e | 38 | void otvori() // procedura otvaranja ograde - senzor pri otvaranju smeta |
kerepd | 0:f89cdb519c2e | 39 | { |
kerepd | 0:f89cdb519c2e | 40 | sensor.rise(NULL); // sprijecavanje rada senzora tijekom otvaranja ograde |
kerepd | 0:f89cdb519c2e | 41 | sensor.fall(NULL);// |
kerepd | 0:f89cdb519c2e | 42 | motor.pokreni(2, 0.0); |
kerepd | 0:f89cdb519c2e | 43 | pc.printf("Otvaranje ograde \n \n \r "); |
kerepd | 0:f89cdb519c2e | 44 | TerraTerm(); |
kerepd | 0:f89cdb519c2e | 45 | } |
kerepd | 0:f89cdb519c2e | 46 | |
kerepd | 0:f89cdb519c2e | 47 | |
kerepd | 0:f89cdb519c2e | 48 | |
kerepd | 0:f89cdb519c2e | 49 | void pocetna() // funkcija koja se izvodi samo prvi puta - npr. ograda ostala djelomično otvorena |
kerepd | 0:f89cdb519c2e | 50 | { |
kerepd | 0:f89cdb519c2e | 51 | if(sw_start.read()==0&&sw_end.read()==0) |
kerepd | 0:f89cdb519c2e | 52 | { |
kerepd | 0:f89cdb519c2e | 53 | pc.printf("Zatvaranje ograde za 8s \n \n \r "); |
kerepd | 0:f89cdb519c2e | 54 | sensor.rise(&zaustavi); |
kerepd | 0:f89cdb519c2e | 55 | |
kerepd | 0:f89cdb519c2e | 56 | wait(8); |
kerepd | 0:f89cdb519c2e | 57 | motor.pokreni(1, 2.0); |
kerepd | 0:f89cdb519c2e | 58 | pc.printf("Zatvaranje ograde \n \n \r "); |
kerepd | 0:f89cdb519c2e | 59 | TerraTerm(); |
kerepd | 0:f89cdb519c2e | 60 | } |
kerepd | 0:f89cdb519c2e | 61 | } |
kerepd | 0:f89cdb519c2e | 62 | |
kerepd | 0:f89cdb519c2e | 63 | |
kerepd | 0:f89cdb519c2e | 64 | |
kerepd | 0:f89cdb519c2e | 65 | void glavna() // funkcija provjere stanja ulaza koja se izvodi kod svakog novog događaja |
kerepd | 0:f89cdb519c2e | 66 | { |
kerepd | 0:f89cdb519c2e | 67 | |
kerepd | 0:f89cdb519c2e | 68 | pomocna=0; |
kerepd | 0:f89cdb519c2e | 69 | signal_rx.rise(NULL); //blokiranje signala iz daljinskog uptavljača ukoliko ograda nije zatvorena |
kerepd | 0:f89cdb519c2e | 70 | |
kerepd | 0:f89cdb519c2e | 71 | if(sw_start.read()==0&&sw_end.read()==1) |
kerepd | 0:f89cdb519c2e | 72 | { |
kerepd | 0:f89cdb519c2e | 73 | sensor.rise(&zaustavi); |
kerepd | 0:f89cdb519c2e | 74 | sensor.fall(&pocetna); |
kerepd | 0:f89cdb519c2e | 75 | pc.printf("Zatvaranje ograde za 8s \n \n \r "); |
kerepd | 0:f89cdb519c2e | 76 | wait(8); |
kerepd | 0:f89cdb519c2e | 77 | motor.pokreni(1, 2.0); |
kerepd | 0:f89cdb519c2e | 78 | pc.printf("Zatvaranje ograde \n \n \r "); |
kerepd | 0:f89cdb519c2e | 79 | TerraTerm(); |
kerepd | 0:f89cdb519c2e | 80 | } |
kerepd | 0:f89cdb519c2e | 81 | |
kerepd | 0:f89cdb519c2e | 82 | |
kerepd | 0:f89cdb519c2e | 83 | if(sw_start.read()==1) |
kerepd | 0:f89cdb519c2e | 84 | { |
kerepd | 0:f89cdb519c2e | 85 | signal_rx.rise(&otvori); |
kerepd | 0:f89cdb519c2e | 86 | sensor.fall(NULL); |
kerepd | 0:f89cdb519c2e | 87 | pc.printf("Ceka se signal za otvaranje \n\n \r "); |
kerepd | 0:f89cdb519c2e | 88 | TerraTerm(); |
kerepd | 0:f89cdb519c2e | 89 | } |
kerepd | 0:f89cdb519c2e | 90 | } |
kerepd | 0:f89cdb519c2e | 91 | |
kerepd | 0:f89cdb519c2e | 92 | |
kerepd | 0:f89cdb519c2e | 93 | int main() |
kerepd | 0:f89cdb519c2e | 94 | { |
kerepd | 0:f89cdb519c2e | 95 | TerraTerm(); |
kerepd | 0:f89cdb519c2e | 96 | signal_rx.rise(NULL); // signal za otvaranje ograde nije potreban ukoliko ograda nije zatvorena |
kerepd | 0:f89cdb519c2e | 97 | sw_start.rise(&zaustavi); |
kerepd | 0:f89cdb519c2e | 98 | sw_end.rise(&zaustavi); //definiranje događaja prilikom rastućih bridova |
kerepd | 0:f89cdb519c2e | 99 | sensor.rise(&zaustavi); |
kerepd | 0:f89cdb519c2e | 100 | |
kerepd | 0:f89cdb519c2e | 101 | pocetna(); |
kerepd | 0:f89cdb519c2e | 102 | glavna(); |
kerepd | 0:f89cdb519c2e | 103 | |
kerepd | 0:f89cdb519c2e | 104 | while(1) { |
kerepd | 0:f89cdb519c2e | 105 | |
kerepd | 0:f89cdb519c2e | 106 | if(sw_start.read()==1&&sw_end.read()==1) // provjera jesu li prekidači u kratkom spoju |
kerepd | 0:f89cdb519c2e | 107 | |
kerepd | 0:f89cdb519c2e | 108 | { |
kerepd | 0:f89cdb519c2e | 109 | pc.printf("NEISPRAVNI KRAJNJI PREKIDACI \n\n \r "); |
kerepd | 0:f89cdb519c2e | 110 | zaustavi(); |
kerepd | 0:f89cdb519c2e | 111 | break; |
kerepd | 0:f89cdb519c2e | 112 | } |
kerepd | 0:f89cdb519c2e | 113 | |
kerepd | 0:f89cdb519c2e | 114 | |
kerepd | 0:f89cdb519c2e | 115 | if(pomocna==1) |
kerepd | 0:f89cdb519c2e | 116 | { |
kerepd | 0:f89cdb519c2e | 117 | glavna(); |
kerepd | 0:f89cdb519c2e | 118 | } |
kerepd | 0:f89cdb519c2e | 119 | } |
kerepd | 0:f89cdb519c2e | 120 | } |