Jump to content
ELFORUM - Forumul electronistilor

mihaicozac

Membru activ
  • Content Count

    593
  • Joined

  • Last visited

Community Reputation

33 Se poate si mai bine

About mihaicozac

  • Rank
    Membru
  • Birthday 04/11/1965

Profile Information

  • Locatie
    Luftenberg, Austria

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. PWMValue ar trebui să fie o variabilă tip byte nu int. PWM-ul din Arduino lucrează pe 8 biţi, un int acolo care poate trece şi în domeniul negativ dacă nu ai grijă e cam nepotrivit, ar mai fi nevoie de o linie PWMValue = constrain(PWMValue, 0, 50), amplasată după ce incrementezi variabila.
  2. Modulul Arduino are neboie de minim 7V la intrare, pe stabilizatorul de tensiune cad cam 2V minim. Probabil la pornirea motorului tensiunea de reţea scade şi stabilizatorul de 5V nu mai poate menţine tensiunea fixă. Dacă BOD-ul e setat prea jos nici nu se resetează şi rămâne aşa cu registrele corupte.
  3. Dacă ai un powerbank ar fi util să faci o probă cu montajul alimentat din el nu din adaptor, aşa poţi elimina o incertitudine, dacă paraziţii vin prin sursă sau inducţie în firele dintre montaj şi afişaj. Eu înclin să cred că Arduino se zăpăceşte, şi consecinţa e că nici afişajul nu mai merge.
  4. Cum arată etajul de ieşire? de fapt cum conanzi hardware încărcarea?
  5. Asta nu e mare scofală, stabileşti 2 praguri V_Max şi V_Min funcţie de chimia bateriilor, şi faci condiţiile: charge = V < V_Max ? TRUE : FALSE; digitalWrite(un_pin_liber, charge); Variabila booleană "charge" comandă printr-o ieşire releul sau tranzistorul sau ce ai pe acolo între panoul solar şi baterie. Asta e o funcţie de bază, în practică ar mai trebui introdus şi un histerezis ca să nu tot comute aiurea când ajunge în jurul pragului V_Max. V_Min se poate folosi ca să decuplezi ieşirea când bateria e descărcată: output = V > V_Min ? TRUE : FALSE; digitalWrite(alt_pin_liber, output);
  6. Foloseşti o variabilă float "energy" care pleacă de la zero şi la fiecare ciclu de 10ms se incrementează cu V x A x 1 / 360000. energy = energy += V * A * 1/360000; Dacă schimbi viteza buclei trebuie modificat şi raportul de înmulţire.
  7. VSCode cu PlatformIO mi se pare mult mai performant decât IDE-ul original de la Arduino.
  8. Eu mă refeream la implementarea în programele obişnuite, ca un fel de debug simplu.
  9. Ce repede a sărit pointerul la valori negative... Folosind o funcţie din asta s-ar putea scrie în loop() o linie gen if(freeMemory() < 32) digitalWrite(somePin, HIGH); şi pune un led pe acea ieşire, iar în caz de blocare a programului dacă vedem ledul aprins vom şti de ce s-a blocat.
  10. Teoretic şi watchdog timerul şi BOD-ul duc la resetarea microcontroller-ului nu la blocarea lui. Pe de altă parte temporizările bazate pe millis() pot duce la erori în cazul în care millis() ajunge la limita de sus şi se dă peste cap, în cazul ăsta dacă ai operaţii gen actual_millis - previous_millis variabila rezultată este de valoare foarte mare şi negativă dacă este un integer simplu sau ai o condiţie nedeterminată dacă variabila este unsigned.. Aici e nevoie de o condiţie suplimentară cum ar fi if(previous_millis < actual_millis) sau ceva asemănător. Apoi mai e şi problema funcţiilor nested, în care se alocă resurse progresiv, pt. că stiva din RAM se poate umple rapid dacă ai variabile multe şi lungi. Şi întreruperile dese sunt păcătoase pt. că procesorul salvează în stivă operaţiile curente ca să poată prelucra întreruperea şi în cazul mai multor întreruperi simultane şi complexe generate fie de programul principal fie de alte funcţii sau biblioteci poţi ajunge rapid la umplerea stivei. La scrierea programului ţi se raportează câtă memorie RAM rămâne liberă pt. variabilele locale, deci se poate estima cam câte niveluri de imbricare sunt safe. Regula este să nu treci de 50-60% RAM folosit dacă ai multe funcţii în funcţii.
  11. Eu împart codul în 3 zone în ordine, citirea intrărilor, prelucrarea datelor şi comanda ieşirilor plus afişarea. Dacă viteza programului e mult mai mare ca a procesului nici nu prea contează cum scrii softul Dacă e proces critic e mai bine să laşi afişarea pe un controller separat, care preia datele paralel cu cel principal.
  12. O bună practcă e de a le numi cât mai sugestiv chiar dacă ies nume lungi, chiar şi booleenele se pot numi gen "is_the_power_switch_closed" pt. că astfel codul devine mult mai citeţ. iar dacă peste 3 ani vrei să faci o revizie software scuteşti timp de acomodare, mai ales dacă e şi comentat la greu. Am avut un controller de încărcare baterie cu ATMega328P, făcut pe placă, nu cu modul de cumpărat. la care am legat un led pe o ieşire care cpilea dacă totul mergea bine şi rămânea aprins dacă sistemul se resetase între timp. Problema era că la conectarea adaptorului de reţea se restarta aleator dar nu întotdeauna. Mă deranja restartarea pt. că trebuia recalibrată din nou bateria şi nu mai afişa corect starea ei pe display. În final un condensator mai mare pe pinul de reset a rezolvat problema. Am mai avut de asemenea probleme cu ceva module chinezeşti Mini Pro, din cele care se vând 10 deodată, cu sigla Baite pe ele, şi care dădeau erori de afişarea pe un LCD 12864 dacă schiţa era mai complexă, dar nu se blocau. E posibil să fi fost echipate cu cipuri aruncate la testarea din fabrică.
  13. Posibil ca millis() să fie de vină. Pe de altă parte, am o automatizare de încălzire centrală care funcţionează cu lunile fără blocaje. Nu foloseşte millis() nicăieri.
  14. ar mai trebui adăugată o linie după cele 2: float scale = (battMax - battMin) / 100; float procent = (voltage - battMin) / scale; procent = constrain(procent, 0, 100); altfel te trezeşti cu valori aiurea pt. procentul bateriei dacă tensiunea este sub prag sau peste.
  15. Păi schimbă numele din scale în divisions sau ce vrei tu, scaleValue, scalation, diviziune, etc N-am ştiut că mai foloseşti o variabilă scale altundeva. Poţi renunţa la if-urile alea de la sfârşit şi scrie direct Serial.print(procent), o să ai precizie mai bună.
×
×
  • 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