segítség!!

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Lezárt
robroy007
Újonc
Újonc
Hozzászólások: 9
Csatlakozott: 2015. május 8. péntek, 19:43

Re: segítség!!

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

annyira nem bővölt :)

az első hsz-ben is volt róla szó, hogy hab a tortán, és ha az elején már cél valami könnyebb rá tervezni, mint utólag toldozni foltozni
"a hab a tortán már az lenne, ha nem kellene a víz hőfokát külön eszközzel figyelni és mérni, illetve a hozzá tartozó hűtést vezérelni hanem ez is megoldható lenne arduinos környezetbe és egy eszközzel persze"

frekiváltó ténye annyiból lényegtelen, hogy egy mágnes kapcsoló segéd érintkezője is lehet az arduino felé biztosított startjel, mert mind a kettő relé kontaktot ad
(a fordulatszám meg a vezérlő felől pwm alapján van megoldva külön)

a 20°C nem irreális bemenő vízhőfoknak, ha figyelembe vesszük, hogy a gépet is 20°C-on kellene üzemeltetni a megfelelő pontosság érdekében!!

az autóknál kicsit másabb a magas hőfok indoka úgy gondolom, ott a hideg motor eleve az égéstől von el teljesítményt jelentő hőmennyiséget az égés során

a főkapcsolós vízhűtés pazarló ezért cél a főorsóval való indítás

A "De most ezzel "spórolni szeretnél" sortól gyakorlatilag egy dologról beszélünk már működés tekintetében :wink:
annyit talán ami különbség, hogy az áramlás kapcsoló jelét arduinon belül akarom lekezelni, mint ahogy a hőfok problémát is és csak azon keresztül adni jelet vagy elvenni a cnc vezérléstől (pusztán csoportosítani a jeleket és az azokra adott válaszokat)
Avatar
SzLacus
Tranzisztorgyógyász
Hozzászólások: 175
Csatlakozott: 2012. május 20. vasárnap, 6:00

Re: segítség!!

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

Amit írtam, abban az arduino fogadja a startjelet, az arduino fogadja az áramlás jelet, és az arduino ad "mehet" jelet. Lehet, hogy nem voltam elég egyértelmű, de az arduino kezel mindent, és a hőfokot is az kezelheti, ha lesz hőmérő a körben. Csak ki kell találnod, hogy mit teszel a hőmérő jelével.
Én most azt látom megvalósíthatónak, hogy az áramlás megléte befolyásolja a működést, és egy víz hőmérővel ellenőrzöd a víz hőfokát. Ha az meghalad egy értéket, (kitalálod hogy mennyit) akkor ugyan úgy leállást készerítesz, mintha nem keringene a víz. Egy következő lépcsőben a leállási hőmérséklet alá kitalálsz egy "üzemi hűtővíz hőmérsékletet" és gondoskodsz róla egy hűtővel, hogy az meg is lehessen. Ennek is van több módja, az elterjedtnek azt nevezném, hogy van egy nagy hőszigetelt tartály tele van vízzel, és egy szabályzás gondoskodik róla hogy a tartályban a víz hideg legyen. A hűtendő rendszerek meg ebből vételezik az ismert hőmérsékletű vizet a hűtéshez.
A 20 fok környezeti hőmérsékletből nekem nem jön ki a 20 fokos csapágy hőkérséklet. Ha elkezdesz dolgozni, a csapágy melegedni fog, és annak a hőjét onnan 20 fokos hűtő közeggel elhordani, csak végtelen sebességgel, és 100%-os hőátadással lehet. Ahhoz, hogy 20 fokos maradjon, a csapágy 20 foknál hidegebb hűtőközegről kell gonoskodnod. Akkor teljesen megváltozik a hűtésed, mert akkor nem a hűtés megléte a működés kritériuma, hanem a csapágy 20 fokon tartása. Ez egy sokkal bonyolultabb és több változós feladvány. És nem nagyon látom megkerülhetőnek a csapágyhoz hőcsatolt hőérzékelőt. És ez egy szép nagy és bonyolult integráló differenciáló móka lesz. Szép feladat.
robroy007
Újonc
Újonc
Hozzászólások: 9
Csatlakozott: 2015. május 8. péntek, 19:43

Re: segítség!!

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

Hol találom az időzítő könyvtárat az arduinonál? Keresem de ezek szerint rossz helyen, hogy találják minta megoldást

Az if vagy for ciklus megoldás számlálóval tetszik és a jelenlegi tudásommal talán menni is fog :)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: segítség!!

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

Közvetlen a sültgalamb alatt...

Minta:
Meddig = millis()+1000

If (meddig < millis) {
Leketyegett az ido!
}
robroy007
Újonc
Újonc
Hozzászólások: 9
Csatlakozott: 2015. május 8. péntek, 19:43

Re: segítség!!

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

Köszönöm!!
Avatar
SzLacus
Tranzisztorgyógyász
Hozzászólások: 175
Csatlakozott: 2012. május 20. vasárnap, 6:00

Re: segítség!!

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

Akkor célszerű a számolgatós változatot megírnod. Már csak azért, mert annak minden lépését és összefüggését érteni fogod. Működésben semmivel nem lesz gyengébb, mintha a timer (ezt a könyvtárat keresed) használatával. Azt javaslom, hogy először készíts egy apró programot, amiben egy bemenetet figyelsz, (indítójel) és ha megvan, akkor egy if-ben egy változót (időzítés számláló) beállítasz mondjuk 50-re. Ha nincs meg (else) akkor csökkented a számlálót, és időzítesz 100 ms-t. Aztán a soros porton kiüzened, a számláló állását, és kezded újra a dolgot. Elindítasz egy soros monitort, és lesed az üzeneteket. Amit 50 kanyar után látsz, azon gondolkodsz egy kicsit és megoldod. Ezen a ponton eljutottál odáig, hogy az arduino fix ledjén (13 digit kimeneten) a vészleállás relét szimulálhatod. Addig világítson a led, amíg a számláló nem nulla, ha nullára csökkent a számlálód, akkor a led kapcsoljon ki. A cél az, hogy amikor a gombot megnyomod, akkor led bekapcs, soros porton minden alkalommal 50 jön. Amikor elengeded, akkor led tovább világít, soroson csökkenő számok jönnek nulláig, és a led elalszik. Aztán létesítesz egy másik bemenetet (áramlás). Ha idáig meg vagy, akkor folytatjuk azzal, hogy kitaláljuk mikor melyik függvényében mit kell csinálni. Lesz még egy késleltetésünk, ami a víz áramlás megjelenési ideje, és kb minden eszköz meglesz ahhoz, hogy alkalmas módon össze kominálva pont azt tegye amit elvársz tőle.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: segítség!!

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

Valami ilyesmi kód kell, ha számlálózni - időzíteni akarsz:
(az utasitasok megertesehez kell a Arduino Notebook illetve az arduino.cc oldalon a referenciatáblázat)

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

int szamlalo=0;
setup()
{
pinMode(13,output); //13-as lábon LED van
pinMode(12,input); //12. lab es GND kozt gomb
digitalWrite(12,HIGH); //12-es lab belso felhuzoellenallas felhuz 
}

loop() {
if (digitalRead(12) == LOW) {  //ha a 12-es labon a gomb nyomva (GND-re megy)
   szamlalo=millis()+1000;  //a szamlalo a millis ertek (azaz MOST)+ 1 secundum legyen
if (szamlalo>millis()) { //ha nem erte el a millis() msec szamlalo a bellitott idot  
  digitalWrite(13,HIGH); // a D13 LED vilagitson
} else { //kulonben
digitalWrite(13,LOW);  //D13 kikapcsolva
}
}
kukuri
Bitmanipulátor
Hozzászólások: 132
Csatlakozott: 2014. január 20. hétfő, 12:50

Re: segítség!!

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

Üdvözletem!

Összeraktam egy kis ketyerét.
Annyit kell róla tudni hogy relét működtet különböző paraméterek alapján.
Az adatokat folyamatosan küldöm egy szerverre hogy áttekinthetően lehessen figyelni bárhonnan.
Van egy relé amit 10 percenként kell bekapcsolni és adott idő után kikapcsolni.
Van a rendszerben egy RTC is hogy az idő jó legyen. Az utolsó bekapcsolást mindig EEPROMba mentem és ezt nézem vissza ellenőrzéskor.
A gondom a következő:
Szépen fut a kód és 1-1,5 óra eltetlével hibásan működik.
Az elmentett idő folyamatosan felülíródik az aktuális idővel. Így a feltétel sosem teljesül ahhoz hogy bekapcsoljon a relé.
Reset után megint megy egy ideig, utána elront valamit.

A netet mobilmodemről táplált routeren kapja.
Azt vettem észre hogy a hibás működés előtt kb 20sec ideig nincs kapcsolat a vezérlő és a szerver között. Tehát a kapcsolat sem tökéletes mobilon keresztül. Ezt már korábban is észrevettem, mert a szervertől kapott ~20-30 karakter hosszú üzenetet többször is hibásan kapta meg. Teljes karakter sorozat kiíráse előtt megszakadt a kapcsolat és indította az újracsatlakozást.

A kódnak azt a részét bemásolom ahol állítom az utolsó működés idejét, valamint hogy meddig legyen bekapcsolva a relé.

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

  timestamp=now.unixtime();
    // adagolás 1
    if(timestamp < (oxi_last+oxi_adag))
    {
      ssr_oxi=1;
      eeprom_ir=0;
    }
    else
    {
      ssr_oxi=0;
    }
    //Két adagolás közti várakozás
    if(timestamp > (oxi_last+oxi_ido))
    {
      ssr_oxi=0;
      oxi_last=timestamp;
      if(!eeprom_ir)
      {
        EEPROM.put( 13, oxi_last );
        eeprom_ir=1;
      }
    }
    // adagolás 2
    if(timestamp < (pely_last+pely_adag))
    {
      ssr_pely=1;
      eeprom_ir_pely=0;
    }
    else
    {
      ssr_pely=0;
    }
    //Két adagolás közti várakozás
    if(timestamp > (pely_last+pely_ido))
    {
      ssr_pely=0;
      pely_last=timestamp;
      if(!eeprom_ir_pely )
      {
        EEPROM.put( 21, pely_last );
        eeprom_ir_pely=1;
      }
    }
    if(pely_last>timestamp)
    {
      EEPROM.put( 21, timestamp );
    }
    if(oxi_last>timestamp)
    {
      EEPROM.put( 13, timestamp );
    }
// külön parancsal elindított adagolás
    if(parancs=="adagstart")
    {
      EEPROM.put( 13, timestamp );
      EEPROM.put( 21, timestamp );
    }

Egy kis magyarázat a változókról:
- oxi_adag az az idő ameddig bekapcsolva kell lenni folyamatosan
- oxi_last az utolsó bekapcsolás ideje
- oxi_ido az az idő amennyit várni kell két bekapcsolás között

Egyszerre 2 ilyen relét vezérlek.

Van valami ötlet mit nézzek meg?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: segítség!!

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

Ez csak kódrészlet.
Én soroson visszaírnálm az dőt, egyebeket Ill ha van SD, akkor logolás a főbb paramétereket (változóérték, idő stb).
A programod elején a időlekérés hogy megy? Én az RTC-ben tárolom az időt és onnnan veszem mindig, ha kell.

A hibás netkapcsolatot kezeld le, hogy ekkor a rendszered önállóan fusson. A kieső adatokat meg valahol időpecséttel gyűjtse. És ha van újra net, akkor pótolja a kiküldést.
kukuri
Bitmanipulátor
Hozzászólások: 132
Csatlakozott: 2014. január 20. hétfő, 12:50

Re: segítség!!

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

A teljes kódot nem biztos hogy be szeretném másolni, közel 1000 sor jelenleg.
Az időt RTC-ből veszem mindig és ahhoz hasonlítom.

Most összeraktam egy másik rendszert szenzorok nélkül. 2 napja fut hiba nélkül. Persze ez már nem mobilnet. Persze valószínűleg fel kellene ruházni ugyanolyan szenzorokkal.

Az a gyanum hogy ha nem találja meg időben a netkapcsolatot akkor szúrja el. A mentett adatokból azt láttam hogy akkor kezdte el rosszul menteni az időt amikor 20-30 s ig nem érkezett adat a rendszerből. 30s is eltelhet mire észreveszi hogy nincs internet kapcsolat. Ez idő alatt a program teljesen leáll. Nem biztonságosabb egy másik arduinoval kezelni az ethernetshieldet? A két arduino közt pedig kiépíteni egy buszt ahol adatot cserélnek. Így a főprogram folyamatosan futhat, nem zavarna bele a netes kapcsolat.Ebben az esetben persze kell egy memória a fő arduinora kötve, mert az ethernetshielden levő valószínűleg nehezen hozzáférhető a vezérlő arduino számára.
Bár az is lehet hogy túlbonyolítom.
kukuri
Bitmanipulátor
Hozzászólások: 132
Csatlakozott: 2014. január 20. hétfő, 12:50

Re: segítség!!

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

Üdvözlet!

Az arduino mekkora hőmérsékleten tud stabilan működni?
Összeraktam egy vezérlést, a szobában gond nélkül működik.
Beraktam egy dobozba és azóta gondok vannak vele. Utoljára beépítettem egy hőfokmérőt is. Ez szerint 41-42°C van a dobozban.
Ez mennyire sok? Lehet mondani rá hogy biztos ez a hiba? Vagy másfelé keresgessek. Van a dobozban egy ethernet shield is. Szerintem ez fűti a legjobban a dobozt. Elméletileg szellőztetéssel le tudom vinni a hőmérsékletet 30°C ra.
Most beteszek egy LCD-t hogy lássam hol akad el a program. Lehet a program nem is áll le csak az ethernet kapcsolatot rontja el.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: segítség!!

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

Zárt dobozban ez feljebb is megy. A 42-43 fok külső hőmérő? Az AVRnek bvan belső hőmérője is.
A SW és HW egyedi tervezésű? HW mit tud? Betáp? 7805 van utána? Nem az szabályoz vissza?
Az LCD kevés. Én RTC + IIC EEPROM-ot tennék és logolnám az eseményeket....
kukuri
Bitmanipulátor
Hozzászólások: 132
Csatlakozott: 2014. január 20. hétfő, 12:50

Re: segítség!!

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

Szia!
Saját rendszert építek.
A lényeg hogy a szenzorok alapján vezérli a rendszert reléken keresztül. A szenzorok adatain és kimeneti állapotokat folyamatosan küldi egy szervernek. Így egy saját honlapon felügyelhető és ellenőrizhető a rendszer működése.
Ami a dobozban van.
- Arduino mega
- Ethernet shield wiznet 5100 chippel
- RTC + EEPROM
- 12V tápegység 1,5A
- DC-DC konverter LM2596 Ezt 5V ra állítottam a szenzorok tápjának.
- DC-DC konverter LM2596s Ez ~7V ra van állítva amit a Mega magának leszabályoz.
- SSR 4 csatornás (OMRON)
- Relay 8 csatornás
- Arduino nano, Jelenleg ez reseteli a megát ha 1 percen belül nem kap jelet. A mega WD ja nincs bekapcsolva. Ezt már kísérlet képen tettem bele.
- DS18B20 szenzor belső ellenőrzésre. Van másik 4 még de ez dobozon kívül.
- 230V relé ami kapcsol egy 5V jelet. Ezzel érzékelve hogy bekapcsoltak egy 230V-os kört.

Külső szenzorok
- Szint érzékelő 5db
- DS18B20 4db
- DHT22 1db

Elsősorban ebay beszerzésből vannak a cuccok. De nem hinném hogy ez befolyásoló tényező lenne.
Az AVR belső hőmérője hogy érhető el?

Most lett egy kis hűtőbordám, kb 15x15mm-es. Ezt ráragasztom az AVRre. Hátha segít valamit. Bár a W5100 szerintem jobban melegszik, lehet az vágja haza az egészet.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: segítség!!

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

AVR belső hőmérő:

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

// Internal Temperature Sensor
// Example sketch for ATmega328 types.
//
// April 2012, Arduino 1.0

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

  Serial.println(F("Internal Temperature Sensor"));
}

void loop()
{
  // Show the temperature in degrees Celcius.
  Serial.println(GetTemp(),1);
  delay(1000);
}

double GetTemp(void)
{
  unsigned int wADC;
  double t;

  // The internal temperature has to be used
  // with the internal reference of 1.1V.
  // Channel 8 can not be selected with
  // the analogRead function yet.

  // Set the internal reference and mux.
  ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3));
  ADCSRA |= _BV(ADEN);  // enable the ADC

  delay(20);            // wait for voltages to become stable.

  ADCSRA |= _BV(ADSC);  // Start the ADC

  // Detect end-of-conversion
  while (bit_is_set(ADCSRA,ADSC));

  // Reading register "ADCW" takes care of how to read ADCL and ADCH.
  wADC = ADCW;

  // The offset of 324.31 could be wrong. It is just an indication.
  t = (wADC - 324.31 ) / 1.22;

  // The returned temperature is in degrees Celcius.
  return (t);
}
A hűtőbordával nem érsz semmit...
A dobozt kellene hűteni és a hibázást ennek megfelelően lekezelni....

Fémdobozt nem lehetne használni? Pl. Rittal dobozt?
A tápszűrések rendben (DC-DC táp mennyire zajongja a környéket? Árnyékolás?)?
Bemenetek védelmei?
Relék visszarúgásai rendben?
kukuri
Bitmanipulátor
Hozzászólások: 132
Csatlakozott: 2014. január 20. hétfő, 12:50

Re: segítség!!

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

Találtam egy leírást miszerint a megában nincs ilyen hőmérő :(
AVR chips that have an internal temperature sensor:

ATmega8 : No
ATmega8L : No
ATmega8A : No
ATmega168 : No
ATmega168A : Yes
ATmega168P : Yes
ATmega328 : Yes
ATmega328P : Yes
ATmega1280 (Arduino Mega) : No
ATmega2560 (Arduino Mega 2560) : No
ATmega32U4 (Arduino Leonardo) : Yes


Később biztosan áttérek fém dobozra. Bár lehet ezt is átszerelem.
Azt gondoltam hogy csak a hűtőborda nem segít mert attól a hő még benne marad a dobozban. Viszont a prociról le tudnám vele vezetni a hőt és utána kiszellőztetni a dobozt.
A táp egy fekete téglában szerelt LED tápegység.
DC-DC táp szabadon van, nincs árnyékolva. A szerelt kis panel csak be van forrasztva a nyákra.
Bemenetek jelenleg nincsenek védve. Ide optocsatolókat akarok rakni.
Relé visszarúgást nem tudom. Ezek is szerelt lapok.
Pár link az alkatrészekről:
http://www.ebay.com/itm/361275268360
http://www.ebay.com/itm/261914591759
http://www.ebay.com/itm/181409861491
http://www.ebay.com/itm/131453825042
http://www.ebay.com/itm/351248208122
http://www.ebay.com/itm/111665076485
Lezárt