Fórum témák

» Több friss téma
Fórum » Arduino
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Lapozás: OK   349 / 349
(#) game4812 hozzászólása Hé, 16:14 /
 
Sziasztok! Akadt egy problémám, amire biztos van egyszerű magyarázat, csak én nem jövök rá. Adott egy akvárium vezérlő, ami szeretném, ha megjegyezné, hogy mennyi időt világítottak a fénycsövek, és beállítani egy adott értéket, ahol jelez, hogy ideje cserélni. Arra gondoltam, hogy csak egyszerűen 6 percenként hozzáadok 0,1 órát egy számlálóhoz, ha az arduino adott kimenete aktív, és ezt eltárolom az EEPROM-ban. Tudom, float helyett lehetne unsigned long, stb., stb., de nem ez a fő baj vele, hanem hogy a kiemelt rész működik. De csak magában. Minden nap 10 órakor (ekkor kapcsolnak a csövek) elkezdi hozzáadni a 0.1-eket, de egyszer gondol egyet, és abbahagyja. Van, hogy 3 óra után, van, hogy csak 0.2-t ad hozzá, pedig 9 óra a világítás naponta. Ha újraindítom, akkor számol tovább.

A véletlenszerűség miatt arra gondolok, hogy nem a kódban van a hiba, hanem valami zaj lehet, de 4 dolog van relén, a szűrő csak este van kikapcsolva pár percre, CO2 még a fények előtt kapcsol, a fűtés nem kapcsol be legtöbbször, ha megy a fénycső, mert az is melegít, tehát az sem igazán lehet, plusz a fénycsövek. De ez a zavar nem annyira lehet az oka, mert az arduino nem fagy le, csinálja a dolgát, ha éppen akkor kapna egy zavart, amikor leolvas, akkor annak a +0.1 hozzáadásnak kellene maximum eltűnnie, nem? Hol keressem a hibát?

  1. #include <EEPROMex.h>
  2. byte eepneon1 = 0;                //eeprom címzés
  3. float neon1oh = 0;                 //ebben tárolja az eltelt időt
  4. float eepintervalhour = 0.1;       //6 percenként ennyit ad hozzá
  5. unsigned long previousMillistube = 0;
  6. unsigned long eepinterval1 = 360000//6 perc
  7. byte lastneonv;                   //a kimenet 6 perce high vagy low volt
  8. byte neonv;                       //a kimenet most high vagy low
  9. void setup()
  10. {
  11.   Serial.begin (9600);
  12. }
  13.  
  14. void loop()
  15. {
  16.   neonv = digitalRead (8);
  17.   if (neonv != lastneonv && neonv == HIGH)
  18.   {
  19.     lastneonv = neonv;
  20.   }
  21.   if (neonv != lastneonv && neonv == LOW)
  22.   {
  23.     lastneonv = neonv;
  24.     previousMillistube = millis();
  25.   }
  26.   if (neonv == LOW && (millis() - previousMillistube >= eepinterval1))
  27.   {
  28.     previousMillistube = millis();
  29.     neon1oh = (neon1oh + eepintervalhour); EEPROM.updateFloat(eepneon1, neon1oh);
  30.   }
  31.   Serial.println(neon1oh);
  32.   Serial.println(EEPROM.readFloat (eepneon1));
  33.   delay (1000);
  34. }


IRF540 nem logic level, tudom.
(#) atus1981 válasza game4812 hozzászólására (») Hé, 16:19 /
 
Az UNO-t tápláld meg aksiról vagy elemről és rögtön meglátod, hogy a hálózati zaj-e a baj.
(#) Gabó válasza game4812 hozzászólására (») Hé, 16:20 /
 
Relé modult, honnan táplálod? Lcd-t megint honnan? Az egyéb apróságok tápja? Remélem nem az uno 5Vos kimenetéről.
A hozzászólás módosítva: Hé, 16:20
(#) game4812 válasza Gabó hozzászólására (») Hé, 16:39 /
 
Így nézett ki bekötés előtt, a táp 12V 5A kapcsolóüzem, pumpák és LED szalag erről közvetlenül, az UNO a saját feszstabján keresztül, relék, DS3231, 1602LCD egy 7805ről, kivéve a háttérvilágítása, az az UNO-n PWM-ezve van, de 50/255 a kitöltése. LED szalag a fénycsövek bekapcsolása előtt dimmelve 0-255-ig, majd 100-ra állítva, amikor bekapcsolnak a csövek.

Amint bekapcsoltak a fények, az energiafogyasztás gyakorlatilag konstans, amíg hozzá nem nyúlok a kijelzőhöz, vagy etetéshez kikapcsolom a szűrőt, de ez este történik. Ami furcsa, hogy minden esetben elkezd számolni. (Tehát ha előző éjszaka újraindítom, reggel 10-ig lenne ideje összeszedni zavart, mivel a LED szalag, dózispumpák, fűtés ilyenkor működik, és megtehetné, hogy nem kezd el számolni. De számol, csak megáll a számlálás, és Arduino megy tovább vidáman.
A hozzászólás módosítva: Hé, 16:44
(#) Gabó válasza game4812 hozzászólására (») Hé, 16:48 /
 
Akkor ahogy sejtettem. Nekem a megoldás az lett, hogy az UNO (nálam mega van) 5Vos kimeneti tápja kb az RTCnek meg (ETH Shieldnek) ad csak tápot. Ill a relés blokk optocsatolónak ad még 5Vot. A többi (LCD, szenzorok, relé modul relé tekercs része stb), egy külön DC-DC konverterrel van leválasztva.
(#) KoblogPerGyok válasza game4812 hozzászólására (») Hé, 17:02 /
 
Szia!

Sajnos nem látom a teljes kódod, de néhány észrevétel, ha ezeket tudtad már akkor bocsánat!

1:
Ha float típust növelsz egésszel valahol, akkor az egész után tegyél egy nullát, természetesen a tizedespont után.

float x;
x+=1; //Nem minden esetben lesz jó, ez helyett:

x+=1.0; //Így tuti nem csordul túl.


2:
If szerkezetekben is, ha egy float típust hasonlítasz össze egy általad a kódban megadott egésszel, akkor is ezt a trükköt kell használni:

float x;

If (x>1) //nem minden esetben jó.

Inkább:
If (x>1.0)


3:
float neon1oh = 0.0;   

4:
Az EEPROM mennyi írást bír el? Ha 1000 akkor 100óra. 10000 akkor több, de ez gondolom csak az adott címen található szektorra vonatkozik, de sejtésem szerint mindig ugyanoda/ugyan azokra a byte-okra írod az eredményt. Lehet nem így van, mert ezt megoldottad, akkor bocsánat!

5:
EEPROM.updateFloat után nem kell delay(5)? Ez az EEPROM-tól függ, de nem árt neki.
(#) game4812 válasza KoblogPerGyok hozzászólására (») Hé, 17:31 /
 
Gabó, atus1981:
Húzzam ki az LCD háttérvilágítást, és annyi? Csak az megy róla gyakorlatilag, ami áramot is fogyaszt. kipróbálom majd egy 9V-os elemről is, hátha, csak azt reméltem, van valami kézzel fogható oka, például, hogy az EEPROM-mal foglalkozó rész érzékenyebb a zavarokra, mivel a program amúgy tökéletesen fut, volt már 80 napos egybefüggő működésem is, és akkor is frissítettem, azért indult újra.

A float-tal kapcsolatos dolgot nem tudtam, ezt átírom, teszek oda delayt is. Programozással foglalkozni ennél a projektnél kezdtem el, tehát sokat kell még tanulnom. Az EEPROM címének váltásra vannak libraryk, de nem foglalkoztam vele, mert a gyártó szerint 100 000 írási ciklust bír, de itt 1 milliónál is többet bírt a gyakorlatban. A garantálttal számolva, kb. 3 évet bírna. A csövet 1-1,5 évente cserélni kell, mert a spektruma eltolódik, fényereje csökken, és az a terv, hogy mivel ilyenkor számítógépről nulláznom kellene az értékeket, ilyenkor a címzést is megváltoztatom.
A hozzászólás módosítva: Hé, 17:31
(#) Electricboy hozzászólása Hé, 18:26 /
 
Sziasztok!
Vettem egy 128x64es oled kijelzőt rá küldtem a libaryből a teszt programot és azt írta hogy hibás a magasság méret, kíváncsiságból ki próbáltam a 128x32 libet is azzal jó volt elsőre lefutottak az animációk. Mutatok pár képet, létezik hogy ez tényleg 32 pixel magas, ilyen kialakításból még nem láttam ebben a magasságban? Valami ilyet kellett volna kapnom, de az én képemen látni hogy csak a fele van meg. Én vagyok béna vagy átcseszett a kiccikinai?
(#) sirály12 válasza Electricboy hozzászólására (») Hé, 18:30 /
 
Olyan mintha minden második sor hiányozna. Biztosan hozzávaló libet használsz? Minden beállítás jó?
(#) Electricboy válasza sirály12 hozzászólására (») Hé, 18:39 /
 
Ebayen ezt írta: 0.96" I2C IIC SPI Serial 128X64 OLED LCD Display SSD1306 for 51 STM32 Arduino
Nem sok lib van erre, de ott van a hiba képen adafruit ssd1306 tehát gondolom jó a header. Nem módosítottam semmi beállítást, az első képen gyakorlatilag a sample file egy az egyben fut. Nekem is úgy tűnik mintha minden 2. kimaradna, kvázi szét nyújtja.
(#) Gabó válasza game4812 hozzászólására (») Hé, 18:40 /
 
Reléid tekercse honnan kapja a tápot? Unoról? Mert az nem jó.
Ami az uno 5Vjáról menjen, az legyen minél kevesebb. Max ami nagyon keveset fogyaszt.
(#) game4812 válasza Gabó hozzászólására (») Hé, 18:45 /
 
L7805-ről.
(#) TavIR-AVR válasza Electricboy hozzászólására (») Hé, 18:48 /
 
Létezik SH1306 illetve SSD1306 chippel is.
Valamint tényleg létezik 32 soros is (keskenyebb/alacsonyabb) kijelző.

reklamálj, hogy nem megy az ajánlott LIB-bel ill. a képet is csatold neki... Adjon javaslatot.

DE a SSD1306.h-ban is állítsd be a felbontást! Többféléhez is jó a lib! Alapban 128x128-asra van állítva!
(#) icserny válasza Electricboy hozzászólására (») Hé, 18:59 /
 
"de ott van a hiba képen adafruit ssd1306 tehát gondolom jó a header."
Az a "hiba" nem a kijelző hibája, hanem valamit rosszul konfiguráltál be (nem a te kijelződhöz van beállítva a program).

Konkrétan az SSD1306_LCDHEIGHT értéke nem 64, pedig a program azt szeretné, ha 64-re lenne állítva...
(#) david10 válasza KoblogPerGyok hozzászólására (») Hé, 21:08 /
 
Köszönöm a válaszodat!
Szerintem ameddig egy 24C64-es eepromból nem tudok kiolvasni egy bájtot a digitalWrite és digitalRead parancsokkal, addig nincsen amit csináljak a kriptó memóriával.
Találtam ezt a leírást, ez szerint megfogok probálni kiolvasni bájtokat 24C64-es eepromból.
Következő: »»   349 / 349
Bejelentkezés

Belépés

Hirdetés
Frissek
2017. Máj, 23. Kedd
5:15:34
Jelenleg 82 fő olvassa az oldalt
Online tagok:
Lapoda.hu     XDT.hu     HEStore.hu