[ JECHAM @ 09.01.2017. 14:47 ] @
Potrebna mi je šema za pojačanje naponskog nivoa od 0mV-1000mV na 0mV-5000mV

Poželjno(čak i obavezno) napajanje sa jednim naponom(poželjno 5v)
Dal može sa LM358 ili LM324 ili neki jeftiniji, lako nabavljiv kod nas(ili kod Kineza)

U pitanju je pojačanje naponskog nivoa LM35 senzora(3 ili 4 komada) koji daju signal za Arduino(clone).Opseg merenja 10-80 stepeni(100-800mV)
Signal bi trebao da se vodi 10-ak metara od senzora do Arduina, pa sam mislio da bi tako malo smanjio neke smetnje i malo povećao rezoluciju očitavanja.


[Ovu poruku je menjao veselinovic dana 14.01.2017. u 12:02 GMT+1]
[ Gosha_Nish @ 09.01.2017. 14:58 ] @
Za takve slucajeve se koristi 4-20mA bus ili 0-10V.
Ako bas hoces tako kako si napisao potreban ti je rail to rail OP. Ta dva nisu.
Medjutim ako nije uslov napajanje sa 5V mogu i oni.
Samo rail to rail OP mogu da dosegnu 5V na izlazu (ne bas 5,0 ali tu negde) sa napajanjem od 5V.





[ JECHAM @ 09.01.2017. 15:59 ] @
Ne treba mi izlaz do 5v. Dovoljno je do 4v. Moze i do 3v, samo ogranicim pojacanje na x4
[ vladd @ 09.01.2017. 17:15 ] @
http://onlinescience38.blogspo...ature-sensor-circuit-lm35.html
[ scoolptor @ 09.01.2017. 17:51 ] @
Kao sto Gosha rece, najbolje je da koristis strujnu petlju.
Na strani senzora mozes upotrebiti ovo kolo:

A na strani Arduina mozes upotrebiti 4-20mA sensor board ili mozes napraviti nesto slicno.

[ Living Light @ 09.01.2017. 17:55 ] @
Za neke normalne, kucne potrebe,
bez preteranih exibicija u vezi tacnosti,
koristan je OP TLC271 ili OP272.



Izvor:
http://www.ti.com/lit/ds/symlink/tlc277.pdf

Moze da se podesi pojacanje tipa : "Bilo šta-Na bilo šta",
i to Rail-to-Rail (sa malkice odstupanja, u smislu Rail-to-Rail)
[ Living Light @ 09.01.2017. 18:30 ] @
Sve sto je pomenuto je LEPO, kad se radi o signalu od 4-20mA i opsega 0-100°C.

Citat:
JECHAM: Opseg merenja 10-80 stepeni(100-800mV)
Signal bi trebao da se vodi 10-ak metara od senzora do Arduina,


Ta "Indusrija" nesto bas i ne paše,
na konverziju opsega 10-80°C na izlazni nivo napona od 100-800mV.

Znam, da SVE to, pomenuto, valjano Fercera,
jedino sto postavljac pitanja ima drugacije zahteve, u vezi opsega izlaznog napona.

pOz


[ scoolptor @ 09.01.2017. 19:07 ] @
I te kako pase, posto je postavljac pitanja dobio mnogo bolje resenje od onog kojeg je trazio.


-Senzor se spaja sa 2 zice. Nije potrebna treca zica za napajanje.
-Postize se veca otpornost na sum i smetnje
-Pad napona u provodnicima ne utice na rezultat merenja
-4mA donji prag se moze koristiti za detekciju greske

Ako se strujna petlja terminira preko otpornika od 250 oma koji je paralelno spojen sa ADC ulazom mikrokontrolera,
[att_img]
tada su uspostavljeni sledeci odnosi:

Temp = 0C, I = 4mA Vadc = 1V
Temp = 10C I = 5,6mA Vadc = 1,4V
Temp = 80C I = 16,8mA Vadc = 4,2V
Temp = 100C I = 20mA Vadc = 5V

Sto je vrlo problizno onome sto je postavljac pitanja trazio.

U tom slucaju, ukoliko je napon koji izmeri ADC manji od 1V, ili veci od 5V, MCU zna da postoji problem sa senzrom.
Naravno mogu se ubaciti kondenzatori za filtraciju, TVS diode, resetabilni osiguraci za zastitu od kratkog spoja, itd. zavisno od aplikacije.


[Ovu poruku je menjao scoolptor dana 09.01.2017. u 21:05 GMT+1]
[ mikikg @ 09.01.2017. 19:30 ] @
Dobra je ova varijanta sa strujnim pretvaracem, to resenje je prilicno imuno na smetnje i ima sve dobre osobine koje je @scoolptor naveo.

Prikljucni kabel moze biti najobicnija upredena dvozicna parica ili shirmovan dvozicni mikrofonski kabel, shirm vezati na GND samo sa jedne strane i to sa strane kontrolera.

PS: Otpornik za terminaciju od 250R ili koji se vec izabere, MORA da bude dobro fiksiran/zalemljen na plocicu jer ako se on odkaci stradace MCU!
[ scoolptor @ 09.01.2017. 20:13 ] @
Citat:
PS: Otpornik za terminaciju od 250R ili koji se vec izabere, MORA da bude dobro fiksiran/zalemljen na plocicu jer ako se on odkaci stradace MCU!

Ako je ulazna impedansa ADC-a dovoljno visoka, moze se ulaz ADCa povezati preko otpornika od 1K-10K.
U tom slucaju bi zastitne diode na ulazu ADC-a, u slucaju prekida sent otpornika, pod pretpostavkom da postoje, ogranicile napon na ulazu na ~ Vss-0.6V..Vdd+0.6V, sto bi pomoglo da MCU prezivi.
[ JECHAM @ 09.01.2017. 23:05 ] @
Sad ste mi dali malo vise materije za razmisljanje.
Svidja mi se varijanta sa tlc272(jos bolje sa tlc274) jer bi koristio 3 senzora(mozda kasnije 4 komada).
Za vezu sam mislio da koristim mrezni kabal- 2 zile za napajanje( mogu da ih dupliram pa da idu 4) i 3(4) signala.
Ni ova verzija sa strujnim pretvaracem mi ne izgleda komplikovano(osim onih vrednosti otpora od 1%)

[ Living Light @ 10.01.2017. 03:52 ] @
JECHAM, baci pogled,



Mozda je korisno, pogledaj ove linkove:

http://electronics.stackexchan...rpreted-by-the-microcontroller

http://electronics.stackexchan...a-sensor-by-using-an-amplifier
[ macolakg @ 10.01.2017. 08:35 ] @
Evo, kome treba, ultrajednostavnog konvertora sa 0-10V na 4-20mA:


Ono kad napišem na primer 4K70 to znači da je tolerancije 1%. Ako negde napišem 4K700, onda 0,1% i td...
[ goran_68 @ 10.01.2017. 11:05 ] @
Najjednostavnije rešenje ti je PIC16F1783 (11 x 12-bit ADC with Voltage Reference) koji uzorkuje ta 3-4 LM35 lokalno a posle možeš i bežično ako treba.

[Ovu poruku je menjao goran_68 dana 10.01.2017. u 13:22 GMT+1]
[ branko tod @ 10.01.2017. 11:23 ] @

Izvinjenje, moja greška. Pročitao sam " sa 4-20mA na 0-10V"
[ mikikg @ 10.01.2017. 11:24 ] @
U vezi tolerancije i vrednosti otpornika, u sustini se tesko nalaze otpornici koju su van E48 ili E96 niza tako da ce verovatno morati da se "trimuje" malo konstrukcija (ustelovati tacno potrebno pojacanje), da li na HW ili SW nivou treba odluciti, svakako je u SW jednostavnije.

Dakle bazdaranjem treba podesiti dve bitne tacke, 0*C (voda izmesana sa ledom) i recimo 100*C (kljucala voda) i onda u SW namestiti koeficijent korekcije da se dobije tacno ocitavanje temperature sa senzora.
Idealno bi bilo da se svaki pojedinacni kanal/senzor tako bazdari.
[ mikikg @ 10.01.2017. 11:47 ] @


Ovo resenje nije lose ali je vise predvidjeno za "lokalnu upotrebu", da taj AMP i sam senzor stoje blizu MCU plocice.

Taj OP ce verovatno prooscilovati vec sa nekoliko metara prikljucnog kabela (zbog parazitivne kapacitivnosti) pa ako se ide na to resenje treba malo preurediti shemu i dodati elemente koje bi ga stabilizovale tj izolovale od kapacitivnog opterecenja na izlazu.

Najjednostavnija modifikacija koja nece nista uticati na DC parametre je dodati redno sa izlazom sa 1. nozice OP-a jedan otpornik od recimo 47R ili 100R. (bas na izlaz 1. nozice, ne na izlaz celog AMP, dakle da taj dodatni otpornik bude "uhvacen" i povratnom spregom).
[ Living Light @ 10.01.2017. 12:26 ] @
miki,
Ako sam dobro shvatio, da bi se umirile oscilacije,
mislio si na ovo:

[ mikikg @ 10.01.2017. 12:42 ] @
Da bas tako, to ce drasticno povecati imunost na kapacitivno opterecenje.

Medjutim drugi problem koji je vezan za duzinu provodnika i dalje ostaje jer je ovo naponska verzija pretvaraca, kod njega igra ulogu otpornost provodnika i onda postoji varijanta ili bazdariti sa tacno tim provodnicima i njihovom duzinom i ne menjati to kasnije ili da se uvede Remote-Sensing :) ... trece nema, ima samo strujna verzija pretvaraca ili preci na digitalnu komunikaciju sa senzorom ...
[ zica49 @ 10.01.2017. 19:16 ] @
Strujna verzija je najoptimalnije rjesenje koje je bezbroj puta ponovljeno i testitano u teskim industrijsim uvjetima.


[ Living Light @ 10.01.2017. 19:47 ] @
Upravo zbog toga se Rafinerije, Petrohemije, Azotare, TehnoGas,
i ostala hemijska indusrija rukovodi SAMO sa signalom od 4-20mA.

Na TO sve, se jos doda i HART protokol komunikacije,
unutar (superponirano) na tih 4-20mA,

i onda je komunikacija i Očitavanje vrednosti merenja---Perfekcija !

pOz

[ JECHAM @ 13.01.2017. 12:38 ] @
Nakon svega iznesenog, izgleda da ću ipak praviti kao strujni izvor 4-20mA.
Možda napravim i verziju sa TLC274(i otpornik na izlazu u krugu povratne veze) za neku varijantu sa kraćim vezama.
Ovde bi i naslov teme trebalo promeniti u
Udaljeni senzor LM35 na arduino
ili sl.
Hvala svima na savetima i predlozima.


[Ovu poruku je menjao JECHAM dana 13.01.2017. u 21:31 GMT+1]
[ Living Light @ 13.01.2017. 15:08 ] @
Citat:
JECHAM: Ovde bi i naslov teme trebalo promeniti u Udaljeni senzor LM35 na arduino

Dobra Ideja !
Mislim da posle isteka ovoliko vremena nisi u mogucnosti da menjas naslov teme,
ali tu mogucnost imaju moderatori.

Tema je poprilicno otisla od pustih OP 324, 358...

Promena naziva bi bila korisna i za pretragu po forumu Elektronika,
na pr. kad neko ukuca : Arduino merenje temperature.

[ JECHAM @ 14.01.2017. 12:45 ] @
Evo sheme u Eagle-u sa tri kanala.
Umesto LM35 na shemi je 3-pinski priključak(raster 2,54)
Svaki kanal ima svoj priključak za paricu.
Da li bi trebalo još nešto dodati (neki kondezator ili sl.)?


[Ovu poruku je menjao JECHAM dana 15.01.2017. u 13:46 GMT+1]
[ mikikg @ 14.01.2017. 13:30 ] @
Na tom delu sheme ne treba nikakav dodatni kondenzator, njih ces staviti tamo gde izlazi napajanje za ove konvertere (napon koji ide ka 1N4148 diodama pa prema GND).
[ ha_23 @ 15.01.2017. 13:37 ] @
Da je u ptianje vec neki PLC togas moras da upotrebis 4-20mA no ako vec radis sa Arduino ili neki MCU mozes da koristis i digitalne senzore, nisi ogranicen na analogne.
Nije lose da razgledas i opcija sa DS18B20.
[ JECHAM @ 16.01.2017. 14:24 ] @
Gledao sam i DS18B20. Ne znam na koju daljinu mogu njih da spojim(mrezni kabal il slično).
Kod analognih senzora mogu prostim merenjem napona na krajevima kabla(ulaz arduina) da proverim dal je senzor ispravan dok je kod digitalnih to malo komplikovanije.
[ goran_68 @ 16.01.2017. 15:16 ] @
Pominjao sam ti već sledeću varijantu: DS18B20 + arduino (ja sam spominjao PIC ali to ti je isto) na strani na kojoj čitaš temperature i jedan arduino na udaljenom kraju. Između, recimo RS485. Ovakva konfiguracija ima prednosti.
Na jednostavan način možeš da dodaš novi senzor temperature ukoliko se ukaže potreba.
Takvih primera je pun net dakle, sve ti je uglavnom sažvakano.
Kod ove varijante drugi kraj može da bude udaljeniji kod žičane veze a praktično na drugom kraju planete ako ideš bežično.

[Ovu poruku je menjao goran_68 dana 16.01.2017. u 16:27 GMT+1]
[ PedjaZ @ 16.01.2017. 15:53 ] @
DS18B20 + arduino, sa sirmovanim kablom sigurno ide 20m (provereno).
Sa UTP vise od 100m (tako kazu).
[ bobahruma @ 20.01.2017. 00:04 ] @
"DS18B20 + arduino, sa sirmovanim kablom sigurno ide 20m (provereno).
Sa UTP vise od 100m (tako kazu)."

Evo ja bas muku mucim sa duzinom utp kabla + 4 sonde. Svakih 15 min. dobijam ocitavanje -127 i svaki put na razlicitoj sondi.
Nije do sonde, smanjio sam otpornik sa 4.7Kohm na 2Kohm, bezao od strujnih vodova i opet nemam savrsena ocitavanja.
Ako neko ima ideju sta dalje da pokusam bio bih zahvalan.
[ PedjaZ @ 20.01.2017. 18:04 ] @
A sa nekim kratkim kablom samo za probu?
Koje zice koristis na UTP kablu?
Sirm ti negde spojen?

Imam dva DS18B20, jedan na kraj tih 20m a drugi na 1m.
5m ide kabal u istoj kanalici sa drugim 220V kablovima.
Ja merim bas na svakih 15min (u pocetku sam i cesce) i svaki put je OK.
Otpornik je nesto vise od 2k.

Nije neko resenje ali sto ne ignorises -127 pa meris ponovo?


Inace, temperaturu kuce ne regulises tako sto palis i gasis pumpe.
Ili nekim servo motorom da regulises regulator promaje ili 4-kraki mešni ventil.

[Ovu poruku je menjao PedjaZ dana 20.01.2017. u 19:19 GMT+1]
[ Living Light @ 20.01.2017. 18:14 ] @
Citat:
bobahruma: ja bas muku mucim sa duzinom utp kabla + 4 sonde. Svakih 15 min. dobijam ocitavanje -127 i svaki put na razlicitoj sondi.
Nije do sonde, smanjio sam otpornik sa 4.7Kohm na 2Kohm, bezao od strujnih vodova i opet nemam savrsena ocitavanja.

Ožićenje (do SEN) ima negde spoj sa "Masom", spoj koji nije stalan, niti konstantan.

Smetnje koje se pri tom javljaju su "Intenzivnije" od samog signala sa senzora,
pa dolazi do "brljotina" u ocitavanju vrednosti temperature.

Proveri "Mase", i "Uzemljenja", i eventualna DODIRIVANJA kabla sa
nePOUZDANIM tackama.

pOz



[ tuxserbia @ 20.01.2017. 20:14 ] @
A bežično nije opcija?

Na drugoj strani neki nano

https://www.amazon.com/KOOKYE-...mp;refRID=1G6J4VR0R9E84ZHTTECD

plus

433
https://www.amazon.com/UCEC-XY...mp;refRID=GY2GDWWNCC03TE2A9XW0

ili

2.4

https://www.amazon.com/Arduino...mp;refRID=GY2GDWWNCC03TE2A9XW0

https://www.amazon.com/Makerfi...mp;refRID=EKXFZBK6HXZRJXF0Z1TD

Ovaj nano ima "zloglasni" CH340G. Na linuxu radi, na win 'nako, na meku treba malo gurka, ali radi.
[ payge @ 20.01.2017. 21:54 ] @
Citat:
bobahruma:
...dobijam ocitavanje -127 i svaki put na razlicitoj sondi.
Nije do sonde, smanjio sam otpornik sa 4.7Kohm na 2Kohm, bezao od strujnih vodova i opet nemam savrsena ocitavanja.
Ako neko ima ideju sta dalje da pokusam bio bih zahvalan.


Svojevremeno smo koristili senzore DS18B20 u vodonepropusnom kucistu
http://www.tweaking4all.com/wp...ds18b20-waterproof-485x600.jpg
nakacene za GPRS Trakere na kamionima za monitoring temperature u hladnjaci.
Duzina kabla 6 do 8 metara.

Svi GPRS Trakeri su u odmah startu posle ugradnje bar dva - tri puta dnevno slali lazne alarme sa abnormalnim minus temperaturama.

Proverimo sve kamione, nadjemo lose odradjene instalacije, senzori su visili slobodno u vazduhu na 10cm kabla ucvrscenog vezicom za ram od metalnih polica u hladnjaci.
Majstor instalater je negde zurio, ocigledno.
U voznji, na senzore su verovatno povremeno padale kapi vode ili ih je neko slucajno kacio rukom prilikom utovara / istovara a mozda je senzor dodirivao metalni ram od police.

Uglavnom, Problem je nestao kad smo vratili majstora nazad da sve senzore ugradi i propisno ucvrsti u nesto slicno ovome:

https://encrypted-tbn3.gstatic...KZhysXzpOaDsiSiYPrzE52NpQHWIxg

To je bilo nase iskustvo sa minus stoikusur temperaturama.
Ne kazem da je to slucaj i kod tebe al' mozda ti da ideju za resenje problema.







[ bobahruma @ 21.01.2017. 11:51 ] @
Citat:
PedjaZ:
A sa nekim kratkim kablom samo za probu?
Koje zice koristis na UTP kablu?
Sirm ti negde spojen?

Imam dva DS18B20, jedan na kraj tih 20m a drugi na 1m.
5m ide kabal u istoj kanalici sa drugim 220V kablovima.
Ja merim bas na svakih 15min (u pocetku sam i cesce) i svaki put je OK.
Otpornik je nesto vise od 2k.

Nije neko resenje ali sto ne ignorises -127 pa meris ponovo?


Inace, temperaturu kuce ne regulises tako sto palis i gasis pumpe.
Ili nekim servo motorom da regulises regulator promaje ili 4-kraki mešni ventil.

[Ovu poruku je menjao PedjaZ dana 20.01.2017. u 19:19 GMT+1]


Sa kratkim kablovima sve radi savrseno
Na utp-u koristim boje za data i +, a sve sarene su minus
Nije sirmovan kabal

Ignorisao sam sve temperature <5 i >50, tako i radi sve, ali me nervira zasto uopste brlja

Temperaturu regulisem tako sto sam stavio motore na ventile u sabirnici (akutator)
[ ha_23 @ 21.01.2017. 12:06 ] @
@bobahruma ovaj problem sa DS18b20 mi je dobro poznat. Temperatura koja realno moze da se meri je -55°C do +125°C pa lesno moze da se resi softverski.
Imas vise varijanti:
Ova prvo ja koristim i radi odlicno.

Code:

float temperatura_buf = 0.0;
float temperatura = 0.0;

        dallas.requestTemperatures();
        temperatura_buf = dallas.getTempCByIndex( 0 );

        if(temperatura_buf >= -55.00) 
        {

           temperatura = temperatura_buf;
        }




Moze i sa while ili sa do while da ponavjlas dodeka da dobies tacni rezultat. Nisam jos isprobao :)

Code:

   // do loop execution
   do {

        dallas.requestTemperatures();
        temperatura = dallas.getTempCByIndex( 0 );

       }while( temperatura <= -55.00);



Code:

   while(temperatura <= -55.00){

        dallas.requestTemperatures();
        temperatura = dallas.getTempCByIndex( 0 );

       }


Probaj dali ovo resava tvoj problem.
Pozdrav
[ bobahruma @ 21.01.2017. 12:17 ] @
Living Light, menjao sam kabal, proveravao, merio, sve to po par puta i tu nisam nasao nikakvu gresku.

tuxserbia, bezicna opcija mi je zadnja varijanta ako ne uspem drugacije da resim.

Naisao sam na neko resenje, ali ne znam da ga realizujem.
Treba da se pomere vrednosti u OneWire, da cita senzore malo sporije.
Koji god OneWire (gde je to vec reseno) skinem, trazi mi more nekih drugih biblioteka.
Jel neko ima ideju koje vrednosti u OneWire prepraviti.

https://forum.arduino.cc/index.php?topic=20574.0
[ bobahruma @ 21.01.2017. 12:28 ] @
Citat:
ha_23:
@bobahruma ovaj problem sa DS18b20 mi je dobro poznat. Temperatura koja realno moze da se meri je -55°C do +125°C pa lesno moze da se resi softverski.
Imas vise varijanti:
Ova prvo ja koristim i radi odlicno.

Code:

float temperatura_buf = 0.0;
float temperatura = 0.0;

        dallas.requestTemperatures();
        temperatura_buf = dallas.getTempCByIndex( 0 );

        if(temperatura_buf >= -55.00) 
        {

           temperatura = temperatura_buf;
        }

Pozdrav


Ovako sam ja resio, ali trazim pravo resenje.

Code:


float ErrorDonja = 5; //greska u citanju sondi npr5
float ErrorGornja = 50; //greska u citanju sondi npr50
 
{
   if ((SpavacaTemp <ErrorDonja) || (FanCoilTemp <ErrorDonja) || (DecijaTemp <ErrorDonja) || (DnevnaTemp <ErrorDonja) ||
       (SpavacaTemp >ErrorGornja) || (FanCoilTemp >ErrorGornja) || (DecijaTemp >ErrorGornja) || (DnevnaTemp >ErrorGornja))       
        {digitalWrite(ErrorLed,HIGH);(NeCitajPetljuState = 1);}
          else(NeCitajPetljuState = 0);
   }  
    {    
   if (NeCitajPetljuState == 0)

{ostatak koda}

[ PedjaZ @ 21.01.2017. 12:52 ] @
Koristim BASCOM ali isto čudo.

Setio sam se da sam sa 100000 (default) morao da spustim na 40000
Config Twi = 40000
[ mikikg @ 21.01.2017. 14:04 ] @
5V i 3.3V logika u single-endend rezimu rada (jedan provodnik po jednoj liniji) sa bilo kojim protokolom rada, jednostavno nije predvidjena da radi na rastojanjima duzim od metar-dva, to je predvidjeno za kratke veze u okviru samog uredjaja.

To sto nekome radi DS temperaturni senzor na vise od nekoliko metara je verujtemi cista sreca i splet povoljnih okolnosti (malo EMI buke u okruzenju).

Za "ozbiljne" komunikacione linije se uglavnom koriste parice sa direfencialnim prenosom signala, recimo kao kod RS485 veze/protokola ili strujna analogna petlja ili kombinacija digitalnog protokola kroz strujnu komunikacionu liniju.
Sve ostale kombinacije su u fazonu "radi kod kuce na stolu a u pogonu brljavi" :)

[Ovu poruku je menjao mikikg dana 21.01.2017. u 23:52 GMT+1]
[ mikikg @ 21.01.2017. 15:15 ] @
Pogledajte ovu brosuru i AN za RS485, to je jedan od standarda za digitalnu zicanu komunukaciju do 1200m.
http://www.ti.com/lit/sg/slyt484a/slyt484a.pdf
http://www.ti.com/lit/an/slla070d/slla070d.pdf

[ mbm @ 21.01.2017. 21:56 ] @
Unutar procedure za čitanje sadržaja registara DS18B20 ili DS18S20 obaviti uvek proveru CRC pa uzeti u obzir rezultat merenja temperature samo ako je CRC ispravan. Ako je CRC ispravan a ipak se pojavljuju čudni rezultati bacite senzore i kupite orginalne MAXIM od pouzdanog dobavljača a ne kineske lažnjake za pola evra komad.

MB


PS- tajming mora mora biti 100% ispravan pošto metoda uzaludnih pokušaja nije dovoljno dobra.

[Ovu poruku je menjao mbm dana 21.01.2017. u 23:20 GMT+1]
[ bobahruma @ 31.01.2017. 01:38 ] @
Znam da je ovo otislo malo van teme, izvinjavam se ali,

odustao sam od dugackih kablova za DS18B20.
Prelazim na serijsku komunikaciju izmedju dva arduina.
Dve blize sonde ostaju kod prvog arduina, a ove dve dalje idu na drugi arduino (nano, ili micro)

risiver:
Code:


// Example 5 - Receive with start- and end-markers combined with parsing

const byte numChars = 32;
char receivedChars[numChars];
char tempChars[numChars];        // temporary array for use when parsing

      // variables to hold the parsed data
char Informacija[numChars] = {0};
float SpavacaTemp = 0.0;
float DecijaTemp = 0.0;
//float HodnikTemp = 0.0;

boolean newData = false;

int led = A1;
int temperatura = 5;

//============

void setup() {
    Serial.begin(9600);
    Serial.println("This demo expects 3 pieces of data - text, an integer and a floating point value");
    Serial.println("Enter data in this style <HelloWorld, 12, 24.7>  ");
    pinMode (led, OUTPUT);
    Serial.println();
    
    pinMode (12, OUTPUT);
    digitalWrite(12, LOW);
}

//============

void loop() {
    recvWithStartEndMarkers();
    if (newData == true)
    {
        strcpy(tempChars, receivedChars);
            // this temporary copy is necessary to protect the original data
            //   because strtok() used in parseData() replaces the commas with \0
        parseData();
        showParsedData();
        newData = false;
    }
}

//============

void recvWithStartEndMarkers() {
    static boolean recvInProgress = false;
    static byte ndx = 0;
    char startMarker = '<';
    char endMarker = '>';
    char rc;

    while (Serial.available() > 0 && newData == false) {
        rc = Serial.read();

        if (recvInProgress == true) {
            if (rc != endMarker) {
                receivedChars[ndx] = rc;
                ndx++;
                if (ndx >= numChars) {
                    ndx = numChars - 1;
                }
            }
            else {
                receivedChars[ndx] = '\0'; // terminate the string
                recvInProgress = false;
                ndx = 0;
                newData = true;
            }
        }

        else if (rc == startMarker) {
            recvInProgress = true;
        }
    }
}
//============
void parseData() {      // split the data into its parts

    char * strtokIndx; // this is used by strtok() as an index

    strtokIndx = strtok(tempChars,",");      // get the first part - the string
    strcpy(Informacija, strtokIndx); // copy it to Informacija

    strtokIndx = strtok(NULL, ",");
    SpavacaTemp = atof(strtokIndx);     // convert this part to a float
 
    strtokIndx = strtok(NULL, ","); // this continues where the previous call left off
    DecijaTemp = atof(strtokIndx);     // convert this part to an integer

   // strtokIndx = strtok(NULL, ",");
   // HodnikTemp = atof(strtokIndx);     // convert this part to a float
}
//============
void showParsedData() {
  
  {if ((SpavacaTemp <temperatura) || (SpavacaTemp <temperatura))
  {digitalWrite(led,HIGH);}
                   //else{digitalWrite(led,LOW);}
                 }                
   
  /*
    Serial.println("");
    Serial.println("INFORMACIJE SA SERIAL PORTA");
    Serial.print("Informacija ");
    Serial.println(Informacija);  
    Serial.print("Spavaca ");
    Serial.println(SpavacaTemp);
    Serial.print("Decija  ");
    Serial.println(DecijaTemp);
    //Serial.print("Hodnik  ");
   // Serial.println(HodnikTemp);
    Serial.println("");
    Serial.println("");
    */
}


sender:
Code:


/*
korisceni pinovi:
pin 13 - 
pin 12 -  
pin 11 - 
pin 10 - 
pin 9 - OneWire DS18b20 sonda  siva
pin 8 - 
pin 7 - 
pin 6 - 
pin 5 - 
pin 4 - 
pin 3 -    
pin 2 - 

pin A5 - SCL LiquidCrystal_I2C zuta
pin A4 - SDA LiquidCrystal_I2C plava
pin A3 - 
pin A2 - 
pin A1 - 
pin A0 - 
 */
 //koriscene biblioteke
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// pin na koji ulaze senzori
#define ONE_WIRE_BUS 9
OneWire oneWire(ONE_WIRE_BUS);
// koriscenje dallas-a i oneWire 
DallasTemperature sensors(&oneWire);

//podesavanje LCD-a 16 slova x2 reda
LiquidCrystal_I2C lcd(0x27,16,2); 

//---------------------------------------------------------------

void setup() {
  //startuj serial port
  Serial.begin(9600);
   // startuj onewire biblioteku
  sensors.begin();

lcd.init();    // analiziraj LCD 
 
  // Stampaj na LCD-u
  lcd.backlight();
  lcd.setCursor (3,0);
  lcd.print("by bobahru");
  lcd.setCursor (1,1);
  lcd.print("064/412-68-66");
   delay(10000);  //zadrzavanje poruke pri paljenju
   lcd.clear();  //ocisti LCD
}
//citanje temperature sa senzora i pretvaranje u vrednost  
float sensorValue (byte deviceAddress[])
{
float tempC = sensors.getTempC (deviceAddress);
float temp = (DallasTemperature::toFahrenheit(tempC));
return temp;

delay(10000);
}


void loop() {
  //sve vrednosti senzora
  sensors.requestTemperatures();
  //0,1,2,3 je broj senzora, pretvoriti u ime 
  float SpavacaSoba = (sensors.getTempCByIndex(0));
  float DecijaSoba = (sensors.getTempCByIndex(1));
  //float Hodnik = (sensors.getTempCByIndex(2));
  
 // Serial.print("0123456789");
  Serial.print ("<");
  Serial.print ("s");
  Serial.print (",");
  Serial.print (SpavacaSoba);
  Serial.print (",");
  Serial.print (DecijaSoba);
  //Serial.print (",");
  //Serial.print (Hodnik);
  Serial.print (">");

  lcd.setCursor (0,0);  //prvi red
  lcd.print(" Spavaca:");
  lcd.setCursor (10,0);
  lcd.print (SpavacaSoba);
    lcd.setCursor (0,1); //drugi red
    lcd.print("  Decija:");  
    lcd.setCursor (10,1);
    lcd.print (DecijaSoba);

delay(500);
}
[ mikikg @ 31.01.2017. 11:25 ] @
Citat:
bobahruma: Znam da je ovo otislo malo van teme, izvinjavam se ali,

odustao sam od dugackih kablova za DS18B20.
Prelazim na serijsku komunikaciju izmedju dva arduina.
Dve blize sonde ostaju kod prvog arduina, a ove dve dalje idu na drugi arduino (nano, ili micro)



Oko programiranja najbolje da otvoris novu temu u podforumu mikroelektronika.

Sto se tice seriske veze (RS232), tu ima mali problem sto ti fali jos jedan seriski port na MASTER Arduinu (MCU koji skuplja podatke sa svih senzora).
RS232 radi samo 1:1 full-duplex, ne moze u mrezi da radi vise uredjaja, samo jedan uredjaj na jedan port.

Za mrezu seriskih uredjaja se koristi RS485 protokol i za to trebaju odgovarajuci tranciver (RX/TX) interface moduli, postavio sam gore na vrhu ove stranice par brosura oko toga.

I logiku moras malo izmeniti, ne da ti senzor stalno salje podatke nego da se on odazove kada ga MASTER pita za temperaturu (trebace ti ta logika zbog adresiranja uredjaja na mrezi).




[Ovu poruku je menjao mikikg dana 31.01.2017. u 14:10 GMT+1]
[ tuxserbia @ 31.01.2017. 13:10 ] @
A I2C? Nisam doduše probao sa dužim kablovima.
[ mikikg @ 31.01.2017. 13:41 ] @
I2C kao sto mu samo ime kaze "Inter-Integrated Circuit" je predvidjen za komunikuciju izmedju cipova ali u okviru jedne PCB ili uredjaja i nije predvidjen da "napusta" granice/okvire uredjaja, nije predvidjen za to i nema mehanizme za potiskivanje smetnji kao sto imaju spomenuti RS protokoli koji imaju mnoooogooo dB za potiskivanje CM smetnji za razliku od ostalih protokola koji imaju 0!
[ tuxserbia @ 31.01.2017. 14:03 ] @
Naravno, mada radi i komunikacija između arduino pločica normalno. Tek sad sam video kod i da ga već upotrebljava za LCD. Tako da je upoznat i sa njim.

Čisto razmišljam naglas, i uglas, "brainstorming" po staroserbski.
[ scoolptor @ 31.01.2017. 14:08 ] @
Ako je promena temperature tela koje meris spora, mozes komotno koristiti DS18B20 senzore. Trik je u odbacivanju rezultata merenja koji odskacu od ocekivanog, i/ili imaju CRC gresku.
[ bobahruma @ 31.01.2017. 15:51 ] @
Sta je konkretno CRC greska?
Lose rezultate sam vec odbacio, ali kada se desi da preskoci ocitavanje sonde izbrkaju se temperature. Moze se to resiti sa mac adresom sondi, ali onda je zamena sonde komplikovana nekom ko se slabije razume.
[ scoolptor @ 31.01.2017. 17:27 ] @
Procitas svih 9 bajtova internog SRAM-a senzora.
Izracunas CRC vrednost prvih 8 bajtova.
Ukoliko se rezultat koji dobijes ne slaze sa devetim procitanim bajtom, doslo je do greske u komunikaciji.

Takodje, kada master zeli da selektuje zeljeni senzor, slanjem komande MATCH i 64-bitne adrese,
dolazi do hardverske CRC provere od strane senzora, koji na osnovu 56 bita izracunava preostalih 8,
koji moraju da se poklope sa onim sto im salje master. Ovo pisem napamet. Moguce je da drugacije funkcionise.

Nisam koristio DS18B20 od 2005, ali planiram uskoro da upotrebim gomilu (nadzor temperatura spojeva el. instalacija i LED izvora),
posto su jeftini, pristupacni, dovoljno precizni, i laki za upotrebu.
[ Zlatni_bg @ 01.02.2017. 05:19 ] @
DS18B20 koristio sa Arduinom na 40 metara, ali sa kvalitetnim bakarnim kablom sa silikonskom izolacijom. Desavalo mi se da i sa njim, kao i UZ senzorom dobijam u odredjenom vremenskom periodu "laznu vrednost" i mislim da je to skroz ok. Moje resenje se nije svelo na ignorisanje vrednosti (u slucaju nekog pozara?) vec na cuvanje poslednjih par merenja i poredjenjem sa sledecim. Ukoliko par puta za redom dobijam slicne vrednosti merenje se uzima u obzir, ukoliko je temperatura drasticno drugacija merenje se odbacuje i uzima sledeca bliska onoj poslednjoj sa vise slicnih merenja, isto tako ako se dobiju abnormalno drugacije vrednosti (100C razlike?)u odredjenom vremenskom intervalu za redom, one postaju merodavne. Ipak DS ima neko ogranicenje koliko moze da se "zagreje" ili "ohladi" u sekundi. Ipak su to po mom misljenju amaterski senzori a na nama je da ih kalibrisemo i dobijemo najbolje od njih.

One-wire senzori su prilicno lose resenje za vece daljine nazalost, pogotovu DS18B20, i trebalo bi da se koristi sa dobrim 5V napajanjem (na vecoj daljini nazalost mozda i sopstvenim, resenim sa nekim DCDC step-up-om i solarnim punjenjem AA/2AA baterije?) jer se gubi dosta napona na otporu, naravno nikako "parazitno" koriscenje ne dolazi u obzir. Mozda cak i neki filteri/zavojnice? ali to ce iskusnije drustvo da posavetuje bolje nego ja. Ja u elektronici vise koristim Atmel i softversko resavanje nego hardversko zbog manjka znanja, ali mogu da posavetujem oko softverskog peglanja.
[ scoolptor @ 01.02.2017. 15:15 ] @