Arduino Nano, DS18B20 a OLED - prosím o radu (vyřešeno)
Moderátor: Moderátoři
Arduino Nano, DS18B20 a OLED - prosím o radu (vyřešeno)
Našel jsem a zkouším dvě konstrukce s Arduinem pro DS18B20 a OLED display s řadičem SSD1306. Tady je první, zde je prakticky identická druhá (pouze s I2C adresou 0x3D se po zapnutí vůbec nic neděje, po opravě na 0x3C to cosi dělá).
No a v tom "cosi" je právě ten problém... Oba zdrojáky se přitom chovají stejně (koneckonců jeden je v podstatě kopie druhého). Po resetu se v závislosti na verzi programu po chvíli na displayi zobrazí text
HOW2ELE
CTRONICS
(právě takto - zalomený na dva řádky, velké písmo), popř.
ARDUINO + DS18B20
SSD1306 OLED
(opět na dvou řádcích pod sebou, malé písmo). No a to je všechno, dál se neděje nic... Tento problém taky kdosi popisuje v komentářích u první konstrukce.
DS18B20 napájím z pinu 3V3 Arduino Nano (je to klon - napětí stabilizuje CH340G), předpokládám přitom, že vstup A0 (PC0/ADC0 pro ATmega328P) je 3V kompatibilní. I kdyby ale nebyl (a tedy se korektně nečetl stav DS18B20), tak by měl program hlásit chybu, jak je psáno na příslušném místě zdrojáku.
Mohl by někdo zkušeným okem kouknout na ten zdroják a tipnout, kde by mohla být chyba?
Dodávám, že HW je v pořádku, provozuju na té sestavě program 2,4GHz scanner (alternativně zde) a vše normálně funguje (jen je k Arduinu Nano místo DS18B20 odpovídajícím způsobem připojený TRx nRF24L01).
Díky.
No a v tom "cosi" je právě ten problém... Oba zdrojáky se přitom chovají stejně (koneckonců jeden je v podstatě kopie druhého). Po resetu se v závislosti na verzi programu po chvíli na displayi zobrazí text
HOW2ELE
CTRONICS
(právě takto - zalomený na dva řádky, velké písmo), popř.
ARDUINO + DS18B20
SSD1306 OLED
(opět na dvou řádcích pod sebou, malé písmo). No a to je všechno, dál se neděje nic... Tento problém taky kdosi popisuje v komentářích u první konstrukce.
DS18B20 napájím z pinu 3V3 Arduino Nano (je to klon - napětí stabilizuje CH340G), předpokládám přitom, že vstup A0 (PC0/ADC0 pro ATmega328P) je 3V kompatibilní. I kdyby ale nebyl (a tedy se korektně nečetl stav DS18B20), tak by měl program hlásit chybu, jak je psáno na příslušném místě zdrojáku.
Mohl by někdo zkušeným okem kouknout na ten zdroják a tipnout, kde by mohla být chyba?
Dodávám, že HW je v pořádku, provozuju na té sestavě program 2,4GHz scanner (alternativně zde) a vše normálně funguje (jen je k Arduinu Nano místo DS18B20 odpovídajícím způsobem připojený TRx nRF24L01).
Díky.
Naposledy upravil(a) JirkaZ dne 27 črc 2023, 22:08, celkem upraveno 2 x.
Kdo chce, hledá způsob;
kdo ne - hledá důvod.
Ze dvou možností často volím tu třetí.
kdo ne - hledá důvod.
Ze dvou možností často volím tu třetí.
Myslím, že to bude obdobný problém s nedostatkem paměti v Arduino NANO, který popisuji v jiném tématu viz tento odkaz (i tam šlo o použití OLED displeje). Knihovny pro Arduino k obsluze OLED displejů alokují paměť dynamicky, takže se spotřeba paměti neprojeví při výpisu v rámci překladu programu, ale projeví se to až za běhu programu v Arduinu, a to může za určitých okolností, které zhruba popisuji v tom tématu, způsobit přetečení části paměti používané pro zásobník do části paměti používané pro haldu. Důsledkem je pak obvykle havárie/zatuhnutí programu běžícího v Arduinu. Zkuste si tam to měření spotřebované paměti jak to v tom tématu popisuji, ale je možné, že to zatuhne ještě dříve než se to měření nějak projeví.
Případně zkuste z toho programu vyseparovat obsluhu OLED displeje a veškeré výpisy směrujte na sériový port jako při ladění. Tím by se měla výrazně snížit spotřeba paměti programu. Bez OLED to pravděpodobně bude fungovat bez problému. Bohužel někteří autoři podobných návodů si neuvědomují jak jsou knihovny pro obsluhu OLED paměťově náročné a pak v případě použití Arduina s malou pamětí jako je právě NANO stačí jen něco málo navíc doplnit a je problém.
Pokud použijete Arduino NANO Every, které má 3 krát více paměti než obyčejné Arduino Nano tak by to mělo tento problém rovněž vyřešit. Ostatně to také i udělal Celeron v tom tématu.
Případně zkuste z toho programu vyseparovat obsluhu OLED displeje a veškeré výpisy směrujte na sériový port jako při ladění. Tím by se měla výrazně snížit spotřeba paměti programu. Bez OLED to pravděpodobně bude fungovat bez problému. Bohužel někteří autoři podobných návodů si neuvědomují jak jsou knihovny pro obsluhu OLED paměťově náročné a pak v případě použití Arduina s malou pamětí jako je právě NANO stačí jen něco málo navíc doplnit a je problém.
Pokud použijete Arduino NANO Every, které má 3 krát více paměti než obyčejné Arduino Nano tak by to mělo tento problém rovněž vyřešit. Ostatně to také i udělal Celeron v tom tématu.
Naposledy upravil(a) Valdano dne 26 črc 2023, 21:03, celkem upraveno 1 x.
Možná bych zkusil v souboru Adafruit_SSD1306.h na řádce 28-30 to udělat takhle:
Kód: Vybrat vše
#define SSD1306_128_64 ///< DEPRECTAED: old way to specify 128x64 screen
//#define SSD1306_128_32 ///< DEPRECATED: old way to specify 128x32 screen
//#define SSD1306_96_16 ///< DEPRECATED: old way to specify 96x16 screen
Tak jsem věc vyřešil, sice "dirty workaround" způsobem, ale prostě to funguje...
Pro mě coby sw téměř laika není jiná možnost a nechtěl jsem tomu věnovat moc času (ani zneužívat čas ostatních).
Tedy: našel jsem třetí konstrukci, lehce modifikoval některé věci v programu (jsou popsány v hlavičce zdrojového textu) a vše běhá jak z praku, viz foto bastlu v příloze.
V příloze je i onen modifikovaný zdroják, kdyby se někomu hodil.
Pro mě coby sw téměř laika není jiná možnost a nechtěl jsem tomu věnovat moc času (ani zneužívat čas ostatních).
Tedy: našel jsem třetí konstrukci, lehce modifikoval některé věci v programu (jsou popsány v hlavičce zdrojového textu) a vše běhá jak z praku, viz foto bastlu v příloze.
V příloze je i onen modifikovaný zdroják, kdyby se někomu hodil.
- Přílohy
-
- Temp_meter_DS18B20_and_OLED_circuitsdiy_modified_and_tested.zip
- (1.24 KiB) Staženo 19 x
Kdo chce, hledá způsob;
kdo ne - hledá důvod.
Ze dvou možností často volím tu třetí.
kdo ne - hledá důvod.
Ze dvou možností často volím tu třetí.
První odkaz:
resp.
Druhý odkaz:
Ale jak píšu výše, ten třetí projekt to vyřešil.
Kód: Vybrat vše
Globální proměnné zabírají 433 bytů (21%) dynamické paměti, 1615 bytů zůstává pro lokální proměnné. Maximum je 2048 bytů.
Druhý odkaz:
Kód: Vybrat vše
Globální proměnné zabírají 451 bytů (22%) dynamické paměti, 1597 bytů zůstává pro lokální proměnné. Maximum je 2048 bytů.
Kdo chce, hledá způsob;
kdo ne - hledá důvod.
Ze dvou možností často volím tu třetí.
kdo ne - hledá důvod.
Ze dvou možností často volím tu třetí.
A nemůže to být tím, že ty první dva projekty používají starý konstruktor, který používá pro určení rozlišení ty konstanty v Adafruit_SSD1306.h na řádce 28-30? A tam je implicitně vybraný 128x32. Takže by mohlo pomoci změnit ty konstanty v Adafruit_SSD1306.h na řádce 28-30, nebo volat novější konstruktor, což by šlo okoukat z toho třetího projektu.
asdf: aha....sice nevím, co je konstruktor (tedy ani po přečtení toho textu), ale zkusit to můžu (pokud se k tomu dostanu)...
Nicméně můj laický dojem je, že i kdyby to špatně definovalo geometrii na displayi (který je 128x64, myslím ten můj kus), tak by se to snad nekouslo na uvítacím textu, ale "lítaly" by tam nějaké nesmysly.
Nebo ne?
P.S.: právě jsem došel k závěru, že jsem schopen jakžtakž chápat základy imperativního programování, a to ještě nejspíš v Basicu. Cokoliv vyššího (třeba objektového), ale na druhou stranu i nižšího, např. assembler nebo dokonce strojový kód, jdou zcela mimo mě.
Dlouho jsem neuměl pojmenovat, v čem se nějak alespoň minimálně orientuju a v čem vůbec. Takže teď už tomu můžu dát alespoň název![Wink ;-)](./images/smilies/icon_wink.gif)
Nicméně můj laický dojem je, že i kdyby to špatně definovalo geometrii na displayi (který je 128x64, myslím ten můj kus), tak by se to snad nekouslo na uvítacím textu, ale "lítaly" by tam nějaké nesmysly.
Nebo ne?
P.S.: právě jsem došel k závěru, že jsem schopen jakžtakž chápat základy imperativního programování, a to ještě nejspíš v Basicu. Cokoliv vyššího (třeba objektového), ale na druhou stranu i nižšího, např. assembler nebo dokonce strojový kód, jdou zcela mimo mě.
Dlouho jsem neuměl pojmenovat, v čem se nějak alespoň minimálně orientuju a v čem vůbec. Takže teď už tomu můžu dát alespoň název
![Wink ;-)](./images/smilies/icon_wink.gif)
Kdo chce, hledá způsob;
kdo ne - hledá důvod.
Ze dvou možností často volím tu třetí.
kdo ne - hledá důvod.
Ze dvou možností často volím tu třetí.
Já myslel, že by možná ta spodní půlka s teplotou nebyla vidět.
Konstruktor: Myslel jsem tuhle řádku:Tam se vyrábí proměnná display a volá se na ní konstruktor s jedním parametrem. To je jakási inicializace. V tom 3. projektu je tam těch parametrů víc.
Konstruktor: Myslel jsem tuhle řádku:
Kód: Vybrat vše
Adafruit_SSD1306 display(OLED_RESET);
Takže finální závěr:
asdf měl pravdu (díky!), pro můj OLED 128x64 stačilo upravit knihovnu Adafruit_SSD1306.h (v Linuxu je defaultně v adresáři /home/uzivatel/Arduino/libraries/Adafruit_SSD1306/) takto:
původní část:
změněná část:
Po novém překladu a nahrání do Arduino Nano už fungují všechny výše uvedené verze programů.
asdf měl pravdu (díky!), pro můj OLED 128x64 stačilo upravit knihovnu Adafruit_SSD1306.h (v Linuxu je defaultně v adresáři /home/uzivatel/Arduino/libraries/Adafruit_SSD1306/) takto:
původní část:
Kód: Vybrat vše
// ONE of the following three lines must be #defined:
//#define SSD1306_128_64 ///< DEPRECTAED: old way to specify 128x64 screen
#define SSD1306_128_32 ///< DEPRECATED: old way to specify 128x32 screen
//#define SSD1306_96_16 ///< DEPRECATED: old way to specify 96x16 screen
// This establishes the screen dimensions in old Adafruit_SSD1306 sketches
// (NEW CODE SHOULD IGNORE THIS, USE THE CONSTRUCTORS THAT ACCEPT WIDTH
// AND HEIGHT ARGUMENTS).
Kód: Vybrat vše
// ONE of the following three lines must be #defined:
#define SSD1306_128_64 ///< DEPRECTAED: old way to specify 128x64 screen
//#define SSD1306_128_32 ///< DEPRECATED: old way to specify 128x32 screen
//#define SSD1306_96_16 ///< DEPRECATED: old way to specify 96x16 screen
// This establishes the screen dimensions in old Adafruit_SSD1306 sketches
// (NEW CODE SHOULD IGNORE THIS, USE THE CONSTRUCTORS THAT ACCEPT WIDTH
// AND HEIGHT ARGUMENTS).
Kdo chce, hledá způsob;
kdo ne - hledá důvod.
Ze dvou možností často volím tu třetí.
kdo ne - hledá důvod.
Ze dvou možností často volím tu třetí.
- pocitujlasku
- Příspěvky: 1757
- Registrován: 12 pro 2005, 01:00
pozor na to, lebo po aktualizacii kniznice sa ti to prepise. Navyse je to deprectaed - cize tato moznost moze coskoro zmiznut.
Skus priamo v projekte pouzit to, co je v prikladoch
v prvych priklade pouzi namiesto
nieco taketo a malo by to fungovat
Skus priamo v projekte pouzit to, co je v prikladoch
v prvych priklade pouzi namiesto
Kód: Vybrat vše
Adafruit_SSD1306 display(OLED_RESET);
Kód: Vybrat vše
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3D ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
...
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
No vidis, a tak si sa bal
1) jo, to je mi jasné, že s aktualizací knihovny se to přepíše. Zatím to mám řešené tak, že jsem tu upravenou knihovnu uložil do jejího adresáře s jinou extenzí (jako zálohu).
Smaže se tento "cizí" soubor onou případnou aktualizací a mám to raději dát jinam?
2) změna části kódu u první a druhé konstrukce (ve smyslu, jak navrhuješ): možná to z čistě studijních důvodů vyzkouším, ale tak nějak mi připadá, že použití třetí rovnou funkční konstrukce je lepší...
Smaže se tento "cizí" soubor onou případnou aktualizací a mám to raději dát jinam?
2) změna části kódu u první a druhé konstrukce (ve smyslu, jak navrhuješ): možná to z čistě studijních důvodů vyzkouším, ale tak nějak mi připadá, že použití třetí rovnou funkční konstrukce je lepší...
Kdo chce, hledá způsob;
kdo ne - hledá důvod.
Ze dvou možností často volím tu třetí.
kdo ne - hledá důvod.
Ze dvou možností často volím tu třetí.
- pocitujlasku
- Příspěvky: 1757
- Registrován: 12 pro 2005, 01:00
nevidel som tu tretiu, ale podla komentarov pouziva ten novy konstruktor. ja som len z toho prveho prikladu upravil podla toho, ako to pouziva autor kniznice.
Je bezne, ze casom nejake starsie funkcne kody prestanu fungovat a musis ich trocha upravit.
ja som napr. svoj kod za 2 roky upravoval asi 3x kedze aj tie kniznice sa vylepsuju a optimalizuju a nie vzdy sa to da tak, ze su 100% kompatibilne
Je bezne, ze casom nejake starsie funkcne kody prestanu fungovat a musis ich trocha upravit.
ja som napr. svoj kod za 2 roky upravoval asi 3x kedze aj tie kniznice sa vylepsuju a optimalizuju a nie vzdy sa to da tak, ze su 100% kompatibilne
No vidis, a tak si sa bal
JirkoZ, tou změnou jsi nevyřešil naprosto nic. Vše, co je za dvojtým lomítkem je komentář, kterej se nijak při překladu neuplatňuje. To znamená, že v původním a novým kódu je funkční jen jedinný řádek začínající dvojtým křížkem, tedy
A to, co je za ///< je až do konce řádku opět komentář, takže se zase při překladu neuplatní. Takže před a po úpravě je výsledek překladu stejný.
Navíc správný termín v komentáři je "DEPRECATED," což znamená, že daný způsob je zastaralý a již se nedoporučuje používat.
Že ti to začalo chodit bude v něčem jiným. U těch OLEDů někdy stačí text, co se píše na displej zkrátit o pár znaků a začne to chodit.
Kód: Vybrat vše
#define SSD1306_128_64 ///< DEPRECTAED: old way to specify 128x64 screen
Navíc správný termín v komentáři je "DEPRECATED," což znamená, že daný způsob je zastaralý a již se nedoporučuje používat.
Že ti to začalo chodit bude v něčem jiným. U těch OLEDů někdy stačí text, co se píše na displej zkrátit o pár znaků a začne to chodit.
Jirka
Proč mi nemůže všechno chodit hned ?!!
Proč mi nemůže všechno chodit hned ?!!