Fórum témák

» Több friss téma
Fórum » Arduino
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Lapozás: OK   173 / 863
(#) Bell válasza atus1981 hozzászólására (») Dec 12, 2015 /
 
Ez alapján jó közelítéssel elég, ha az
1/T = 1/T25 + TK*ln(R/R25)
összefüggéssel számolsz, ahol TK(TC) 0.79 Bővebben: Link adatlap alapján.
Szerintem a DS18B20-al kevesebb gond lenne
A hozzászólás módosítva: Dec 12, 2015
(#) atus1981 válasza Bell hozzászólására (») Dec 13, 2015 /
 
Köszi ezt korábban olvastam már, de nem lettem okosabb tőle
(#) vizor válasza atus1981 hozzászólására (») Dec 13, 2015 / 1
 
Helló.

A lényeg, hogy meg kell határoznod a Steinhart-Hart képlethez a három NTC-függő állandót, az A,B,C-t. Ezt ezen a weblapon meg tudod tenni: Thermistor calculator. Ki kell tölteni itt három adatot, ehhez szükség lesz a termisztorod adatlapjára. A három adat a termisztor három különböző ellenállása 5, 25 és 45 fokon. Persze lehetnek más hőmérséklet értékek is, de a 25 fok mindenképpen legyen benne. Ez a termisztor adatlapján egy szép hosszú táblázatban benne van. Ebből a weblap kalkulál neked három Steinhart-Hart állandót, az A,B és C-t.

Ezután ezt felhasználhatod az Arduino progidban:

int temp0ADC;
double temp0res,temp0celsius,A,B,C;

temp0ADC=analogRead(TEMP_0_PIN);
temp0res=4700.0/((1023.0/(double)temp0ADC)-1);
temp0celsius=(1.0/(A+(B*(double)log(temp0res))+(C*pow((double)log(temp0res),3))))-273.15;

A 4700 az annak az ellenállásnak az értéke amivel feszültségosztót alkot az NTC.
A hozzászólás módosítva: Dec 13, 2015
(#) atus1981 válasza vizor hozzászólására (») Dec 13, 2015 /
 
Köszönöm, így már értem.
(#) vizor válasza atus1981 hozzászólására (») Dec 13, 2015 /
 
Nincs mit.
Még ügyelj arra, hogy a weblap tudományos alakban adja meg a három állandót. Tehát vagy te is ilyen alakban adod meg, vagy eltolod a tizedespontot a megfelelő helyre.
(#) atus1981 válasza vizor hozzászólására (») Dec 13, 2015 /
 
Ebbe gondoltam behelyettesíteni a számított értékeket.
Remélem jó az elképzelésem...

  1. //Utilizes the Steinhart-Hart Thermistor Equation:
  2.  //    Temperature in Kelvin = 1 / {A + B[ln(R)] + C[ln(R)]^3}
  3.  //    where A = 0.001129148, B = 0.000234125 and C = 8.76741E-08
  4. #include <math.h>
  5. #include "LiquidCrystal.h"
  6.   // A LiquidCrystal eljarast hasznaljuk
  7.  
  8. LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
  9.   // Az LCD bekotes a labak:
  10.   // R(D4), E(D5), D4(D6) ,D5(D7), D6(D8), D7(D9)
  11.  
  12.  
  13.   int led =13;
  14.  
  15. byte e1[8] = {B10,B100,B1110,B10001,B11111,B10000,B1110};
  16. byte o3[8] = {B1010,B1010,B0,B1110,B10001,B10001,B1110};
  17.  
  18.   //Beallitjuk az ekezetes karaktereket
  19. double Thermister(int RawADC) {
  20.  double Temp;
  21.  Temp = log(((10240000/RawADC) - 10000));
  22. // 10K Ohm hoellenallas.  
  23. //Ahogy számolunk: Ellenállás = (1024 * BalanceResistor/ADC) - BalanceResistor
  24.  
  25.  Temp = 1 / (0.001129148 + (0.000234125 * Temp) + (0.0000000876741 * Temp * Temp * Temp));
  26.  Temp = Temp - 273.15;            // Convert Kelvin to Celcius
  27.  
  28.  return Temp;
  29. }
  30.  
  31. void setup() {
  32.   pinMode(led, OUTPUT);
  33.   digitalWrite(led, LOW);
  34.  
  35.   lcd.createChar(1, e1);
  36.   lcd.createChar(4, o3);
  37.   // Tarsitjuk a szamokhoz
  38.  
  39.  lcd.begin(16, 2);
  40.       //Az LCD 2 sor, 16 oszlopos
  41.  lcd.print("  Homerseklet:");
  42.       //LCD-re kiirunk szoveget
  43. }
  44.  
  45. void loop() {
  46.    lcd.setCursor(3, 0);
  47.   //Kurzor 1. sor 4. karalternel
  48.    lcd.write(4);
  49.   //A't irjuk hosszu o"
  50.    lcd.setCursor(5, 0);
  51.   //Kurzor 1. sor 6 karalternel
  52.    lcd.write(1);
  53.   //Atirjuk az e betut e'-re
  54.    lcd.setCursor(8, 0);
  55.   //Kurzor 1.sor 9. karakternel
  56.    lcd.write(1);
  57.   //Atirjuk az e betut e'-re
  58.   lcd.setCursor(11, 1);
  59.   //Kurzor 2.sor 12. karakternel
  60.    lcd.print("C");
  61.   //C bertu kifirkalas
  62.   lcd.setCursor(10, 1);
  63.   //Kurzor a 2.sor 11. karakternel
  64.    lcd.print((char)223);
  65.   //Fokjel elohivasa a memoriabaol
  66.   lcd.setCursor(4, 1);
  67.   //Kurzor a 2.sor 5.karakternel
  68.    lcd.print(double(Thermister(analogRead(0))));  
  69.   // Homerseklet kifirkalasa
  70.    delay(500);
  71.   /* if (analogRead(A0) < 150 ) {
  72.      digitalWrite(led, HIGH); }
  73.      else {digitalWrite(led, LOW);
  74.     */ }
  75.    
  76. }
(#) vizor válasza atus1981 hozzászólására (») Dec 13, 2015 /
 
Hát ja, valami ilyesmi. Nem próbáltam ki a progid, de ránézésre jó.
Ha a szoba hőmérsékletét jól méri, akkor oké. Én higanyos hőmérővel meg a multiméter hőmérőjével teszteltem és 1-2 fokra nagyjából ott volt mind a három. Nekem 100K-s termisztorok vannak és fél fokon belül mindegyik jól mért, százados pontossággal írattam ki.
(#) atus1981 válasza vizor hozzászólására (») Dec 13, 2015 /
 
Viszont eddig fel sem tűnt, hogy ez a kty 81-222 PTC...
Eme ráeszmélés után találtam egy kapcsolást.
(#) vizor válasza atus1981 hozzászólására (») Dec 13, 2015 /
 
Hát végül is maga a kapcsolás elve ugyanaz, feszosztó. Itt már csak az a probléma, hogy a PTC működése és jelleggörbéje más mint az NTC-nek és nem tudom, hogy ez hogy illik az eredeti képletbe. Még sosem próbáltam PTC-vel.

De végül is az alapkérdés a Steinhart-Hart állandóinak meghatározása volt NTC esetén, az meg megvolt. A lényeget érted.
(#) Kovidivi válasza atus1981 hozzászólására (») Dec 13, 2015 /
 
Ehhez stabil 5V is kell, esetleg külön 5V. Ha a mikrokontrollerben lenne belső erősítő (vagy differenciális erősítő), pl. Atmega128, akkor egy másik feszültségosztóval beállítod az 1.127V-ot, és ehhez képest mérsz. Ha még kalibrálod is, akkor egész pontos kis hőmérőt kapsz. De a DS18b20 még mindig egyszerűbb Csak jó lenne, ha hardveresen támogatná valamelyik AVR, vagy be lehetne állítani az SPI-t, vagy UART-ot hozzá.
(#) atus1981 válasza Kovidivi hozzászólására (») Dec 13, 2015 /
 
Az a baj, hogy adott az érzékelő és egy analóg eszközzel is kompatibilis kell maradjon. Mellesleg nem egyszerű cserélni sem.
Viszont az áramköröm mindenképpen tartalmaz egy 7805 stabilizátort.
Azt is lehetne esetleg megoldásként felvetni, hogy megcsinálom a feszültségosztót és programban kivonom az 1.127V-ot majd ennek az eredményét elosztom 7.59-cel. És meg is van a °C. Javítsatok ki, ha tévednék.
Köszönöm.
(#) atus1981 hozzászólása Dec 14, 2015 /
 
Sziasztok!
Ha egy hőmérőnél nem kell tized-század kijelzés, akkor a float helyett használható az int?
(#) RoliNyh válasza atus1981 hozzászólására (») Dec 14, 2015 /
 
Nem vagyok nagy zseni még, de szerintem simán... INTEGER annyit tesz, egész és 32 biten tárolja az adatot ami egy hőmérséklet kijelzéshez szerintem enyhén túlzás...
Értéke lehet előjelesként : −2 147 483 648 tól +2 147 483 647 -ig.

Szóval szerintem a BYTE is megfelelő lenne neked 8 biten tárolja az adatot...
Feltéve ha megelégszel a −128 -tól +127 -ig kijelzéssel...

Adattípusok változók
(#) atus1981 válasza RoliNyh hozzászólására (») Dec 14, 2015 /
 
Arduinoban nem 0-255 lehet az értéke?
Byte
Ám köszi.
A hozzászólás módosítva: Dec 14, 2015
(#) RoliNyh válasza atus1981 hozzászólására (») Dec 14, 2015 /
 
Lehetséges, én általánosságban mondtam...
Próbáld ki...
(#) csatti2 válasza RoliNyh hozzászólására (») Dec 14, 2015 /
 
Az integer nincs kőbe vésve, az átlag AVR (nem AVR32) 8 bites és az integer 16bites (és előjeles). Ha pontosan definiálni akarja az ember, hogy mekkora helyet foglaljon el, akkor pl. az int16_t (16 bit előjeles), uint16_t (16 bit előjel nélküli), (u)int8_t (8 bites), (u)int32_t (32 bites) típusokat kell használni. Különleges esetben (pl. platform hordozhatóság esetén, mondjuk jó legyen a kód AVR-en és ARM-on is) használhatók még a fast típusok is. Pl. uint_fast16_t. Ilyenkor azt a típust használja a fordító, ami legalább 16 bites de a leggyorsabb kódot eredményezi a CPU-n, amire a kód fordul (pl. egy 32 bites CPU általában a 32 bites változókat preferálja), azaz lehet hogy fordításkor 32 bites változónak fordul majd le az egyik CPU-ra de csak 16 bitesnek egy másikon (pl. az AVR sokkal lassabban dolgozik 32 bites változókkal mint 16bitesekkel).

atus1981 kérdésére válaszolva viszont nem helyettesítheted direktbe integer matematikával a lebegőpontos matekot, viszont pár apró trükkel (és némi pontosság feláldozásával) átültetheted a kódot integer matekra (ilyen pici 8bites uC-knél ez a helyes gyakorlat is, mivel a lebegőpontos számítások atomlassúak rajtuk). Pl. ha megszorzol minden számot mondjuk 1000-el és így számolsz velük, akkor a műveletektől függően (osztás nagyon pontatlan lehet) pár tizedes pontig nézve elfogadható értékeket kaphatsz (csak ne felejtsd el, hogy a végeredmény is 1000-ese a valódi értéknek). Ha elég jó felbontást választ az ember, akkor gyakran jobb eredményt is lehet kapni mint lebegőpontos számokkal (sokan elkövetik azt a kezdő hibát, hogy nagyon pici számokat adnak össze nagy számmal sokszor [pl. mérésösszegzéskor], ilyenkor gyakran óriási hibát generálnak a végeredményben)
(#) atus1981 válasza csatti2 hozzászólására (») Dec 14, 2015 /
 
Mit javasolsz? Nekem csak egész értékű adatok kellenek.
(#) csatti2 válasza atus1981 hozzászólására (») Dec 14, 2015 /
 
Több irány is van. Egyik lehetőség, ha a számításokat az uC-ben végzed el, és vannak nem egész konstansaid (vagy osztanod kell), akkor a már említett módon felszoroznám a számokat 1000-el vagy még nagyobbal és így végezném el a számításokat 16 vagy 32 bites integerekkel.

Egy másik lehetőség ún. lookup table (kereső táblázat) használata. Excelben vagy hasonlóban megírod a képletet. Behelyettesíted az értékeket a szükséges tartományra (mondjuk -20C-től 70C-ig). Majd kiszámoltatod az excellel a hozzájuk tartozó ADC értékét. Ezután fogod a végeredmény listát és berakod egy tömb értékének, amit aztán belefordítasz a kódba (lehetőleg a PROGMEM-ben tárolva a tömböt). Így már csak ezen a listán kell végigmenni lesz és megkeresni azt az elemet, ami legközelebb van az ADC jelenlegi értékéhez. Mivel a lista sorba rendezett lesz (folyamatosan csökkenő vagy növekvő), ezért a gyors keresésre is lehet találni nagyon jó algoritmusokat. Ez a megoldás nagyon jól működik mikrokontrollereknél, mivel sokkal gyorsabb kódot eredményez kisebb helyen mint a számításos. pl. logaritmus és egyéb számítások be se férnek egy kis 1k-s mikroba, ezzel a trükkel meg mégis lekezelhet egy NTC-s hőmérsékletmérést.
A hozzászólás módosítva: Dec 14, 2015
(#) GPeti1977 válasza csatti2 hozzászólására (») Dec 14, 2015 /
 
Csak érdekesség hogy a P8X32A Parallax kontrollerbe a ROM-jába bele van írva a logaritmus, antilogaritmus meg a szinusz tábla.
(#) atus1981 válasza csatti2 hozzászólására (») Dec 14, 2015 /
 
Huhh, ezzel feladtad a leckét
Lehet inkább maradok a float-nál...
(#) csatti2 válasza GPeti1977 hozzászólására (») Dec 14, 2015 /
 
Az a kis kütyü ágyúval verébre lenne egy ilyen egyszerű hőmérsékletmérés esetén. Én inkább egy pici attiny kategóriára gondoltam. Mint pl. ez a projektem.
(#) Kovidivi válasza atus1981 hozzászólására (») Dec 14, 2015 / 1
 
Helló.
Azt megcsinálhatod, hogy veszel egy előjeles byte-ot: signed char valtozo=0; ,
és ebbe elmented a hőmérsékletet tizedesjegy nélkül: valtozo=(signed char)(homerseklet_floatban_vatlozo_neve);
Ezzel egy a baj, hogy simán levágja a tizedeseket, ha 10,9 volt, akkor 10-et kapsz. Erre van egy trükk: valtozo=(signed char)(((homerseklet*10)+5)/10); ez kerekítést végez. Ha 10,3 volt, ebből lesz 103+5=108, 108/10=10. Ha 10,6 volt, akkor 106+5=111, 111/10=11. Kész.
(#) atus1981 válasza Kovidivi hozzászólására (») Dec 14, 2015 /
 
Hali!
Egyetlen fok nem számít, de mindenképpen kipróbálom az ötletedet!
Köszi mindenkinek!
(#) ALI hozzászólása Dec 16, 2015 /
 
Sziasztok.
Egy kis segítséget kérnék van egy ilyen lcd keypad-om.
Bővebben: Link
Az a gondom, hogy fel töltöm a minta programot működik rendesen.
De van egy LM35-ösöm is és ha annak a programját meg próbálom össze írni a példa programmal akkor nem megy csak két gomb.
Mi lehet vele a gond?

  1. //Sample using LiquidCrystal library
  2. #include <LiquidCrystal.h>
  3.  
  4. /*******************************************************
  5.  
  6. This program will test the LCD panel and the buttons
  7. Mark Bramwell, July 2010
  8.  
  9. ********************************************************/
  10.  
  11. //  the pins used on the LCD panel
  12. LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
  13.  
  14. // define some values used by the panel and buttons
  15. int lcd_key     = 0;
  16. int adc_key_in  = 0;
  17. #define btnRIGHT  0
  18. #define btnUP     1
  19. #define btnDOWN   2
  20. #define btnLEFT   3
  21. #define btnSELECT 4
  22. #define btnNONE   5
  23.  
  24. // read the buttons
  25. int read_LCD_buttons()
  26. {
  27.  adc_key_in = analogRead(0);      // read the value  the sensor
  28.  // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
  29.  // we add approx 50 to those values and check to see if we are close
  30.  if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
  31.  // For V1.1 us this threshold
  32.  if (adc_key_in < 50)   return btnRIGHT;  
  33.  if (adc_key_in < 250)  return btnUP;
  34.  if (adc_key_in < 450)  return btnDOWN;
  35.  if (adc_key_in < 650)  return btnLEFT;
  36.  if (adc_key_in < 850)  return btnSELECT;  
  37.  
  38.  // For V1.0 comment the other threshold and use the one below:
  39. /*
  40.  if (adc_key_in < 50)   return btnRIGHT;  
  41.  if (adc_key_in < 195)  return btnUP;
  42.  if (adc_key_in < 380)  return btnDOWN;
  43.  if (adc_key_in < 555)  return btnLEFT;
  44.  if (adc_key_in < 790)  return btnSELECT;  
  45. */
  46.  
  47.  
  48.  return btnNONE;  // when all others fail, return this...
  49. }
  50.  
  51. void setup()
  52. {
  53.  lcd.begin(16, 2);              // start the library
  54.  lcd.setCursor(0,0);
  55.  lcd.print("Push the buttons"); // print a simple message
  56. }
  57.  
  58. void loop()
  59. {
  60.  lcd.setCursor(9,1);            // move cursor to second line "1" and 9 spaces over
  61.  lcd.print(millis()/1000);      // display seconds elapsed since power-up
  62.  
  63.  
  64.  lcd.setCursor(0,1);            // move to the begining of the second line
  65.  lcd_key = read_LCD_buttons();  // read the buttons
  66.  
  67.  switch (lcd_key)               // depending on which button was pushed, we perform an action
  68.  {
  69.    case btnRIGHT:
  70.      {
  71.      lcd.print("RIGHT ");
  72.      break;
  73.      }
  74.    case btnLEFT:
  75.      {
  76.      lcd.print("LEFT   ");
  77.      break;
  78.      }
  79.    case btnUP:
  80.      {
  81.      lcd.print("UP    ");
  82.      break;
  83.      }
  84.    case btnDOWN:
  85.      {
  86.      lcd.print("DOWN  ");
  87.      break;
  88.      }
  89.    case btnSELECT:
  90.      {
  91.      lcd.print("SELECT");
  92.      break;
  93.      }
  94.      case btnNONE:
  95.      {
  96.      lcd.print("NONE  ");
  97.      break;
  98.      }
  99.  }
  100.  
  101. }



  1. #include <LiquidCrystal.h>
  2. LiquidCrystal lcd(12, 13, 8, 9, 10, 11);
  3. float tempC;
  4. int reading;
  5. int tempPin = A1;
  6.  
  7. void setup()
  8. {
  9. analogReference(INTERNAL);
  10. lcd.begin(16, 2);
  11. }
  12.  
  13. void loop()
  14. {
  15. reading = analogRead(tempPin);
  16. tempC = reading / 9.31;
  17.  lcd.setCursor(0, 0);
  18.   lcd.print("SZ:");
  19.   lcd.print(tempC);
  20.   lcd.print("C");
  21. delay(1000);
  22. }
(#) kapu48 válasza ALI hozzászólására (») Dec 17, 2015 /
 
Mi miből tudnánk neked megmondani, hogy mi lehet a gondod?
Ha még a hibajelenséget sem közölted?

Valószínűleg már a 2. értelmes sor sem jó!
Ez van az első programban:
1. // the pins used on the LCD panel
2. LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

A másikban pedig:
LiquidCrystal lcd(12, 13, 8, 9, 10, 11);
Most fogalmunk nincsen! Hova is vannak bekötve az LCD pinjei?
(#) ALI válasza kapu48 hozzászólására (») Dec 17, 2015 /
 
Szia. Úgy van kötve a hogy a második van. A hiba jelenséget le írtam az a hiba ha össze van rakva a két program akkor csak két gomb működik.
(#) kapu48 válasza ALI hozzászólására (») Dec 17, 2015 /
 
Az első A0-án mér:
adc_key_in = analogRead(0);

A második: int tempPin = A1;???
reading = analogRead(tempPin);
(#) atus1981 válasza ALI hozzászólására (») Dec 17, 2015 /
 
Hali!
Ugyan nem a problémádra a megoldás, de én tennék egy
  1. lcd.print(char(223));
ilyent a 19. sor utánra vagy a 20. sor elé Szebb...
(#) ALI válasza kapu48 hozzászólására (») Dec 17, 2015 /
 
Az A0 lenne a nyomógombok az A1 pedig az lm35.
Össze keveredik a két mérés?
(#) ALI válasza atus1981 hozzászólására (») Dec 17, 2015 /
 
Eléggé kezdő vagyok ez mire való?
Következő: »»   173 / 863
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem