Jump to content
ELFORUM - Forumul Electronistilor

rlodina

Membru activ
  • Content Count

    218
  • Joined

  • Last visited

Community Reputation

24 Se poate si mai bine

About rlodina

  • Rank
    Membru
  • Birthday 07/07/1969

Profile Information

  • Locatie
    Baia Mare

Recent Profile Visitors

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

  1. Am rezolvat-o cu SIM800 (~60 lei) - a mers TOT din prima (este tot pe 2G). Lib: https://github.com/vshymanskyy/TinyGSM.git (inclusiv poți obține de la modem tens. bateriei - l-am alimentat dintr-o celula li-ion (defapt 2 in paralel)). Legat de M590E - cred că avea ceva probleme modulul care l-am avut eu. Posibil - la iesirea din funcția de initializare (din lib. tinyGSM) era deja conectat.
  2. Pornind de la observația că în array-ul image acolo unde-i 1 ledul este ON si la 0 este OFF putem deduce că deplasând la stanga / dreapta acele valori cu 1 ... vom obține efectul dorit. #define WAIT 300 unsigned long lastMove; void loop() { multiplexDisplay(); if (milis() - lastMove > WAIT) { lastMove = milis(); for (int i=0; i<8; i++) image[8] = image[8] << 1; } } Cod netestat (posibil să trebuiască ajustată un pic și funcția multiplexDisplay). Succes
  3. Vezi (ca sursa de inspirație): jeelabs/esplink
  4. @celtik ms de răspuns. nu-l folosesc cu Arduino - pt. teste m-am conectat direct la el cu un modul FTDI USB-UART într-un terminal pot să comunic cu modulul - răspunde la comenzile AT. l-am alimentat și la 4.7V (fără diodă) direct dintr-o sursă care sigur duce > 2A. condensatorul este nou Problema este că nu se conectează la rețea. Q1 - Ce nu știu: trebuie rulate ceva comenzi AT (la power-on) - necesare conectării la rețeaua GSM ? Q2 - Tu în ce rețea l-ai folosit ? Q3 - Îți mai aduci aminte ce trebuia configurat ? Flow: la power on apare mesajul: MODEM:STARTUP -> ledul blink la 1 sec după câteva secunde: +PBREADY -> ledul blink la 1 sec după aprox 3 min - ledul off Între 2 și 3 modemul răspunde corect la comenzi de genul: AT+CGSN -> afișare IMEI = OK AT+CCID -> afișare serie SIM ? = OK AT+CSQ -> afișare calitate semnal (răspunde : 28 sau 30) AT+CREG? -> cum stai cu înregistrarea în rețea ? - răspunde +CREG: 0,3 3=not registered, the terminal is searching base stations după aprox 1 min răspunde +CREG: 0,0 0=not registered, the terminal is not searching new operators și gata - trebuie un nou restart (e ok și unul soft - un pin (boot) la GND). Probabil e dus ceva la el (nu am decât o bucată ... nici nu mai comand) - mâine-mi vine un SIM800L care sper să-mi mergă din prima.
  5. Ms - caut o antenă mai adecvată (am incercat și pe balcon .... unde tel - setat pe 2G - are semnal ok).
  6. Am șuntat dioda - și-l alimentez direct la 3.9 V (recomandat) + 2200uF pe alim.
  7. Da. Nu are pin activat. Nu am incercat, dar am remarcat că sunt comenzi AT pt. controlul complet legat de PIN, setare, schimbare, dezactivare, etc.
  8. Bună. Am o problemă cu acest modul: Știți vreo incompatibilitate a acestui modul cu rețeaua Vodafone ? Nu se conectează la rețea. Din datasheet: Frequency bands: EGSM900/DCS1800 Dual-band, or GSM850/1900 or Quad-band Pe scurt: - este alimentat corect (sursa capabilă să livreze 2 A). - răspunde la comenzi (gen: AT+CCID - serie cartelă, ATI - info modem, nivel semnal ~30, caută rețeaua (aprox 1 min.) după care nimic, nu a găsit nici o rețea - locația are acoperire 2G (GPRS) - cartela merge pe 2G (GPRS) - probată în telefon A folosit cineva cu succes acest modul ? Incompatibil cu retea/cartela/ etc ? Device-ul ar trebui să posteze (mici info.), pe un site (GPRS), în ziua activă (o dată la ~30 de zile). E adevărat, ăsta-i doar 20 lei, probabil SIM800 este (din ce văd pe net) mai folosit. Voi aveți o recomandare. Mulțumesc
  9. Rezolvat - prin înlocuire (cu unul recuperat dintr-o centrala cu alte hibe).
  10. Servomotorul este funcțional. Am să comand o vană second. Centrala este operațională - nu vreau să o desfac acum => STOP căldură, fără sa am certitudinea că pot să o rezolv - sau cel puțin să nu o stric mai rău.
  11. Nu prea cred. Nu am demontat-o - doar intuiesc ce-i acolo: un mic motoraș care acționează robinetul de comutare -> apă caldă - încălzire. Este un element în mișcare ... La cum picură mă gândesc că numai pe la ax - ceva orning .. și-a trăit și el viața ...
  12. Bună ziua. A început să-mi picure robinetul cu 3 căi de la centrala din titlu. Nu aș renunța la ea - măcar încă câțiva ani. Știți cumva un furnizor de piese la un preț mai accesibil decât la "distribuitorul oficial" (poate ceva kit de reparație - dacă nu tot ansamblu) ? Mulțumesc.
  13. Nu știu sigur ce probleme tehnice implică soluția cu analogRead in utilizare, in special cand intervalele sunt multe - mă gândesc în special la rezistența contactului butoanelor care poate varia în timp (impurități, ozidare), etc ... - poate cineva cu mai multă experiență ne poate da un hint. Am gasit un articol interesant (legat de subiect): http://www.rau-deaver.org/1-wire_keyboard.html - conține și un mic program de calcul rezistențe + generează și un codul pt. interpretarea intervalelor bazat pe o mulțime de parametrii (inclusiv toleranța rezistorilor) ...
  14. Salut - felicitări pt. perseverență. Te-ai prins, folosind clase, codul ar fi mai structurat + f. important: mai ușor de folosit. Practic acele funcții pe care tu care le definești ca fiind publice (în clasă) constitue așa numită "interfață" - pe care eu, ca utilizator al bibliotecii tale, trebuie să o știu - restul ține de implementare. Este f. important să proiectezi o interfață simplu de utilizat (puține functii, valori implicite la parametrii unde-i cazul) Constructorul clasei - si se apelează o singură dată la alocarea variabilei (nu la compilare). Ex: TriButton b1(A0, 1, 200); //alocata pe stivă TriButton *b2 = new TriButton(A1, 1, 200); //alocata în heap la ultimii 2 parametrii ai putea să le dai valori implicite (cele mai uzuale - dacă se pretează la tine) si atunci constructorul ar arata de forma: TriButton ::TriButton (int analogPIN, int delay = 2000, int autoRepeatSpeed=5); nu te zgârci la denumirea parametrilor - pt. mine este mai explicativ autoRepeatSpeed decât clk. astfel îmi permiți o declarare de forma: TriButton b1(A0); // delay si autoRepeatSpeed ar lua valorile implicite 2000 respectiv 5 + dacă vrei să forțezi trecerea prin acest constructor - marcheaza ca privat constructorul implicit ( TriButton::TriButton) pe care-l generează compilatorul dacă tu nu-l definești. În fișierul header, în secțiunea private a clasei scrie funcția TriButton(){} => următorul cod generează eroare de compilare: TriButton b1; Nu se poate apela constructotul implicit deoarece este declarat privat - si asta si urmărim - butonul nostru are nevoie obligatoriu de pin-nul .... Mai există un constructor generat implicit: constructrul de copiere (cu semnatura: TriButton(const TriButton& ) ) - musai declarat (și implementat) dacă în clasă aloci dinamic resurse (new, malloc, prop. pointeri, etc) și vrei ca eu să pot folosi clasa ta într-un cod de forma: void Procesare(TriButton b){ // aici la apel se apeleaza constructorul de copiere //practic variabila b1 (din setup) este copiata în variabila locala b //folosinduse de constructorul de copiere definit de tine } void setup(){ TriButton b1(A0); procesare(b1); } am trimis variabila b1 ca parametru la o funcție. N'o acum îmi pare rău că am amintit de acest constructor de copiere că tu nu ai nevoie acum de el (nu aloci nimic ....) În variata a 2-a a clasei poate o faci mai flexibilă: - de ce musai 3 butoane lasă-mă să o pot folosi cu 2 cu 5 cu 7 .... - și poate nu am rezistori folosiți de tine => am alte domenii - dă-mi posibilitatea să-mi pot eu defini intervalele. Ex. eu asa as dori să o folosesc - așa mi se pare mai simplu: #include "Btn.h" void OnIncrement(){ Serial.println("OnIncrement"); } void OnDecrement(){ Serial.poprintln("OnDecrement"); } void OnReset(){ Serial.println("OnReset"); } TriBtn myTriBtn(A0); //are max 3 butoane void setup(){ //atasez functii la combinatiile care ma intereseaza myTriBtn.OnClick_A(OnIncrement); myTriBtn.OnClick_B(OnDecrement); myTriBtn.OnClick_A_B(OnReset); } void loop(){ myTriBtn.loop(); //să respire și el } și o posibilă implementare: #ifndef __BTN_H__ #define __BTN_H__ #ifndef MAX_INTERVALE #define MAX_INTERVALE 10 #endif class Btn{ public: typedef void (*callback)(); //definim o descriere de functie //constructor Btn(int pin, int delay = 0, int repeatAt = 500 /* milisec*/): _pin(pin), _delay(delay), _repeatAt(repeatAt){ //secventa de mai sus _pin(pin) este echivalenta cu _pin = pin } //salvez intervalele si adresa functiei de callback void OnClick(int minValue, int maxValue, callback callback){ _intervale[_nrIntervale].minValue = minValue; _intervale[_nrIntervale].maxValue = maxValue; _intervale[_nrIntervale].onClick = callback; _nrIntervale++; } //citeste val. pin, cauta intervalul si apeleaza functia callback atasata void loop(){ int val = analogRead(_pin); for(int i = 0; i< _nrIntervale; i++){ if (val >= _intervale[i].minValue && val <= _intervale[i].maxValue){ if (_intervale[i].onClick != NULL) { return _intervale[i].onClick(); } } } } private: Btn(){} //no acces to implicit constructor int _pin; int _delay; int _repeatAt; int _nrIntervale; //butoane apasate + intervale + callback struct Data{ int minValue; int maxValue; callback onClick; }; Data _intervale[MAX_INTERVALE]; }; //specializez clasa Btn // ex: ptr. 3 butoane cu un set dat de rezitori => intervale cunoscute class TriBtn : public Btn{ public: TriBtn(int pin, int delay = 0, int repeatAt = 500 /* milisec*/): Btn(pin, delay, repeatAt){} void OnClick_A(callback callback){ Btn::OnClick(100, 200, callback);} void OnClick_B(callback callback){ Btn::OnClick(410, 500, callback);} void OnClick_A_B(callback callback){ Btn::OnClick(210, 300, callback);} }; #endif // __BTN_H__ care-mi permite și construcția cu 5 butoane: Btn myKey(A0); void OnActiuneA(){ Serial.println("OnActiuneA"); } void OnActiuneB(){ Serial.println("OnActiuneB"); } /* etc. */ void OnActiuneABC(){ Serial.println("OnActiuneABC"); } void setup(){ //definesc toate combinațiile care ma intereseaza + intervalele lor myKey.OnClick(100, 200, OnActiuneA); myKey.OnClick(210, 300, OnActiuneB); myKey.OnClick(310, 400, OnActiuneC); myKey.OnClick(410, 500, OnActiuneD); myKey.OnClick(510, 600, OnActiuneAB); myKey.OnClick(610, 700, OnActiuneAC); // la apasarea simultana a but A + B + C se citeste o valoare in intervalul 710 - 800 myKey.OnClick(710, 800, OnActiuneABC); } void loop(){ myKey.loop(); } ATENTIE ! - cod netestat - intervale din burtă, nu am implementat delay si autoRepeat, debounce, etc.... Maximă: Varianta cea mai bună a unui cod este cea pe care tu o înțelegi (și merge). Restul sunt bigudiuri ... Martin Fowler (e un pic celebru tipul) a spus: “Any fool can write code that a computer can understand. Good programmers write code that humans can understand.” Succes
  15. Doar i-mi dau cu parerea - si in final nu vreau decat sa te incurajez sa nu abandonezi. Metoda de a invata programare prin "compilare" cod din diverse surse fara sa intelegi conceptual modul de functionare nu-i cel mai recomandat ... Probabil o idee ar fi sa "rupi" aplicatia in mici module pe care sa le dezvolti (si sa le intelegi) separat ... Deduc din postarea ta: Input: - Temp1 - Temp2 - Foto-cell Out: - sneck t1->ON|OFF, t2->ON|OFF, ... - ventilator -> turatie variabila - bujie - pompa -> ON|OFF Idei: - am putea sa ne facem un pic ordine "in minte" folosind o diagrama de stari (state machine) - acele etape prin care trece mica noastra automatizare. - Timer.h -> probabil fiecare actiune ai putea sa o implementezi intr-o functie si cu ajutorul clasei Timer sa le apelezi la intervalele sau pe perioada dorita Succes
×
×
  • Create New...