Én is szoftveres gondra gondoltam, mivel régebben ment.
Azóta szórakoztam DS1307-es RTC-vel és már ott csodálkoztam hogy a többféle demo program más-más időt és dátumot lát ugyanazon RTC-ből.
Azóta van egy SD shield is, amin van RTC és csak azt használom. Gyönyörűen tudom naplózni a mért hőmérsékletet az SD kártyára, és 4bites módban az LCD-re kiírni.
A vége az lesz, hogy fogok egy régi gépet XP-vel és ott is kipróbálom.
Az i2c címet mivel állítottad át? Vissza kellene vinni a gyári beállításra.
Meg ahogy nézem, a végén van egy jumper, felteszem, hogy a háttérvilágítás ki/bekapcsolására szolgál.
A gond szerintem szoftveres, és vagy valamelyik könyvtárral vagy az i2c címzésével (szürreális, esetleg időzítésével) lehet galiba.
Írj egy sketch-t, ami ki/be kapcsolgatja a háttérvilágítást.
Aztán ahogy a könyvtár belsejét elnéztem, van parancs a kijelző ki/be kapcsolgatására [ lcd.displayon() talán, de meg kell nézni], azzal is lehetne tenni egy próbát.
Az 5-ös lábon mértem a feszültséget. Bocs a kép minőségért.
- a ledPin-t átírtam
- Wire.h és LiquidCrystal_I2C.h újra telepítve
semmi változás
- Ha nem a 0x27 -es cím van beállítva, akkor a kijelző háttérvilágítása megy, más nem történik.
- átnéztem a wire.h és LiquidCrystal_I2C.h-t de nem találtam benne fix címzést
- a másik kontrollerrel és egy másik kijelzővel is ezt csinálja.
- A film arról van amit csinál a kijelző. Látni rajta, hogy a D13-as LED ki-be kapcsólgat 3 mp-ként, és villan a kijelző.
- ha kiveszem a wire.h-t, akkor hibaüzenet jön az ellenőrzés közben:
C:ArduinosajatlibrariesLiquidCrystal_I2CLiquidCrystal_I2C.cpp: In member function 'void LiquidCrystal_I2C::init_priv()': C:ArduinosajatlibrariesLiquidCrystal_I2CLiquidCrystal_I2C.cpp:42: error: 'Wire' was not declared in this scope C:ArduinosajatlibrariesLiquidCrystal_I2CLiquidCrystal_I2C.cpp: In member function 'void LiquidCrystal_I2C::expanderWrite(uint8_t)': C:ArduinosajatlibrariesLiquidCrystal_I2CLiquidCrystal_I2C.cpp:242: error: 'Wire' was not declared in this scope
Technikai értelemben ennek elvileg semmi köze a jelenséghez.
Javaslataim.
1. Szedd le és tedd fel újra a wire.h-t és a liquidcrystal_i2c.h-t.
2. Játszd végig az összes i2c címzést, amit a kontroller megenged.
3. Nézz bele a wire.h-ba és az liquidcrystal_i2c.h-ba, hogy ott nincs-e hívás az adott i2c címre (nem kell-e átírni abban). Elvileg ezt a liquidcrystal_i2c.h a sketch eleji meghívással elintézi, de láttam már karon varjút (teapot sketch mpu6050 teszteléshez) -- sajnos ennek a könyvtárnak is botrányos (pontosabban nincs) dokumentációja.
4. Ha megvan a másik kontroller, azzal is csinálj egy tesztet.
A filmen csak az látszik, hogy az 5-ös lábat ki/be kapcsolja, aminek -- legalábbis elvben -- semmi létjogosultsága nincs, tekintetbe véve, hogy csak egy lcd.clear(); van.
Öööööööö.... Csinálj egy olyat, hogy az include wire.h-t kiszeded //-rel, aztán csinálj egy próbafordítást (verify).
A kontraszt állítgatására elmászik a kijelző színe (átfordul negatívba is akár)?
Megnéztem, az egyszerűbb bekötésnél az 1--5 lábak között rövidzár van, az 5. láb az R/W, ami "high" állásban olvasást jelent, tehát ott a 4,77 V azt jelenti, hogy az LCD-t olvasod, nem írod. Ami ugye nem jó ("low" kellene lennie, valahol 0,5 V-ig maximum.
Nézd meg, hogy „élő” rendszernél mit művel ugyanez a láb. Ha átmegy 0,5 V alá, akkor korrekt.
Az már önmagában nekem kicsit fura.
A 15--16 4,78 V-ja korrekt, elvileg +5V-ig mehet, de ezt a kijelző specifikációja pontosan tartalmazza.
A potméterrrel tudom szabályozni a kontrasztot. Egy PCF8574 van a kártyán egy SMD tranzisztor, egy SMD LED és néhány olyan SMD amit nem ismerek fel (ellenállás és kondi). Ja és a 3 címzőpont és a potméter.
Nincs fordítva rakva, egy 400 pontos próbapanelba ültettem be.
A kontroller LCD nélkül és csak táppal:
1-2 = 4.78
1-5 = 4.77 !!!!!
15-16 = 4.78
Feszültség és vezeték mentesen az 1-5 láb egyik irányba 798 Ohm-ot mutat, a másik irányba 105K.
Ami érdekes, hogy az első kontrollert használtam novemberben, a másik a héten jött új.
Először is tekergesd körbe a potmétert mindkét végállásig úgy, hogy csak táppal van meghajtva az egész hóbelevanc.
A háttérvilágításnak (elvben) működnie kell, mindentől függetlenül (bár nem tudom, hogy maga a kontroller hogy van vezetékelve, az ebay linken erről semmi sincs).
Ellenőrizni kell, hogy nincs-e fordítva az LCD (valószerűtlen, mert eldurranna azonnal a háttérvilágítás LED-je).
Az LCD-n bekapcsoláskor láthatóan meg kell változnia a kontrasztnak (lcd előfeszítés), ezt látnod kell.
SDA--SDA, SCL--SCL bekötést én folyamatosan összekeverem (megfordítom), ezt is nézd meg esetleg.
Aztán érdemes végigmérni a kulcspontokat. Csak a kontrolleren (LCD nélkül) 1--5 láb (rövidzár), 1--2 láb (+5V), 15--16 láb (2,0--3,3 V, ez a háttérvilágítás LED-je).
Betöltőttem a demokból a Hello world-öt, kiegészítettem egy kicsit. Így már látom hogy az UNO működik, a D13-on a LED ki-be kapcsolgat, a kijelző egy-egy villanást csinál (háátérvilágítás), mást nem.
prg:
#include <Wire.h> #include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x20 for a 16 chars and 2 line display
void setup() { pinMode(13,OUTPUT); lcd.init(); // initialize the lcd
// Print a message to the LCD. lcd.backlight(); lcd.print("Hello, world!"); delay(1000); }
Kábelezést ellenőriztem, a tápnak elégnek kell lennie, hiszen csak az LCD van rajta. (Egy másik kiépítésben van rajta SD shield, RTC, DS18B20 hőmérő + 4bites módban az LCD és tökéletesen megy.
Ha a kijelző vezetékelése simán megy, akkor jó eséllyel három helyen lehet galiba:
-- kábelezés (különösen táp, beleértve a terhelhetőséget)
-- i2c címzés
-- i2c kábelezés (sajnos ez sem mindig magától értetődő, az arduino.cc-n is van/volt fent pár ökörség).
Aztán érdemes megnézni, hogy a sketchben valami nem kavar-e be a lábaknál. Ezt ki lehet küszöbölni, ha a library mellé rakott mintákkal teszel egy próbát.
Arduino 1.0.5, UNO panel, I2C LCD panel és egy 1602 LCD
Az LiquidCrystal_I2C -t próbálom beüzemelni. Címét le tudom kérdezni, de e legegyszerűbb kiírás eredménye is csak egy felvillanás a kijelzőn, és méla sötétség.
Ez valamikor működött, de felraktam egy LCD_keypad shield-et és azzal játszottam egy darabig. Most szeretnék visszatérni az I2C-hez, mert a keypad ütközik az SD kártya kezeléssel (D10 PIN). Normál LCD kezelés 4bit-es módban megy, csak sok kemenetet foglal.
Már szereztem egy új LCD-t és egy új I2C LCD vezérlőt, de nem ezekkel van a baj.
A LiquidCrystal_I2C library-t már lecseréltem, de ez sem segített.
Várom az ötleteket, mert 2 napja csak keringek körbe-körbe.
Sziasztok, új fórumozó vagyok. Segítségre lenne szükségem a következőhöz: építettem egy mozgó szimulátor prototípust két motorral. Egy ismerősöm készíti a vezérlést Arduinoval. Sajnos sokszor nem ér rá, így nem haladunk a dologgal, nekem pedig nagyon sürgős lenne. Megcsinálta elméletileg teljesen, minden úgy működik, ahogy kell, de a motorok mozgása nem egyenletes, hanem szakaszos. Szükségem lenne valakire, aki bele tudna nézni, vagy meg tudná oldani sos-ben a problémát. Természetesen kifizetem a munkáját. Ha valakinek szakmai kérdése lenne, megpróbálok rá válaszolni, de laikus vagyok a témában, én csak a gépet találtam ki és szeretném már használni.
Igen, ez az aktuális tipp, de még nem ástam bele magam. Az lesz, hogy aki vállalja, feléleszti, aztán majd megalkuszom vele valami épeszű ellenszolgáltatásban.
Hát, ha a bootloader felment, de mégse megy az egész, akkor lehet ott nagyobb a baj. De nem biztos, hogy a PROGMEM túlszaladása okozta, az maximum a flash tárat írhatja felül. Esetleg a fuse-ok elállítódtak? (Vagy rossz modellt választottál? Én szívtam egy kicsit, amíg rájöttem, hogy az atmega168 és atmega328-nak nem ugyanaz a fuse kiosztása)
Csinálj pár futás-tesztet így is, úgy is, mert nincs kizárva, hogy kb. egy idő a számolás és a progmem kezelése. Arra figyelj, hogy a progmem ne verje ki a memóriát, mert nálam egy kártyán már felülírta a bootloadert, úgyhogy most papírnehezék a kártya.
Nem túl nagy még, majd megnézem. De használnék Progmem-ben tárolt tömböt AD gyorsításhoz, hogy ne kelljen számolgatni annyit. Ahhoz jó lenne ha külön fájlban tudnám letárolni az 1024-es tömböt.
Azért kérdem, mert nekem az eddigi legnagyobb (amiben nincs PROGMEM) 11,8 kB c++, 8,7 kB lefordítva és simán át lehet látni.
Én nem vagdosnám szét, hanem hagynám egyben az egészet és belső hívásokat [void (...) ] csinálnék a különböző feladatokra. Így kevés globális változóval meg lehet oldani a kérdést. Az egyes al-rutinokban meg annyi változót deklarálsz, amennyit akarsz (illetve ami a memóriában elfér). Ráadásul így áttekinthető(bb) is lesz az egész program.
Másfelől. Ez (lehet) az a tipikus eset, amikor egyszerűbb egy új könyvtárat (library) létrehozni. Persze ez programozásilag számottevően bonyolultabb, illetve más feladat.
Több fájlra szeretném szétosztani az ArDuino-s projektemet, hogy jobban olvasható, logikusabban rendezhető legyen. Ha létrehozok egy újabb fájlt az ArDuino IDE-vel, és abban megírom a függvényeket, akkor azokat elérem a főprogramban. Viszont ha ezekben a fájlokban deklarálnék globális változót, azt nem látja a főprogram.
Amelyik projektből kiindultam, ott ez a módszer működött (több fájlra szétbontva, és a logikailak oda tartozó globális változók az adott fájlban voltak deklarálva, és a főprogram is meghívta őket), és az ArDuino.cc-n sem találtam még instrukciót, mit kéne még csinálnom, hogy jó legyen. Extern-ként meg kéne hivatkozni? Az IDE 1.0.5-ös verzióját használom Windows 8-on.
A library-k jelentős részének nem nagyon van részletes leírása. Ami akad, az vagy az arduino.cc fórumában van, vagy a GitHub-on.
A LiquidCrystal könyvtárban a print és a write között annyi a differencia, hogy a write a zárójelbe írt éréték (vagy a zárójelbe írt változó tartalmának megfelelő) ascii kódú karaktert jeleníti meg (csak azt), míg a print-tel gyakorlatilag bármit kiírhatsz ('a' egy karaktert, "asdf" több karaktert ír ki, míg a változó kiírható magában is (direktben), vagy különböző módokon kódolva (dec, hex, oct, bin).
Változó konverzióra sok mód van, de egyik sem egyszerű. Programozási szempontból az az elsődleges, hogy a célnak megfelelő minimálisan szükséges (vagyis a lehető legkevesebb szabad memóriát lekötő) változó legyen az adott célra deklarálva.
Még arra sem igazán jöttem rá, hogy mi a különbség az lcd.print() és az lcd.write() között.
Nem igazán tudom feldolgozni azt, hogy van egy library (mondjuk az RTC-hez), és nem találok hozzá megfelelően alacson szintű leírást (mármint az én szintemnek megfelelőt).
Sajnos csak itt tudok kérdezgetni, ha már elvesztettem a türelmemet.