Jump to content
ELFORUM - Forumul electronistilor
GeoMar

Termometru cu DS18B20 si Digiti LED

Recommended Posts

Am incercat sa realizez si eu un termometru cu senzor DS18B20 cu afisare multiplexata pe un afisaj cu 4 digiti LED, Anod Comun.
Am cautat informatii pe net si am reusit sa scriu un mic cod pentru Arduino UNO, functioneaza ok, afiseaza ok temperatura pe digiti, dar am un licarit (palpait) suparator la afisaj.
Nu am mai lucrat cu multiplexare digiti LED si cred ca asta este si cauza, gresesc eu undeva fiind primul proiect cu multiplexare digiti LED.
As dori, daca se poate, o solutie ca sa scap de acel licarit suparator al afisajului.
Mentionez ca sunt incepator cu Arduino.

Multumesc anticipat pentru ajutor.

 

Codul testat de mine:

#include <SevenSeg.h>
#include <OneWire.h>
#include <DallasTemperature.h>

SevenSeg disp (8, 10, 6, 4, 3, 9, 7);
const int numOfDigits = 4;
int digitPins [ numOfDigits ] = { A2, A3, A4, A5};

#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup() {
  disp . setDigitPins ( numOfDigits , digitPins );
  disp . setDPPin (5) ;
  sensors.begin();
  disp.setDutyCycle(80);

}

void loop() {
  sensors.requestTemperatures();
  disp . write (sensors.getTempCByIndex(0), 1) ;
  disp.setRefreshRate(100);
}

 

Link to comment
Share on other sites

Un prim pas ar fi acela de a muta instructiunea 

 disp.setRefreshRate(100);

 in functia void setup(), iar in loc de valoarea 100 sa incercati si valori mai mari.
Cel mai bun mod de a comanda afisoare cu 7 segmente esta acela in care se foloseste o intrerupere generata de unul din timere.
Vedeti acest exemplu de afisare bazat pe folosirea unei intreruperi.

 

Link to comment
Share on other sites

Mersi.
Am mutat instructiunea in void setup, dar fara rezultat. Am marit de la (100) la (1000) refreshul, acelasi licarit, dar se reduce intensitatea luminoasa a digitilor.
Am sa studiez si comanda afisajului cu intreruperi

Link to comment
Share on other sites

Acum 5 minute, costi002 a spus:

Valoarea de aici

disp.setDutyCycle(80);

ai incercat sa o modifici?

Da am incercat, daca micsorez (30) scade luminozitatea afisaj, o cresc ( pana la 100) creste luminozitatea.

De aceea am si apelat pe forum, nu stiu cum sa elimin acel licarit.
Am ceasul contruit de @GanMark cel cu 8 digiti LED, de la rusi, acela merge super, nu licare, cand afiseaza temp se modifica cifra dupa punct (zecimala) fara licarit.

Edited by GeoMar
Link to comment
Share on other sites

DS18B20 necestia timpi destul de precisi la citire. Din cauza asta rutina de citire a lui DS18B20 blocheaza tot microcontrolerul. Ca sa nu mai clipeasca afisajul, trebuie sa amesteci rutina de citire a lui DS18B20 cu cea de afisare, respectand in acelasi timp toti timpii pentru DS18B20. Ceea ce e imposibil in C...

Eventual poti face citiri mai rare a lui DS18B20 si mai multe afisari. Dar afisajul tot o sa clipeasca in timpul citirii lui DS18B20.

Link to comment
Share on other sites

Nu ma pricep prea bine dar e clar ca ai un delay aiurea ce nu este facut cu intreruperi, posibil chiar sa fie ceva din biblioteca.

Incearca sa afisezi ceva dar fara a avea legatura cu citirea / biblioteca DS-ului. E normal ca atunci cand pui un factor de umplere mic sa ai o scadere a luminozitatii cum e normal sa se intample cand ai o rata foarte mare de actulizare / frecveta.

l.e: cimitavita a dat un raspunt complet si a fost mai rapid.

Am o problema oarecum similara la citirea / trimiterea valorilor unui DS18B20 pe MODBUS TCP/IP, trebuie sa asptept cel putin 750ms pana am rezultatul de la senzor.

 

Link to comment
Share on other sites

Ok, am inteles, NU se poate fara acel licarit.
Ca sa "camuflam" acel licarit ca sa nu mai fie vizibil, cum modific in soft ca sa faca ceva asemnator ca in clipul atasat si sa pot citi mai multi senzori DS (4-5)?

 

L.E.

Se vede in clip ca atunci cand afiseaza temperatura senzorului 4 si 6 se actualizeaza fara licarit digitul 3, cel dupa virgula. Cum se poate face acest lucru fara acel licarit al afisajului?

 

Edited by GeoMar
Link to comment
Share on other sites

Se poate face fara sa licare, dar numai cel ce a facut biblioteca stie ce e de facut. De aceea imi place sa imi fac singur anumite rutinele, sa stii exact ce se intampla acolo. DS-ul face relativ greu conversia, dar nu e nevoie sa stai dupa el. Ii dai comanda de conversie, apoi il lasi sa isi faca treba, intre timp, afisezi valoarea anterioara.

Link to comment
Share on other sites

Da, daca te pricepi este mai bine sa-ti faci tu rutinele cum doresti.
Asa cum am scris, sunt incepator si este prima data cand ma "joc" cu multiplexarea a 3 digiti LED, deci folosesc ce au pus altii la dispozitie.

Link to comment
Share on other sites

Ciao

In principiu acel licarit vine de la frecventa de afisare! In trecut am studiat in Bascom AVR problema asta si mi-am dat seama ca acest licarit vine de la frecventa de afisare! Nu intru in detalii ca presupun  ca sa studiat cum se face multiplexarea, dar trebuie cautat in rutine cat timp ii ia sa se mute de pe digit-ul 1 la digit 2 si respectiv 3! Daca acolo este frecventa mare atunci e clarca este de la rutina DS-ului care, cum spune cineva mai sus, poate dura conversia si atunci blocheaza mcu-ul respectiv apare acel licarit!

Nu cunosc codul Arduino, ca m-am jucat/ma joc in Bascom avr dar poti sa incerci sa verifice 1 data la 30 de secunde, temperatura si atunci acel licarit va avea loc doar la 30 sec. dar am eu impresia ca nici nu-l vei observa! 

O alta idee ar mai putea fi sa tatonezi un condesator de cativa nano in baza tranzistorilor multiplexori dupa rezistorul limitator!

O alta problema poate fi insusi tranzistorii, care pot fi o idee mai lenti si sa comute mai greoi, si spun asta deoarece am folosit in trecut pentru anod comun (sau catod...ca astea le tot incurc fara datasheet)  ceva pnp-uri si nu imi licarea dar in schimb unii digiti imi luminau mai tare, altii mai incet si treaba era random , se tot muta de la un digit la altul, pana cand am schimbat pnp-urile cu bc516 si ceasul a finctionat foarte ok! Tot de aici trebuie verificat daca acesti tranzistori furnizeaza curentul necesar ledurilor cand sunt toate aprinse!

O zi faina!

Link to comment
Share on other sites

Momentan pe breadboard NU am montati tranzistori.
Atat digitii cat si segmentele sunt comandate direct de arduino.
Am sa arunc o privire si prin librarie, dar sunt incepator, sa vad ce este pe acolo.

Edited by GeoMar
Link to comment
Share on other sites

Salut, GeoMar ! Eu m-am chinuit in zadar sa rezolv exact aceasta problema, dar cu program scris in PicBasicPro. Dupa luni de teste si muuulte sfaturi primite pe forumul de profil, am renuntat ! Pur si simplu nu am putut scapa de acel flicker ...

In alte limbaje de programare se poate scrie un soft perfect, fara niciun flicker ! Dar in PBP nu !

Sper ca tu sa gasesti totusi o rezolvare ! Bafta !

In atasament ai un model de termometru, FARA FLICKER (testat). Nu stiu exact in ce limbaj e scris...dar poate te ajuta cumva.

vnnik.zip

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.






×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines