mani Postat Ianuarie 30, 2019 Autor Partajează Postat Ianuarie 30, 2019 Buna seara , nu deschid alt topic pentru ca tema aceasta face parte din acelasi proiect. Va rog sa ma ajutati cu un sfat ,un exemplu de cod pentru ca nu reusesc sa-i dau de capat .Am o bujie care aprinde peletii la un arzator ,fiind frig , ca e iarna , rezistenta acesteia se pune in scurtcircuit si activeaza protectia sursei de pc care alimenteaza toata electronica si mecanica ,are in total vreo 36 A . Vreau sa implementez o alimentare a bujiei in pulsuri si m-am gandit ca primele 10 secunde din aprindere sa functioneze in acest mod: - primele 2 secunde : bujie on - 2 msec ---------------------- aici se alimenteaza bujia un 20% (100Hz) bujie off - 8 msec --------------------- pulsuri active de 2 msec si pulsuri inactive 8 msec - urmatoarele 8 secunde : bujie on - 5 msec----------------- aici se alimenteaza bujia un 50% (100Hz) bujie off - 5 msec ---------------- pulsuri active de 5 msec si pulsuri inactive 5 msec Ar trebui sa fie cu ajutorul unui timer dar nu reusesc. Nu vreau sa pun alimentator separat pentru bujie pentru ca nu am loc . Multumesc , o seara buna . Link spre comentariu
mihaicozac Postat Ianuarie 30, 2019 Partajează Postat Ianuarie 30, 2019 (editat) O variantă ar fi următoarea: creezi o variabilă "smooth" cu valoare iniţială zero în setup(). Când vrei să aprinzi bujia incrementezi şi variabila smooth în acelaşi timp. Adică faci aşa ceva: if(dacă trebuie aprinsă bujia) { bujie = 255; smooth++; smooth = min(smooth, 255);} else { bujie = 0; smooth = 0;} apoi scrii ]ntr-un pin PWM comanda analogWrite(6, min(smooth, bujie); iar semnalul din pinul comanda un mosfet legat la bujie. Functie de viteza de procesare PWM-ul ajunge la maximum dupa un timp oarecare de 2-3 secunde. Daca insa ai delay() ]n schita varianta mea nu functioneaza corect pt. ca timerul "smooth" are nevoie de 255 de reiterari ale programului sa ajunga la maximum si atunci va trebui sa folosesti millis(), ceva de genul unsigned long start = millis(); // initializare variabila smooth =( millis() - start) / 16; 16 e o valoare empirica, cu ea ajungi cu PWM-ul la maximum dupa cca. 255 x 16 ms adica 4 secunde. Editat Ianuarie 30, 2019 de mihaicozac Link spre comentariu
Marin1960 Postat Ianuarie 31, 2019 Partajează Postat Ianuarie 31, 2019 O alta varianta pentru @mani, care tine cont de cerintele lui ar fi: / aprindere bujie la centrala // primele 2 secunde, pulsuri active 2 msec si pulsuri inactive 8 msec: // bujie on 2 msec, aici se alimenteaza bujia cu 20% (100Hz) // bujie off 8 msec, // urmatoarele 8 secunde, pulsuri active 5 msec si pulsuri inactive 5 msec: // bujie on 5 msec, aici se alimenteaza bujia cu 50% (100Hz) // bujie off 5 msec, // #define bujie 4 //pin de comanda bujie unsigned long temp; // void setup() { pinMode(bujie,OUTPUT); digitalWrite(bujie, LOW); temp = millis(); bujieOn(2000,2,8); // primele 2 secunde bujieOn(8000,5,5); // urmatoarele 8 secunde digitalWrite(bujie, HIGH); // bujia ramane permanent aprinsa } // void loop() { } //----------- void bujieOn(int durata, int on, int off){ while(millis()-temp < durata){ puls(on,HIGH); puls(off,LOW); } } //--------- void puls(int t,bool state){ digitalWrite(bujie,state); while(t) { t--; delay(1); } } Link spre comentariu
mani Postat Ianuarie 31, 2019 Autor Partajează Postat Ianuarie 31, 2019 Multumesc ,acum sunt la munca si postez de pe telefon ,am sa probez Maine. O zi buna tuturor. Link spre comentariu
Marin1960 Postat Ianuarie 31, 2019 Partajează Postat Ianuarie 31, 2019 Acum am vazut o greseala in schita postata mai sus! Secventa incepand cu temp = millis(); ar trebui sa fie asftfel: ..... temp = millis(); bujieOn(2000,2,8); // primele 2 secunde temp = millis(); // trebuie reinitializat temp! bujieOn(8000,5,5); // urmatoarele 8 secunde etc... Link spre comentariu
mani Postat Ianuarie 31, 2019 Autor Partajează Postat Ianuarie 31, 2019 Multumesc mult ,elegante solutii , adevarul e ca nici nu m-am gandit ca se poate rezolva de maniera aceasta. O seara frumoasa. Link spre comentariu
mani Postat Februarie 1, 2019 Autor Partajează Postat Februarie 1, 2019 volatile int TICK = 0; byte START_TIMER = 0; boolean FLAG_TIMER = 0; #define ventilator 5 #define motor_inainte 11 void setup() { pinMode(ventilator, OUTPUT); pinMode(motor_inainte,OUTPUT); //set timer1 interrupt every 10ms cli(); TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; OCR1A = 2499; //(16.000.000MHz * 10ms) / 64 -1 TCCR1B |= (1 << WGM12); //CTC mode TCCR1B |= (1 << CS11) | (1 << CS10); //prescaler 64 TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt sei(); } ISR(TIMER1_COMPA_vect) { TICK = TICK + 1; if(TICK >= 100) { TICK =0; if(FLAG_TIMER) { if(START_TIMER) { START_TIMER = START_TIMER - 1; } } } } void loop() { curatire(); } void curatire() { if(FLAG_TIMER = 0) { if(START_TIMER = 5) { analogWrite(ventilator,255); digitalWrite(motor_inainte,HIGH ); } } FLAG_TIMER = 0; analogWrite(ventilator,0); digitalWrite(motor_inainte,LOW ); } Buna ziua ,greu e cand esti incepator.Vin cu o noua rugaminte . Poate cineva sa modifice codul pentru a temporiza motorul si ventilatorul pornite timp de 5 secunde si apoi sa ramana oprite. Multumesc mult. Link spre comentariu
mani Postat Februarie 1, 2019 Autor Partajează Postat Februarie 1, 2019 Buna ziua ,greu e cand esti incepator. Vin cu o noua rugaminte .La postarea de mai sus cu codul, am gresit ,a iesit codul inaintea comentariului . Poate cineva sa modifice codul pentru a temporiza motorul si ventilatorul pornite timp de 5 secunde si apoi sa ramana oprite. Multumesc mult. Link spre comentariu
Marin1960 Postat Februarie 1, 2019 Partajează Postat Februarie 1, 2019 Am incercat sa inteleg codul tau, dar mai usor a fost sa fac unul care sa corespunda cerintelor tale. #define ventilator 5 #define motor_inainte 11 const int cst_durata = 5000; // 5000ms = 5secunde // void setup() { pinMode(ventilator, OUTPUT); pinMode(motor_inainte,OUTPUT); digitalWrite(ventilator,HIGH); digitalWrite(motor_inainte,HIGH); delay(cst_durata); analogWrite(ventilator,LOW); digitalWrite(motor_inainte,LOW ); } void loop(){ } Link spre comentariu
Marin1960 Postat Februarie 1, 2019 Partajează Postat Februarie 1, 2019 Ah, topicul este despre cum poate face Arduino doua lucruri in acelasi timp! In acest sens schita de sus corespunde cerintei, dar nu topicului. Mai jos o schita care le imbina pe amandoua: #define ventilator 5 #define motor_inainte 11 unsigned long temp; bool curatire_on = false; bool aici_conditia_ta = true; //true ar trebui setata in codul tau // void setup() { pinMode(ventilator, OUTPUT); pinMode(motor_inainte,OUTPUT); digitalWrite(ventilator,LOW); digitalWrite(motor_inainte,LOW ); } void loop(){ if(curatire_on) curatire(5000); // 5000ms = 5secunde if(aici_conditia_ta){ digitalWrite(ventilator,HIGH); digitalWrite(motor_inainte,HIGH ); curatire_on = true; temp = millis(); } // codul tau unde setezi "aici_conditia_ta" in functie // de nevoile tale } void curatire(int durata){ aici_conditia_ta = false; if(millis()-temp < durata) return; digitalWrite(ventilator,LOW); digitalWrite(motor_inainte,LOW); curatire_on = false; } Link spre comentariu
mani Postat Februarie 1, 2019 Autor Partajează Postat Februarie 1, 2019 Va multumesc mult, am probat si codul pentru bujie si merge perfect. Ma mai poticnesc ca am multe lagune in programare si la 48 de ani intra cam greu informatia in cortex. Am sa mai deranjez pe aici pe forum si cu alte situatii,sper sa nu deranjez, Inca o data multumiri si o seara frumoasa va doresc. Link spre comentariu
mani Postat Februarie 3, 2019 Autor Partajează Postat Februarie 3, 2019 Buna ziua ,codul postat de domnul Marin merge perfect ,cand conectez arduino, porneste ventilatorul si motorul si dupa 5 secunde se opresc. Daca pun conditia ca fiind adevarata in partea mea de cod si conectez din nou arduino ,ventilatorul si motorul nu se mai opresc dupa 5 secunde raman permanent pornite, imi foloseste varianta aceasta de cod pentru aplicatia mea ,dar as dori si o alta varianta care am gandit-o dupa ce am cerut aici ajutorul vostru. Am incercat ieri toata ziua sa modific codul dar nu am reusit de nici un fel sa-l fac sa functioneze in felul urmator : cand conectez arduino ventilatorul si motorul sa fie oprite si cand eu pun conditia mea adevarata in codul meu , sa porneasca ventilatorul si motorul 5 secunde si sa se opresca dupa aceea. V-as ruga daca puteti si cand aveti timp ,si daca nu e mare deranj sa modificati codul si sa functioneze cum am descris mai sus pentru ca am nevoie si de aceasta varianta de cod. Va multumesc inca odata. O zi frumoasa va doresc. Link spre comentariu
Liviu M Postat Februarie 3, 2019 Partajează Postat Februarie 3, 2019 Posteaza ce ai facut pana acum, poate e mai simplu de corectat un cod care aproape merge. Link spre comentariu
Marin1960 Postat Februarie 3, 2019 Partajează Postat Februarie 3, 2019 Cred ca nu m-am exprimat eu cum trebuie! In codul tau, linia 5 ar trebui sa fie "false" la inceput: bool aici_conditia_ta = false; //true ar trebui setata in codul tau Undeva in program iei decizia sa pornesti ventilatorul si motorul, atunci faci "aici_conditia_ta" true si motorul va functiona cat pui tu in functia "curatire(5000)", in acest caz 5000 ms = 5 secunde. O sa fac un exemplu pentru tine, pinul 12 daca-l pui la masa pentru scurt timp (nu permanent!), atunci schita va functiona exact asa cum iti doresti. Link spre comentariu
Marin1960 Postat Februarie 3, 2019 Partajează Postat Februarie 3, 2019 Atentie, in codul tau, daca conditia "aici_conditia_ta" nu face parte dintr-un lant de decizii, ci este pusa pur si simplu in corpul loop-ului, atunci motoarele vor merge practic continuu (o scurta intrerupere la finalul rutinei "curatire()", prea scurta pentru a o sesiza! In exemplul urmator, "aici_conditia_ta" este setata o singura data prin intermediul pinului 12: // liniile bordate de stelute sunt pentru a simula comanda ta // de pornire a motoarelor si a trebui sterse din programul final #define ventilator 3 #define motor_inainte 4 unsigned long temp; bool curatire_on = false; bool aici_conditia_ta = false; //true ar trebui setata in codul tau // void setup() { pinMode(ventilator, OUTPUT); pinMode(motor_inainte,OUTPUT); digitalWrite(ventilator,LOW); digitalWrite(motor_inainte,LOW ); } void loop(){ if(curatire_on) curatire(5000); // 5000ms = 5secunde if(aici_conditia_ta){ digitalWrite(ventilator,HIGH); digitalWrite(motor_inainte,HIGH ); curatire_on = true; temp = millis(); } //****************************** // codul dintre liniile cu stelute ar trebui sters din programul final // sunt doar pentru a simula comanda ta "aici_conditia_ta = true;" // pinul 12 pus la masa pentru scurt timp pinMode(12, INPUT_PULLUP); if(!digitalRead(12)){ // codul tau unde setezi "aici_conditia_ta" in functie aici_conditia_ta = true; // de nevoile tale } //****************************** } void curatire(int durata){ aici_conditia_ta = false; if(millis()-temp < durata) return; digitalWrite(ventilator,LOW); digitalWrite(motor_inainte,LOW); curatire_on = false; } Cred ca at trebui sa postezi si incercarile tale, sa vedem unde este problema. Succes! 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