Arduino - více čidel teploty

Arduino - více čidel teploty
« kdy: 09. 04. 2014, 16:20:39 »
Ahoj chci se zeptat, doufám že jsem to dal do správné rubriky.
Zkouším dělat s arduinem, naprogramoval jsem si teploměr (s hysterezí), který spíná relé. Jak do tohoto programu zakomponuji pokud bych chtěl 2 a více čidel? Každé čidlo má vlastní relé a aby každé čidlo mělo vlastní informační drát. Aby nebyly na jednom drátu. Děkuji

Kód: [Vybrat]
#include <OneWire.h>
 
int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2
int rele = 3;
 
//Temperature chip i/o
OneWire ds(DS18S20_Pin); // on digital pin 2
 
void setup(void) {
Serial.begin(9600);
pinMode(rele, OUTPUT);
digitalWrite (rele, 0); //vypnout rele
}
 
void loop(void) {
float teplota = getTemp();
Serial.println(teplota);
 
if(40 >= teplota) {digitalWrite(rele, 0);}
if(teplota >= 50) {digitalWrite(rele, 1);}
}
 
 
float getTemp(){
//returns the temperature from one DS18S20 in DEG Celsius
 
byte data[12];
byte addr[8];
 
if ( !ds.search(addr)) {
//no more sensors on chain, reset search
ds.reset_search();
return -1000;
}
 
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return -1000;
}
 
if ( addr[0] != 0x10 && addr[0] != 0x28) {
Serial.print("Device is not recognized");
return -1000;
}
 
ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end
 
byte present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
 
 
for (int i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
 
ds.reset_search();
 
byte MSB = data[1];
byte LSB = data[0];
 
float tempRead = ((MSB << 8) | LSB); //using two's compliment
float TemperatureSum = tempRead / 16;
 
return TemperatureSum;
 
}

« Poslední změna: 09. 04. 2014, 18:09:13 od Petr Krčmář »


Martin

Re:Arduino - více čidel teploty
« Odpověď #1 kdy: 09. 04. 2014, 23:39:32 »
A proč se pro čtení teploty používá knihovna OneWire? Měl jsem za to, že teplotmí, či jakékoliv jiné analogové čidlo se prostě připojí na analogovej vstup a čte se přes:

http://arduino.cc/en/Reference/analogRead


lojzik

Re:Arduino - více čidel teploty
« Odpověď #2 kdy: 10. 04. 2014, 06:58:45 »
@Martin: To že čidlo čte nějakou analogovou veličinu neznamená, že jí vždycky vrací jako analogovou hodnotu. S čidlem se může komunikovat digitálně a dají se mu i nastavovat některé vlastnosti jako přesnost měření a pod, jako u zřejmě použitého DS18S20, které komunikuje po 1-wire

@hoonza123: každé čidlo může mít vlastní drát, ale proč by měla být připojená k různým pinům? 1wire je zvládne i na jednom.
zjisti si adresy obou čidel (udělej si prográmek co ti  je vypíše, nebo to možná budou nějaké blechy na čidle) a pak v té getTemp nebudeš zjišťovat adresy čidel na drátě, ale budeš číst hodnotu podle adresy z parametru, kterou dáš natvrdo do programu. Takže ta getTemp bude začínat až tím
ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end

a addr bude prametr getTemp

A pokud trváš na různých pinech abys třeba nemusel řešit různé adresy čidel, tak zkus
OneWire ds1(DS18S20_Pin1);
OneWire ds2(DS18S20_Pin2);
a v následném kódu čti na střídačku z ds1 a ds2, přepiš si tu getTemp, aby měla ds jako parametr.

Jo, a pokud je správné spínání nějak fatální, tak si správně ošetřit stav kdy nebude žádné čidlo připojeno a  nějak filtruj hodnoty pro případ chyby měření a následné špičky a možná ověřuj crc i pro vlastní měřenou hodnotu a nejen pro zjištěné adresy.
Tak jak to máš teď a dojde k chybě čtení adresy nebo bude třeba chybně připojené/nezapojené čidlo, tak i když bude teplota nad padesát, tak ti to vrátí "teplotu" -1000 a relé ti přecvakne. Takže by to asi chtělo řešit jednotlivý výpadek -> nechat relé v původním stavu a dlouhodobý výpadek (vrací souvisle chyby) -> nastavit relé do bezpečné polohy (teď pokud se tím řeší třeba nějaký ohřev, tak se to v případě chyby bude chovat jako "pořád studený, přidej") a případně nějak indikovat/řešit chybu.