Arduino pomoc
Zběžně jsem se na tu knihovnu díval, je to předpokládám to http://www.xs4all.nl/~hmario/arduino/Li ... al_I2C.zip" onclick="window.open(this.href);return false; .
Tady se pin R/W nepoužívá, takže ho můžeš na displeji klidně uzemnit a ušetřený pin používat pro Enable2.
Pokud nebudeš používat kurzor, tak se to výrazně zjednoduší.
Pokud bys kurzor používal, tak budeš muset udržovat informaci jestli je kurzor zobrazený, na kterém z displejů je zobrazený a při přechodech mezi nimi bys ho musel přepínat. V tomto případě by to bylo víc práce.
Pokud nebudeš používat kurzor a nějaké to různé podivné rolování textu (podle mě v praxi absolutně nevyužitelné), tak by mělo stačit upravit snad jen rutiny "setCursor" a pak nejnižší funkci "pulseEnable", kde podle čísla řádku budeš aktivovat Enable1 nebo Enable2.
Příkazy asi můžeš posílat současně na oba displeje, takže tady můžeš vždy aktivovat Enable1 i Enable2.
Nějak takhle:
V LiquidCrystal_I2C.h si pak přidej definici:
Nemám to jak vyzkoušet, takže je to jen teoretický nástřel.
Možná se to bude muset ještě někde přiohnout, ale rozhodně to realizovatelné je.
Tady se pin R/W nepoužívá, takže ho můžeš na displeji klidně uzemnit a ušetřený pin používat pro Enable2.
Pokud nebudeš používat kurzor, tak se to výrazně zjednoduší.
Pokud bys kurzor používal, tak budeš muset udržovat informaci jestli je kurzor zobrazený, na kterém z displejů je zobrazený a při přechodech mezi nimi bys ho musel přepínat. V tomto případě by to bylo víc práce.
Pokud nebudeš používat kurzor a nějaké to různé podivné rolování textu (podle mě v praxi absolutně nevyužitelné), tak by mělo stačit upravit snad jen rutiny "setCursor" a pak nejnižší funkci "pulseEnable", kde podle čísla řádku budeš aktivovat Enable1 nebo Enable2.
Příkazy asi můžeš posílat současně na oba displeje, takže tady můžeš vždy aktivovat Enable1 i Enable2.
Nějak takhle:
Kód: Vybrat vše
void LiquidCrystal_I2C::setCursor(uint8_t col, uint8_t row){
int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 };
if ( row > _numlines ) {
row = _numlines-1; // we count rows starting w/0
}
command(LCD_SETDDRAMADDR | (col + row_offsets[row % 2]));
}
void LiquidCrystal_I2C::pulseEnable(uint8_t _data){
uint8_t enable_x;
if (_data & Rs) {
if (row < 2) {
enable_x = En;
} else {
enable_x = En2;
}
} else {
enable_x = En | En2;
}
expanderWrite(_data | enable_x); // En high
delayMicroseconds(1); // enable pulse must be >450ns
expanderWrite(_data & ~enable_x); // En low
delayMicroseconds(50); // commands need > 37us to settle
}
Kód: Vybrat vše
#define En2 B00100000 // Enable2 bit
Možná se to bude muset ještě někde přiohnout, ale rozhodně to realizovatelné je.
to je dobrej nápad...Mex píše:Pokud nechceš obětovat to řízení podsvícení, tak klidně odpoj signál R/W a použij ho pro to druhé Enable.
Signál R/W se často nezapojuje, protože číst data z LCD je celkem k ničemu, a bez BUSY flagu dá taky snadno obejít.
z LCD se nečte, taky k čemu, když ho ovládáš...
další volný signál...
se přiznám, že jsem podsvícení LCD vyřešil prasácky "samo domo"...
zbyl mi jeden volnej pin, a protože stejně volám v cyklu klávesnici, tak "nábojová pumpa", kde při každé stisknuté klávese pošlu impuls... tranzistor nabije kondík, a pak je to jen otázkou dalšího C-MOS, co drží podsvícení (jasně že je to prasárna, ale funkční...)
Tak jsem upravyl knihovny , jak jsi poslal , ale vyhazuje hlášku : error: 'row' was not declared in this scopeMex píše:Zběžně jsem se na tu knihovnu díval, je to předpokládám to http://www.xs4all.nl/~hmario/arduino/Li ... al_I2C.zip" onclick="window.open(this.href);return false; .
Tady se pin R/W nepoužívá, takže ho můžeš na displeji klidně uzemnit a ušetřený pin používat pro Enable2.
Pokud nebudeš používat kurzor, tak se to výrazně zjednoduší.
Pokud bys kurzor používal, tak budeš muset udržovat informaci jestli je kurzor zobrazený, na kterém z displejů je zobrazený a při přechodech mezi nimi bys ho musel přepínat. V tomto případě by to bylo víc práce.
Pokud nebudeš používat kurzor a nějaké to různé podivné rolování textu (podle mě v praxi absolutně nevyužitelné), tak by mělo stačit upravit snad jen rutiny "setCursor" a pak nejnižší funkci "pulseEnable", kde podle čísla řádku budeš aktivovat Enable1 nebo Enable2.
Příkazy asi můžeš posílat současně na oba displeje, takže tady můžeš vždy aktivovat Enable1 i Enable2.
Nějak takhle:V LiquidCrystal_I2C.h si pak přidej definici:Kód: Vybrat vše
void LiquidCrystal_I2C::setCursor(uint8_t col, uint8_t row){ int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 }; if ( row > _numlines ) { row = _numlines-1; // we count rows starting w/0 } command(LCD_SETDDRAMADDR | (col + row_offsets[row % 2])); } void LiquidCrystal_I2C::pulseEnable(uint8_t _data){ uint8_t enable_x; if (_data & Rs) { if (row < 2) { enable_x = En; } else { enable_x = En2; } } else { enable_x = En | En2; } expanderWrite(_data | enable_x); // En high delayMicroseconds(1); // enable pulse must be >450ns expanderWrite(_data & ~enable_x); // En low delayMicroseconds(50); // commands need > 37us to settle }
Nemám to jak vyzkoušet, takže je to jen teoretický nástřel.Kód: Vybrat vše
#define En2 B00100000 // Enable2 bit
Možná se to bude muset ještě někde přiohnout, ale rozhodně to realizovatelné je.
jak jej mám nadefinovat ?
Dík
Packa
Jsem na cestách, tak mám internet jenom na mobilu. Takže jenom stručně.
Máš pravdu, on si tam nepamatuje adresu řádku. Takže do *.h do definice třídy budeš muset doplnit něco jako "uint8_t _row;".
V proceduře setCursor do ní uložíš adresu řádku (na konci přidej "_row = row;"). V proceduře home pak bude "_row = 0;".
No a v té proceduře write místo "row" použiješ "_row".
Pokud bys dělal nějaké víceřádkové výpisy, tak bys ještě musel i v té proceduře write testovat přechod na nový řádek a tedy případně i na druhý displej. Ale to asi nebude nutné, víceřádkový výpis na takhle malý displej se většinou nepoužívá. Zvlášť proto, že pak by to bylo navrdo zamčené pro displej téhle konkrétní velikosti.
Máš pravdu, on si tam nepamatuje adresu řádku. Takže do *.h do definice třídy budeš muset doplnit něco jako "uint8_t _row;".
V proceduře setCursor do ní uložíš adresu řádku (na konci přidej "_row = row;"). V proceduře home pak bude "_row = 0;".
No a v té proceduře write místo "row" použiješ "_row".
Pokud bys dělal nějaké víceřádkové výpisy, tak bys ještě musel i v té proceduře write testovat přechod na nový řádek a tedy případně i na druhý displej. Ale to asi nebude nutné, víceřádkový výpis na takhle malý displej se většinou nepoužívá. Zvlášť proto, že pak by to bylo navrdo zamčené pro displej téhle konkrétní velikosti.
Mex u tebe má "jedno významné plus"...
Já ti nepomohl, protože mimo web, a Mex byl rychlejší.
sakra, nechci bejt na MEX-íka jedovatej, ale dělá on něco jiného, než že sedí za klábosnicí?
To: Mex
dobrej vodstřel "z debila"
njn, velký potlesk.
p.s.
taky už by mohl "Sám Náš Nejvyžší" přidat tuhle ikonku
Já ti nepomohl, protože mimo web, a Mex byl rychlejší.
sakra, nechci bejt na MEX-íka jedovatej, ale dělá on něco jiného, než že sedí za klábosnicí?
To: Mex
dobrej vodstřel "z debila"
njn, velký potlesk.
p.s.
taky už by mohl "Sám Náš Nejvyžší" přidat tuhle ikonku
Tak se pomalu pouštím do dalšího projektu , koupil jsem za pár šprdliků akumulátorovou vřetenovou sekačku , bez aku , ale to je to nejmenší , dá se použít i bez aku na ruční postrk v kolech jsou převody s volnoběžkama ty nahradím motory a budu z ní dělat robotickou sekačku , na netu je kupa různých pokusů , ale u žádné mě nenadchla orientace v prostoru , mám doma robotický vysavač IROBOT a tam se dá mluvit o plánování trasy a výpočtech - IROBOT je asi to nejlepší na trhu .
Ale všechny projekty co jsou kde na netu tak robot jede k překážce po dotyku se otočí třeba o 40° a jede dál až znovu narazí díky čemuž dříve či později možná pokreje celý prostor , ale kupu míst projede třeba desetkrát a neefektivně .
Nemáte nebo nevíte o nějakém použitelném algoritmu který by se dal pro tuhle aplikaci použít ?
Ale všechny projekty co jsou kde na netu tak robot jede k překážce po dotyku se otočí třeba o 40° a jede dál až znovu narazí díky čemuž dříve či později možná pokreje celý prostor , ale kupu míst projede třeba desetkrát a neefektivně .
Nemáte nebo nevíte o nějakém použitelném algoritmu který by se dal pro tuhle aplikaci použít ?