Sari la conținut
ELFORUM - Forumul electronistilor

Telecomanda IR cu arduino LED-uri


gabitzu2006

Postări Recomandate

Pai in afara de initializare (in setup) butonul 9 nu mai are nici o treaba cu restul. Sau asa ar trebui.

Iar ledul 9 ar trebui sa se stinga cand nu mai apesi butonul 9.

 

OK, am mai gasit ceva de reparat.

#include <IRremote.h>

#define NR_TOTAL_IESIRI 5
#define NR_IESIRI_UP_DOWN 4
int RECV_PIN = 2; // the pin where you connect the output pin of sensor
int relay1 = 4;
int relay2 = 5;
int relay3 = 6;
int relay4 = 7;
int relay9 = 9;  //releu acticat cat butonul 9 e apasat
int idxRel9 = 4;
int relayPins[] = {relay1, relay2, relay3, relay4, relay9};  //array with all the relays' pins
int relayStates[] = {0,0,0,0,0}; //the initial state of relays

int iRepeatCounter = 0;

#define code1 16753245    // code received from button no. 1
#define code2 16736925    // code received from button no. 2
#define code3 16769565    // code received from button no. 3
#define code4 16720605    // code received from button no. 4
#define code5 16718055    // cod pt up
#define code6 16730805    // cod pt down
#define code9 16716015    // cod noua


IRrecv irrecv(RECV_PIN);
decode_results results;

bool bRecRepeat = false;

void setup() {
  Serial.begin(115200);
  irrecv.enableIRIn(); // Start the receiver  
  for(uint8_t i = 0; i < NR_TOTAL_IESIRI; ++i){
     pinMode(relayPins[i], OUTPUT);
//     pinMode (9, OUTPUT);
     digitalWrite(relayPins[i], LOW);
     
  }

  delay(5);
}


void loop() {
  static int idx = -1; //index iesire

  if (irrecv.decode(&results)) {
    unsigned int value = results.value;

    iRepeatCounter = millis();          
    switch(value) {
       case code1: 
              idx = 0; //prima iesire, 
              relayStates[idx] ^= 1; //inverseaza starea
              bRecRepeat = false;
           break;
       case code2: 
              idx = 1; 
              relayStates[idx] ^= 1; 
              bRecRepeat = false;
           break;
       case code3: 
              idx = 2; 
              relayStates[idx] ^= 1; 
              bRecRepeat = false;
           break;
       case code4: 
              idx = 3; 
              relayStates[idx] ^= 1; 
              bRecRepeat = false;
           break;
       case code5: //up 
              idx++; // selecteaza urmatoarea iesire
              idx %= NR_IESIRI_UP_DOWN; //daca e 4, ia-o de la capat
              relayStates[idx] = 1; //fa iesirea 1
              bRecRepeat = false;
           break;
       case code6: //down
              idx--; //selecteaza iesirea precedenta
              if(idx < 0){ //daca e negativa, ia-o pe cea mai mare
                idx = NR_IESIRI_UP_DOWN - 1;
              }
              relayStates[idx] = 1; //fa iesirea 1
              bRecRepeat = false;
           break;
       case code9: 
              relayStates[idxRel9] = HIGH;
              bRecRepeat = true;
           break;
       case REPEAT : 
              bRecRepeat = true;
           break;
       default : 
              bRecRepeat = false;
    } //switch


    if(value != code9){
      for(int i = 0; i < NR_IESIRI_UP_DOWN; ++i){ // modifica iesirea in functie de testele anterioare.
        if(i == idx){
          digitalWrite(relayPins[i], relayStates[i]);
        } else {
          digitalWrite(relayPins[i], LOW);
        }
      } //for
    } //if(value != code9
    
    irrecv.resume(); // Receive the next value
  } //if (irrecv.decode(&results))

  if(relayStates[idxRel9] && bRecRepeat){
    digitalWrite(relayPins[idxRel9], HIGH);
  } else {
    digitalWrite(relayPins[idxRel9], LOW);
    relayStates[idxRel9] = LOW;
  }
    
  if((millis() - iRepeatCounter) > 120){ //mai mult de 120 ms de la ultimul cod receptionat => repeat 
    bRecRepeat = 0;
  }
}  

 

Link spre comentariu
  • Răspunsuri 58
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Daca inca n-ai apucat sa testezi codul anterior, testeaza-l direct pe urmatorul:

#include <IRremote.h>

#define NR_TOTAL_IESIRI 5
#define NR_IESIRI_UP_DOWN 4
int RECV_PIN = 2; // the pin where you connect the output pin of sensor
int relay1 = 4;
int relay2 = 5;
int relay3 = 6;
int relay4 = 7;
int relay9 = 9;  //releu acticat cat butonul 9 e apasat
int idxRel9 = 4;
int relayPins[] = {relay1, relay2, relay3, relay4, relay9};  //array with all the relays' pins
int relayStates[] = {0,0,0,0,0}; //the initial state of relays

int iRepeatCounter = 0;

#define code1 16753245    // code received from button no. 1
#define code2 16736925    // code received from button no. 2
#define code3 16769565    // code received from button no. 3
#define code4 16720605    // code received from button no. 4
#define code5 16718055    // cod pt up
#define code6 16730805    // cod pt down
#define code9 16716015    // cod noua


IRrecv irrecv(RECV_PIN);
decode_results results;

bool bRecRepeat = false;

void setup() {
  Serial.begin(115200);
  irrecv.enableIRIn(); // Start the receiver  
  for(uint8_t i = 0; i < NR_TOTAL_IESIRI; ++i){
     pinMode(relayPins[i], OUTPUT);
//     pinMode (9, OUTPUT);
     digitalWrite(relayPins[i], LOW);
     
  }

  delay(5);
}


void loop() {
  static int idx = -1; //index iesire

  if (irrecv.decode(&results)) {
    unsigned int value = results.value;

    iRepeatCounter = millis();          
    switch(value) {
       case code1: 
              idx = 0; //prima iesire, 
              relayStates[idx] ^= 1; //inverseaza starea
              bRecRepeat = false;
           break;
       case code2: 
              idx = 1; 
              relayStates[idx] ^= 1; 
              bRecRepeat = false;
           break;
       case code3: 
              idx = 2; 
              relayStates[idx] ^= 1; 
              bRecRepeat = false;
           break;
       case code4: 
              idx = 3; 
              relayStates[idx] ^= 1; 
              bRecRepeat = false;
           break;
       case code5: //up 
              idx++; // selecteaza urmatoarea iesire
              idx %= NR_IESIRI_UP_DOWN; //daca e 4, ia-o de la capat
              relayStates[idx] = 1; //fa iesirea 1
              bRecRepeat = false;
           break;
       case code6: //down
              idx--; //selecteaza iesirea precedenta
              if(idx < 0){ //daca e negativa, ia-o pe cea mai mare
                idx = NR_IESIRI_UP_DOWN - 1;
              }
              relayStates[idx] = 1; //fa iesirea 1
              bRecRepeat = false;
           break;
       case code9: 
              relayStates[idxRel9] = HIGH;
              bRecRepeat = true;
           break;
       case REPEAT : 
              bRecRepeat = true;
           break;
       default : 
              bRecRepeat = false;
    } //switch


    if((value != code9) && (value != REPEAT)){
      for(int i = 0; i < NR_IESIRI_UP_DOWN; ++i){ // modifica iesirea in functie de testele anterioare.
        if(i == idx){
          digitalWrite(relayPins[i], relayStates[i]);
        } else {
          digitalWrite(relayPins[i], LOW);
        }
      } //for
    } //if(value != code9
    
    irrecv.resume(); // Receive the next value
  } //if (irrecv.decode(&results))

  if(relayStates[idxRel9] && bRecRepeat){
    digitalWrite(relayPins[idxRel9], HIGH);
  } else {
    digitalWrite(relayPins[idxRel9], LOW);
    relayStates[idxRel9] = LOW;
  }
    
  if((millis() - iRepeatCounter) > 120){ //mai mult de 120 ms de la ultimul cod receptionat => repeat 
    bRecRepeat = 0;
  }
}  

Daca ai apucat, trebuie schimbata numai linia cu

    if(value != code9) {

in

    if((value != code9) && (value != REPEAT)){

 

 

Link spre comentariu

Ca tot n-am mare lucru de facut chiar acum:

#include <IRremote.h>

#define NR_TOTAL_IESIRI 5
#define NR_IESIRI_UP_DOWN 4
int RECV_PIN = 2; // the pin where you connect the output pin of sensor
int relay1 = 4;
int relay2 = 5;
int relay3 = 6;
int relay4 = 7;
int relay9 = 9;  //releu acticat cat butonul 9 e apasat
int idxRel9 = 4;
int relayPins[] = {relay1, relay2, relay3, relay4, relay9};  //array with all the relays' pins
int relayStates[] = {0,0,0,0,0}; //the initial state of relays

int iRepeatCounter = 0;

#define code1 16753245    // code received from button no. 1
#define code2 16736925    // code received from button no. 2
#define code3 16769565    // code received from button no. 3
#define code4 16720605    // code received from button no. 4
#define code5 16718055    // cod pt up
#define code6 16730805    // cod pt down
#define code9 16716015    // cod noua


IRrecv irrecv(RECV_PIN);
decode_results results;

bool bRecRepeat = false;

void setup() {
  Serial.begin(115200);
  irrecv.enableIRIn(); // Start the receiver  
  for(uint8_t i = 0; i < NR_TOTAL_IESIRI; ++i){
     pinMode(relayPins[i], OUTPUT);
//     pinMode (9, OUTPUT);
     digitalWrite(relayPins[i], LOW);
     
  }

  delay(5);
}


void loop() {
  static int idx = -1; //index iesire

  if (irrecv.decode(&results)) {
    unsigned long value = results.value;

    iRepeatCounter = millis();          
    switch(value) {
       case code1: 
              idx = 0; //prima iesire, 
              relayStates[idx] ^= 1; //inverseaza starea
           break;
       case code2: 
              idx = 1; 
              relayStates[idx] ^= 1; 
           break;
       case code3: 
              idx = 2; 
              relayStates[idx] ^= 1; 
           break;
       case code4: 
              idx = 3; 
              relayStates[idx] ^= 1; 
           break;
       case code5: //up 
              idx++; // selecteaza urmatoarea iesire
              idx %= NR_IESIRI_UP_DOWN; //daca e 4, ia-o de la capat
              relayStates[idx] = 1; //fa iesirea 1
           break;
       case code6: //down
              idx--; //selecteaza iesirea precedenta
              if(idx < 0){ //daca e negativa, ia-o pe cea mai mare
                idx = NR_IESIRI_UP_DOWN - 1;
              }
              relayStates[idx] = 1; //fa iesirea 1
           break;
       case code9: 
              relayStates[idxRel9] = HIGH;
              bRecRepeat = true;
           break;
       case REPEAT : 
              bRecRepeat = true;
           break;
       default : 
              bRecRepeat = false;
    } //switch


    if((value != code9) && (value != REPEAT)){
      bRecRepeat = false;
      relayStates[idxRel9] = LOW;
      digitalWrite(relayPins[idxRel9], LOW);      
      
      for(uint8_t i = 0; i < NR_IESIRI_UP_DOWN; ++i){ // modifica iesirea in functie de testele anterioare.
        if(i == idx){
          digitalWrite(relayPins[i], relayStates[i]);
        } else {
          digitalWrite(relayPins[i], LOW);
        }
      } //for
    } //if(value != code9
    
    irrecv.resume(); // Receive the next value
  } //if (irrecv.decode(&results))

  if(relayStates[idxRel9] && bRecRepeat){
    digitalWrite(relayPins[idxRel9], HIGH);
  } else {
    digitalWrite(relayPins[idxRel9], LOW);
    relayStates[idxRel9] = LOW;
  }
    
  if((millis() - iRepeatCounter) > 120){ //mai mult de 120 ms de la ultimul cod receptionat => clear repeat 
    bRecRepeat = 0;
  }
  
  delay(10); 
} //loop 

Da' daca nici de data asta nu merge, cred ca ma las pagubas, ca ideile mi s-au cam epuizat.

Editat de Liviu M
Link spre comentariu

Acum am testat ultimul cod. In prima faza merge fara cusur, insa dupa cateva rulari prin leduri incepe sa faca asa: la fiecare apasare a butonului stanga imi da un blink si atat, indiferent de cat timp tin apasat butonul. cred ca esti pe aproape...

totusi nu inteleg de ce dupa cateva butonari se strica treaba

Link spre comentariu

De obicei problema e intre scaun si tastatura. Am folosit tipul gresit de date la iRepeatCounter. Initial am vrut sa-l folosesc altfel, dupa un timp am modificat si am uitat sa adaptez tipul. Cel putin asa cred. Incepusem sa pun niste mesaje de debug cand m-am prins. Le las comentate in cod. Daca tot nu merge, le activam.

 

#include <IRremote.h>

#define NR_TOTAL_IESIRI 5
#define NR_IESIRI_UP_DOWN 4
int RECV_PIN = 2; // the pin where you connect the output pin of sensor
int relay1 = 4;
int relay2 = 5;
int relay3 = 6;
int relay4 = 7;
int relay9 = 9;  //releu acticat cat butonul 9 e apasat
int idxRel9 = 4;
int relayPins[] = {relay1, relay2, relay3, relay4, relay9};  //array with all the relays' pins
int relayStates[] = {0,0,0,0,0}; //the initial state of relays

unsigned long iRepeatCounter = 0;

#define code1 16753245    // code received from button no. 1
#define code2 16736925    // code received from button no. 2
#define code3 16769565    // code received from button no. 3
#define code4 16720605    // code received from button no. 4
#define code5 16718055    // cod pt up
#define code6 16730805    // cod pt down
#define code9 16716015    // cod noua


IRrecv irrecv(RECV_PIN);
decode_results results;

bool bRecRepeat = false;

void setup() {
  Serial.begin(115200);
  irrecv.enableIRIn(); // Start the receiver  
  for(uint8_t i = 0; i < NR_TOTAL_IESIRI; ++i){
     pinMode(relayPins[i], OUTPUT);
//     pinMode (9, OUTPUT);
     digitalWrite(relayPins[i], LOW);
     
  }

  delay(5);
}


void loop() {
  static int idx = -1; //index iesire

  if (irrecv.decode(&results)) {
    unsigned long value = results.value;

//    Serial.print("Code = ");
//    Serial.print(value);

    iRepeatCounter = millis();          
    switch(value) {
       case code1: 
              idx = 0; //prima iesire, 
              relayStates[idx] ^= 1; //inverseaza starea
           break;
       case code2: 
              idx = 1; 
              relayStates[idx] ^= 1; 
           break;
       case code3: 
              idx = 2; 
              relayStates[idx] ^= 1; 
           break;
       case code4: 
              idx = 3; 
              relayStates[idx] ^= 1; 
           break;
       case code5: //up 
              idx++; // selecteaza urmatoarea iesire
              idx %= NR_IESIRI_UP_DOWN; //daca e 4, ia-o de la capat
              relayStates[idx] = 1; //fa iesirea 1
           break;
       case code6: //down
              idx--; //selecteaza iesirea precedenta
              if(idx < 0){ //daca e negativa, ia-o pe cea mai mare
                idx = NR_IESIRI_UP_DOWN - 1;
              }
              relayStates[idx] = 1; //fa iesirea 1
           break;
       case code9: 
              relayStates[idxRel9] = HIGH;
              bRecRepeat = true;
//              Serial.print("  code9 ");
           break;
       case REPEAT : 
              bRecRepeat = true;
//              Serial.print(" repeat ");
           break;
       default : 
              bRecRepeat = false;
    } //switch

//    Serial.print(" idx = ");
//    Serial.println(idx);

    if((value != code9) && (value != REPEAT)){
      bRecRepeat = false;
      relayStates[idxRel9] = LOW;
      digitalWrite(relayPins[idxRel9], LOW);      
      
      for(uint8_t i = 0; i < NR_IESIRI_UP_DOWN; ++i){ // modifica iesirea in functie de testele anterioare.
        if(i == idx){
          digitalWrite(relayPins[i], relayStates[i]);
        } else {
          digitalWrite(relayPins[i], LOW);
        }
      } //for
    } //if(value != code9
    
    irrecv.resume(); // Receive the next value
  } //if (irrecv.decode(&results))

  if(relayStates[idxRel9] && bRecRepeat){
    digitalWrite(relayPins[idxRel9], HIGH);
//    Serial.println("tin apasat 9");
  } else {
    digitalWrite(relayPins[idxRel9], LOW);
    relayStates[idxRel9] = LOW;
//    Serial.println("sting 9");
  }
    
  if((millis() - iRepeatCounter) > 120){ //mai mult de 120 ms de la ultimul cod receptionat => clear repeat 
    bRecRepeat = 0;
//    Serial.println("nici un buton apasat");
  }
  
  delay(10); 
} //loop 

 

Link spre comentariu

Intre butoane nu e nici o legatura, problema e de timp.

Variabila pe care o foloseam pentru detectarea de buton (ne)apasat era prea "mica" - dupa ~1 minut de functionare a montajului era depasita - rezultatul apelului millis() nu mai incape in ea si testul

 

if((millis() - iRepeatCounter) > 120){

era tot timpul adevarat, resetand imediat LEDul 9.

Link spre comentariu

Am reusit sa testez codul si merge! L-am chinuit un pic, cateva minute si cred ca a trecut si testul timpului.  Acum functioneaza cum trebuie. Ramâne sa implementez eu comenzile pentru al 5-lea led și pt tasta OK. Sper sa ma descurc si pentru tasta dreapta, sa functioneze la fel ca si stanga. La o prima vedere prin cod, s-ar putea sa-mi prind urechile. Nu cred ca am timp in seara asta sa fac ce vreau, dar nu e graba. Revin cand am noutati. Inca o data, mii de multumiri! Si sper sa ma mai ajuti daca nu imi iese ce mi-am propus sa mai implementez in cod.

Link spre comentariu

am reusit sa-l stric! am vrut sa mai bag niste butoane si led-uri si...nu mi-a iesit.

#include <IRremote.h>

#define NR_TOTAL_IESIRI 6
#define NR_IESIRI_UP_DOWN 5
int RECV_PIN = 2; // the pin where you connect the output pin of sensor
int relay1 = 4; // releu 1
int relay2 = 5; // releu 2
int relay3 = 6; // releu 3
int relay4 = 7; // releu 4
int relay7 = 8; // releu 5
int relay9 = 9;  //releu activat cat butonul stanga e apasat(volume up)
int relay8 = 10; //releu activat cat butonul dreapta e apasat(volume down)
int idxRel9 = 5;
int relayPins[] = {relay1, relay2, relay3, relay4, relay7, relay8, relay9};  //array with all the relays' pins
int relayStates[] = {0,0,0,0,0,0,0}; //the initial state of relays

unsigned long iRepeatCounter = 0;

#define code1 16753245    // code received from button no. 1
#define code2 16736925    // code received from button no. 2
#define code3 16769565    // code received from button no. 3
#define code4 16720605    // code received from button no. 4
#define code7 16712445    // code received from button no. 5
#define code5 16718055    // cod pt up
#define code6 16730805    // cod pt down
#define code9 16716015    // cod stanga (stanga/volume up)
#define code8 16734885    // code dreapta (dreapta/volume down)


IRrecv irrecv(RECV_PIN);
decode_results results;

bool bRecRepeat = false;

void setup() {
  Serial.begin(115200);
  irrecv.enableIRIn(); // Start the receiver  
  for(uint8_t i = 0; i < NR_TOTAL_IESIRI; ++i){
     pinMode(relayPins[i], OUTPUT);
//     pinMode (9, OUTPUT);
     digitalWrite(relayPins[i], LOW);
     
  }

  delay(5);
}


void loop() {
  static int idx = -1; //index iesire

  if (irrecv.decode(&results)) {
    unsigned long value = results.value;

//    Serial.print("Code = ");
//    Serial.print(value);

    iRepeatCounter = millis();          
    switch(value) {
       case code1: 
              idx = 0; //prima iesire, 
              relayStates[idx] ^= 1; //inverseaza starea
           break;
       case code2: 
              idx = 1; 
              relayStates[idx] ^= 1; 
           break;
       case code3: 
              idx = 2; 
              relayStates[idx] ^= 1; 
           break;
       case code4: 
              idx = 3; 
              relayStates[idx] ^= 1; 
           break;
       case code7: 
              idx = 4; 
              relayStates[idx] ^= 1; 
           break;
       case code5: //up 
              idx++; // selecteaza urmatoarea iesire
              idx %= NR_IESIRI_UP_DOWN; //daca e 4, ia-o de la capat
              relayStates[idx] = 1; //fa iesirea 1
           break;
       case code6: //down
              idx--; //selecteaza iesirea precedenta
              if(idx < 0){ //daca e negativa, ia-o pe cea mai mare
                idx = NR_IESIRI_UP_DOWN - 1;
              }
              relayStates[idx] = 1; //fa iesirea 1
           break;
       case code9: 
              relayStates[idxRel9] = HIGH;
              bRecRepeat = true;
              Serial.println("  code9 ");
           break;
       case REPEAT : 
              bRecRepeat = true;
//              Serial.print(" repeat ");
           break;
       default : 
              bRecRepeat = false;
    } //switch

//    Serial.print(" idx = ");
//    Serial.println(idx);

    if((value != code9) && (value != REPEAT)){
      bRecRepeat = false;
      relayStates[idxRel9] = LOW;
      digitalWrite(relayPins[idxRel9], LOW);      
      
      for(uint8_t i = 0; i < NR_IESIRI_UP_DOWN; ++i){ // modifica iesirea in functie de testele anterioare.
        if(i == idx){
          digitalWrite(relayPins[i], relayStates[i]);
        } else {
          digitalWrite(relayPins[i], LOW);
        }
      } //for
    } //if(value != code9
    
    irrecv.resume(); // Receive the next value
  } //if (irrecv.decode(&results))

  if(relayStates[idxRel9] && bRecRepeat){
    digitalWrite(relayPins[idxRel9], HIGH);
//    Serial.println("tin apasat 9");
  } else {
    digitalWrite(relayPins[idxRel9], LOW);
    relayStates[idxRel9] = LOW;
//    Serial.println("sting 9");
  }
    
  if((millis() - iRepeatCounter) > 120){ //mai mult de 120 ms de la ultimul cod receptionat => clear repeat 
    bRecRepeat = 0;
//    Serial.println("nici un buton apasat");
  }
  
  delay(10); 
} //loop 

reusesc sa comand cele 5 leduri, in schimb ledul 9 nu se mai aprinde, desi pe serial primesc code9. oricum, e dezordine si la code-uri, si la relay si la butoane. Mi-e ca daca ma apuc eu sa le ordonez iar fac varza. Sau o las pe alta data, cand voi fi mai odihnit si poate mai inspirat. Oricum, pun si un tabel cam cum ar trebui sa actioneze butoanele de pe telecomanda si codurile lor.

taste.docx

Link spre comentariu

Da, trebuia sa dau mai multe detalii despre cod.

1. De fiecare data trebuie cand modifici numarul de iesiri, trebuie sa actualizezi NR_TOTAL_IESIRI. In codul tau e 5, ar trebui sa fie 7. Altfel nu functioneaza cum trebuie initializarea (for(uint8_t i = 0; i < NR_TOTAL_IESIRI; ++i){...)

2. Ordinea iesirilor in relayPins[] este super importanta. Incepe cu 0, asa ca in codul tau trebuie idxRel9 = 6, nu 5 ca acum.

S-ar putea ca asta sa fie totul. Incearca si daca tot nu vrea, mai cautam.

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