Liviu M Postat Martie 24, 2021 Partajează Postat Martie 24, 2021 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
Liviu M Postat Martie 24, 2021 Partajează Postat Martie 24, 2021 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
gabitzu2006 Postat Martie 24, 2021 Autor Partajează Postat Martie 24, 2021 l-am testat si pe ultimul. la inceput merge, dar dupa cateva rulari prin led-uri...oboseste led9...si palpaie aproape imperceptibil. Link spre comentariu
Liviu M Postat Martie 24, 2021 Partajează Postat Martie 24, 2021 Ma mai gandesc si maine, desi chiar nu-mi dau seama ce nu e bine. OK, poate-poate. Schimba unsigned int value = results.value; in unsigned long value = results.value; Link spre comentariu
Liviu M Postat Martie 25, 2021 Partajează Postat Martie 25, 2021 (editat) 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 Martie 25, 2021 de Liviu M Link spre comentariu
gabitzu2006 Postat Martie 25, 2021 Autor Partajează Postat Martie 25, 2021 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
Liviu M Postat Martie 25, 2021 Partajează Postat Martie 25, 2021 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
gabitzu2006 Postat Martie 25, 2021 Autor Partajează Postat Martie 25, 2021 Incerc codul in seara asta, sper. Multumesc mult pentru implicare. Poate ii inspiri si pe altii...sau macar pe mine. Ce mi-am dat seama e ca era o legatura in cod intre led9 si celelalte...stiu ca nu e mare lucru, dar parca incep sa mai inteleg cate ceva. Link spre comentariu
Liviu M Postat Martie 25, 2021 Partajează Postat Martie 25, 2021 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
gabitzu2006 Postat Martie 25, 2021 Autor Partajează Postat Martie 25, 2021 deci am inteles mai mult de o gramada. Acum are sens, deci era o problema cu timpul scurs, nu cu numarul apasarilor. Link spre comentariu
Liviu M Postat Martie 25, 2021 Partajează Postat Martie 25, 2021 Vedem deseara cine a inteles cum trebuie. Link spre comentariu
gabitzu2006 Postat Martie 25, 2021 Autor Partajează Postat Martie 25, 2021 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
Liviu M Postat Martie 25, 2021 Partajează Postat Martie 25, 2021 Pune tu intrebarile si mai vedem. Daca sunt suficient de interesante... Link spre comentariu
gabitzu2006 Postat Martie 25, 2021 Autor Partajează Postat Martie 25, 2021 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
Liviu M Postat Martie 25, 2021 Partajează Postat Martie 25, 2021 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
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