1. Alapvetően protokolltól függ, i2c-vel ne is próbálkozz, azt alapvetően nyákon belüli kommunikációra találták ki. Vannak rendszerek (pl. RS485), ami vígan elmegy több tíz métert is különleges birizgálás nélkül. Arduinóval számos minta van rá. Canbus játszik (bár az eszközök köre szűkös). Elgondolkodtató ez esetben a szobánkénti kontroller és a központi vezérlő master/slave-szerű elrendezésben. Cat6 megfelelő az adatátvitelre és a tápkábelnek is.
2. Kérdés, hogy mennyire akarsz pontos értéket. A One Wire vígan elmegy néhány tucat métert, de a távolsággal arányosan a zavarérzékenység nő. Én nem keverném a rendszereket, egy központi busz, az érzékelők meg a sajátjukon (lásd 1. pont). 3. Én nem feltétlen Arduino alapon csinálnám, de a mega2560, ha nem akarsz csili-vili kijelzést, megbírkózik vele. Én valószínűleg mbed platformon és jó eséllyel Can-Bus-szal vagy RS485-tel csinálnám. 4. Amit a rendszer elbír. Tudok közelségérzékelős rendszerről is, ami megfelelő protokoll alapján tök automatikusan kapcsol mindent a lakásban. 5. A műszaki átvétel után azt csinálsz, amit akarsz, a plusz kábelnek a villanyszerelő nem fog örülni, de azt kérheted, hogy másik csatornába húzza és másik fali elosztódobozba rakja, és akkor nincs gond vele semmilyen szempontból. Az biztos, ha valamit elbaltázol, akkor a tűzvizsgálók erősen kérdezgetni fogják, hogy mi hogy volt, és ha úgy alakul, a biztosító például simán kifarol a helyzetből. Az okosházon nem (csak) az elektronika kerül annyiba, hanem az is, hogy felelősséget vállalnak arra, hogy emiatt nem fog leégni a házad (ha mégis, akkor az ő biztosítójuk az ő felelősségbiztosításuk terhére fizetni fog). Építésügyileg ez úgy néz ki, hogy a házba az és úgy kerülhet bele, ahogy a terveken van. Ez a felelős műszaki vezető felelőssége. Ha a terveken szerepel egy sor második kábelcsatorna, benne egy-két-há CAT-6 UTP kábellel, akkor az lesz. Hogy aztán ezzel mi fog történni, ahhoz nekik már semmi közük. A házat úgy kell átadni, hogy a te tervedből semmi nem látszik sem a terveken, sem a házon (maximum kihagyott lyukak, üres kötődobozok stb.). Aztán amikor az e-építési naplót lezárják, akkor jöhet a mehet, mert onnantól az már a te felelősséged, nem az építésvezetőé.
Jövőre építkeznék (160m2), és elkezdtem nézegetni az okosház rendszereket, viszont elég húzós árakat mondtak... (1.5-2Mft) Amire szükségem lenne (kb): - 14-15 világítási kör vezérlése - 6-7 helység hőmérsékletének mérése, és szabályzása - 10 db redőny vezérlése - kapunyitás - szellőztető berendezés vezérlése
Jelenleg egy 50m2-es kis családi házban lakunk, ahova már összeraktam egy kis eszközt, amivel a a szoba, nappali, külső hőmérsékletét mérem. Páratartalmat mérek, és vezérlem a hővisszanyerős szellőztetőmet. Ugyanezzel az eszközzel mérem a vegyes tüzelésű kazán előremenő és visszatérő víz hőmérsékletét és a puffer hőmérsékletét...
Ez eddig elég stabilan működik, viszont itt kicsik a távolságok (10m max.) a szenzorok és relék, és a mikorkontroller között (Arduino MEGA 2560), és itt működik úgy hogy az arduino jelszintekkel kapcsolok...
Buszos rendszerre gondoltam (hogy építek egyet), ahol a fogyasztókig kihúzatnám (villanyszerelővel) a táp kábeleket egy központi vezérlőszekrényből, és a kapcsolók (lámpa, redőny, stb) és szenzorok (hő- és párataratlom mérő) helyére pedig Cat5e vagy Cat6 -os kábelt húznék, és ezen keresztül adnám az adott jelet vissza a mikrokontrollernek, hogy pl kapcsold fel a lámpát vagy nyisd ki a 2.szoba fűtési szelepét, stb...
Arra gondoltam, hogy megcsinálnám magamnak a vezérlést, de van egy csomó kérdés ami miatt még infót szeretnék gyűjteni, hogy érdemes-e belevágnom... 1., a mikorkontrollertől egy távolabbi helység kapcsolójából nem esik-e túl sokat a jel mire elér a MEGA-ig, ezeket ilyenkór hogyan érdemes csinálni? 24V vagy 48V-al kapcsolni, mert az távolabbra is vihető nagyobb jelszint esés nélkül?
2., DS18B20-al mérem a hőmérsékleteket jelenleg, ha mondjuk a legtávolabbi hőmérő van vagy 30m-re az mennyire fog pontos értéket adni?
3., Egy ilyen "nagyobb" rendszerrel mennyire stabil a MEGA, vagy melyik lapkát érdemes használni?
4., Villanykapcsolónak mit érdemes használni? "Csengő" kapcsoló jó választás lehet? Vagy egy Nextion UNO páros relével. (Erre azért gondoltam, mert a kapcsoló programozható, hogy mit szeretnék kapcsolni vele)
5., Lakhatási engedély kiadásánál mennyire veszik figyelembe, hogy a vezérlést nem villanyszerelő csinálta? Szóval mennyire van erre nekem "jogosultságom" hogy megcsináljam? (Elektroműszerész és OKJ-s programozói vizsgám van)
A véletlen félremérésekre fel is vagyok készülve, 5elemu tömbökbe olvasok, legkisebb, legnagyobb elemek eldobasaval és a maradék átlagolásával. De ha egy mérőeszköz folyamatosan - 127c t ad azzal nem tudok mit kezdeni. Érdekes, hogy mikor USB-n volt az arduino akkor jót mért a hőmérő is és meg is találta a címét is, de mikor külső tápot kapott megállt. Pedig a másik 3 is azon a tápon van. Lehet hogy az előző leírásom nem volt egyértelmű, de külön-külön használom a hőmérőket, mind a 4 másik digitális lábon van. One-wire ként egyik sem működött. Ki fogom cserélni azt az egy hőmérőt hátha csak annak van valami kínja.
Köszi. Ez jutott nekem is eszembe mikorra feltettem a kérdést... nem is értem miért nem így csináltam meg eddig, hiszen más változót is így olvasok onnan. Szerencsére csak egy oldalas a kijelzés ez így nem okoz problémát.
A Nextion-os problémárba én is belefutottam. A dualstatebutton , vagy sima button és új global változó a megoldás. Nyomáskor megváltozik a dsbutton értéke ( vagy nyomáskor megváltoztatod az új változó érték (mondjuk va_valami.val=1). Nextion tárolja a dsbutton vagy a va_valami értékét addig, amíg nem írod felül. Mikor már nincs szükség rá, visszaíratod a változó értékét. (Mondjuk a programban a lekérdezés közvetlen visszaírod alapra).
nextion 0.7.0 vagy 0.9.0 könyvtárral így megy pld:
bt_uzemmod.getValue(&uzemmod); //kiolvasod az értéket
iif (uzemmod == 1) {
.....
}
bt_uzemmod.setValue(0); //visszaírod az értéket alapra
}
Szépséghiba, hogy a kiolvasáshoz, visszaíráshoz az adott lapon kell lenned a nextion-on. (bár elméletben a global változókkal, ha minden lapon letárolod, akkor mennie kell).
Ha itt arra gondolsz, hogy külön van-e megtáplálva, vagy az adatvonalról hajtom-e, akkor igen, 3 vezetékesen használom.
Mivel itthon működött gond nélkül, mivel csak az volt az arduinon, egyéb eszközök nem, így csak arra tudok gondolni, hogy zavar okozza a galibát.
Tudom együgyű kérdés, de az árnyékolást, hogyan kell bekötni? Tehát a vezetékben van az árnyékoló fólia, annak mindkét végét le kell kötni GND-re, vagy csak az egyiket?
Egyéb probléma. Serial vonalon nincs buffer? Jelenleg a 4 hőmérő olvasása, illetve a program további futása, ~ 2 másodpercet vesznek igénybe ciklusonként. Nincs benne delay. Nekem ez megfelelő, mivel nem óramű pontossággal kell kapcsolnom sem relét, sem egyéb dolgot. Van egy Nextion Hmi a redszerben, amin van egy relé bekapcsoló gombja is az érintőfelületen. Többször meg kell nyomni, illetve a program futás egy adott pillanatában kell megérinteni, hogy be-vagy ki kapcsoljon. Miért nem tárolja el a változó értékét, vagy van rá mód, hogy többször beolvassam az állapotát egy azon loop-ban?
#include <max6675.h> #include <OneWire.h> #include <DallasTemperature.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> #define ONE_WIRE_BUS 3 //AVR Nano 3. bemenetére kötve D3 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); DeviceAddress s1 = { 0x28, 0x8A, 0xF7, 0xE1, 0x06, 0x00, 0x00, 0xDB }; //1.szernzor címe másik progival kiolvasva //DS18B20 1-es DeviceAddress s2 = { 0x28, 0xE1, 0x82, 0x2F, 0x07, 0x00, 0x00, 0xD8 }; //2.szernzor címe másik progival kiolvasva //DS18B20 2-es DeviceAddress s3 = { 0x28, 0x9B, 0x38, 0x30, 0x07, 0x00, 0x00, 0xDF }; //3.szernzor címe másik progival kiolvasva //DS18B20 3-as DeviceAddress s4 = { 0x28, 0xCF, 0xCE, 0x2F, 0x07, 0x00, 0x00, 0xB5 }; //4.szernzor címe másik progival kiolvasva //DS18B20 4-es LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display
//Itt határozom meg a Max6675 - Arduino csatoló be & kimeneteit int thermoDO = 4; int thermoCS = 5; int thermoCLK = 6; MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO); // constants won't change. They're used here to // set pin numbers:
// Bemenet elnevezése int Start_gomb = 12; // (Start merker)
// Kimenet elnevezése int Start_merker = 13; // (Start merker) int Kazan_sziv = 9; // (Kazán szivattyu) int fustPin = 10; // (Füst meleg) Pin13-re relé kotve int kerekites = 0; int kerekitesF = 0;
int Tuzeg_State = kerekitesF > 26; //Változók int Nyomogomb_State = 0; // variable for reading the pushbutton status int Fusthovaltozobe_State = 0; // variable for reading the pushbutton status int FusthokiState = 0; // variable for reading the pushbutton status void setup() { lcd.init(); // initialize the lcd lcd.backlight(); lcd.begin(20, 4); sensors.begin(); sensors.setResolution(s1, 9); // initialize the pushbutton pin as an input: pinMode(Start_gomb, INPUT); pinMode(fustPin, OUTPUT);
} void loop(){
sensors.requestTemperatures(); delay(500); //fontos ha 11 vagy 12 a resolution lcd.setCursor(0,0); //0. sor 0. karakter a kezdő cím lcd.print("Puffer horetegek"); // LCD második sor_1_********************** lcd.setCursor(0,1); //0. sor 0. karakter a kezdő cím lcd.print("1"); lcd.print("/"); lcd.setCursor(2,1); //0. sor 3. karakter a kezdő cím kerekites = sensors.getTempCByIndex(0)/1; lcd.print(kerekites); //Itt irja be a 1-es szenzor adatát
lcd.print("C "); lcd.print(char(223));
// LCD második sor_2_********************** lcd.setCursor(10,1); //1. sor 10. karakter a kezdő cím lcd.print("2"); lcd.print("/"); lcd.setCursor(12,1); //1. sor 13. karakter a kezdő cím kerekites = sensors.getTempCByIndex(1)/1; //Ez elvileg huleség. Itt azonban a tizedes vesszo utani ertek eltunik lcd.print(kerekites); // Itt irja be a 2-es szenzor adatát lcd.print("C "); lcd.print(char(223));
// LCD harmadik sor_1_********************** lcd.setCursor(0,2); //2. sor 0. karakter a kezdő cím lcd.print("3"); lcd.print("/"); lcd.setCursor(2,2); //2. sor 3. karakter a kezdő cím kerekites = sensors.getTempCByIndex(2)/1; //Ez elvileg huleség. Itt azonban a tizedes vesszo utani ertek eltunik lcd.print(kerekites); // Itt irja be a 3-as szenzor adatát lcd.print("C "); lcd.print(char(223));
// LCD harmadik sor_2_********************** lcd.setCursor(10,2); //2. sor 10. karakter a kezdő cím lcd.print("4"); lcd.print("/"); lcd.setCursor(12,2); //2. sor 13. karakter a kezdő cím kerekites = sensors.getTempCByIndex(3)/1;//Ez elvileg huleség. Itt azonban a tizedes vesszo utani ertek eltunik lcd.print(kerekites); // Itt irja be a 4-es szenzor adatát lcd.print("C "); lcd.print(char(223));
// LCD negyedik sor /1 ********************** lcd.setCursor(0,3); //3. sor 10. karakter a kezdő cím lcd.print("Fust1"); lcd.setCursor(6,3); kerekitesF = thermocouple.readCelsius()/1;//Ez elvileg huleség. Itt azonban a tizedes vesszo utani ertek eltunik
lcd.print(kerekitesF); // Itt irja be a 4-es szenzor adatát lcd.print("C ");
// Start gomb megnyomását tárolom! // Ventillátor indul
Nyomogomb_State=digitalRead(Start_gomb);
if ( Start_merker, LOW && FusthokiState, HIGH ) {digitalWrite(fustPin, LOW); //lcd.setCursor(10,3); //3. sor 10. karakter a kezdő cím //lcd.print("Keszenlet"); }
// Itt elmentem, hogy start parancs van. if (Nyomogomb_State == HIGH) { // turn LED on: digitalWrite(Start_merker, HIGH); digitalWrite(fustPin, HIGH); }
//Kijelzem hogy start parancs van!
if (Start_merker, HIGH) { lcd.setCursor(10,3); //3. sor 10. karakter a kezdő cím lcd.print("Begyujtas"); }
/* Ha már meleg a füst = ég a tűz, akkor törlöm a start parancsot * valamint 2 változóban is tárolom az állapotát. */ if (kerekitesF > 26) { //Ha ,,kerekitesF nagyobb mint X ( 26 C) akkor kapcsolja a következőket. digitalWrite (Fusthovaltozobe_State, HIGH); digitalWrite (FusthokiState, LOW); digitalWrite(Start_merker, LOW); }
/* Ha már nem meleg a füst = kialudt a tűz, akkor a két változóban is tárolom az állapotát. */ if (kerekitesF < 24) { digitalWrite (Fusthovaltozobe_State, LOW); digitalWrite (FusthokiState, HIGH);}
/* Elvileg itt szeretném a készenléti állapotot kijeleztetni. */ if ( Start_merker, LOW && FusthokiState, LOW) { digitalWrite(fustPin, LOW); lcd.setCursor(10,3); //3. sor 10. karakter a kezdő cím lcd.print("Keszenlet"); } } else if (Fusthovaltozobe_State, HIGH){ lcd.setCursor(10,3); //3. sor 10. karakter a kezdő cím lcd.print("Futes ");
} } /* Az LCD- kijelzett állpotok még nem okék. * Lehetséges kijelzett értékek. 1. Készenlét * 2. Begyujtás * 3. Fűtés * Ebből csak 2 állapotot tudok megjeleníteni. */
Én is szenvedek a DS18b20-al, számszerint 4darabot használok hőmérésre. Ami érdekes, hogy onewire-ként címezve akartam használni. Próbapadon minden simán ment, azonban mikor beépítettem a végleges helyére, egyik sem működött, sőt a címüket sem tudtam lekérdezni. Mind -127C-t mutatott.
Próba-próba, mérés-mérés, aztán arra jutottam, hogy a tápokat párhuzamosítottam mindegyiket egy-egy külön felhúzóellenállással láttam el. Így most működik a 4-ből 3, de van hogy a 4. is "elindul," és jót mér (nem -127-et). Illetve van, hogy még egy másik is "félrekacsingat" :-)
Vicces, hogy pont azért cseréltem a K-hőelemeket le, mert pontatlanok voltak...
A kettő ami eddig jól mért, az stabil. Nem értem... cserélgettem a bemeneteket, programmal játszottam, de nem jó. 4-eres árnyékolt biztonságtechnikai kábelt használok a bekötésre, 4-5 méter hosszban. Vezetékek mindenhol forrasztva.
Az árnyékolást lekötöttem testre, nem segített, így visszavettem.
A korábbiakban már ismertetett rendszerbe tettem, ATX táp, Nema Stepper motor, illetve több hálózati vezeték, és 400V-os kábel is megy ugyanabban a kábelcsatornában.
Van valakinek egy jó ötlete, hogy merre keressem a bajt?
log: napló. Változókat, a függvények futásának kezdetét/végét írod egy fájlba, amit x ciklusonként (vagy időre stb.) elkezdesz elölről (a legrégebbi adatot törlöd, illetve felülírod). A naplót utólag meg tudod nézni (txt, sd kártyán például). Hátránya, hogy maga a naplózás is beleszól a program futásába (SD kártya esetén nem is kicsit).
watchdog: olyan szoftver és/vagy külső áramkör, amely a kontroller (vagy a fő áramkör) megakadásait iktatja ki oly módon, hogy ha a fő áramkörtől (mikrokontrollertől) nem kap jelet a beállított időintervallumon (mikroszekundumtól percekig tartó időszakon belül), akkor automatikusan végrehajt egy borzasztó egyszerű feladatot (ez rendszerint az, hogy aktív földre húzza a mikrokontroller RESET lábát). [A logban ez úgy jelenik meg, hogy a sketch/program void.Setup() szakasza ír bele). Bár ez önmagában még nem jelenti azt, hogy a Watchdog küldte a resetet, csak annyi, hogy újraindult, de ez már komplexebb kérdés.]
Az, hogy "USB-ről megy"... Semmit nem jelent. Az, hogy az USB csatlakozó másik oldalán milyen minőségű táp van, illetve a mikrokontrollernek még mennyi mindent kell hajtania, mi terhelheti, honnan milyen zavarokat szedhet össze, ami akár az érzékelők, akár a mikrokontroller működését érdemben befolyásolja. A forrasztás, ha jó, akkor jó. :-D PLC kicsit más világ, ott egy szinttel szoftverben és hardverben is feljebb vagy.
Az ad-hoc fagyásokat folyamatos logolással és watchdoggal lehet elcsípni. A watchdog reset előtti időszak adatainak összevetésével jó esetben ki lehet bogozni, hogy szoftveres vagy hardveres eredetű-e a probléma. Szoftveresnél tipikus a túlcsordulás (időzítés, változók), hardveresnél a táp, kontakt.
Nekem ilyen esetekben (önállóan működik, két szoftvert egyesítve nem) az szokott lenni, hogy a változókat kavarom (globális) és/vagy két függvény is beletúr ugyanabba. A kódodat nem látom, így nem tudok róla nyilatkozni, hogy mi lehet a gond.
Aztán: táp. A táp fontos, a logikai vonalak zajvédelme úgyszintén. Részletesen a linken. De előbb szoftveresen nézelődnék (Serial debug).