Stránka 1 z 2

Arduino a TMP 36 GT 9Z

Napsal: 08 úno 2015, 09:47
od arduino2015
Ahoj, nechal jsem se odtud [https://learn.adafruit.com/tmp36-temperature-sensor/using-a-temp-sensor] inspirovat, jen mě zajímá, zda když připíšu toto, tak to jednoduše znamená, že program bude vnímat i další senzor, připojený na pin 1, anebo proto, abych měl možnost měřit dvěma senzory, musím udělat ještě něco:



//TMP36 Pin Variables
int sensorPin = 0; //Definice analogového pinu, ke kterému připojím výstup snímače teploty
//citlivost je 10mV na jeden °C
//s celkovou škálou 500mV - umožňuje i záporné hodnoty.
int sensorPin = 1; //Definice analogového pinu, ke kterému připojím výstup snímače teploty
//citlivost je 10mV na jeden °C
//s celkovou škálou 500mV - umožňuje i záporné hodnoty.


//funkce uvedené zde se načtou po spuštění arduina a platí po celou dobu běhu programu.

void setup()
{
Serial.begin(9600); //nabindování sériové komunikace s počítačem.
Serial.println("Vitejte v programu na mereni teploty."); // odeslani textu po seriove lince s odradkovanim

}

void loop() // tyto funkce se cyklicky opakují
{
//čtení napěťových hodnot z teplotního senzoru
int reading = analogRead(sensorPin);

// převod načtených hodnot na napětí (?), for 3.3v arduino use 3.3
float voltage = reading * 5.0;
voltage /= 1024.0;

// zobrazení napěťových hodnot
Serial.print(voltage); Serial.println(" voltu");

// zobrazení teploty v °C
float temperatureC = (voltage - 0.5) * 100 ; //převod teploty (10 mv = 1 °C) s celkovám rozsahem 500mV !offset!
//to degrees ((voltage - 500mV) times 100 ?)
Serial.print(temperatureC); Serial.println(" °C");

// zobrazení teploty ve °F
float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;
Serial.print(temperatureF); Serial.println(" °F");

delay(1000); //doba zobrazení textu 1s
}

Děkuju... :-))

Napsal: 08 úno 2015, 09:50
od arduino2015
PS: ty analogový piny 0 a 1, to jsou tyto?

http://img24.cz/images/29669548077427024382.jpg

Napsal: 08 úno 2015, 12:44
od Honza_dy
To určitě ne. Program bude měřit pouze na pinu A1, protože v definicích jsi mu nejdřív určil pin A0 a následně hned změnil hodnotu na pin A1. Navíc máš stejné jméno "sensorPin" pro dvě proměnné takže tě vůbec nepustí kontrola před kompilací v IDE.
Musíš zdvojit celý proces čtení a výpočtů hodnot a aliasy proměnných musí být odlišné např. int sensorPin1 a int sensorPin2

Zkus to takhle:

Kód: Vybrat vše

//TMP36 Pin Variables
int sensorPin1 = 0; //Definice analogového pinu, ke kterému připojím výstup snímače teploty
//citlivost je 10mV na jeden °C
//s celkovou škálou 500mV - umožňuje i záporné hodnoty.
int sensorPin2 = 1; //Definice analogového pinu, ke kterému připojím výstup snímače teploty
//citlivost je 10mV na jeden °C
//s celkovou škálou 500mV - umožňuje i záporné hodnoty.

//funkce uvedené zde se načtou po spuštění arduina a platí po celou dobu běhu programu.

void setup()
{
Serial.begin(9600); //nabindování sériové komunikace s počítačem.
Serial.println("Vitejte v programu na mereni teploty."); // odeslani textu po seriove lince s odradkovanim

}

void loop() // tyto funkce se cyklicky opakují
{
//čtení napěťových hodnot z teplotního senzoru
int reading1 = analogRead(sensorPin1);
int reading2 = analogRead(sensorPin2);
// převod načtených hodnot na napětí (?), for 3.3v arduino use 3.3
float voltage1 = reading1 * 5.0;
voltage1 /= 1024.0;

float voltage2 = reading2 * 5.0;
voltage2 /= 1024.0;
// zobrazení napěťových hodnot
Serial.print("Cidlo 1:"); Serial.print(voltage1); Serial.println(" voltu");
Serial.print("Cidlo 2:"); Serial.print(voltage2); Serial.println(" voltu");

// zobrazení teploty v °C
float temperatureC1 = (voltage1 - 0.5) * 100 ; //převod teploty (10 mv = 1 °C) s celkovám rozsahem 500mV !offset!
//to degrees ((voltage - 500mV) times 100 ?)
Serial.print("Teplota 1:"); Serial.print(temperatureC1); Serial.println(" °C");

float temperatureC2 = (voltage2 - 0.5) * 100 ; //převod teploty (10 mv = 1 °C) s celkovám rozsahem 500mV !offset!
//to degrees ((voltage - 500mV) times 100 ?)
Serial.print("Teplota 2:"); Serial.print(temperatureC2); Serial.println(" °C");


delay(1000); //doba zobrazení textu 1s
}

Napsal: 08 úno 2015, 15:32
od arduino2015
Díky, a ty porty (viz druhej příspěvek) jsem si určil správně?

Napsal: 08 úno 2015, 16:48
od arduino2015
Tak, už to funguje, ale říkám si, zda ten převod (anebo ten senzor) jsou v pořádku: zkusím si třeba měřit teplotu v podpaží, a plácá to hodnoty od 35 do 40 stupňů.

Napsal: 08 úno 2015, 16:53
od arduino2015
PS: existuje pro arduino nějaký pěkný vizualizační software, aby mi to třeba ukazovalo teplotní grafy a podobné věci?

Napsal: 08 úno 2015, 20:06
od Honza_dy

Napsal: 09 úno 2015, 13:12
od arduino2015
||Díky, a ještě poslední věc.. jak napsat, aby Arduino čerpalo z počítače údaj o čase, a zobrazilo ho na displeji či na "serial monitor"?

Napsal: 09 úno 2015, 15:30
od Atlan
nebude pre teba jednoduchsie tam pripojit obvod s RTC pre arduino

Napsal: 09 úno 2015, 17:29
od arduino2015
RTC?

Já právě myslel, že by to arduino (tu informaci o tom, kolik je) čerpalo přímo přes serial z počítače.

Napsal: 09 úno 2015, 18:01
od arduino2015
a když to mám jen napojený na drátkách, přímo drát napájen na výstup ze snímače, a druhej konec drátu přímo do svorkovnice arduina, a občas mi tam vyskočí podivné teploty, to je čím?

Napsal: 09 úno 2015, 18:30
od arduino2015
//TMP36 Pin Variables
int sensorPin1 = 0; //Definice analogového pinu, ke kterému připojím výstup snímače teploty
//citlivost je 10mV na jeden °C
//s celkovou škálou 500mV - umožňuje i záporné hodnoty.
int sensorPin2 = 1; //Definice analogového pinu, ke kterému připojím výstup snímače teploty
//citlivost je 10mV na jeden °C
//s celkovou škálou 500mV - umožňuje i záporné hodnoty.

//funkce uvedené zde se načtou po spuštění arduina a platí po celou dobu běhu programu.

void setup()
{
Serial.begin(9600); //nabindování sériové komunikace s počítačem.
Serial.println("Vitejte v programu na mereni teploty."); // odeslani textu po seriove lince s odradkovanim

}

void loop() // tyto funkce se cyklicky opakují
{
//čtení napěťových hodnot z teplotního senzoru
int reading1 = analogRead(sensorPin1);
int reading2 = analogRead(sensorPin2);
// převod načtených hodnot na napětí (?), for 3.3v arduino use 3.3
float voltage1 = reading1 * 3.3;
voltage1 /= 1024.0;

float voltage2 = reading2 * 3.3;
voltage2 /= 1024.0;
// zobrazení napěťových hodnot
Serial.print("Cidlo A:"); Serial.print(voltage1); Serial.println(" voltu");
Serial.print("Cidlo B:"); Serial.print(voltage2); Serial.println(" voltu");

// zobrazení teploty v °C
float temperatureC1 = (voltage1 - 0.5) * 100 ; //převod teploty (10 mv = 1 °C) s celkovám rozsahem 500mV !offset!
//to degrees ((voltage - 500mV) times 100 ?)
Serial.print("Teplota A:"); Serial.print(temperatureC1); Serial.println(" stupnu C");

float temperatureC2 = (voltage2 - 0.5) * 100 ; //převod teploty (10 mv = 1 °C) s celkovám rozsahem 500mV !offset!
//to degrees ((voltage - 500mV) times 100 ?)
Serial.print("Teplota B:"); Serial.print(temperatureC2); Serial.println(" stupnu C");


delay(10000); //doba zobrazení textu 10s
}


Používám tento program, a ukazuje mi naprosto nesmyslné teplotní hodnoty. Čip je TMP36GT9Z .... nezničil jsem ho při letování?

http://img24.cz/images/99430041491067950571.jpg

Napsal: 09 úno 2015, 19:17
od Honza_dy
Zpracováváš analogový signál o poměrně malé velikosti. Když čidlo připojíš jen za pomocí drátků, tak se ti na vstup naindukuje rušení, kterého je dneska všude spousta a ovlviňuje to měření.
Čidlo je potřeba připojit pomocí stíněného kabelu a napájení zablokovat kondenzátory.

Napsal: 10 úno 2015, 09:18
od arduino2015
Jak vnutím napsanému textu jiný font? A je zajímavé, že když asem tam chtěl mít škálu od vteřin po rok, tak jsem to musel udělat takle (:) protože kompiler mi odmítal vzít upravenou šablonu, viz screen (a co, text jako text, snad).

void draw () {
int q = second(); // Values from 1 - 31
int w = hour(); // Values from 1 - 12
int e = minute(); // 2003, 2004, 2005, etc.
int r = day(); // Values from 1 - 31
int t = month(); // Values from 1 - 12
int z = year(); // 2003, 2004, 2005, etc.

String s = String.valueOf(q);
text(s, 10, 28);
s = String.valueOf(w);
text(s, 10, 56);
s = String.valueOf(e);
text(s, 10, 84);
String.valueOf(r);
text(s, 10, 28);
s = String.valueOf(t);
text(s, 10, 56);
s = String.valueOf(z);
text(s, 10, 84);
}

Původní verze, co prostě nešla: http://img24.cz/images/53366677391736667294.jpg

Napsal: 10 úno 2015, 12:35
od Atlan
preco sa pre hodnoti 1-31 pouziva INT <<< ??? dokonca znamienkove <?