Egy érdekes problémám lenne, már minden formában próbálkoztam (gugli is jó barátom) de eddig semmi eredmény.
Adott "A" és "B" feladat.
"A" feladat folyamatosan fut a loop()-ban. Van egy változó amit figyelek, és adódik olyan körülmény (változó 0 értéket kap huzamosabb ideig), hogy ekkor "B" feladatot kell elvégezni. A probléma az, hogy ha a változó továbbra is 0, akkor a "B" feladat ne hajtódjon végre újra és újra, hanem várjon addig, míg a változó újra nagyobb lesz, mint 0 és "A" feladat újra végrehajtható.
Tehát olyan megoldás kellene, hogy "B" végrehajtás után kikapcsolja magát és induljon "A" feladattal, mikor a változó új, nullánál nagyobb értéket kap.
Keresek valakik vállalkozó szellemű szakembert, aki össze tud rakni egy kis Arduinos rendszert. Ha számlát is tudnál adni, még jobb lenne, de megoldható másként is.
Nem egy kész "terméket" kell kifejleszteni, csak egy kis részét, nem kell garancia se, pusztán "segítség" kell, hogy tovább tudjunk lépni.
Röviden a feladat:
RFID olvasókat kell összekötni egy Arduino boarddal, majd WIFIn keresztül egy http requestben elküldeni amit kiolvasott. Elvileg nagyon jó leírások vannak hozzá, mind a RC522 readeről, mind a wifire (beépített vagy ESP8266)
Ha megcsináltad, az adott kódrészre szívesen ránézek, de ahogy eddig is, eztán sem fogok más helyett kódolni. Illetve kódolok, csak az ugye nem ingyenszolgálat lenne.
int bejaratiajtonyitas; // bejárati ajtó nyitás int bejaratiajtocsukas; // bejárati ajtó csukás int teraszajtonyitas; // terasz ajtó nyitás int teraszajtocsukas; // terasz ajtó csukás int nappaliablak1nyitas; // nappali kis ablak nyitás int nappaliablak1csukas; // nappali kis ablak csukás int nappaliablak2nyitas; // nappali nagy ablak nyitás int nappaliablak2csukas; // nappali nagy ablak csukás int haloablaknyitas; // háló dupla ablak nyitás int haloablakcsukas; // háló dupla ablak csukás int kisszobaablaknyitas; // kisszoba ablak nyitás int kisszobaablakcsukas; // kisszoba ablak csukás int villanyoranyitas; // villanyora nyitás // int villanyoracsukas; // villanyora csukás
int aramsensor = 4; // áramszünet reléről érkező jel int amplifier = 9; // amplifier relay
RCSwitch mySwitch = RCSwitch(); // rf 433mhz
//wiegand:
unsigned char databits[MAX_BITS]; // stores all of the data bits unsigned char bitCount; // number of bits currently captured unsigned char flagDone; // goes low when data is currently being captured unsigned int weigand_counter; // countdown until we assume there are no more bits
unsigned long facilityCode=0; // decoded facility code unsigned long cardCode=0; // decoded card code
// interrupt that happens when INTO goes low (0 bit) void ISR_INT0() { //Serial.print("0"); // uncomment this line to display raw binary bitCount++; flagDone = 0; weigand_counter = WEIGAND_WAIT_TIME;
}
// interrupt that happens when INT1 goes low (1 bit) void ISR_INT1() { //Serial.print("1"); // uncomment this line to display raw binary databits[bitCount] = 1; bitCount++; flagDone = 0; weigand_counter = WEIGAND_WAIT_TIME; }
mySwitch.enableReceive(1); //pin2 = int1 // 433Mhz Receiver on inerrupt 0 => that is pin #2
// binds the ISR functions to the falling edge of INTO and INT4 attachInterrupt(0, ISR_INT0, FALLING); // pin3 = int0 rfid attachInterrupt(4, ISR_INT1, FALLING); // pin7 = int4 rfid
weigand_counter = WEIGAND_WAIT_TIME; }
void loop() {
int garazssensorValue = analogRead(A0); //mozgáserzékelök int eloszobasensorValue = analogRead(A1); int konyhasensorValue = analogRead(A2); int kisszobasensorValue = analogRead(A3); int nappalisensorValue = analogRead(A4); int haloszobasensorValue = analogRead(A5);
//rf433mhz olvasás
if (mySwitch.available()) { int value = mySwitch.getReceivedValue(); if (value == 0) { Serial.print("Unknown encoding"); } else { Serial.print("Received "); Serial.print( mySwitch.getReceivedValue() ); Serial.print(" / "); Serial.print( mySwitch.getReceivedBitlength() ); Serial.print("bit "); Serial.print("Protocol: "); Serial.println( mySwitch.getReceivedProtocol() ); }
if (bejaratiajtonyitas==true) bejaratiajtostatus = true; if (bejaratiajtocsukas==true) bejaratiajtostatus = false;
if (teraszajtonyitas==true) teraszajtostatus = true; if (teraszajtocsukas==true) teraszajtostatus = false;
if (nappaliablak1nyitas==true) nappaliablak1status = true; if (nappaliablak1csukas==true) nappaliablak1status = false;
if (nappaliablak2nyitas==true) nappaliablak2status = true; if (nappaliablak2csukas==true) nappaliablak2status = false;
if (haloablaknyitas==true) haloablakstatus = true; if (haloablakcsukas==true) haloablakstatus = false;
if (kisszobaablaknyitas==true) kisszobaablakstatus = true; if (kisszobaablakcsukas==true) kisszobaablakstatus = false;
mySwitch.resetAvailable(); }
int mozgasgarazs =(garazssensorValue<400 || garazssensorValue>900) // mozgásérzékelők érzékelése int mozgaseloszoba =(eloszobasensorValue<400 || eloszobasensorValue>900) int mozgaskonyha =(konyhasensorValue<400 || konyhassensorValue>900) int mozgaskisszoba =(kisszobasensorValue<400 || kisszobasensorValue>900) int mozgasnappali =(nappalissensorValue<400 || nappalisensorValue>900) int mozgashaloszoba =(haloszobasensorValue<400 || haloszobasensorValue>900)
//wiegand:
// This waits to make sure that there have been no more data pulses before processing data if (!flagDone) { if (--weigand_counter == 0) flagDone = 1; } // if we have bits and we the weigand counter went out if (bitCount > 0 && flagDone) { unsigned char i; Serial.print("Read "); Serial.print(bitCount); Serial.print(" bits. "); // we will decode the bits differently depending on how many bits we have // see www.pagemac.com/azure/data_formats.php for mor info if (bitCount == 35) { // 35 bit HID Corporate 1000 format // facility code = bits 2 to 14 for (i=2; i<14; i++) { facilityCode <<=1; facilityCode |= databits[i]; } // card code = bits 15 to 34 for (i=14; i<34; i++) { cardCode <<=1; cardCode |= databits[i]; } Serial.print("FC = "); Serial.print(facilityCode); Serial.print(", CC = "); Serial.println(cardCode); } else if (bitCount == 26) { // standard 26 bit format // facility code = bits 2 to 9 for (i=1; i<9; i++) { facilityCode <<=1; facilityCode |= databits[i]; } // card code = bits 10 to 23 for (i=9; i<25; i++) { cardCode <<=1; cardCode |= databits[i]; } //kártyaszámok kiíratása Serial.print("FC = "); Serial.print(facilityCode); Serial.print(", CC = "); Serial.println(cardCode); } else { // you can add other formats if you want! Serial.println("Unable to decode."); }
//kártya:
if (cardCode==54685) { {
digitalWrite(riaszto, !digitalRead(riaszto)); // ki/be kapcsolja a riasztót és ki/be kapcsolja az rfid zöld ledjét riasztoState = digitalRead(riaszto); // read pin status Serial.println(riasztoState); }
digitalWrite(amplifier, HIGH); //kikapcsolja az amplifiert
}
}
//cleanup and get ready for the next card //törli a kártyaszámokat bitCount = 0; facilityCode = 0; cardCode = 0; for (i=0; i<MAX_BITS; i++) { databits[i] = 0; } }
Még annyit, hogy ha valami tele van hibával, akkor az csak úgy tűnik, mintha működne, és potenciálisan benne van az esélye annak, hogy előbb-utóbb olyasmibe futsz bele, amit nem vársz. És az elég gáz, hogy pl. nem tudsz a lakásba bemenni vagy nem tudod lelőni a riasztót vagy...
Végtelenül leegyszerűsítve az állapotgép: vannak feltételek, amelyek lehetnek simán binárisak (igaz/hamis), vagy lehetnek analógok (adott érték alatt vagy felett, de ebből is bináris eredmény lesz). Az események a feltételek változásait jelentik. Egy állapotgépnek annyi konkrét állapota van, ahány kombináció előfordulhat a feltételekben. A legegyszerűbb állapotgép a villanykapcsoló--villanykörte kombináció. Ha a villanykapcsoló "BE" állapotban van, akkor a lámpa világít, ha "KI" állapotban van, akkor nem világít. Az állapotváltozás a kapcsoló átbillentése egyik állapotból a másikba. Beágyazott fejlesztésnél az állapotok változását vizsgáljuk, és a régi feltételcsomagból az új feltételcsomagba történő átmenet pillanatában egy szándékolt új állapotot hozunk létre. Ha a villanykapcsoló mikrokontrolleres vezérlést kapna, akkor azt vizsgálnánk, hogy mikor kerül át egyik állapotból a másikba a kapcsoló, és ennek megfelelően kapcsolnánk ki és be azt a bemenetet, amelyen a relémodul van.
A kódodban deklarálva és definiálva van már az elején néhány állapot:
boolean alarm=true; // kezdéskor aktív boolean ido=false; boolean idolejart=false;
Ez már eleve több, mint ami a legtöbb kezdő kódjában alapból megtalálható. A villanykapcsolós részt most nem írom le teljes egészében, az 5 perc ELEKTRONIKA facebook oldalán van erről egy elég hosszú jegyzet kódrészletekkel, példákkal egyetemben. A te esetedben az van, hogy: -- van egy esemény, az ajtó nyitása (ez egy feltétel változását jelenti), -- az ajtó nyitása indukál egy állapotot, amikor a rendszer a riasztásig 30 másodpercig vár, -- ebből az állapotból két további állapot elérése lehetséges: 1. ha beírod 30 mp-en belül a kódot, akkor kikapcsol az élesítés, 2. ha nem írod be a kódot vagy rossz kódot ütsz be vagy későn ütöd be, akkor riasztani kezd. A 30 mp-es várakozási idő alatt tehát alapvetően két dolgot kell figyelned: beütötted-e a jó kódot vagy lejárt-e a 30 mp. Az elsőt hagyjuk most, nem erre vonatkozott a kérdés. A második, az idő lejáratához kettő dolog kell: valami, amivel időt mérünk és valami, amivel megakasztjuk a program futását úgy, hogy közben ezt-azt tudunk csinálni. Az elsőre a megoldás a millis() függvény, ami eredményül a reset óta eltet időt adja vissza unsigned long formátumú változóban, milliszekundumokban. A másik a while() ciklus, ami addig fut, amíg a while utáni zárójelben lévő feltétel igaz. A kódot nem fogom neked megírni, de a funkcionális kódvázlat így kellene kinézzen: 1. kezdeti állapot: ajtó zárva, riasztó éles, állapotfigyelés: nyílik-e az ajtó. 1--2. trigger: kinyílt az ajtó, indul a számláló. 2. állapot: ajtó nyitva, riasztó éles, állapotfigyelés: beírtad-e a jó kódot vagy lejárt-e az idő. 2--3. trigger: beírtad a jó kódot, kikapcsol a riasztó. [erre nem térünk ki] 2--4. trigger: lejárt az idő: bekapcsol a sziréna. 4. állapot: szól a sziréna (hogy meddig, az már részletkérdés, nyilván ez is egy állapot lesz). Minden vizsgálandó dologhoz tartozik egy feltétel (egy-egy boolean), és minden triggervizsgálathoz kell egy-egy while utasítás.
A delay() függvény egy while, de semmi mást nem csinál, mint hogy azt figyeli, hogy lejárt-e az idő, nem tudod meghatározni, hogy közben mit csináljon. Ha a delay() helyett a while()-ba ágyazod bele azt a vizsgálatot, hogy lejárt-e az idő és hogy sikerült-e a jó kódot beírnod, akkor pont azt éred el, ami a célod (és remélhetőleg megérted az állapotgépek működését). A BlinkWithoutDelay pontosan ezt demonstrálja, csak ott egyetlen feltétel van (letelt-e az idő), és egyetlen állapotot vált (világít-e a led).
Készítesz egy timerinterruptot (TimerOne library), ami a beállított időközönként megszakítás generál. Ebben a rutinban egy számlálót növelsz a megfelelő feltételek teljesülése esetén. Ha a számláló elérte a beállított értéket, akkor a kimenetet(ket) vezérelheted ahogy szeretnéd. Közben a program fut tovább a köztes időben.
Szia köszi Azt már néztem de nem tudom értelmezni sajnos kb 0 előképzettséggel sikerült összeraktam egy működő rendszert tudom hogy tele van hibával de működik :)
Ahogy írtam Nem ez a valós program azért írtam le ezt mert arra lenne szükségem hogy valaki megírja hogy mit írjak a delay helyébe hogy ne álljon le addig
Lakásriasztó tervezésben szeretnék egy kis segítséget kérni.
Leegyszerűsítve, ott akadtam el, (már persze az elején) :) hogy amikor hazamegyek, kinyitom a bej.ajtót, szükségem lenne 30mp-re,amíg a kártyám hozzáérintem az RFID-hez. Persze ez delay-el nem megy,mert addig áll a progi.
a saját kódom, kicsit bonyolult,mert GSM,RF,RFID,MP3, minden van benne, amúgy működik,,csak ez a delay a gond.
Itt egy egyszerűbb kód, segítene valaki átírni?
Köszönöm!
boolean alarm=true; // kezdéskor aktív boolean ido=false; boolean idolejart=false;
int sensor = 3; // bejárati ajtó érzékelő int nyomogomb = 4; // legyen most ez egy sima monentary button amivel aktiválom/deaktiválom int szirena = 5; // ez hozza müködébe a szirénát
Ha pénzt ad érte, az már eleve kereskedelmi forgalomba hozásnak minősül, ennek megfelelően minden ehhez kapcsolódó kötelezettsének meg kell felelned. Ez alól ki lehet bújni ilyen-olyan megoldásokkal, de mindegyikre egyöntetűen jellemző, hogy gyakorlatilag minden létező közvetlen és közvetett kárért te felelsz, ha galiba történik.
Nyilván valószerűtlen, hogy fog. De ha történik, akkor számolni kell a következményekkel.
Magam is arra jutottam, hogy ehhez a készülékhez nem lesz CE-minősítés és kész.
Ha valakinek így is megfelel, az megveszi, akinek nem felel meg, az nem veszi meg.
Egy magánlabor minden további nélkül rendelt a napokban pár darabot, pedig ők pontosan ugyanúgy és ugyanarra használják, mint az állami kórház laborja használta volna. Nekik csak az volt fontos, hogy jól használható és olcsó legyen. Máshol nyilván vannak ezeknél erősebb prioritások is...
Mivel ez nem sorozatgyártásban készül, hanem nálam a konyha asztalon, a gyártás legfontosabb eszközei a lombfűrész és a tűreszelő, hát vicces lenne erre gyártástechnológiát írni:)
A másik téma esetében én is rátaláltam, az abszolút encoderre, de amikor megláttam az árát, rögtön rájöttem, hogy ilyenem se lesz:)
Itt azért nem valami rettentő precíz mozgatásra és reprodukcióra van szükség, lényegében ha egy kommersz léptető- vagy szervo motor felbontását tudja, az már bőven elég.
A mechanikai rész is persze problémás, de azt nem is vállalnám, azt majd megcsinálja más, ha eljutunk odáig.
Nem tudom, hogy konkrét választ kaptál-e erre a két felvetett kérdésre, nem olvastam végig a folyamot. Amit el tudok mondani a témában.
CE minősítéshez sorozatgyártási eljárással készített mintadarab kell, több. Irreleváns az egyszerűsége, a felhasználási körülmények és az eszköz jellege determinálja, hogy milyen vizsgálati protokollon megy át. Sok ezek közül az eszköz megsemmisülésével jár, tehát a beadott x darab mintadarab közül nem fogsz visszakapni mindent. Épen legalábbis nem. A vizsgálat ára is a protokolloktól függ, alapból százezres nagyságrend, de simán el tud menni sok milliós nagyságrendig.
De.
Nem a vizsgálat lesz a drága, hanem a termék sorozatgyártásra való előkészítése, a megfelelő gyártó megtalálása, a gyártói (és tervezői) minősítések megszerzése, majd az x számú sorozatgyártott (!) próbadarab elkészítése. Ha x = 10, akkor az. Darabonként mondjuk 300 000 forint. Amit később összetörnek, felgyújtanak, árammal szétcsapnak, megfagyasztanak, szétráznak, eláztatnak stb. (Nem egymás után, külön-külön.)
A robot tekintetében ez kb. az ipar 4.5 (még nem feltétlen 5.0). Az összes nagy cég fejleszt ilyet. Amire szükséged van/lesz azt abszolút enkódernek hívják. Attól függően, hogy milyen pontosságú mozgást akarsz megvalósítani, különböző felbontású és precizitású enkóderek léteznek, úgy optikai, mint elektromechanikus megoldással (előbbi felbontása azért jóval rosszabb, mint az optikaié). Az már egy egészen komoly mérnöki feladat, hogy ezt hogy oldod meg mechanikusan, kuplungolod a motort, nem adsz rá tartófeszültséget, vagy mint az ipar 5.0 robotok teszik, a nyomatékérzékelők adatai alapján dekódolod a mozgást. És akkor ez még mindig csak a mozgás rögzítése, ott van mögötte a műszaki specifikáció második hulláma, nevezetesen az, hogy milyen abszolút precizitással és milyen ismétlődő precizitással kell visszaadniuk a mozgást.
Szép feladat, de igen költséges és igen időigényes hobbi keretek között.
A szabályozás szerint az lesz orvostechnikai eszköz, amit a gyártója annak szán. Az eredeti kérdező szánhatja nem orvostechnikai eszköznek is a specializált számológépét. A kérdés, hogy ebben az esetben el tudja-e adni.
Egy példa: Gyárthatsz szike alakú tárgyat.
1. Ha nincs minősítésed az alapanyagról, akkor maximum dísztárgy lehet.
2. Ha van beszállítói igazolásod, hogy nem mérgező az alapnyagod, akkor eladhatod konyhakésnek.
3. Ha van beszállítói alapanyag minősítésed ÉS minősítteted a terméket, hogy megfelel az orvostechnikai készülékekre vonatkozó szabványoknak (sterilizálhatóság, hőmérséklet tűrés, stb), akkor eladhatod orvosi szikének.
Látszik, hogy mindhárom esetben ugyanaz a termék, egyedül a gyártói szándék más.
De ez egy szikénél azért egyértelmű. Nem hiszem, hogy bármelyik kórház is vállalná a rizikót, hogy Aliexpressen rendeljen szikét...
A specializált számológép azért jó kérdés, mert miért ne lehetne általános célú segédeszköz, mint a példaként említett számítógép, amit történetesen az egészségügyben használnak.
Jelen esetben a probléma azzal lesz, hogy míg egy általános célú számítógépet, számológépet, mobiltelefont, akármit folyamatosan gyárt a gyártója ÁLTALÁNOS felhasználásra, és mellesleg veszik egészségügyi felhasználásra IS, addig az itt tárgyalt számológép kifejezetten egy adott feladatra, megbízásból készül. Ez innentől pedig inkább jogi téma, mint műszaki. Az eredeti kérdező pedig adja ki trainspotter néven a készüléket, és a leírásban legyen benne, hogy vasúti kocsik HOBBICÉLÚ számolásának segítségét szolgálja. :-)
Az értelmezésed alapján a papír, a toll, számológép IS megfelel a definíciónak.
Egy általános célú nyomógombos számláló (márpedig a tervezett eszköz BÁRMINEK a számlálására alkalmas) "diagnosztikai" szempontból semmiben sem különbözik egy számológéptől.
Ha akarom, akkor in vitro a mikroszkóp, mert abban történik maga a vizsgálat.
Azt meg te is tudod, hogy lehet úgy pergésmentesíteni, hogy ne számoljon tévesen, nem is számol.
Ezeket a vizsgálatokat amúgy szakorvosok végzik, észre veszik, ha duplán sípol, vagy valami baj van.
De végül is mindegy, én nem nagyon tudok tenni semmit, amúgy pont ma hívott fel a negyedik közbeszerzési pályázó, hogy ajánlatot kérjen és ez ugyanaz a közbeszerzés.
Nem egy drága dolog ez, ha kell nekik, akkor majd megveszik közbeszerzésen kívül, ha nem kell, akkor meg így jártam.
Tudja a fene... Hiszen diagnózis felállításához használják.
"Az in vitro diagnosztikai orvostechnikai eszközök (továbbiakban IVD orvostechnikai eszközök) definíciója az in vitro diagnosztikai orvostechnikai eszközökről szóló 8/2003. (III.13.) ESzCsM rendelet 2. § (1) bekezdés a) pontjában került meghatározásra a következők szerint: „minden olyan orvostechnikai eszköz, amely mint reagens, reagens származék, kalibráló, kontrollanyag, reagens készlet, készülék, berendezés, gép vagy rendszer, önmagában vagy más eszközzel együttesen alkalmazva, a gyártó meghatározása szerint emberi szervezetből származó minták – ideértve a vér- vagy szövetadományozást is – in vitro vizsgálatára szolgál kizárólag vagy elsősorban azzal a céllal, hogy információt nyújtson"
Én úgy látom, hogy eszerint a definíció szerint benme van.
Mi van, ha az egyik sejttípust számoló nyomógomb pergésmentesítése nem jó, és néha 2-4 darabot is hozzáad egy nyomásra? Ilyenkor ki felelős a téves diagnózisért?
Ha a mintát elemző ember papírt, tollat, számológépet vagy egyéb általános célú eszközt használ, akkor az övé a felelősség. De ha te adsz neki egy eszközt, amiben ő megbízik, és vakon használja, akkor szerintem közös lesz a felelősség.