Sari la conținut
ELFORUM - Forumul electronistilor

proiect nokia 3310 +LM35


wolfei

Postări Recomandate

Buna ! Am inceput proiectul de licenta care va fi o statie meteo ce va transmite wireless temp presiunea umiditatea...poate daca mai am timp pun si un card sa stocheze datele...Am hotarat sa incep usor...mai intai fac simularile in proteus si la sfarsit imi fac placuta si lipesc componentele...am facut programul pentru afisarea pe display nokia 3310...si acum vreau sa afisez temperatura...urmand sa ma ocup pe urma pe rand de restul de senzori si de transmisie...de asemenea as aprecia niste sfaturi in ce senzori de umiditate si presiune sa folosesc..nu vreau cine stie ce exactitate....vreau sa fie usor de programat...eu ma gandeam la mpx4115 pt presiune si la sh11 pt umiditate...Folosesc un 16f877A si pentru temp am ales un LM35...As avea nevoie de ceva ajutor in a afisa temperatura pe display...va atasez ce am facut pana acum :limb:Va multumesc in avans pentru ajutor!

Link spre comentariu
  • Răspunsuri 140
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Liviu M

    67

  • wolfei

    54

  • A_L_E_X

    6

  • nana

    3

Top autori în acest subiect

Am alta problema....am reusit sa afisez temeratura...merge perfect pana in 64 grade...cand se reseteaza si incepe sa afiseze iar de la 0..si merge asa pana cand senzorul arata 128 grade...si iar se reseteaza de la 0...daca ar putea cineva sa ma ajute cu un sfat as fi foarte recunoscator...Va atasez programul si schema in proteus...Va multumesc!

Link spre comentariu

Atata timp cat nu stii in ce ordine evalueaza compilerul operatiile, sunt sanse ca operatia

value = read_adc(0)*5*100/1023;
sa-ti dea overflow.

Cum se pare ca folosesti picc de la Hi-Tech, int e pe 16 biti; cu semn inseamna -32768..32767 (parca). Adica atat poate sa fie value al tau.

64 * 5 * 100 = 32000 => pentru valori ale ADC mai mari de 64 o sa ai probleme de reprezentare.

Eu vad doua solutii:

- ori pui paranteze in jurul lui 5*100/1023:

value = read_adc(0)*(5*100/1023);
LE Cred ca cea mai "sigura" varianta e
value = read_adc(0)*((5.0*100.0)/1023.0));
, da' sunt sanse sa ti se termine memoria.

- ori calculezi direct valoarea 5*100/1023 si folosesti rezultatul

value = read_adc(0)*4.887;
- ori iti modifici schema (n-o vad ca n-am protel, da' din configurari ai referintele 0 si VDD) si alegi referintele in asa fel incat 1LSB = 1°C si atunci afisezi direct valoarea ADC-ului.

A, sunt 3 solutii? Cu atat mai bine, nu? :da

 

LE Cum spuneam, nu vad schema ta, da' presupun ca intre LM si PIC ai in circuitel care sa-ti translateze nivelele, nu? Ca altfel statia ta meteo o sa poata masura numai temperaturi pozitive.

Link spre comentariu

MUltumesc mult de raspuns :101 Deja nu mai stiam ce sa fac...era prea simplu...eu am crezut ca daca le declar ca long int...nu o sa am probleme...a doua varianta merge struna :limb: Si multumesc ca ai ridicat si problema cu temp negative...la asta nu ajunsesem inca...ca mie nu imi dadeau nici astea pozitive.Ce fel de "circuitel" ar trebui sa pun intre pic si LM ca sa imi inregistreze si val negative?

Link spre comentariu

Cred ca cea mai simpla solutie e sa folosesti schema pentru temperaturi negative+pozitive si alimentare unipolara din data sheet-ul de la national, figura 7, pagina 7 si sa folosesti un offset in program (ti se vor muta toate temperaturile cu tensiunea diodelor).

Altfel ar trebui sa folosesti alimentare diferentiala si un level shifter (cred); nu cred ca e cazul sa te complici.

Link spre comentariu

Multumesc pentru raspuns...dar fiind incepator sunt un pic in ceata...Am incercat sa implementez schema mentionata, temp negative le iau de pe diode...si arata ok...dar cele pozitive le iau tot de pe iesirea din LM35?...Adica am acum doua intrari in microcontroler?Sau trebuie sa le unesc pe undeva... :nas: Eu am incercat mai multe variante...singura care ar merge mi s-a parut k ar fi cea in care pun 2 intrari de la LM35 in uC.Astept un raspuns.Multumesc in avans!

Link spre comentariu

Nu-i nevoie de 2 intrari, una e suficienta. Tot ce trebuie sa faci e sa masori tensiunea de la referinta (gnd-ul) lm35-ului si s-o consideri mai departe, in program, referinta ta => o tensiune (temperatuara) offset. Adica atunci cand masori o tensiune mai mare decat referinta respectiva, ai temperatura pozitiva. Cand e mai mica, ai tensiune negativa.De exemplu, daca pe fiecare dioda cad 0,6V, cand pui 2 diode, masa lm35 va fi 1,2V. Adica la 0°C o sa masori la iesire 1,2V. La 150°C si 10 mV/°C o sa ai 1,2V + 150*0,01V = 2,7V. La -55°C o sa ai 1,2V-55*0,01V = 1,2V-0,55V = 0,65V. In program va trebui, practic, sa scazi 1,2V din valoarea masurata.LE Cred ca se poate si sa conectezi masa "virtuala" (anodul diodei "de sus") a lm-ului la referinta negativa a ADC-ului si sa reconfigurezi picul. Da' s-ar putea sa trebuiasca sa umbli la formula de conversie (la numarul de volti/lsb).

Link spre comentariu

Sper ca mai ai de schimb; :rade: in locul tau l-as alimenta printr-o dioda, doua sa mai cada si pe ele ceva tensiune. Si poate si conexiunile la PIC le-as face prin rezistente de cateva sute de ohmi.LE Acum vad, in sfarsit, cum ai legat senzorul. La ADC trebuie sa mergi tot cu VOUT. Numai valoarea masirata se va deplasa (in sus) cu tensiunea care cade pe diode; practic senzorul va fi alimentat intre VDDSystem si GNDSystem+2VDIODA. 0mV de la iesirea lui, corespunzatori lui 0°C vor fi egali cu tensiunea din pinul lui de referinta, adica GNDSystem+2VDIODA.A, si rezistenta aia de 18kOhm intre VOUT si GNDSystem (vezi data sheetul) e foarte importanta ca sa poata genera tensiuni negative (cred cel putin).LE Rezistenta ai pus-o; sper ca e legata bine si la capatul care nu se vede.

Link spre comentariu
:da ..Proiectul e deocamdata doar teoretic...cand o sa il pun pe placa o sa pun LCD la 3.3V si o sa mai pun si snite rezistente..ma gandeam eu ca s-ar putea sa ard ceva si am inceput prin a face schema in proteus...abia pe urma urmand sa fac o placuta...Ce spui tu cu diodele si offsetul e perfect logic...dar eu nu inteleg cum mie pe o sonda pusa in anodul diodei din intrare in LM imi arata 0.015V la 0C...am modificat schema...sper ca acum am inteles bine...am mai facut niste simulari..d.ar tot nu reusesc sa ii dau de cap...E bine cum am implementat acum?Am inercat sa pun offsetul de 1.2V...while(1) { if(read_adc(0)>=0.014) // positive or negative { value =read_adc(0)*((5.0*100.0)/1023.0)-1.2; if (value>99) { display_digit(1,30,(value/100)%10); //hundreds display_digit(1,45,(value/10)%10); //tenths display_digit(1,55,value%10); //ones } else { lcd_gotoxy(30,0); lcd_puts(" "); lcd_gotoxy(30,1); lcd_puts(" "); display_digit(1,45,(value/10)%10); //tenths display_digit(1,55,value%10); //ones } }MUltumesc inca o data pentru raspunsuri!
Link spre comentariu

E, asa parca mai vii de-acasa.

Offsetul il iei din schema/il masori cand o sa ai circuitul gata. In momentul asta e 0.852V (anodul lui D1). Valoarea asta o folosesti ulterior in formule.

Referitor la program, mie imi iese cam:

bit minus; unsigned char offset=85; //exprimat in grade, offsetul e 800..1200 mV/(10mV/°C) = 80..120LSB                                  // o alta varianta ar fi sa masori valoarea asta cu o alta intrare in adc                                  // asa ai implementa si o compensare cu temperatura.while(1){      minus=0;      value =read_adc(0)*((5.0*100.0)/1023.0)-offset; // valoarea masurata si convertita, din care scazi offsetul                                                                                if(value<0)      {          value *= -1;          minus=1;      }      if(minus)          lcd_puts("-");  // aici mai vezi si tu unde trebuie asezat minusul asta      h=(value/100)%10;      t=(value/10)%10;      o=value%10;	     display_digit(1,30,h);                //hundreds     display_digit(1,45,t);                 //tenths     display_digit(1,55,o);                 //ones   }

Clar, nu e complet, e numai o idee de cum as face eu bucatica asta. Partea de prelucrare/afisare am copiat-o din posturile tale anterioare, tu stii daca functioneaza.

Am oarece dubii referitor la formula de conversie analog/digital. Tinand cont ca referintele tale-s 0 si 5V, pe care le poti masura cu 10 biti, mie formula in milivolti imi da

read_adc(0)*((5000.0)/1023.0)-offset;
Mai verifica si tu o data.

 

LE Bineinteles ca am gresit. Cu regula de 3 simpla mai nou imi iese:

read_adc(0)*(1023.0/5000.0)-offset_lsb;
De asemenea, cred ca si offsetul trebuie calculat cu aceeasi formula:

offset_lsb((852 mV)*1023.0/5000.0)
Asa ca verifica totul inca o data si alege ce ti se pare ca-i mai bine.
Link spre comentariu

Nu era mai bine daca nu corectam? Era mai bine.

Daca as fi pus unitatile de masura langa fiecare marime, m-as fi prins mai repede ca gresesc.

valoare[mV] = read_adc(0)[lsb]*((5000.0 [mV])/1023.0[lsb])-offset[mV];

In conditiile astea offsetul ramane ca la inceput -> tensiunea masurata pe dioda.

Sper ca acum sa fie, in sfarsit, bine.

Link spre comentariu

Liviu multumesc frumos pentru toate raspunsurile, dar ma cam calca pe nervi temperatura asta negativa.Azi am implementat sugestiile tale...dar tot nu da cum trebuie...Asa ca m-am pus iar pe cautat pe net...rezultatele gasit nu prea m-au multumit...cam toti recomanda sa folosesti schema in care este -Vs... asa ca am decis sa las deoparte aceasta problema...cel putin pentru moment.Asta e inceputul licentei mele...pe care trbuie sa o prezint in vara...si ma astept sa fie temperaturi pozitive atunci :limb: ...daca la sfarsit o sa mai am timp...o sa incerc iar sa rezolv problema.Intre timp trebuie sa ma apuc de ceilalti doi senzori...de presiune si umiditate....si sa inteleg cum se fac transmisiile wireless intre PIC-uri.Daca ai vreo sugestie pentru ceilalti senzori as fi foarte bucuros sa o aud.Multumesc inca o data !

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări