Sari la conținut
ELFORUM - Forumul electronistilor

Cum poate Arduino sa faca doua "treburi" in acelasi timp.


mani

Postări Recomandate

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
  • Răspunsuri 30
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Imagini postate

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 de mihaicozac
Link spre comentariu

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

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
 
 
 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

 

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

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

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

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

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

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

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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • 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