Arduino NTC teplomer s MAX7219

Raspberry, Arduino, Mini-PC a další

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
Mahoney
Příspěvky: 759
Registrován: 26 říj 2019, 00:00

#16 Příspěvek od Mahoney »

jankrizan: To co máš na mysli je uint (unsigned int)
Uživatelský avatar
jankrizan
Příspěvky: 167
Registrován: 30 pro 2007, 00:00

#17 Příspěvek od jankrizan »

Chlapi, veľmi dobre mi radíte, čo si cením a chcem vás ešte poprosiť o radu s touto konštrukciou. V kocke- jedná sa trojitý termostat s diagnostikou poruchových stavov. Chcem tam implementovať ten teplomer, ktorý sme riešili. V podstate to celé funguje tak ako si predstavujem, ak tam vložím iba jeden ten teplomer. Bohužiaľ druhý a tretí je nad moje sily, neviem definovať prikazy pre druhý a tretí displej. Skúšal som aj vložiť ich na začiatok -ešte pred void setup, tak ako sú tie ostatné, ale nefunguje to, ovplyvňujú to asi tie "živé setDigit". Momentálne sú za komentom, aby neboli aktívne, takto to ide -len jeden. Pomôžte mi prosím. Ďakujem.
Přílohy
Thermometer32_3xNTC_ver_MAX7219_test.zip
(3.16 KiB) Staženo 45 x
Uživatelský avatar
jankrizan
Příspěvky: 167
Registrován: 30 pro 2007, 00:00

#18 Příspěvek od jankrizan »

Opravujem program, zabudol som ešte nejaké údaje doplniť.
Přílohy
Thermometer32_3xNTC_ver_MAX7219_test.zip
(3.19 KiB) Staženo 62 x
Uživatelský avatar
asdf
Příspěvky: 707
Registrován: 06 říj 2022, 00:00
Kontaktovat uživatele:

#19 Příspěvek od asdf »

No, udělal jsi z toho hrozný prasečinec. :-) Zkusil jsem upravit ten program pro jednu teplotu, aby to dělal třikrát.

Kód: Vybrat vše

#include "LedControl.h"
LedControl lc(2,4,3,3);

int ThermistorPina = A0;
int ThermistorPinb = A1;
int ThermistorPinc = A2;
float teplotaa;
float teplotab;
float teplotac;

void setup(){
  for ( int i = 0; i < 3; i++ )
  {
    lc.shutdown(i, false);
    lc.setIntensity(i, 0); 
    lc.clearDisplay(i);
  }
}

static void zpracujTeplotu(int adresa, int termistorPin, float *teplota)
{
  int 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;
  
  Va = analogRead(termistorPin); 
  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(adresa,7,15);     
   lc.setRow(adresa,6,0);     
   lc.setRow(adresa,5,0);
 if ( temp3 == 0 ){
   lc.setChar(adresa,4,' ',false);
   lc.setChar(adresa,5,minus,false);}
 else {lc.setChar(adresa,5,minus,false);
   lc.setDigit(adresa,4,temp3,false);}   
   lc.setDigit(adresa,3,temp2,true);
   lc.setDigit(adresa,2,temp1,false);
   lc.setRow(adresa,1,99);
   lc.setRow(adresa,0,78);
   *teplota = Tca;
}
 
void loop(){
  zpracujTeplotu(0, ThermistorPina, &teplotaa);
  zpracujTeplotu(1, ThermistorPinb, &teplotab);
  zpracujTeplotu(2, ThermistorPinc, &teplotac);
  delay(300);
}
Uživatelský avatar
jankrizan
Příspěvky: 167
Registrován: 30 pro 2007, 00:00

#20 Příspěvek od jankrizan »

Dík, ale tento program sa zaoberá iba zobrazením teploty, ale ja potrebujem zobrazovať aj poruchové informácie pri dosiahnutí nastavených teplôt a porušení niektorých podmienok. Ak nedokážem urobiť príkazy pre jednolivé displeje, rozhodne nedokážem to nejako napasovať do seba a hlavne aby to bolo funkčné. Máš pravdu, že je to chaotické a aj zložito napísané, ale je to zatiaľ funkčné a hlavne tomu rozumiem, čo chcem vyjadriť a rozumie tomu aj arduino. Jasné, že som mal použiť millis namiesto delay, bohužiaľ je to pre mňa (vysoká škola jadrovej fyziky).
Uživatelský avatar
asdf
Příspěvky: 707
Registrován: 06 říj 2022, 00:00
Kontaktovat uživatele:

#21 Příspěvek od asdf »

Tak do té funkce loop() můžeš dopsat ten zbytek.
Uživatelský avatar
jankrizan
Příspěvky: 167
Registrován: 30 pro 2007, 00:00

#22 Příspěvek od jankrizan »

Presne tak aj ja uvažujem. Je to naozaj prehľadné a skúsim to zmiešať, čo to povie. Ale až zajtra, už mám z toho osýpky. Zatiaľ veľmi pekne ďakujem. Ak budeš mať záujem mi pomôcť, budem veľmi rád, osobne nemám s kým tieto veci diskutovať. Možeme pokračovať na SZ, nebudeme zahlcovať forum. Ešte raz ďakujem.
Uživatelský avatar
asdf
Příspěvky: 707
Registrován: 06 říj 2022, 00:00
Kontaktovat uživatele:

#23 Příspěvek od asdf »

Napsal jsem ti SZ.
Uživatelský avatar
asdf
Příspěvky: 707
Registrován: 06 říj 2022, 00:00
Kontaktovat uživatele:

#24 Příspěvek od asdf »

Řešili jsme s Jánem, jak blikat několika displeji a LEDkou připojenou na digitální výstup. Použili jsme na to takovouhle knihovničku. Třeba by se mohla hodit i někomu jinému.
Použití se snad dá okoukat z tohohle:

Kód: Vybrat vše

#include "LedControl.h"
#include "blikac.h"

int ThermistorPina = A0;
int ThermistorPinb = A1;
int ThermistorPinc = A2;
float teplotaa;
float teplotab;
float teplotac;
#define power 11 //LED výstup-11-POWER/Porucha-bliká 
unsigned long lastTempTime;

LedControl lc(2,4,3,3);
BlikacPin blikacPower(power);
BlikacText blikacText(&lc, 0);

void setup(){
  pinMode(power, OUTPUT); //LED výstup-11-režim normal(svieti trvalo-POWER)/režim porucha(bliká)
  lastTempTime = millis();
  for ( int i = 0; i < 3; i++ )
  {
    lc.shutdown(i, false);
    lc.setIntensity(i, 10);
    lc.clearDisplay(i);
  }
  blikacPower.nastavDoby(200, 200);
  blikacPower.svit();
  blikacText.nastavDoby(200, 200);
  blikacText.nastavJas(10);
  blikacText.blikej();
}

static void zpracujTeplotu(int adresa, int termistorPin, float *teplota)
{
  int 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;
 
  Va = analogRead(termistorPin);
  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(adresa,7,15);     
   lc.setRow(adresa,6,0);     
   lc.setRow(adresa,5,0);
 if ( temp3 == 0 ){
   lc.setChar(adresa,4,' ',false);
   lc.setChar(adresa,5,minus,false);}
 else {lc.setChar(adresa,5,minus,false);
   lc.setDigit(adresa,4,temp3,false);}   
   lc.setDigit(adresa,3,temp2,true);
   lc.setDigit(adresa,2,temp1,false);
   lc.setRow(adresa,1,99);
   lc.setRow(adresa,0,78);
   *teplota = Tca;
}
 
void loop(){
  blikacPower.loop();
  blikacText.loop();
  
  if ( millis() - lastTempTime < 300 ) return;
  lastTempTime = millis();
  
  zpracujTeplotu(0, ThermistorPina, &teplotaa);
  zpracujTeplotu(1, ThermistorPinb, &teplotab);
  zpracujTeplotu(2, ThermistorPinc, &teplotac);
  
  if ( teplotac > 43 )
  {
    blikacPower.nastavDoby(100, 100);
    blikacPower.blikej();
  }
  
}
Přílohy
blikac.zip
(1.49 KiB) Staženo 62 x
Odpovědět

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