Stránka 1 z 2
Arduino NTC teplomer s MAX7219
Napsal: 12 lis 2025, 10:40
od jankrizan
Zdravím. chcem poprosiť u radu s týmto teplomerom. Zosmolil som túto jednoduchú konštrukciu, ale má to chybu krásy. Teplomer funguje iba do 00,0°C a už neviem ako ďalej, aby som dosiahol mínusovú teplotu. Ohmická tezerva na anal. vstupe ešte je. Ak teplomerovú časť požijem s LCD, tak to funguje, s MAXom nie. Neviem, čo ďalej treba pridať alebo zmeniť, na internete je veľmi málo takýchto zapojení, myslím s MAXom. Ale myslím, že mi niečo chýba. A ešte by som poprosil aj odstránenie prebytočnej nuly na začiatku, pod hodnodou 10,0°C. Ďakujem.
Napsal: 12 lis 2025, 12:09
od asdf
To minus bych zkusil nějak takhle (ale nemám to jak vyzkoušet):
Kód: Vybrat vše
#include "LedControl.h"
LedControl lc = LedControl(2,4,3,1);
float ThermistorPina = A0;
float Va;
int tempC;
float Reading;
float R1 = 10000;
float logR2, R2, T, Tc, Tca, Tf;
float c1 = 1.009249522e-03, c2 = 2.378405444e-04, c3 = 2.019202697e-07;
char minus;
void setup(){
lc.shutdown(0, false);
lc.setIntensity(0, 0);
lc.clearDisplay(0);}
void loop(){
Va = analogRead(ThermistorPina);
R2 = R1 * (1023.0 / (float)Va -1);
logR2 = log(R2);
T = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
Tca = (T - 273.15);
Tf = (T * 9.0)/ 5.0 + 32.0;
tempC=Tca*10;
minus = ' ';
if ( tempC < 0 )
{
minus = '-';
tempC *= -1;
}
int temp1 = (tempC % 10); // one of temp
int temp2 = (tempC / 10) % 10; // tens of temp
int temp3 = (tempC / 100) % 10; // units of temp
lc.setRow(0,7,15);
lc.setRow(0,6,0);
lc.setRow(0,5,0);
lc.setDigit(0,4,temp3,false);
lc.setDigit(0,3,temp2,true);
lc.setDigit(0,2,temp1,false);
lc.setChar(0,1,minus,false);
lc.setRow(0,1,99);
lc.setRow(0,0,78);
delay(300);
}
Napsal: 12 lis 2025, 14:37
od jankrizan
Perfekne, ďakujem asdf, akurát trebalo poprehadzovať riadky do lc.setChar(0,5,minus,false); , ešte keby sa niekomu podarilo tú zbytočnú nulu.
Napsal: 12 lis 2025, 14:41
od samec
float ThermistorPina = A0; nie je dobrý nápad

Napsal: 12 lis 2025, 14:44
od jankrizan
Dôvod? aj keď to funguje?
Napsal: 12 lis 2025, 14:51
od asdf
Zkusil bych to takhle (nemám to jak vyzkoušet):
Kód: Vybrat vše
#include "LedControl.h"
LedControl lc = LedControl(2,4,3,1);
float ThermistorPina = A0;
float Va;
int tempC;
float Reading;
float R1 = 10000;
float logR2, R2, T, Tc, Tca, Tf;
float c1 = 1.009249522e-03, c2 = 2.378405444e-04, c3 = 2.019202697e-07;
char minus;
void setup(){
lc.shutdown(0, false);
lc.setIntensity(0, 0);
lc.clearDisplay(0);}
void loop(){
Va = analogRead(ThermistorPina);
R2 = R1 * (1023.0 / (float)Va -1);
logR2 = log(R2);
T = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
Tca = (T - 273.15);
Tf = (T * 9.0)/ 5.0 + 32.0;
tempC=Tca*10;
minus = ' ';
if ( tempC < 0 )
{
minus = '-';
tempC *= -1;
}
int temp1 = (tempC % 10); // one of temp
int temp2 = (tempC / 10) % 10; // tens of temp
int temp3 = (tempC / 100) % 10; // units of temp
lc.setRow(0,7,15);
lc.setRow(0,6,0);
lc.setRow(0,5,0);
if ( temp3 == 0 )
{
lc.setChar(0,5,' ',false);
lc.setChar(0,4,minus,false);
}
else
{
lc.setChar(0,5,minus,false);
lc.setDigit(0,4,temp3,false);
}
lc.setDigit(0,3,temp2,true);
lc.setDigit(0,2,temp1,false);
lc.setRow(0,1,99);
lc.setRow(0,0,78);
delay(300);
}
Napsal: 12 lis 2025, 15:01
od samec
jankrizan píše:Dôvod? aj keď to funguje?
Nikdy nepoužívaj float pre celé čísla.
Nedávno tu bola o tom debata
http://www.ebastlirna.cz/modules.php?na ... c&t=110069
presnejšie od strany 2 až do konca.
Napsal: 12 lis 2025, 15:06
od asdf
Taky tu řádku
Kód: Vybrat vše
LedControl lc = LedControl(2,4,3,1);
bych zkusil změnit na
Napsal: 12 lis 2025, 15:30
od jankrizan
Vďaka za informácie. Pre asdf: Ďakujem ide to, ale zasa som si dovolil malý zásah do riadkov v lc. Mínusko poskakovalo z pozície 4 na 5, ak sa teplota zmenila o dekádu. Čo sa týka riadku - LedControl lc.... tak je to v každom programe, ktorý má MAX7219, ale samozrejme, že to môžem zmeniť, program funguje rovnako a nemá problém ani s kompiláciou, ani s fungovaním.
Pre samec: Ja som chápal z "priloženého txt", že int sa používa na celé a kladné čísla a float na plávajúce čísla, ako trebars mínus a plus a desatinné čiarky, preto. Ale zmenil som na int, ak si myslel toto. Program beží rovnako a nemá problém. Ale VĎAKA, tieto veci mi len prospejú.
Napsal: 12 lis 2025, 15:44
od pocitujlasku
jankrizan: ano, float je na des. cisla. ale ty mu tam definujes cislo pinu, nie hodnotu na jeho vstupe.
Napsal: 12 lis 2025, 15:50
od jankrizan
Aha, chápem, vďaka.
Napsal: 12 lis 2025, 16:04
od asdf
Tahle řádka
Kód: Vybrat vše
LedControl lc = LedControl(2,4,3,1);
dělá to, že vytvoří dočasný objekt, zinicializuje ho, jak je požadováno. Pak vytvoří objekt lc, inicializuje ho jako kopii toho dočasného objektu. A pak ten dočasný objekt zruší. Kdyby ten objekt byl nějaký složitější, tak by mohl s tím jeho kopírováním být problém. Tady asi problém není, ale proč to dělat tak složitě, když to jde jednoduše.
Tímhle
se inicializuje na požadované hodnoty rovnou ten objekt lc. Žádná kopie se nedělá.
Napsal: 12 lis 2025, 16:16
od jankrizan
Chápem, takže ak to takto upravím aj v iných konštrukciach, tak nič nepokazím?
Napsal: 12 lis 2025, 16:21
od asdf
Já bych to upravil všude.
Napsal: 12 lis 2025, 22:15
od Valdano
jankrizan píše:int sa používa na celé a kladné čísla
Datový typ int je celočíselný a platformně závislý a používá se jak pro kladné tak i pro záporné hodnoty. Na 16 bitové platformě se jedná o 16 bitovou proměnnou určenou pro rozsah celočíselných hodnot od -32768 do 32767. Na 32 bitové platformě se jedná o 32 bitovou proměnnou určenou pro rozsah celočíselných hodnot od -2147483648 do 2147483647.