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.

https://os.mbed.com/media/uploads/kerepd/ograda.png


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

https://os.mbed.com/media/uploads/kerepd/konstrukcijski_bb.png

Elektricna shema spoja

https://os.mbed.com/media/uploads/kerepd/ograda_schema.png

Funkcionalan rad

https://os.mbed.com/media/uploads/kerepd/img_01481.jpg

https://os.mbed.com/media/uploads/kerepd/img_0150-2.jpg

Revision:
0:f89cdb519c2e
diff -r 000000000000 -r f89cdb519c2e main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Dec 02 14:42:59 2020 +0000
@@ -0,0 +1,120 @@
+#include "mbed.h"
+#include "Ograda.h"
+
+
+Ograda motor(D2,D3,D4,D5);
+InterruptIn sw_start(D6, PullDown);
+InterruptIn sw_end(D7, PullDown);
+InterruptIn sensor(D8, PullDown);
+InterruptIn signal_rx(USER_BUTTON, PullUp);
+int pomocna=0;
+Serial pc(USBTX, USBRX);
+Timer debounce;
+
+
+void TerraTerm() // ispisivanje podataka u TerraTerm pomoću serijske komunikacije
+{
+    pc.printf("Ograda zatvorena =1, nije zatvorena=0: %d \n \r ", sw_start.read());
+    pc.printf("Ograda otvorena =1,  djelomicno otvorena=0: %d \n  \n\r ", sw_end.read());
+    pc.printf("Senzor = %d \n  \n\r ", sensor.read());
+}
+
+
+void zaustavi() //funkcija za zaustavljanje motora
+{
+    debounce.start();
+    if (debounce.read_ms()>200) 
+    {
+        motor.zaustavi();
+        pc.printf("Zaustavaljanje motora i gasenje signalizacije \n \r ");
+        pomocna=1;         //služi za povratak u glavnu funkciju
+        TerraTerm();        //ispis ulaza 
+        debounce.reset();
+    }
+
+}
+
+
+void otvori()  // procedura otvaranja ograde - senzor pri otvaranju smeta
+{
+    sensor.rise(NULL); // sprijecavanje rada senzora tijekom otvaranja ograde
+    sensor.fall(NULL);//
+    motor.pokreni(2, 0.0);
+    pc.printf("Otvaranje ograde \n  \n \r ");
+    TerraTerm();
+}
+
+
+
+void pocetna() // funkcija koja se izvodi samo prvi puta - npr. ograda ostala djelomično otvorena
+{
+    if(sw_start.read()==0&&sw_end.read()==0) 
+    {
+        pc.printf("Zatvaranje ograde za 8s \n \n \r ");
+        sensor.rise(&zaustavi);
+
+        wait(8);
+        motor.pokreni(1, 2.0);
+        pc.printf("Zatvaranje ograde \n \n \r ");
+        TerraTerm();
+    }
+}
+
+
+
+void glavna() // funkcija provjere stanja ulaza koja se izvodi kod svakog novog događaja
+{
+    
+    pomocna=0;
+    signal_rx.rise(NULL); //blokiranje signala iz daljinskog uptavljača ukoliko ograda nije zatvorena
+
+    if(sw_start.read()==0&&sw_end.read()==1) 
+    {
+        sensor.rise(&zaustavi);
+        sensor.fall(&pocetna);
+        pc.printf("Zatvaranje ograde za 8s \n \n \r ");
+        wait(8);
+        motor.pokreni(1, 2.0);
+        pc.printf("Zatvaranje ograde \n \n \r ");
+        TerraTerm();
+    }
+
+
+    if(sw_start.read()==1) 
+    {
+        signal_rx.rise(&otvori);
+        sensor.fall(NULL);
+        pc.printf("Ceka se signal za otvaranje  \n\n \r ");
+        TerraTerm();
+    }
+}
+
+
+int main()
+{
+    TerraTerm();
+    signal_rx.rise(NULL); // signal za otvaranje ograde nije potreban ukoliko ograda nije zatvorena
+    sw_start.rise(&zaustavi);
+    sw_end.rise(&zaustavi); //definiranje događaja prilikom rastućih bridova
+    sensor.rise(&zaustavi);
+
+    pocetna();
+    glavna();
+
+    while(1) {
+      
+        if(sw_start.read()==1&&sw_end.read()==1) // provjera jesu li prekidači u kratkom spoju
+        
+        { 
+            pc.printf("NEISPRAVNI KRAJNJI PREKIDACI  \n\n \r ");
+            zaustavi();
+            break;
+        }
+
+
+        if(pomocna==1) 
+        {
+            glavna();
+        }
+    }
+}