Sari la conținut
ELFORUM - Forumul electronistilor

mihaicozac

Membru activ
  • Număr conținut

    648
  • Înregistrat

  • Ultima Vizită

Despre mihaicozac

  • Dată Naștere 11.04.1965

Vizitatori Recenți Profil

Blocul vizitatori recenți este dezactivat și nu este arătat altor utilizatori.

mihaicozac's Achievements

Proficient

Proficient (10/14)

  • First Post
  • Collaborator
  • Posting Machine Rare
  • Conversation Starter
  • Reacting Well

Recent Badges

  1. În principiu nu ai avea nevoie de un microcontroller, se poate realiza şi cu 2 divizoare rezistive, unul la ieşirea senzorului al doilea de la o referinţă de tensiune. Astfel poţi obţine o pantă de 1mV/bar, care se pot citi direct pe multimetru. Dacă însă vrei să foloseşti neapărat componentele cumpărate este relativ simplu de scris un program, ai nevoie de biblioteca de afişare pt. display senzorul se conectează la o intrare analogică apoi faci conversia valorilor cu funcţia map(). în funcţia loop() ai nevoie de ceva de genul: int sensorRead = analogRead(A0); // CITESTE TENSIUNEA SENZORULUI int bar = map(sensorRead, 102, 768, 0, 1600); // TRANSFORMA DOMENIUL DE VARIATIE Apoi faci afişarea folosind funcţile specifice bibliotecii afişajului, gen lcd.setCursor) şi lcd.Print.
  2. COP-ul de fapt ar trebui să fie minim 1.00, că nu ai cum să scoţi mai puţină putere pe ieşire decât introduci, chiar dacă nu extragi deloc energie din exterior.
  3. Poţi încerca să limitezi domeniul variabilei: float COP_f = Lminute * delta * 1.16; COP_f = constrain (COP_f, 0.01, 5.00); Sau cu max(): COP_f = max(COP_f, 0.01);
  4. Păi nu merge dacă înlocuieşti valoarea 500 în formula de calcul cu variabila Lminute x 60 ?
  5. Ai nevoie de un lcd.clear() înainte de orice schimbare de date la afişaj. Ca şi în setup(), unde există linia respectivă înainte de afişarea efectivă.
  6. Poţi face o scanare cu protocolul 1-wire şi să vezi dacă şi cum răspunde senzorul. Nu e greu de simulat, după un impuls reset de 500us se aşteaptă răspunsul de prezenţă de 120us apoi poţi da comenzi. Pt. aflarea adresei unice se dă comanda 0xF0, perifericul răspunde cu 7 bytes de adresă plus unul de CRC. Măcar ai un punct de plecare de la care poţi experimenta, e posibil ca setul de comenzi şi adrese să fie diferit de protocolul 1-Wire, cum e la Dell la memoriile din surse de ex. unde codul de produs a fost modificat în ROM dar restul funcţiilor sunt la fel.
  7. În mod clar nu e protoolul 1-Wire de la Dallas că ar fi trecut în documentaţie copyright-ul sau măcar un TM pe acolo. Din schema bloc e clar cum lucrează, emite un impuls ultrasonic scurt şi aşteaptă ecoul pe acelaşi traductor transformat în receptor. CEl mai simplu ar fi cu un osciloscop cu memorie sau analizor logic pe o maşină care foloseşte acelaşi senzor, aşa s-ar putea citi şi probabil interpreta traficul de date. Link-ul pus de tine nu se deschide, să vedem ce e pe acolo.
  8. Nu are cum să scape răspunsul, pt. că fără delay citirea intrării seriale se face de zeci de mii de ori pe secundă, şi doar dacă intră ceva în buffer se procesează condiţia if, iar asta durează probabil 2-3us după care iar verifică la nesfârşit intrarea serială. Pe de altă parte dacă treci pe recepţie şi ai timp mort cu delay-ul s-ar putea să pierzi datele de intrare dacă sunt transmise în acest timp. În mod normal ar trebui sincronizată cumva rularea ori cu millis() ori prin altă metodă. Dacă un byte de date are nevoie de 2ms să intre în buffer la 4800baud nu are rost să verifici mai des de atâta. În practică 50ms ar fi suficiente ca interval şi rămâne destul timp între pt. a face şi restul, cum ar fi afişarea plus bucătăria internă.
  9. Ar trebui verificată şi valoarea de la Serial.timeout(), care implicit este de 1000ms. Dacă ai rata de transmitere a datelor mai mică de valoarea asta pot apărea erori de interpretare a datelor. Dacă sunt de trimis 4 bytes mulţi folosesc metoda asta: if (Serial.available() > 3) {// ceva cu pointeri sau arii pt. refacerea variabilei} // sau mai rau if (Serial.available() == 4) {ca mai sus} Dacă apare o eroare la recepţie din cauză de întreruperi sau alt motiv bufferul rămâne cu 3 sau mai puţini bytes valizi şi apoi vine următoarea rafală de 4 bytes din care se iau în considerare doar primii până la completarea unei serii de 4 cu octeţii din buffer după care se face citirea şi prelucrarea, iar de aici se dă peste cap tot. Deci dacă trimiţi rafalele la interval de 500ms valoarea lui Serial.timeout() trebuie să fie mai mică, undeva între 100-200ms. Dacă rata de transmitere este mai mare de 1 secundă atunci ce am scris eu nu mai este valabil.
  10. Noi le-am cumpărat direct din Polonia de la fabricant, în poze care sunt mai vechi apare un alt display fabricat de Glyn, dar apoi am ales Riverdi pt. că era aproape la jumătate preţul deşi calitatea e mai slabă, unghi mai prost şi reflexii mai mari. Din ce am văzut TME are pe stoc display-uri din seria RVT70... dar s-au scumpit al dracului.
  11. Există o bibliotecă gata scrisă pt. astfel de situaţii, se numeşte Serial Transfer Library, e foarte simplu de folosit.
  12. mihaicozac

    Indicator nivel apa

    Ar merge şi invers, cu 3 ieşiri de strobe şi o singură intrare de echo. Avantajul ar fi că se poate folosi o întrerupere hardware la pinul de intrare în loc de PulseIn şi programul rulează fără blocaje.
  13. mihaicozac

    Indicator nivel apa

    Funcţie de aplicaţie comparaţia poate avea şi 3 stări. De ex. int result = a < b ? -1 : a > b ? 1 : 0; Însă în cazul unui port digital e clar că nu pot fi decât 2 stări, 0 şi 1.
  14. mihaicozac

    Indicator nivel apa

    În C/C++ boolean true este orice valoare afară de zero, care este false. Deci poţi scrie if(value) dacă value are orice valoare non-zero se consideră true.
  15. mihaicozac

    Indicator nivel apa

    @Alex vw Dacă toate rezervoarele sunt identice e simplu de modificat schiţa, defineşti încă 2 seturi de intrare-ieşire pt. senzori şi îi denumeşti trigPin1 şi echoPin1, respectiv trigPin2 şi echoPin2, apoi încorporezi toată bucla loop iniţială într-o funcţie cu 2 parametri de intrare respectiv triggerPin şi echoPin căreia îi dai un nume de ex. getLevel(int trig_pin, int echo_pin). Mai ai nevoie de un numărător în buclă cu 3 stări, care poate fi de ex. o variabilă int counter = 0; şi un buton de incrementare a stării numărătorului până la 2 şi apoi din nou la zero,, apelat printr-o întrerupere de flanc pe un pin care suportă întreruperi, 2 sau 3. În final mai ai nevoie de 3 leduri de afişare a rezervorului în care tocmai se face măsurătoarea. Per total ai nevoie astfel de 4 + 3 + 1 = 8 pini suplimentari faţă de cei 9 existenţi. Cu Arduino Uno ar merge direct, la ESP8266 însă ar fi nevoie de multiplexor extern. Dacă rezervoarele nu sunt identice atunci mai nevoie de încă 2 seturi de parametri ai rezervorului iar funcţia getLevel() primeşte în plus la argumente setul de lucru al parametrilor respectivi: // REZERVOARE IDENTICE switch (counter) { case 0: getLevel(trigPin, echoPin); break; case 1: getLevel(trigPin1, echoPin1); break; case 2: getLevel(trigPin2, echoPin2); break; } // REZERVOARE DIFERITE switch (counter) { case 0: getLevel(trigPin, echoPin, maximumRange, r); break; case 1: getLevel(trigPin1, echoPin1, maximumRange1, r1); break; case 2: getLevel(trigPin2, echoPin2, maximumRange2, r2); break; } În schiţă la rază scrie int r = 53.2 e clar că fiind integer se va lua în considerare doar 53 însă asta nu influenţează foarte mult calculul.
×
×
  • 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