Harangozás vezérlő



Bevezetés:

2023. tavaszán egy kedves barátom keresett meg azzal, hogy Berzék ( Miskolc közeli kis falu ) egyik temploma melletti harangláb harangozását lenne jó "automatizálni". A harangozás már így is elektromosan volt megoldva, viszont a harangozás indítást és leállítását csak helyben lehetett végezni egy kapcsoló segítségével. Szerették volna, hogy távolról is el lehessen indítani a harangozást. Így néz ki a harangláb ill. a harang:
Harang vezérlő
Harang vezérlő

Egy műszaki beállítottságú embernek nyilván azonnal több megoldási lehetőség is eszébe jut. Én is így voltam vele, vegyük sorra ezeket a lehetőségeket:

- Előre programozott kapcsoló óra fix időpontokkal. Nem nagyon néztem utána de bizonyára sokféle olyan eszköz kapható, melyek 230 V -ot kapcsolnak előre programozott időpontokban, megadható időtartamokra. Ezzel a megoldással az a gond, hogy túlságosan "be van drótozva", azaz rugalmatlan. Valószínűleg nem szükséges pilótavizsga a programozásokhoz, de pl. abban az esetben ha egy már beprogramozott harangozást mégis ki kellene hagyni, vagy netán "extra" időpontban lenne szükség harangozásra ( pl. temetés ), nem biztos hogy lenne olyan aki meg tudná csinálni. Ezesetben jönne az idegeskedés, telefonálgatás, stb. Vagyis ez a módozat nem annyira szerencsés.

- Távvezérlés WEB -es felületről. Ez már sokkal korszerűbb, mondhatni "időtállóbb" megoldás volna. Ha a WEB -es felület megfelelően egyszerű valószínűleg egy teljesen laikus is szépen elboldogul vele. A harangot vezérlő mikrovezérlőn kell létrehozni egy WEB szervert, amire a felhasználó felkapcsolódik mondjuk a mobil telefonján ( ha a hálózat is úgy akarja ), rábök a harangozás indítására és már el is indul a harangozás. Aztán ha úgy gondolja ennyi elég volt rábök a leállításra és leállítja. Ha a hálózat is úgy akarja ... Adódik a kérdés hogy mi van, ha nem akarja úgy, pl. mert valami gond van a hálózattal ? Akkor egy kicsit hosszabbra nyúlik a harangozás :-). Azaz a leállítást már jó volna a harang közelében levő vezérlőre bízni. A WEB -es felületről mondjuk annyi lenne csak kiválasztható hogy mondjuk 2 perc harangozás induljon, és az idő mérése ill. a leállítás vezérlése már a helyi áramkör feladata volna. Klassz megoldás, csak a harang környezetében nincs wifi, vagyis mobil hálózaton kellene mindezt lebonyolítani. Ráadásul a WEB szerver futtatása is felvet bizonyos problémákat.

- Távvezérlés SMS üzenettel. Ez az előzőhöz hasonló, csak az átviteli közeg ( Layer 2 ) más. Nagy előnye az egyszerűsége, megbízhatósága. Az sem utolsó, hogy bármelyik mobil telefonról indítható a harangozási parancs, ha a használó tudja a harang telefonszámát ( üdv a 21. században :-) ill. a szintaktikát amit a harang vezérlő vár. De a mai világban már egy megfelelő applikáció összeütése sem nagy feladat, amin nem is kell karakterről karakterre beírni az üzenetet, hanem elegendő mondjuk egy menürendszer megfelelő elemére rábökni ( lásd lentebb :-). Hátránya a költsége, hiszen az SMS küldésnek díja van.

Alapos mérlegelés és a felhasználókkal való konzultáció alapján az SMS -es verzió került megépítésre.

A feladat - csakúgy mint egyéb "projektjeim" nagy részében - itt is két fő részből állt: egyrészt a harangot vezérlő hardver kliens oldalt kellett megtervezni-megépíteni, másrészt az Android -os applikációt.

1. Hardver megvalósítás

1.1. Részegységek

Nézzük először miből kellett kiindulni, azaz hogyan volt a rendszer kiépítve. Mint fentebb említettem a harangozás már eleve elektromosan volt megoldva, magát a harangot egy elektromágnes mozgatta, az elektromágnest pedig egy vezérlő áramkör irányította. Amikor a vezérlő áramot kapott, megfelelő időzítő relék segítségével a szükséges ütemben vezérelte az elektromágnest. Azt pedig hogy mikor működjön a vezérlő, azaz mikor legyen harangozás, egy külön kapcsolóval kapcsolták. A következő képeken látható a vezérlő áramkör, a harangot mozgató elektromágnes ( igen, az a rúdszerű izé ) és a kapcsoló:

Harang vezérlő
Harang vezérlő
Harang vezérlő

Ahhoz hogy egy teljesen rugalmas, a felhasználó igényeit mindenben követő rendszert kapjunk egyértelmű hogy mikrovezérlőt kell a feladatban alkalmaznunk. Talán nem meglepő, hogy az Arduino -ra esett a választásom ( tekintve hogy azt ismerem ). Az Arduino nem képes közvetlenül SIM kárya kezelésére, ezért ki kell egészíteni egy SIM900 modullal. Vagyishát nyilván erre is létezik ezernyi más eszköz, én ezt választottam mert a netes bogarászásaim során ezt láttam legjobban dokumentáltnak. Az ára sem túl vészes, ráadásul magyarországi webáruházak kínálatában is szerepel, mely nem utolsó szempont az ilyen jellegű eszközöknél, hiszen ha pl. megrendelek KingKong -ból egy kártyát ami nem, vagy csak részben felel meg a nálunk használatos távközlési protokolloknak, akkor fújhatom. Biztosra akartam menni, hiszen - gondoltam - úgyis lesz majd sok egyéb probléma is amit meg kell oldanom ( haj, milyen igazam volt ), legalább amit lehetséges zárjak ki.

Az áramkörnek a következők szerint kell működnie:

- Beérkező SMS -re indítsa a harangozást 1, 2, 3 ... 20 percre

- A végén állítsa le a harangozást :-)

- Legyen lehetőség a harangozás közbeni leállításra ( szintén SMS -ben )

A kész áramkör a következő részegységekből áll:

- Arduino mikrovezérlő. Harang vezérlő

Természetesen minnél kisebb helyigényű verziót célszerű használni, ezért a képen is látható Arduino Nano -ra esett a választás, mely rendelkezik (micro)USB csatlakozóval, ami által egyszerű a szoftver esetleges upgrade -je ill. hiba esetén a diagnosztizálás.

- SIM900 modul. Harang vezérlő

Mint fentebb említettem valószínűleg egyéb típus is megfelelt volna a célra, én ezt választottam. Van egy-két - nevezzük így - fura dolog a kártyán.

Kezdjük azzal ami a fenti képen is látszik: a panel alján van a SIM foglalat. Persze nézőpont kérdése mit nevezünk tetejének és aljának, de tény, hogy az egyik oldalon vannak a csatlakozók, státusz LED -ek, jumperek, nyomógomb, kapcsoló, a másik oldalon pedig a SIM slot. Ez persze amíg az asztalon van minden összekócolva nem gond, hiszen úgy fordítom hogy akarom, viszont beépítés előtt el kell dönteni hogy alma vagy körte. És nincs jó döntés !! Ugyanis alapvető kritérium az is hogy működés közben lássuk a státusz LED -eket, de az is, hogy a SIM kártyához egyszerűen hozzáférjünk. Mint látni fogjuk én az első verzió mellett döntöttem, de lehet hogy a mostani eszemmel már máshogy építeném be, mert mégiscsak fontosabb a SIM kártyához való hozzáférés. Akárhogy is, szerintem nem volt a legokosabb dolog így megtervezni a panelt. Akkormár inkább a processzor ment volna az aljára, az úgyse érdekel senkit :-)

De van más "érdekesség" is. Például hogy alapesetben nem éled fel "magától" a modul. Vagyis ha tápot adunk rá nem indul el, csak ha megnyomjuk a POWER gombot. Persze beépített állapotban senki nem fog gombot nyomogatni mondjuk egy áramszünet után, ezért szerencsére van mód szoftveres élesztésre is, mégpedig a D9 lábat kell piszkálnunk. De csak akkor, ha előtte a kártyán rövidbe tettük az R13 érintkezőket. NEM, NEM JUMPERREL ! FORRASZTÁSSAL ! Ráadásul elég hülye helyen van, tehát nagy szerencse hogy van tűvégű hegy a pákámhoz. ( Nem vagyok büszke a képen látható óngolyó alkotásomra, de a célnak megfelel, és félő volt ha tovább bizerálom kárt teszek a közelében levő alkatrészben. ) Harang vezérlő

Ha ez megvan, egy procedúrát követve a D9 lábon keresztül feléleszthető a kártya. Viszont itt jön egy újabb buktató: leállítani is ugyanazon a lábon, ugyanazzal a procedúrával kell !! Azaz könnyen előfordulhat ( velem elő is fordult ) hogy el akartam indítani, de már valamiért ketyegett, és a beindítás helyett leállítottam.

Nézzük egy kicsit részletesebben, egymás mellé teszem a felélesztés és a leállítás jelalakjait:

Harang vezérlő
Harang vezérlő

Látható, hogy a D9 pinre adott, 1 másodpercnél hosszabb jellel lehet be ill. kikapcsolni is a SIM900 modult. A kódban ez így néz ki:


void powerUp()
{
 pinMode(9, OUTPUT); 
 digitalWrite(9,LOW);
 delay(1000);
 digitalWrite(9,HIGH);
 delay(2000);
 digitalWrite(9,LOW);
 delay(3000);
}

Sokat agyalogtam hogyan lehetne a fenti kódot bolondbiztossá tenni, vagyis csak akkor futtatni ha nem él a modul. Aztán arra jutottam, hogy kiadok egy üres AT parancsot, és ha nem jön az OK válasz akkor bizerálom a D9 -et ( lásd lentebb az Arduino kód SETUP részét ).

Még annyi tartozik talán ide, hogy - mint a fenti képen is látszik - az antenna szerves részét képezi a modulnak. Vagyishát nem is az antenna, hanem inkább a foglalat, mivel maga az antenna könnyen lecsavarozható. Sokat gondolkodtam hogy így hagyjam-e, vagy távolítsam el és tegyem külön az antennát. A rajta hagyás mellett az szól, hogy nem kell piszkálni a modult, így egy esetleges későbbi modul csere sokkal könnyebben megoldható. Hátránya hogy így nehezebb elhelyezni a dobozban, és esetleg a rádióhullámok adása-vétele szempontjából is előnyösebb ha elkülönül. Vagányabb is :-) a vezérlő doboz kinézete ha az oldalán van az antenna, viszont - mivel viszonylag könnyen letekerhető - meg lehet a veszélye hogy valaki leszedi. Dehát az már legyen más gondja. Maga a doboz nem jelent árnyékolást tekintve hogy műanyag dobozba került a vezérlő, de talán az Arduino Nano modul nagyobb "biztonságban van" ha picit távol van az antennától. Az eltávolítás mellett döntöttem.

Mint említettem nagyon sok irodalom fellelhető a neten a SIM900 -al kapcsolatban, egy jó leírás a sok közül:

Arduino GPRS Shield

- Tápegység. Harang vezérlő

Szerencsére sima 5V kell a Nano -nak és a SIM900 -nak is így nem kellett túlságosan bonyolítani a tápegység kérdést. Ja, mégis. Több helyen felhívják a figyelmet a SIM900 -al kapcsolatban, hogy SMS küldéskor akár 2A -t is felvesz, és ha erre nem képes a tápja az hibás működéshez vezet. Első közelítésben nem terveztem SMS küldést, de mivel egy későbbi verzióban szükség lehet rá, eleve megfelelő tápegységet használtam, ill. egy kicsit nagyobbat.

Ha már tápegységről, itt emlékeznék meg az olvadóbiztosítékról, mely ugye védi a gyenge áramú részt ( Kínából származik az 5V -os tápegység, sose lehet tudni ). A méretezést az ember nyilván tudományos alapon próbálja megközelíteni. A tápegységre kapcsolt fogyasztók áramfelvételei a következők:

  • Arduino Nano - 20 mA
  • SIM900 - 2A
  • Kapcsolóelem
  • LED -ek

Mindez ugye 5V -on, vagyis közelítőleg 15W teljesítményt jelent. Nem sok, mondhatnánk. Ennek megfelelően gondoltam a tápegység primer oldalán a 230 V -os betáp olvadóbiztosítékát is meghatározni. De nem sikerült :-(. Bekapcsolásnál akkora áramot vesz fel az áldott kínai táp, hogy még lomha olvadósbiztiből is 630mA -eset kellett betennem hogy ne pukkanjon el.

- Kapcsolóelem.

Vagy minek nevezzem. Az az alkatrész, ami - az Arduino vezérlésével - a 230 V -ot kapcsolja a harang mozgatóra ( vagyishát az azt vezérlő ütemező áramkörre ). No itt aztán volt zsákutca, útvesztő, labirintis bőségesen. A legnagyobb problémát az jelentette, hogy nem sokat tudtam a harang mozgató áramigényéről. Lehetett tudni, hogy egy elektromágnes szerű mozgatásról van szó, ami így induktív jellegű terhelést valószínűsített. Az áram felvételről viszont csak tippjeim voltak. A már meglévő ( kiváltandó ) kapcsoló dobozon volt egy 6A -es, B karakterisztikás kismegszakító, ez jelentett némi támpontot ( de mint később látni fogjuk, abszolút vakvágányra vitt ). Legegyszerűbb lett volna mérni, de a település ahol a harang működik majdnem 100km -re van, egyeztetni kellett volna a helyiekkel, tehát bonyolult lett volna.

Tanácstalanságomban felhívtam egy céget akik mindenféle harangozáshoz szükséges elektronikát árulnak és szerencsére egy nagyon segítőkész illetővel tudtam beszélni ( ezúton is köszönet a kapott információkért ! ). Elmondta, hogy 2A -en bőven belül van a mozgató teljesítménye. Ezen már el tudtam indulni, max. 500W -ot kell tehát kapcsolgatni. Megnéztem milyen reléket használnak általában mikrovezérlőkhöz és nagy örömmel láttam, hogy a jól bevált "kék" relé bőven tudja a kívánt kritériumot: Harang vezérlő

Kici is, occó is, bőven tudja a 2A -t ( hiszen 10A van ráírva ), mi kell még ? Akkor múlt el az öröm az orcámról amikor jobban utánaolvastam a "kék" relékkel kapcsolatos tapasztalatoknak. Enyhén szólva nem ajánlották komolyabb alkalmazásokba. Az enyémet nem mondanám "komolyabbnak", de azt semmiképp nem szerettem volna ha pár hónapon vagy éven belül rossz minőségű alkatrész okozta meghibásodás miatt kellett volna útra kelnem.

Jó, akkor legyen egy komolyabb típus, mondjuk Finder. Jóval drágább, de ez már csak jó lesz. Vagy mégsem ? Hiszen ott van az a fránya induktív terhelés. Ez ugye azt jelenti, hogy az áram nem képes pillanatszerűen megváltozni rajta, kikapcsolásnál valahol "le akar csengeni". Ez legtöbbször villamos ív formájában a kapcsoló eszköz eltávolodó érintkezői között szok megtörténni, amit az érintkezők csak véges ideig képesek tolerálni. Egy idő után beégnek, és megintcsak ott volnék hogy mehetek 100km -re javítani. Na, szuper.

Akkor legyen mágneskapcsoló. Az már csak nem ég be, hiszen éppen ilyen célokra használják. Amikor megnéztem milyen árban vannak egy pillanatra el is ment a kedvem az egész harangvezérléses projekttől, hiszen kis költségvetésű munkáról van szó, nem fér bele egy 20e Ft -os alkatrész. Ráadásul 5V -os működtetési feszültségűt nem is találtam ami azt jentette volna, hogy kellett volna egy külön tápegység csak a mágneskapcsolónak.

Ekkor kezdtem "intenzív kutatómunkába" a netes fórumokon, de még az AI -t is bevontam a feladatba :-). A válaszokban gyakran felvetették a szilárdtest relé ( továbbiakban SSR ) lehetőségét is. Ez ugye egy olyan elmés eszköz, ahol félvezető végzi a kapcsolást, nincsenek kontaktusok. Eleinte idegenkedtem tőle. Nem is volt még dolgom vele, meg nem is tudtam elképzelni hogy a félvezető hogyan képes induktív terhelést kapcsolni. De úgy okoskodtam, hogy ha nagy teljesítményű villanymotorokat tud kapcsolni, akkor az "én" harangommal is működnie kell. No de milyen típus legyen ? Mert ugye túl egyszerű volna ha csak egyféle létezne. Van olyan amelyik a szinusz hullám nullátmeneténél kapcsol, és van amelyik nem foglalkozik ezzel. Itt például azt javasolják, hogy induktív terheléshez a "simát" alkalmazzuk, azaz ne a nullátmeneteset ( https://www.celduc-relais.com/en/how-to-properly-select-solid-state-relays/ ). Máshol meg mást írnak :-(.

Döntenem kellett hogy melyik megoldás legyen. A legrosszabb az volt a dologban, hogy ki sem tudtam előre próbálni a lehetőségeket mondjuk egy "deszkapanelon", hiszen a kapcsolt - harangozó - berendezést nem tudtam szimulálni. Érdeklődtem persze fórumokon, de harang mozgatásban szinte senki sem volt jártas, így javarészt csak általános válaszokat kaptam.

Az SSR mellett döntöttem végülis. Legfőbb indok az volt, hogy már a legelején, a telepítéskor ki fog derülni hogy működik vagy sem, ha működik akkor onnantól "örökös". Ha pedig nem, akkor ... akkor sajnos vert seregként haza kell kullognom ... Persze próbáltam mindenre felkészülni, pl. arra, hogy mi lesz ha a nagy terhelő áram túl sok hőt diszcipál az SSR -en. Nos, hűtőbordára tettem ( ami majdnem annyiba került mint az SSR ... de a szépségért biztonságért meg kell szenvedni, ugye ).

Harang vezérlő

Nos így néz ki az SSR. Fotek gyártmány, ugye. Vagyis az van ráírva. Vagy mégsem ? Nem lehet hogy az "O" betű nem is "O", hanem mondjuk "Q" ? Hát de. Véletlenül találtam a következő cikkre:
Inferior Counterfeit FOTEK SSR-25 Solid State Relays on the Market

A leírtak persze nem csak a 25A -es típusra vonatkotnak, hanem az általam vásárolt 40A -esre is. Tömören: ez a - jónevű magyar web áruházakban is FOTEK -ként árusított - SSR bizony HAMISÍTVÁNY ! Az írás lényege, hogy nagyon meg lehet vele szívni ha valaki komolyan veszi az adatlapján leírtakat, mert ezek az olcsó hamisítványok olykor a töredékét sem teljesítik a leírtaknak. No, szép, gondoltam. Még egy idegeskedni való ( tudniilik hogy az éles működés során nem lesz-e ebből probléma ). Szerencsére alaposan túl van méretezve az eszköz, ha a 40A -nek csak egy töredékét teljesíti akkor is jó vagyok.

Újabb eldöntendő kérdés, hogy általános SSR -t használjak ( instant on switching ) vagy olyat, ami nullátmenetnél kapcsol ( zero switching ). A kettő között az a különbség, hogy a normál kapcsolásúnál azonnal bekapcsol ( "vezet" ) az SSR amint megkapja a vezérlőjelet, míg a nullátmenetes megvárja a szinusz hullám következő nullátmenetetét és akkor kapcsol. Gondolhatnánk mi sem egyszerűbb ezt eldönteni, meg kell nézni induktív terhelésre melyik való. Sajnos a helyzet nem egyértelmű, olvasni ilyet is meg olyat is. Ebben a leírásban például az "Instant On" típust ajánlják, de máshol meg mást, pl. a Hobbielektronika fórumon van aki épp az elenkezőjét javasolja. Az általam alkalmazott FOTEK ( vagyishát FQTEK ) SSR nullátmenetes, és szerencsére nem volt vele probléma.

Volt még egy kérdés amit el kellett döntenem, mégpedig hogy közvetlenül kötöm az Arduino kimenetére az SSR -t, vagy tranzisztoron keresztül ( esetleg opto kapuval ). Érdekes rákeresni a neten az ezzel kapcsolatos írásokra , kb. fele-fele arányban találni a tranzisztort használatát, és a közvetlen összekötést javasló írásokat. Nos, mivel számomra ez a kérdés már a dobozolás végén merült fel, nem bonyolítottam az életem és közvetlenül kötöttem az Arduino D12 lábára az SSR -t. Elvileg a galvanikus leválasztás miatt sem kell aggódni, mivel az SSR bemenete - ismétcsak: elvileg - opto csatolóval indul. Szerencsére nem volt gond.

Itt láthatod a vezérlő kapcsolási rajzát. Bocs a kézi skiccért, de annyira egyszerű, hogy nem lenne érdemes csicsás rajzot készíteni. ( Természetesen a SIM900 is kap 5 Voltot, csak az lemaradt. ):

Harang vezérlő

1.2. Megépítés, dobozolás

El kell mondanom, hogy a dobozolást sokkal kisebb feladatnak gondoltam, mint amivé vált. Hiszen a "deszkapanel" amin fejlesztettem ennyike volt:

Harang vezérlő

Két modul az egész, néhány vezeték és pár apró alkatrész. Veri ízi, mondaná a német. Hát nem. Legyen itt gyorsan egy kép a végeredményről hogy érzékeltessem miről beszélek :
Harang vezérlő

A következőkben bemutatok néhány képet az elkészítés különböző fázisairól:

Harang vezérlő
Harang vezérlő
Harang vezérlő

Harang vezérlő
Harang vezérlő
Harang vezérlő

Harang vezérlő
Harang vezérlő
Harang vezérlő

Harang vezérlő
Harang vezérlő
Harang vezérlő

Mint látható végülis sikerült mindent a helyére raknom. Az elektronikus modulokat még egy fém lemezzel is "leszigeteltem", hogy lehetőleg még zavarvédettebbek legyenek. Az üvegcsöves főbiztosíték a 6A -es ( meglehetősen túlméretezett ) kismegszakító bal oldalán kapott helyet. A 3 állású főkapcsoló a fázist és a nullát is kapcsolja. Az SSR hűtőtönkre került, bár utóbb bebizonyosodott hogy teljesen fölöslegesen, egyáltalán nem melegszik. De így a jobb. A Nano modul segédpanelre került függőlegesen. Érdekes, hogy az az "agya" az egésznek, mégis szinte elveszik. Úgy lett pozícionálva, hogy az USB csatlakozója könnyen hozzáférhető legyen. Viszonylag egyszerű a cseréje: régi kihúz, új bedug. Ez jól is jött akkor, amikor a felhasználók egy kis működésbeli módosítást kértek; vittem egy Nano -t az új szoftverrel és komplett cseréltem. Szerettem volna ha a SIM900 modult is ilyen "régi_kihúz - új_bedug" módszerrel lehetett volna cserélni, de sajnos a pin-sort rá kell forrasztani. A 4 darab sárga előlapi LED különböző villogásokkal jelzi a folyamatban levő harangozást. Ha 4 percnél kevesebb van hátra a harangozásból akkor annyi LED villog 1 másodpercenként, ahány perc van még hátra.

A 3 állású főkapcsoló középső állásában minden ki van kapcsolva, a bal oldali állásában közvetlenül jut a 230V a kimenetre, azaz manuálisan tudják indítani a harangozást. A jobb oldali állásban van bekapcsolva a Nano -s áramkör, és válik lehetővé az SMS -el való vezérlés.

2. Szoftver megvalósítás

2.1. Arduino

2.1.1. Általános leírás

Noshát az az igazság, hogy kicsit bajban vagyok, hiszen a szoftver lényegi részét kb. 1 éve készítettem, és az idő kicsit "elsimítja" a részleteket. Az biztos, hogy igen sok próbálkozással, nyomozással, zsákutcákkal járt. Segítséget természetesen az internetről vettem, javarészt a ChatGPT -től és a Prohardver "Mikrokontrollerek Arduino környezetben (programozás, építés, tippek)" topicjából.

Mint fentebb utaltam rá, a működés alapelve, hogy az Arduino a SIM900 modulon keresztül SMS -t kap, azt értelmezi és a tartalmának megfelelően kapcsolgatja az SSR -t.

Az SMS a következő: "Harang=<perc<"

A perc egy 1 és 20 közötti egész szám, ami megadja hány másodpercig kell harangozni. Amennyiben 0 (nulla) érkezik, az a harangozás azonnali megszakítására utasítja az áramkört. Így tehát egy esetleges téves harangozási parancs kvázi visszavonható.

Lehetne értekezni hogy nem túl egyszerű-e a szintaktika, azaz nem kellett volna-e valamennyire "eltitkosítani" a SMS tartalmát. Úgy gondolom nem, mivel a harangozás elindításához e kulcsszó mellett a telefonszámot is ismerni kell. Márpedig arra már egy év után a helyiek sem igen emlékeztek, tehát roppant kicsi a valószínűsége hogy bárki is "rátalál" és még a szintaktikát is tudja. ( Persze ha ezt az írásomat elolvassa úgy már egyértelmű lesz, de a telefonszámot tőlem senki nem fogja megtudni :-).

A következő érdekes kérdés, amivel bizony nagyon sok időm elment, hogy mennyire legyen "intelligens" a rendszer. Hiszen azon kívül hogy megkapja a harangozás hosszára vonatkozó SMS -t, akár egyéb utasítást is kaphat, pl. küldjön valamilyen választ, pl. nyugtázást a harangozás elkezdéséről ill. befejezéséről. Vagy egy statisztikát a harangozásokról ( darabszám, perc, milyen hosszúból hány darab volt ). Vagy a működési körülményekről, pl. az áramkimaradások miatti újraindulásokról. Felmerült olyan igény hogy lekérdező üzenetet lehessen küldeni magáról a működésről, hogy lehessen távolról tudni működik-e a rendszer ( nincs-e áramszünet ).

Nagyon sokáig próbálkoztam egy olyan funkció megvalósításával, hogy az olyan SMS -eket melyek nem az Arduino -nak szólnak ( "Harang=" ) továbbítsa egy adott telefonszámra. Ez elsősorban a távközlési szolgáltatóktól kapott SMS -ek miatt lett volna, hogyha pl. kártya érvényesség meghosszabbításával kapcsolatban érkezik valami. ( Később egyértelművé vált, hogy erre nincs szükség, mert a szolgáltatóknak van olyan esetkre megoldásuk amikor a SIM kártya ilyen "buta" eszközökben működik". ) Ez egy nagyon elegáns dolog lett volna ( ezért is fordítottam rá ennyi időt ), de be kell hogy valljam, beletört a bicskám. Nagy hátránya lett volna hogy minden ilyen SMS továbbítás pénzbe került volna, így - előbb vagy utóbb - probléma jelentkezett volna az egyenleggel. Főként hogy gyakran amit mi az okos telefonjainkon egy darab SMS -nek látunk az valójában több SMS -ből tevődik össze, hiszen szabvány szerint egy SMS max hossza 160 karakter (!!!), ha pedig Unicode karaktereket tartalmaz ennél még kevesebb. Komoly memóriakezelési problémákba is belefutottam, így aztán végül úgy döntöttem, hogy az eszköz csak fogadni fogja az SMS -eket, küldeni nem.


2.1.2. SMS kezelés

A feladat természetéből adódóan a rendszer működésének kulcskérdése az SMS -ek kezelése ill. a SIM900 modullal való kommunikáció.

A SIM900 modullal való kommunikáció szerencsére viszonylag egyszerűen, soros módon a történik. Az Arduino -n egy szoftveres soros portot kellett létrehozni ( 7 és 8 pinek ) így két vezetéken kommunikál a SIM900 -al annak Tx és Rx lábain keresztül ( a fenti képen lásd a SIM900 modul sarkában végződő lila és szürke vezetékeket, kék a föld ).

A SIM900 modul vezérlése un. AT parancsokkal történik. Azoknak akik a 90 -es években betárcsázós modemekkel próbáltak maguknak internetet varázsolni bizonyára nem jelent újdonságot a használatuk. Lényeg, hogy minden utasítás az "AT" karakterpárral kezdődik, és egy '+' karakter után kiegészül magukkal a parancsokkal. Ha csak magát az "AT" parancsot küldjük el, akkor - ha minden rendben - az eszköz az "OK" válasszal felel. Azt hiszem nem lenne értelme nagyon belemerülni, hiszen rengeteg sok AT parancsot ismer a modul ( íme: SIM900_AT Command ), inkább csak bemutatom hogy a programomban mely parancsokat használtam:

- AT - Figyeli hogy üzemkész-e a SIM900. Ha igen, akkor "OK" a válasz

- AT+CMGF=1 - A lehetséges 'PDU' és 'Text' mód közül a Text módot választjuk ki ( bővebben: Operating Modes )

- AT+CNMI=2,2,0,0,0 - New Message Indicator, megadjuk hogy ne tárolja hanem a soros porton küldje ki ( küldje tovább ) az érkező (új) SMS tartalmat az Arduino -nak

- AT+CLTS=1 - Time-stamp kérésének engedélyezése a szolgáltatótól

- AT+CCLK - Dátum és pontos idő elkérése a szolgáltatótól

Mindezen parancsok a program SETUP részében, azaz az eszköz bekapcsolásakor egyszer adódnak ki, hiszen javarészt üzemmód beállítására szolgálnak, amit elég az elején megadni. Az utolsó, dátum és idő elkérése azért kell, hogy le tudja tárolni az indulás időpontját ( ami a következő induláskor kiíródik a konzol soros portra, tájékoztatás céljából ).

Fontos megemlíteni, hogy a SIM üzenetek továbbítása nem AT parancsokkal történik hanem a klasszikus soros kommunikációval, azaz az Arduino figyeli a SIM900 adási bufferét ( ami az Arduino felé adási, ugye ) és ha nem üres akkor elszedi tőle a karaktereket.

Tegyünk egy kis kitérőt arról amit már fentebb érintettem, hogy mi lett volna ha eltárolom a beérkező SMS -eket mondjuk azzal a céllal, hogy egy az eszköz felé küldött megfelelő SMS kérésre elküldje. Nos ennek több módja van. Amit először próbáltam az az volt, hogy marad a CNMI=2,2,0,0,0 és azonnal továbbítódik az üzenet az Arduino -nak, ami aztán csinál vele amit csinál. Ez egészen jól működött mindaddig, amíg sima ASCII karaktereket tartalmaz az üzenet. Pl. egy "Harang=4" tartalmú üzenet a következőképpen érkezik az Arduino -nak:

+CMT: "+36301234567","","23/08/26,17:22:42+08"
Harang=4

Szépen látható benne a küldő telefonszáma. A második rész ( küldő neve ) üres, utána jön a dátum és idő, végül - új sorban - maga az üzenet. Nincs tehát gond amíg nincs trükkös karakter. A következő viszont egy olyan üzenet kezdete, amiben már trükkös karakterek is vannak:

+CMT: "+36301234567","","23/10/2 2,19:45:47+08"
004B00650064007600650073002000DC0067007900660065006C00FC006E006B0021

Elég szembeötlő, hogy 4 byte -os egységekből tevődik össze, a dekódolása sem túl bonyolult: 'Kedves Ügyfelünk!'. Igen, ez egy Telekomtól kapott üzenet. Látható hogy jelentősen eltér az előzőtől. Akkor kezdett elegem lenni amikor egy teljes üzenetet nem is tudtam egyben beolvasni a SIM900 -tól, hanem "burst" -ökben jött, amit sehogysem tudtam rendesen kezelni, ezért egyes részei elvesztek, akárhogy is zsonglőrködtem. Problémát jelentett az is, hogy egy komplett üzenet nagyon sok helyet elfoglalt volna a memóriában, ezért aztán ezzel a módszerrel ünnepélyesen felhagytam.( Jóval később olvastam egy megoldásról amire annak idején nem jöttem rá: át kell állítani a kódolást az AT+CSCS paranccsal. )

Ezután kezdtem egy "intelligensebb" megoldás után nézni, vagyishogy ne kelljen már beolvasnom az üzenetet a SIM900 -ból az Arduino memóriájába, kell legyen valami huszárosabb megoldás. Van is természetesen. Mégpedig az, hogy a SIM kártya memória rekeszébe tárolódik az üzenet, és arra is van mód, hogy onnan legyen közvetlenül el ill. tovább küldve. Hurrá. Hogy ehhez mi kell a következő oldalon van nagyon szépen leírva:
GSM–Handling Received SMS

Annyi a lényeg, hogy minden SIM kártya rendelkezik az SMS -ek tárolására több-kevesebb tárhellyel, mely - nevezzük így - rekeszekből áll. Egy rekesz, egy SMS. A rekeszek lekérdezésére kiadtam az alábbi AT parancsot és az alatta látható választ kaptam:

AT+CPMS? +CPMS: "SM",6,20,"SM",6,20,"SM",6,20

Én is egyszerűbbre számítottam, de a fenti oldalon leírják a megoldást. 3 darab SMS-tár terület van a kártyán, az első az SMS -ek olvasásakor és törlésekor használatos, a második a SMS küldésekor az SMS tárból és SMS írásakor az SMS tárba használódik, a harmadik pedig az újan érkezett SMS tárolásakor ( ez nekem is zavaros ). Látszik, hogy összesen 20 darab SMS kezelésére van lehetőség, és jelenleg 6 darab foglalt.

Természetesen lehetőség van a tárban levő SMS -ek lekérdezésére. Íme:

AT+CMGL="ALL"

+CMGL: 1,"REC READ","+36301234567","","23/08/19,15:16:12+08"
3

+CMGL: 2,"REC READ","+36301234567","","23/08/19,15:28:41+08"
3

+CMGL: 3,"REC READ","+36301234567","","23/08/19,15:46:25+08"
2

+CMGL: 4,"REC READ","+36301234567","","23/08/19,15:52:28+08"
4

+CMGL: 13,"REC READ","+36301234567","","21/06/07,21:46:24+08"
Tisztelt ⸮gyfel⸮nk! SIM k⸮rty⸮j⸮ra ingyenesen alkalmaz⸮sokat telep⸮t⸮nk. K⸮rj⸮k, sz⸮ks⸮g eset⸮n enged⸮lyezze az automatikus SMS k⸮ld⸮st!

+CMGL: 14,"REC READ","+36301234567","","21/06/07,22:02:15+08"
A SIM alkalmaz⸮sok telep⸮t⸮se sikertelen, de SIM k⸮rty⸮ja tov⸮bbra is hib⸮tlanul m⸮k⸮dik.

OK

Asszem szépen látszik a lényeg. A 'CMGL:' után látható egy szám, ami a rekesz sorszámára utal ( a 20 rekeszes tárolóban, ugye ), vagyis tényleg 6 darab használt. A "REC RED" jelentése: kapott és elolvasott. A második sorokban láthatók maguk az üzenetek ( az ékezetes karakterek furcsaságai ne zavarjanak ). Természetesen mindenre megvannak a megfelelő parancsok, egyetlen üzenet kilistázására, törlésére, és ... tadám ... küldésére ( vagyishát továbbítására ) ! A parancs a következő: AT+CMSS.

Nos idáig jutottam a SMS küldéses-továbbításos agyalgásaimban amikoris úgy döntöttem, hogy mégsincs nekem erre szükségem, hiszen innen el kellett volna kezdeni ezzel kisérletezgetni, kezelni a rekesz indexeket hogynehogy összegubancolódjanak, vizsgálni a bejövő sms -eket hogy kifélék-mifélék, hogyan fogynak a rekeszek és ezernyi előre még nem is látható problémát.. Azt se felejtsük el, hogy az SMS küldéssel való kísérletezgetésnek anyagi vonzata is van, hiszen pénzbe kerül. Ráadásul mindez nagyon elbonyolította volna a programot, nekem pedig épp az lett volna a célom hogy egyszerű és bombabiztos legyen. Már amennyire egy program bombabiztos tud lenni egyáltalán, ugye.

2.1.3. Program SETUP

Maga a szoftver nem túl bonyolult, hiszen lényegileg annyit kell tennie, hogy fogadja és értelmezi a bejövő SMS -t ( a SIM900 modultól ) és a tartalmának megfelelően ill. annak megfelelő időre bekapcsolja az SSR -t, majd az időzítés végén kikapcsolja.

A SETUP részben történik a portok és a SIM900 modul beállítása. Ekkor ugye még nem áll készen az SMS -ek fogadására amit a műszerdoboz előlapján levő zöld státusz jelző LED villogtatásával jelez a felhasználóknak. A villogtatást megszakítással ( Timer interrupt ) oldottam meg, ami ugye a "háttérben" zajlik, a program futásától függetlenül. A SETUP lefutása végén az interrupt letiltódik, miáltal a zöld folyamatosra vált.

A SETUP részben történik bizonyos információk elmentése ill. kiíratása is, hogy a korábbi működésről legyenek információk, mely adott esetben megkönnyítheti a hibabehatárolást. Az információk letárolása az Arduino EEPROM memóriájába történik, ami kikapcsolás után is megtartja a benne tárolt adatokat. A címek a következők:

0 - újraindulások "göngyölt" darabszáma (Ujra_Darab), ( integer, azaz 32767 -ig tud számolni )

10 - az Arduino legutóbbi elindulásának ideje ( startAddrTIME ), a SETUPban íródik minden induláskor

50 - újraindulások göngyölítésének kezdő ideje ( startUjraDate )

70 - harangozási statisztika számolásának kezdő ideje ( startStatDate )

100 - 1 perces harangozások darabszáma (startDoBell). integer, 2 byte -on

102 - 2 perces harangozások darabszáma

104 - 3 perces harangozások darabszáma

.

.

140 - 20 perces harangozások darabszáma

Valószínűleg érthetőbb lesz ha bemutatok egy kiírást ami a program indulásakor történik:

-----------------------------------------------------------------------------------------------------
-------- Harang vezérlő v2.0. --- Készítette Romány József - 2023-2024 ---------------------------
-----------------------------------------------------------------------------------------------------
SETUP - Arduino portok beállítása ...
SETUP - Újraindulási darabszám 2024.05.20. 12:00 óta = 1 -> 2
SETUP - Legutóbbi újraindulás ekkor = 24/05/20,12:09:33
SETUP - Eddigi harangozások típus szerint 2024.05.20. 12:00 óta (perc-darab) =
SETUP - 1-0, 2-0, 3-0, 4-0, 5-0, 6-0, 7-0, 8-0, 9-0, 10-0, 11-0, 12-0, 13-0, 14-0, 15-0, 16-0, 17-0, 18-0, 19-0, 20-0
SETUP - Eddigi harangozás 2024.05.20. 12:00 óta összesen (perc) = 0
SETUP - SIM900 modul beállítását kezdjük:
SETUP - Kiadunk egy AT parancsot hogy lássuk kell-e éleszteni a SIM900 modult ...
SETUP - OK -t kaptam, él a SIM900, nem kell éleszteni.
SETUP - AT+CMGF=1
SETUP - AT+CNMI=2,2,0,0,0
SETUP - AT+CLTS=1
SETUP - AT+CCLK?
SETUP - A hálózatról olvasott pontos idő = 24/05/20,12:10:32
SETUP - Watch-dog aktiválása 4 másodpercre ...
SETUP - Vége. Várakozás SMS parancsra.

Remélhetőleg érthetőek a megfogalmazások :-). Talán a harangozás típus szerinti statisztika szorul egy kis magyarázatra: azt mutatják a számpárosok, hogy az adott perc harangozásból hány darab történt az adott dátum óta. Jelnleg "tiszta lappal" indulunk, ezért van mindegyik típusnál '0'. Utána van egy összesített érték is ( ami szintén '0' ), ez érdekességként mutatja hogy összesen hány perc harangozás volt az adott dátum óta.

Ezután következik a SIM900 modul beállítása, amit a fentebb már leírt lekérdezési procedúrával kezdünk. Esetünkben él a SIM900 modul ezért nem aktiválja az élesztési procedúrát. Ezt követik a már szintén kitárgyalt AT vezérlő parancsok.

A SETUP rész legvégén beállítunk egy watch-dog funkciót. Ennek lényege, hogy elindul egy időzítés, ami 4 másodpercre van állítva, és amennyiben a program ennyi időn belül nem kerül egy bizonyos wdt_reset() utasítás végrehajtásra, a vezérlő önműködően újraindul. Fontos, hogy nem csak egyszeri a dolog, hanem innentól kezdődően a program futása során végig ismétlődnie kell a 'wdt_reset()' utasításnak legalább 4 másodpercenként. Ez arra jó, hogy ha valamiért lefagy a program vagy rossz ágban elakad, akkor nem marad ott a végtelenségig, hanem újraindul. Természeten a 'wdt_reset()' -et nagyon át kell gondolni hova tesszük, hogy helyes program működés során mindenképp lefusson legalább 4 másodpercen belül.

2.1.4. Program MAIN

Ez a programrész sem bonyolult. Megkérdezzük a SIM900 modult a (szoftveres)soros porton hogy jött-e valami. Ha jött beolvassuk és az első 160 karaktert letároljuk ( ha nekünk szól abba bőven belefér, ha meg nem nekünk akkor minek tárolgassuk ), kisbetűssé alakítjuk, ha nekünk szóló "szabványos" üzenet akkor kiköbözzük belőle hány perc harangozás szükséges. Ha 1 és 20 közé esik letároljuk az EEPROM -ba a statisztikához, aktiváljuk az SSR -hez tartozó kimenetet, elindítjuk az időzítést ami a millis() függvényre épül, emellett villogtatjuk a 4 darab sárga LED -et az előlapon. A villogtatás 1 percnél az 1. LED villog, 2 percnél az 1. és 2. stb., 4 -nél több percnél pedig egyszerre az 1. és 3., majd a 2. és 4.. A villogás üteme 1 másodperc. Kicsit talán összevisszának tűnik, de hozzátartozik a dologhoz, hogy az első verzióban csak max. 4 perces harangozásról volt szó, ezért tettem fel 4 darab LED -et a doboz elejére. Aztán mikor már kész volt sőt működött is jött az igény, hogy mégiscsak jó volna hosszabb harangozás is. Hát így történt tisztelt bíróság.

Még annyi, hogy az azonnali leállítási kérelmet is fontos lekezelni arra az esetre, ha egy elindított harangozást le szeretnének állítani. Ez a Harang=0 SMS üzenettel érhető el. A lekezeléséhez az időzítés ( harangozás ) alatt is figyelve vannak a beérkező üzenetek, és ha 'Harang=0' érkezik kilépünk az időzítésből és lekapcsoljuk az SSR -t.

2.1.5. Programkód

Az Arduino Nano -ba tehát a következő kód került:


// Harang vezérlő program v2.0 by Jozs

#include <SoftwareSerial.h>
#include <EEPROM.h>
#include <avr/wdt.h>

SoftwareSerial SIM900(7, 8);

String textMessage;

char buffer[70];

// Portok definiálása:
const int RELE = 12;
const int LED[5] = { 0, 2, 3, 4, 5 };
const int LED_MAX = 4;
byte mit_akar=0;
const unsigned long interval     = 500;
const unsigned long totalDuration  = 60000;
boolean ledState = true;
byte ciklus;
byte i;
byte k;
volatile boolean flashing = true;
byte pozi;
int Ujra_Darab;
const int startAddrTIME =  10;
const int startUjraDate =  50;
const int startStatDate =  70;
const int startDoBell   = 100;
int bell_darab;
int bell_osszes;


void setup() 
{
  Serial.begin(19200); 
  SIM900.begin(9600);

  cli();
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1  = 0;
  OCR1A = 7882;
  TCCR1B |= (1 << WGM12);
  TCCR1B |= (1 << CS12) | (1 << CS10);  
  TIMSK1 |= (1 << OCIE1A);
  sei();
  
  Serial.println("");
  Serial.println(F(" -----------------------------------------------------------------------------------------------------"));  
  Serial.println(F(" --------  Harang vezérlő v2.0. ---  Készítette Romány József - 2023-2024  ---------------------------"));  
  Serial.println(F(" -----------------------------------------------------------------------------------------------------"));    
  Serial.println("SETUP - Arduino portok beállítása ...");  
  pinMode(RELE,   OUTPUT);
  pinMode(LED[1], OUTPUT);
  pinMode(LED[2], OUTPUT);
  pinMode(LED[3], OUTPUT);
  pinMode(LED[4], OUTPUT);
  pinMode(6, OUTPUT);

  digitalWrite(RELE, LOW);

  Serial.print(F("SETUP - Újraindulási darabszám "));  
  for ( i = startUjraDate; i < startUjraDate+17; i++ )
    {
      Serial.write(EEPROM.read(i));
    }  
  Serial.print(F(" óta = "));
  EEPROM.get(0, Ujra_Darab); delay(200);
  Serial.print(Ujra_Darab);  
  Serial.print(" -> ");    
  Ujra_Darab++;
  EEPROM.put(0, Ujra_Darab); delay(200);
  Serial.println(Ujra_Darab);

  Serial.print(F("SETUP - Legutóbbi újraindulás ekkor = "));  
  for ( i = startAddrTIME; i < startAddrTIME+17; i++ )
    {
      Serial.write(EEPROM.read(i));
    }  
  Serial.println("");

  Serial.print(F("SETUP - Eddigi harangozások típus szerint "));  
  for ( i = startStatDate; i < startStatDate+17; i++ )
    {
      Serial.write(EEPROM.read(i));
    }  
  Serial.println(F(" óta (perc-darab) = "));
  Serial.print(F("SETUP -    "));
  bell_osszes = 0;
  for ( i = 0; i < 20; i++ )
    {
      EEPROM.get(startDoBell + i*2, bell_darab); delay(200);
      Serial.print(i+1);
      Serial.print("-");
      Serial.print(bell_darab);
      bell_osszes = bell_osszes + bell_darab*(i+1);
      if ( i==19 ) break;
      Serial.print(", ");
    }  
  Serial.println("");

  Serial.print(F("SETUP - Eddigi harangozás "));  
  for ( i = startStatDate; i < startStatDate+17; i++ )
    {
      Serial.write(EEPROM.read(i));
    }  
  Serial.print(F(" óta összesen (perc) = "));
  Serial.println(bell_osszes);

  Serial.println(F("SETUP - SIM900 modul beállítását kezdjük:"));

  Serial.println(F("SETUP - Kiadunk egy AT parancsot hogy lássuk kell-e éleszteni a SIM900 modult ..."));
  SIM900.print("AT\r");
  delay(3000);
  Response(); 

  if ( strstr(buffer,"OK") )
      {
        Serial.println(F("SETUP - OK -t kaptam, él a SIM900, nem kell éleszteni.")); 
      }
      else
      {
        Serial.println(F("SETUP - Nem él a SIM900, aktiváljuk a POWER-UP procedúrát ..."));  
        digitalWrite(9, HIGH);
        delay(1000);
        digitalWrite(9, LOW);
        delay(5000);
        Serial.println(F("SETUP - Várunk 30 másodpercet hogy összeszedje magát ..."));
        delay(30000);
      }

  Serial.println("SETUP - AT+CMGF=1");
  SIM900.print("AT+CMGF=1\r");
  delay(3000);
  Response();

  Serial.println("SETUP - AT+CNMI=2,2,0,0,0");
  SIM900.print("AT+CNMI=2,2,0,0,0\r");
  delay(3000); 
  Response();  

  Serial.println("SETUP - AT+CLTS=1");
  SIM900.print("AT+CLTS=1\r");
  delay(3000); 
  Response();

  Serial.println("SETUP - AT+CCLK?");
  SIM900.print("AT+CCLK?\r");
  delay(3000); 
  Response();  

  pozi = 0;
  for ( i = 0; i<sizeof(buffer); i++ )
  {
    pozi=i;
    if ( buffer[i] == 34 ) break;
  }
  pozi++;

  Serial.print(F("SETUP - A hálózatról olvasott pontos idő = "));
  for ( i = pozi; i <= pozi+16; i++ )
  {
    Serial.print(buffer[i]);
    EEPROM.write(startAddrTIME+i-pozi, buffer[i]);
    delay(200);
  }
  Serial.println("");

  flashing = false; digitalWrite(6, HIGH);
  Serial.println(F("SETUP - Watch-dog aktiválása 4 másodpercre ..."));  
  wdt_enable(WDTO_4S);
  Serial.println("SETUP - Vége. Várakozás SMS parancsra.");
  Serial.println();
}

ISR(TIMER1_COMPA_vect) 
 {
  if (flashing) digitalWrite(6, !digitalRead(6));
 }

void loop()
{
 wdt_reset();
 textMessage = "";

 if(Serial.available()) SIM900.print((char)Serial.read());
 if(SIM900.available()>0)
  {

   while (SIM900.available())
    {
      while (SIM900.available())
        {    
          while (SIM900.available())
            {
              char c = SIM900.read();
              if (textMessage.length() < 160)
              {
                textMessage += c;               
              }
          delay (10);
        }
      delay (100);
      } 
    }

    Serial.print("A következő üzenet érkezett= ");
    Serial.println(textMessage);
    delay(10);  

    textMessage.toLowerCase();

  for (int i = 20; i >= 1; i--) 
  {
    String searchString = "harang=" + String(i);
    if ( textMessage.indexOf(searchString) != -1 )
      {
        mit_akar = i;
        break;
      }
  }
 }     

 if (( mit_akar >= 1 ) && ( mit_akar <= 20 ))
 {
 
    EEPROM.get(startDoBell+((mit_akar-1)*2), bell_darab); delay(200);
    bell_darab++;
    EEPROM.put(startDoBell+((mit_akar-1)*2), bell_darab); delay(200);
  
    Serial.print("Harang=");  
    Serial.print(mit_akar);  
    Serial.print(" érkezett, aktiváljuk a kimenetet ");  
    Serial.print(mit_akar);     
    Serial.println(" percre.");
    digitalWrite(RELE, HIGH);

  for ( ciklus=mit_akar; ciklus>=1; ciklus-- )
  {
    unsigned long startMillis    = millis();
    unsigned long previousMillis = millis();
    unsigned long currentMillis  = millis();

    while ( currentMillis - startMillis < totalDuration )
    {
    if(SIM900.available()>0)
     {
       textMessage = SIM900.readString();
       Serial.println("");
       Serial.print("Harangozás közben érkezett üzenet= ");
       Serial.println(textMessage);
       delay(10);
       textMessage.toLowerCase();
       if ( textMessage.indexOf("harang=0") > 0 )
         {
           Serial.println(F("Harangozás közben Harang=0 érkezett! Lekapcsoljuk a kimenetet!")); 
           mit_akar = 0;
           break;
         }
      }

    currentMillis  = millis();

    if (currentMillis - previousMillis >= interval)
    {
      wdt_reset();
      previousMillis = currentMillis;
      ledState = !ledState;

      // A következ
      if ( ciklus > LED_MAX )
      {
          digitalWrite(LED[1], ledState);
          digitalWrite(LED[2], !ledState);
          digitalWrite(LED[3], ledState);
          digitalWrite(LED[4], !ledState);
      }
      else
      {
          for ( i=1; i <=ciklus; i++ )
          {
            digitalWrite(LED[i], ledState);
            if ( ciklus<4 ) digitalWrite(LED[ciklus+1], LOW);
          }
      }
    }
  }
   if ( mit_akar != 0 ) Serial.print("P"); else break ;
  }

  if ( mit_akar != 0 )
  {
    Serial.println("");
    Serial.print("Letelt a ");  
    Serial.print(mit_akar);         
    Serial.println(" perc, lekapcsoljuk a kimenetet.");
  }
  Serial.println("Várakozás SMS parancsra.");    
  mit_akar = 0;
  digitalWrite(RELE, LOW);
    for ( i=1; i <= LED_MAX; i++ )  digitalWrite(LED[i], LOW);
 }
}


void Response()
{
int count = 0;

if (SIM900.available())
   {
    while (SIM900.available())
      {         
        buffer[count++] = SIM900.read();
        if (count == 64) break;
      }
        buffer[count++] = '\0';
        count = 0;
   }
}



2.2. Android

2.2.1. Általános leírás

Az applikáció feladata egyszerű: a felhasználó ki tudjon választani egy harangozás hosszt másodpercben és a kiválasztáskor az küldődjön el SMS -ben egy adott mobil telefonszámra. A gyakrabban használt harangozási hosszakat ( 1, 2, 3, 4, 10, 15 perc ) külön gombokra tettem az egyszerűbb használhatóság kedvéért. Így valahogy:
Harang vezérlő

A gombok a programban siman Button -okként lettek definiálva, a biztonság kedvéért egy Notifier -en "megjáratva", hogy ha a ráböktünk egy gombra ne azonnal induljon az SMS ( és azzal a harangozás, ugye ), hanem kérdezzen rá az alkalmazás, hogy tényleg komolyan gondoltad-e. Az SMS csak akkor lesz elküldve, ha a Notifier üzenetre igen -nel válaszolunk.
Harang vezérlő

Külön gombra került a harangozás megszakítása funkció ami végrahajtás előtt szintén rákérdez:
Harang vezérlő

Természetesen arra is van lehetőség ha olyan harangozási időt szeretnénk beállítani ami nincs kint gombokon, erre egy ún. Spinner -t használtam, ami tulajdonképpen egy görgethető elemválasztó. Az elemek ezesetben ugye az 1 és 20 közötti másodpercek. A Screen inicializálásakor ehhez meg kellett adni egy 1 - 20 számokból álló listát ( lásd lentebb ). A Spinner lenyíló ablakára bökve megjelenik az 1 - 20 lista. A következő screenshot ezt mutatja. Sajnos az App Inventor nem alkalmas arra hogy "cizelláljuk" az elemválasztót így egy kicsit puritán a lista, de végülis örüljünk hogy van és funkcionálisan szuperul működik.
Harang vezérlő

A lista egy elemét kiválasztva a fix gombokhoz hasonlóan egy notifier jelenik meg és igent választva küldődik el a kiválasztott percet tartalmazó SMS. A fő Screen Designer képernyője így néz ki ( nyilván ezen nem látszik részletesen minden elem ):
Harang vezérlő

Tettem az alkalmazásba egy segítő szöveget is, mely egy másik Screen -en kapott helyett. A fő Screen alján levő Button -nal lehet rá átlépni. A segítő szöveget az alján levő Vissza gombbal lehet elhagyni.
Harang vezérlő

( Upsz, van is itt egy hibácska a pirossal bekarikázott részen v2.0 -nak kellene lennie ... a fene se gondolta hogy az Inventorban ezt minden Screen -en külön át kell írni. ) A "program" felépítése rém egyszerű, csak egyetlen blokkból áll. A Designer képernyője így néz ki:
Harang vezérlő

2.2.2. Az Android program

Akkortehát következzenek maguk a program blokkok. Fentebb vázlatosan leírtam mik vannak benne, semmi bonyolultság, Button, Notifier, Spinner. Magát az SMS küldést egy sima SendMessageDirect hívás csinálja aminek van egy PhoneNumber és egy Message mezője, melyeket értelemszerűen fel kell tölteni. A Spinnerhez a program elején definiáltam egy 20 elemű listát amiből választhat. Kicsit trükkös volt mire jöttem, ez segített.

Tehátakkor íme a fő Screen programja:
Harang vezérlő

A Segítség Screen -é pedig ( hahaha :-) :
Harang vezérlő

3. Telepítés, beüzemelés

Az általam eddig készített dolgok a fenti megépítés-hardver-szoftver témákban ki is merültek, itt viszont hátra volt még az eszköz telepítése-beüzemelése. A telepítés helye Egertől kb. 80 km -re van, ami egy kicsit elbyonolította a dolgokat. Ez már nem az a távolság ahonnan csak úgy hazaugrik az ember mondjuk egy itthon felejtett szerszámért. Vagyis indulás előtt alaposan át kellett gondolni mire lehet készülni. Szerencsére ilyen szempontból nem is volt gond, pedig - mint nemsokára olvashatod - akadt bonyodalom bőven.

A kiindulási állapot így nézett ki:
Harang vezérlő

Látható hogy nem ma készült. A lényeg a kép jobb oldalán levő doboz. A doboz közepén levő Ganz kapcsolóval lehetett elindítani és leállítani a harangozást. Mellette kismegszakító az áramtalanításra. Bár a képen szintén látszik az árammérő doboz és alatta - természetesen - egy kismegszakító, igaz, arról a templomnak is ment valami fogyasztója. Sőt, a bal felső részen látható porcelán biztosítók is ezt védték. Végülis inkább több legyen mint kevesebb. A doboz belseje a következő képen látható:
Harang vezérlő

Eltartott egy ideig míg ki tudtam bogozni ki kivel van. Kapásból azt hittem a bal alsó a bejövő vezeték és a jobb alsó megy a haranghoz. De nem, fordítva volt. Mindegy. Leszedtem a dobozt és feltettem az újat. Úgy döntöttünk, hogy az új doboz csak két sarkán lesz felfogtatva, a bal alsó és a jobb felső. Bal alsó tipli adott volt, így csak egyetlen furatra volt szükség a jobb felső sarokba. Abba is bement a tipli, majd felfogattam a dobozt két termetes csavarral, bekötöttem, bekapcsoltam, és ... semmi. Se kép, se hang. Újabb agyalgás, mi történhetett. Méréssel megállapítottam, hogy a doboz nem kap bemenő feszt. De miért ? Hova lett ? A gyanú a fúrásra terelődött, és a fali vezeték visszabontását követően be is igazolódott: elfúrtam a falban menő ( illetve jövő ) vezetéket :-((. Szubbasszus. Ráadásul csak az egyik szálat, így még a kiskegszakító sem ment le ( és nem mellesleg meg sem rázott ). Lásd kék tipli:

Harang vezérlő
Harang vezérlő

Mondhatni nagy volt az öröm; mikor már éppen végeztünk volna következett egy kis vésés ( igen, vésőt is vittem és kalapácsot ), falbontás. A kerámia biztosítókig menő vezetéket kiszedtük és kicseréltük új vezetékre ( igen, az is volt nálam):
Harang vezérlő

Gondolom egy villanyszereléshez értő felszisszen megoldás láttán, mentségemre legyen mondva, hogy a régi vezeték is hasonlóképpen volt vezetve, így - mondhatni - a helyzet semmiképpen nem romlott. Arról nem beszélve, hogy a két kerámia biztit is megszüntettük, mert egyrészt nem láttam értelmét megtartani, másrészt borzalmas állapotban voltak, így még egy látványos lépést is tettünk a(z üzem)biztonság irányába. Szerencsére mire legközelebb mentünk a helyiek már szépen rendbehozták a falat:
Harang vezérlő

Hogy miért mentünk legközelebb ? Nos egy szoftver upgrade miatt, mert a fenti szoftver ha figyelmesen olvastad már a 2.0 verzió, vagyis volt egy 1.0 is. A régi verzióban csak 1, 2, 3 vagy 4 perces harangozási időt lehetett megadni, ezt módosítottam az új verzióban 1 - 20 percre.

Az új szoftvert úgy terveztem betölteni hogy nem töltöm be :-), hanem itthon felprogramozok egy Nano -t, azt elviszem, a régi helyére beteszem és passz ( ennek olyan oka is volt, hogy a régi Nano -ra valamiért nem tudtam notebook -ról felcsatlakozni, vagyis ha akartam volna sem tudtam volna a helyszínen rátölteni az új szoftvert ). Természetesen (?) ez sem ment simán, mert amikor az új Nano betételét követően bekapcsoltam a vezérlőt, elszállt a bizti. Egy kicsit combosabb olvadóbizti betétele után pedig tök hülyén működött, így kénytelen voltam visszatenni a régi Nano -t, és dolgavégezetlenül hazakullogni. Azóta sem tudom mi történhetett, csak tippjeim vannak ( ami azért elég rossz a jövőre gondolva ). A következő próbálkozásra már nagyon rákészültem, olyannyira hogy gyári Nano -t szereztem be, ami kb. 8 -szor annyiba került mint az eddig általam használt klónok, viszont ha ezzel egy újabb fölösleges berzéki utat megspórólok már mindjárt pluszban vagyok. A képen alul a régi, felül az új Nano látható:
Harang vezérlő

4. Zárszó

Noshát így zajlottak a harangvezérlő készítéssel kapcsolatos viszontagságaim. Nem volt egyszerű, és ha előre tudom mennyire összetett a feladat nincs kizárva hogy nem is vállalom be, viszont sok sikerélményt adott, a kínlódásokból, zsákutcákból pedig sokat tanultam, így összességém mégis azt mondhatom megérte.

Ezúton is szeretnék köszönetet mondani mindazoknak akik a különböző fórumokon ill. privátban segítettek a munka során felvetődött problémáim megoldásában !!

Ha pedig azt is figyelembe veszem, hogy megismerkedhettem néhány igazán nagyszerű emberrel Berzéken, elsősorban Virág Barna - most már mondhatom - barátommal és az Édesanyjával és finom főztjeivel, akkor biztosan állíthatom, hogy nagyon sokat veszítettem volna eme "projekt" nélkül.

Kívánom nekik hogy használják sokáig egészséggel, magamnak pedig hogy sosem romoljon el :-))

 JozsBiker, 2024