GeoMar Postat Martie 11, 2018 Partajează Postat Martie 11, 2018 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 spre comentariu
Elison Postat Martie 11, 2018 Partajează Postat Martie 11, 2018 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 spre comentariu
GeoMar Postat Martie 11, 2018 Autor Partajează Postat Martie 11, 2018 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 spre comentariu
costi002 Postat Martie 11, 2018 Partajează Postat Martie 11, 2018 Incearca sa scazi de la 100 la 50, poate merge asa Link spre comentariu
GeoMar Postat Martie 11, 2018 Autor Partajează Postat Martie 11, 2018 (editat) Am scazut si la 50, chiar si la 10, mai pregnant se vede acel licarit. Editat Martie 11, 2018 de GeoMar Link spre comentariu
costi002 Postat Martie 11, 2018 Partajează Postat Martie 11, 2018 Valoarea de aici disp.setDutyCycle(80); ai incercat sa o modifici? Link spre comentariu
GeoMar Postat Martie 11, 2018 Autor Partajează Postat Martie 11, 2018 (editat) 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. Editat Martie 11, 2018 de GeoMar Link spre comentariu
cimitavita Postat Martie 11, 2018 Partajează Postat Martie 11, 2018 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 spre comentariu
Stefan Postat Martie 11, 2018 Partajează Postat Martie 11, 2018 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 spre comentariu
GeoMar Postat Martie 11, 2018 Autor Partajează Postat Martie 11, 2018 (editat) 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? Editat Martie 11, 2018 de GeoMar Link spre comentariu
costi002 Postat Martie 11, 2018 Partajează Postat Martie 11, 2018 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 spre comentariu
GeoMar Postat Martie 11, 2018 Autor Partajează Postat Martie 11, 2018 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 spre comentariu
Ionut Remus Postat Martie 11, 2018 Partajează Postat Martie 11, 2018 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 spre comentariu
GeoMar Postat Martie 11, 2018 Autor Partajează Postat Martie 11, 2018 (editat) 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. Editat Martie 11, 2018 de GeoMar Link spre comentariu
fratello Postat Martie 11, 2018 Partajează Postat Martie 11, 2018 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 spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum