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).
A kijelzett értéknél, hogy sporoljak a karakterekkel ezt változtattam.
Ez volt.: ,,
lcd.print(getTempCByIndex(1);
kerekites = sensors.getTempCByIndex(1)/1; // Ez elvileg huleség. Itt azonban a tizedes vesszo utani ertek eltunik lcd.print(kerekites); //Itt irja be a 1-es szenzor adatát