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 :pravnik:

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

Kód: Vybrat vše

LedControl lc(2,4,3,1);

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

Kód: Vybrat vše

LedControl lc(2,4,3,1);
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.