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)
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.
kdo ne - hledá důvod.
Ze dvou možností často volím tu třetí.
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.
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
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 154 x
kdo ne - hledá důvod.
Ze dvou možností často volím tu třetí.
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ů.resp.
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ů.Ale jak píšu výše, ten třetí projekt to vyřešil.
kdo ne - hledá důvod.
Ze dvou možností často volím tu třetí.
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
kdo ne - hledá důvod.
Ze dvou možností často volím tu třetí.
Konstruktor: Myslel jsem tuhle řádku:
Kód: Vybrat vše
Adafruit_SSD1306 display(OLED_RESET);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).
změněná čá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).
Po novém překladu a nahrání do Arduino Nano už fungují všechny výše uvedené verze programů.
kdo ne - hledá důvod.
Ze dvou možností často volím tu třetí.
- pocitujlasku
- Příspěvky: 2764
- Registrován: 12 pro 2005, 00:00
- Bydliště: SR, Poprad
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);nieco taketo a malo by to fungovat
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);
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 ne - hledá důvod.
Ze dvou možností často volím tu třetí.
- pocitujlasku
- Příspěvky: 2764
- Registrován: 12 pro 2005, 00:00
- Bydliště: SR, Poprad
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
Kód: Vybrat vše
#define SSD1306_128_64 ///< DEPRECTAED: old way to specify 128x64 screen 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.
Proč mi nemůže všechno chodit hned ?!!