Arduino NTC teplomer s MAX7219

Raspberry, Arduino, Mini-PC a další

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
jankrizan
Příspěvky: 167
Registrován: 30 pro 2007, 00:00

Arduino NTC teplomer s MAX7219

#1 Příspěvek 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.
Přílohy
Thermometer31_NTC_MAX7219_test.zip
(640 bajtů) Staženo 80 x
Uživatelský avatar
asdf
Příspěvky: 707
Registrován: 06 říj 2022, 00:00
Kontaktovat uživatele:

#2 Příspěvek 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);
}
Uživatelský avatar
jankrizan
Příspěvky: 167
Registrován: 30 pro 2007, 00:00

#3 Příspěvek 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.
Přílohy
Thermometer31_NTC_MAX7219_test.zip
(681 bajtů) Staženo 70 x
Uživatelský avatar
samec
Příspěvky: 6671
Registrován: 19 pro 2017, 00:00

#4 Příspěvek od samec »

float ThermistorPina = A0; nie je dobrý nápad :pravnik:
Uživatelský avatar
jankrizan
Příspěvky: 167
Registrován: 30 pro 2007, 00:00

#5 Příspěvek od jankrizan »

Dôvod? aj keď to funguje?
Uživatelský avatar
asdf
Příspěvky: 707
Registrován: 06 říj 2022, 00:00
Kontaktovat uživatele:

#6 Příspěvek 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);
}
Uživatelský avatar
samec
Příspěvky: 6671
Registrován: 19 pro 2017, 00:00

#7 Příspěvek 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.
Uživatelský avatar
asdf
Příspěvky: 707
Registrován: 06 říj 2022, 00:00
Kontaktovat uživatele:

#8 Příspěvek 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);
Uživatelský avatar
jankrizan
Příspěvky: 167
Registrován: 30 pro 2007, 00:00

#9 Příspěvek 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ú.
Přílohy
Thermometer31_NTC_MAX7219_test.zip
(1.84 KiB) Staženo 64 x
Uživatelský avatar
pocitujlasku
Příspěvky: 2764
Registrován: 12 pro 2005, 00:00
Bydliště: SR, Poprad

#10 Příspěvek od pocitujlasku »

jankrizan: ano, float je na des. cisla. ale ty mu tam definujes cislo pinu, nie hodnotu na jeho vstupe.
No vidis, a tak si sa bal
Uživatelský avatar
jankrizan
Příspěvky: 167
Registrován: 30 pro 2007, 00:00

#11 Příspěvek od jankrizan »

Aha, chápem, vďaka.
Uživatelský avatar
asdf
Příspěvky: 707
Registrován: 06 říj 2022, 00:00
Kontaktovat uživatele:

#12 Příspěvek 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á.
Uživatelský avatar
jankrizan
Příspěvky: 167
Registrován: 30 pro 2007, 00:00

#13 Příspěvek od jankrizan »

Chápem, takže ak to takto upravím aj v iných konštrukciach, tak nič nepokazím?
Uživatelský avatar
asdf
Příspěvky: 707
Registrován: 06 říj 2022, 00:00
Kontaktovat uživatele:

#14 Příspěvek od asdf »

Já bych to upravil všude.
Uživatelský avatar
Valdano
Příspěvky: 3117
Registrován: 01 led 2023, 00:00
Bydliště: Česká Lípa

#15 Příspěvek 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.
Odpovědět

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