Arduino Nano, DS18B20 a OLED - prosím o radu (vyřešeno)

Raspberry, Arduino, Mini-PC a další

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
JirkaZ
Moderátor
Moderátor
Příspěvky: 1429
Registrován: 26 úno 2021, 01:00

Arduino Nano, DS18B20 a OLED - prosím o radu (vyřešeno)

#1 Příspěvek od JirkaZ »

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.
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í.

Uživatelský avatar
Valdano
Příspěvky: 695
Registrován: 01 led 2023, 01:00
Bydliště: Česká Lípa

#2 Příspěvek od Valdano »

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.
Naposledy upravil(a) Valdano dne 26 črc 2023, 21:03, celkem upraveno 1 x.

Uživatelský avatar
asdf
Příspěvky: 64
Registrován: 06 říj 2022, 02:00

#3 Příspěvek od asdf »

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

Uživatelský avatar
JirkaZ
Moderátor
Moderátor
Příspěvky: 1429
Registrován: 26 úno 2021, 01:00

#4 Příspěvek od JirkaZ »

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.
Přílohy
20230726_211632_cropped_320x875_q97.jpg
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í.

Uživatelský avatar
Celeron
Příspěvky: 16140
Registrován: 02 dub 2011, 02:00
Bydliště: Nový Bydžov

#5 Příspěvek od Celeron »

Kolik ti to píše při kompilaci, že zůstává volný RAM pro proměnný? Jestli míň než cca 1200 byte, tak je to OLED klasika, stejnej problém jsem tu popisoval já.
Jirka

Proč mi nemůže všechno chodit hned ?!!

Uživatelský avatar
JirkaZ
Moderátor
Moderátor
Příspěvky: 1429
Registrován: 26 úno 2021, 01:00

#6 Příspěvek od JirkaZ »

První odkaz:

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 chce, hledá způsob;
kdo ne - hledá důvod.

Ze dvou možností často volím tu třetí.

Uživatelský avatar
asdf
Příspěvky: 64
Registrován: 06 říj 2022, 02:00

#7 Příspěvek od asdf »

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.

Uživatelský avatar
JirkaZ
Moderátor
Moderátor
Příspěvky: 1429
Registrován: 26 úno 2021, 01:00

#8 Příspěvek od JirkaZ »

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 ;-)
Kdo chce, hledá způsob;
kdo ne - hledá důvod.

Ze dvou možností často volím tu třetí.

Uživatelský avatar
asdf
Příspěvky: 64
Registrován: 06 říj 2022, 02:00

#9 Příspěvek od asdf »

Já myslel, že by možná ta spodní půlka s teplotou nebyla vidět.

Konstruktor: Myslel jsem tuhle řádku:

Kód: Vybrat vše

Adafruit_SSD1306 display(OLED_RESET);
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.

Uživatelský avatar
JirkaZ
Moderátor
Moderátor
Příspěvky: 1429
Registrován: 26 úno 2021, 01:00

#10 Příspěvek od JirkaZ »

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:

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 chce, hledá způsob;
kdo ne - hledá důvod.

Ze dvou možností často volím tu třetí.

Uživatelský avatar
pocitujlasku
Příspěvky: 1757
Registrován: 12 pro 2005, 01:00

#11 Příspěvek od pocitujlasku »

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

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);
No vidis, a tak si sa bal

Uživatelský avatar
JirkaZ
Moderátor
Moderátor
Příspěvky: 1429
Registrován: 26 úno 2021, 01:00

#12 Příspěvek od JirkaZ »

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ší...
Kdo chce, hledá způsob;
kdo ne - hledá důvod.

Ze dvou možností často volím tu třetí.

Uživatelský avatar
pocitujlasku
Příspěvky: 1757
Registrován: 12 pro 2005, 01:00

#13 Příspěvek od pocitujlasku »

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
No vidis, a tak si sa bal

Uživatelský avatar
asdf
Příspěvky: 64
Registrován: 06 říj 2022, 02:00

#14 Příspěvek od asdf »

Ještě si ale asi dávej pozor na tu paměť, jak psal Valdano a Celeron. Jestli to budeš nějak upravovat, tak tě to možná potká.

Uživatelský avatar
Celeron
Příspěvky: 16140
Registrován: 02 dub 2011, 02:00
Bydliště: Nový Bydžov

#15 Příspěvek od Celeron »

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

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.
Jirka

Proč mi nemůže všechno chodit hned ?!!

Odpovědět

Zpět na „Miniaturní počítače (Arduino, Raspberry a další)“