Idozites problema.

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
tajtilaci
Újonc
Újonc
Hozzászólások: 3
Csatlakozott: 2014. május 7. szerda, 17:20

Idozites problema.

Hozzászólás Szerző: tajtilaci »

Sziasztok!

Egy kartyaolvasoval vezerelnek egy relet. Irtam hozza egy programot, ami reszben mukodik is. Ha leolvastatom a kartyat, akkor aktivalodik is a kimenet a megfelelo idore. Ha olvastatas utan a bemenetet aktivalom, akkor a kimenetnek aktivnak kell maradnia, ez a resz is mukodik. Ha a bemenet az olvastatas utan nem aktiv, a kimenet elenged. Ezzel sincs semmi gond. Ha a bemenetet
a beallitottkesleltetesi idon belul, tobbszor aktivalom/inaktivalom, akkor a kivant kesleltetesi ido, nem mindig a megfelelo hosszusagu. Szoval a cel,ha a bemenetet inaktivalom, akkor az elejtesi kesleltetes,mindig 20 mp legyen.Szerintem kihagytam valamit, csak nem tudom hogy mit :-)
Kezdo vagyok meg a temaban, de szeretnem ezt a feladatot valahogy tokeletesen megoldani. :-)


Ime a program:

Kód: Egész kijelölése

 /* Inditastiltas autohoz. Irta: Tajti Laszlo.
 Felhasznalt eszkozok:
 Arduino Uno, (NANO ha Unoval mar mukodik, helymegtakaritas vegett)
 RFID-RC522 kartyaolvaso,
 Piezo zummer,
 Ketszinu led, ket kivezetessel,
 Relepanel. (alacsony-aktiv)
 Mukodes: Ervenyes katya leolvasasa utan, a relekimenet 20 masodpercre aktivalodik,
 a LED pirosrol-zoldre valt.
 Ha a gyujtast raadjuk az autora, a rele 20 masodperc utan is aktiv marad.
 Ha levesszuk a gyujtast, a rele 20 masodperc mulva elenged, es a LED pirosra valt.
 RFID olvaso bekotese:
 MOSI:Pin 11
 MISO:Pin 12
 SCK:Pin 13
 SS:Pin 10
 RST:Pin 9
 */
 
 






 #include <SPI.h>
 #include <RFID.h>

   RFID rfid(10,9);           // Olvaso SS es RST kivezetese
   int buzzPin = 3;           // kimenet a zummerhez
   int relay = 4;             // Rele kimenet
   int led = 6;               //LED Anod
   int led1 = 7;              //LED Katod
   int gyujtas = 2;           // bemenet a gyujtas erzekelesere
   
   

 void setup(){
  
     pinMode(relay, OUTPUT);
     pinMode(led, OUTPUT);
     pinMode(led1, OUTPUT);
     pinMode(gyujtas, INPUT);
    
     //Serial.begin(9600);    // Soros kommunikacio, a kartyaadatok kiolvasasahoz.
     SPI.begin();
     rfid.init();
     }

 void loop(){
      
      
       if(digitalRead(gyujtas) == HIGH)       // Bemenet magas (gyujtas raadva) Rele huzva marad.
                                              // Az auto lefulladasa eseten hasznos.
                                              // a megadott idon belul, nem kell ujra olvastatni.
      

       delay(20000);                         // Gyujtas leveve, Rele 20 masodperc utan elenged.          
     {

       
      if(digitalRead(gyujtas) == LOW)       // Bemenet alacsony,rele elengedve.
      
      
      
     {
      
      digitalWrite(relay,HIGH);       // Rele elengedve- gyujtas blokkolva
                                      // Esetleges akku levetelekor, es ujra
     {                                // csatlakoztatasanal, az auto blokkolva marad.
       digitalWrite(led, HIGH);       // LED pirosan vilagit
       digitalWrite(led1, LOW);
     }
     
    {
     if (rfid.isCard())              // Kartya erzekelve
    {
     //Serial.print("Card detected, ");
     
     if (rfid.readCardSerial())     // Kartya adatok kiolvasasa
    {
     //Serial.print("the card's number is: ");
     //Serial.print(rfid.serNum[0]);
     //Serial.print(".");
     //Serial.print(rfid.serNum[1]);
     //Serial.print(".");                   // A kartyaadatokat kiirathatjuk,
     //Serial.print(rfid.serNum[2]);        // a soros monitorra. Az uj kartyak
     //Serial.print(".");                   // ervenyesitesenel hasznos.
     //Serial.print(rfid.serNum[3]);
     //Serial.print(".");
     //Serial.print(rfid.serNum[4]);
     //Serial.println(" ");
    }

    if(rfid.serNum[0]==180&&rfid.serNum[1]==166&&rfid.serNum[2]==20&&rfid.serNum[3]==29&&rfid.serNum[4]==27
    ||
       rfid.serNum[0]==164&&rfid.serNum[1]==169&&rfid.serNum[2]==82&&rfid.serNum[3]==46&&rfid.serNum[4]==113)
     // Ha a kartyaazonositok minden tagja egyezik,
   

   
   
   
   
   
   
    {
     digitalWrite(led,LOW);    // A LED zoldre valt
     digitalWrite(led1,HIGH);
     digitalWrite(relay,LOW);  // A rele meghuz, gyujtasblokk feloldva
     analogWrite(3,250);       // Piezo megszolal 
     delay(1000);
     analogWrite(3,0);
     
     
     if(digitalRead(gyujtas) == LOW) // Ha a bemenet alacsony, (nincs rajta a gyujtas)
  
     
     delay(20000);                   // A rele 20 mp.-ig huz
    }
    }
    }
    }
    }
      
    
    
     rfid.halt();
    }
    
A ket include mas kartyaolvasokhoz irt programokbol lett osszeszedve, azok alapjan irtam ezt is. En a teljes kartyaazonositot figyelem az azonositas soran, a peldaprogramok csak az elso blokkokat.
Ha van otletetek,hogy mi lehet a hiba, azt elore is megkoszonnem.

Udv.

T.L.



Admin: Legközelebb használd kódbeszúráshoz a CODE gombot!
Avatar
SzLacus
Tranzisztorgyógyász
Hozzászólások: 175
Csatlakozott: 2012. május 20. vasárnap, 6:00

Re: Idozites problema.

Hozzászólás Szerző: SzLacus »

Szerintem azért, mert delay-t használsz. Amikor delay kerül végrehajtásra, akkor a programod többi része nem jut szóhoz. Mintha ott sem lennének a sorok. Úgy kéne megyoldanod, hogy amikor indul az időzítésed, akkor elmentesz egy időpontot, és megteszed azt, amit az időzítés elején tenned kell. (pl. meghúzod a relét). Aztán azt figyeled, hogy a pillanatnyi idő (millis) meghaladja-e az elmetettet a késleltetési idővel. Amikor igen, akkor teszi a programod amit kell (elengedi a relét). Így a loop folyamatosan kering, és kihagyja azokat a részeket, amiket akkor kell megcsinálni, amikor lejárt az időzítés. Viszont észreveszi, ha jön újabb kártyaolvasás, vagy egyéb esemény. A kulcs, hogy megszakításba nem lehet megszakítást ágyazni, így amikor delay-ban vagy akkor "süket" a dolog. Pontosabban csak utána fog lefutni az a megszakítás kérés, ami közben jött, mondjuk a kártya olvasótól. De azt is csinálhatod, hogy az egyben 20 sec késleltetést például 200*0,1 sec-ként hajtod végre egy ciklussal. A ciklusban pedig minden delay(100) után meglesed, hogy történt-e valami ami miatt a késleltetésedet változtatnod kell. Mondjuk ha késleltetés közben újra olvasod a kártyát, és azt akarod, hogy ettől újra induljon a 20 sec, akkor a ciklusszámlálódat menet közben megint 200-ra állítod, és meg van oldva a dolog. Ugyan ezt kell tenned, ha az időzítés közben megjelenik a várt gyújtás jele. Amíg azt látod, addig minden alkalommal 200-ra állítod a ciklus számlálót. Ha a gyújtást leveszed, elfogy a számláló, és letelik az időzítésed, amitől elejt a reléd. ugyan ezt kell tenned akkor is, ha az elmentett idős megoldást választod. Amíg él a gyújtás, addig minden loop körben újra frissíted az időt.
Szerintem így működhet. Az hozzá tartozik a dologhoz, hogy ez nem pont 20 sec időt fog adni, hanem a 20 sec és a egy loop, vagy a másik megoldás esetén, egy időzítési egység (a példában delay(100)) valamilyen hányadát. De ez a "szórás" a működést nem zavarja.
Még egy apróság, hogy mintha nem passzolnának a nyitó ({) és záró (}) kapcsos zárójelek. A loop első if-je mögött hiányolom a kezdőt, és az azt követő delay mögött pedig nem értem a kezdő zárójelet. Elemezhetnénk, hogy mi is történik, de szerintem nem így akartad leírni. Egyébként, ha csak egy utasítás van az if-ben, akkor nem kötelező a kapcsos zárójelek használata, vagyis értelmezi nélküle is a fordító, csak nem biztos, hogy az lesz az erenmény, mint amit te kódolni szándékoztál.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Idozites problema.

Hozzászólás Szerző: Robert »

A millis() függvényt használd.

Adott pillantot ki tudsz olvasni és a folyamatos do-loop-ban nézd, hogy eltelt e az idő:

Kód: Egész kijelölése

setup()
{start=9999999}
loop() {
if mehet=OK start=millis()
if start<millis()+20000 rele meghuz else rele elenged
} 
tajtilaci
Újonc
Újonc
Hozzászólások: 3
Csatlakozott: 2014. május 7. szerda, 17:20

Re: Idozites problema.

Hozzászólás Szerző: tajtilaci »

Koszonom szepen a segitsegeteket! Megprobalkozom ezekkel a megoldasokkal. :-)
Válasz küldése