Elektromos mennyezeti TV konzol vezérlése ARDUIno UNO R3-val

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
Shadow1988
Újonc
Újonc
Hozzászólások: 2
Csatlakozott: 2021. december 31. péntek, 7:09

Elektromos mennyezeti TV konzol vezérlése ARDUIno UNO R3-val

Hozzászólás Szerző: Shadow1988 »

Sziasztok!

Szeretnék egy mennyzeti TV konzolt vezérelni Arduinoval és IR távirányítóval.

A vezérlés valami hasonló elgondolású:
Ha megnyomom a bekapcsoló gombot a távirányítón minden funkció működik, amíg ez nem történik meg semmit nem tudok csinálni.
Bekapcsolást követően tudom mozgatni a konzolt különböző irányokba (LE/FEL). Folyamatos gombnyomás esetén a mozgás folyamatosan történik.

Egyenlőre ledekkel kisérletezem, igy még konkrét mozgás nincs, csak ledeket kapcsolgatok a távirányítóval.

A problémám a következő:
Valamiért nem tudom, megoldani, hogy a bekapcsoló gomb megfelelően működjön, és ellássa a feladatát. Amikor csak a folyamatos mozgáshoz szükséges funkció fut le az Arduinon akkor működik, de amint bele illesztem az engedélyezéshez szükséges kódot gyakorlatilag egyik funkció sem csinálja azt amit kellene.

Kód :

Kód: Egész kijelölése

#include <IRremote.h>
int RECV_PIN = 11;
int LED_PIN2 = 2;
int LED_PIN3 = 4;
int LED_PIN4 = 3;
int LED_PIN5 = 5;
int LED_PIN6 = 7;
int kapcs = 8;
int SET;
int PRG;
int on_off;
int a;
String string1,string;
int cmd;

IRrecv irrecv(RECV_PIN);
decode_results results;
void bemenet_vizsgalat(){ //ellenőrzi, hogy az adott gomb folyamatosan van nyomva, vagy nem, 
					//folyamatos nyomás esetén amíg nyomom addig világít a led

a++;
      if (irrecv.decode(&results)) {
       // Serial.println(results.value);
a=0;
        string1 =results.value; 
        if(results.value==4294967295){    
    
            string=string;                
        }else if(results.value<4294967295){ 
            string= string1;
        }
  
    
    irrecv.resume();
      Serial.print(string);
      Serial.print("  full   ");
      }
    else if(a>10){string="0";} 
  return string;
}




void setup() { 
      Serial.begin(9600);     
      irrecv.enableIRIn(); // Start the receiver
      pinMode(kapcs, INPUT);
      pinMode(LED_PIN2, OUTPUT);
      pinMode(LED_PIN3, OUTPUT);
      pinMode(LED_PIN4, OUTPUT);
      pinMode(LED_PIN5, OUTPUT);
      pinMode(LED_PIN6, OUTPUT);   
}

void loop() {
 if (irrecv.decode(&results)) { 	//bekapcsolás vizsgálat--> ha a bekapcsoló gombot megnyomom az on_off változó értékét átírja 1-re, Led 
 						//folyamatosan világít, mégegyszer megnyomom átírja on_off változót 0-ra Led nem világít
       // Serial.println(results.value);
if(results.value==68157695)
                           
                 {
                       if(on_off == 0)
                          {
                           digitalWrite(LED_PIN2, HIGH); 
                           on_off = 1;
                          }
                        else if(on_off == 1) 
                          {
                           digitalWrite(LED_PIN2,LOW); 
                           on_off = 0;
                          }
                          
                }
 irrecv.resume();
}


bemenet_vizsgalat();		//távirányítótól kapott információ vizsgálata
 
 
 // Melyik gombra mi történjen
 if(string=="68176055")cmd=2;  
      else if(string=="68208695")cmd=1;
      
      else cmd=0;    
              switch(cmd){
                  case 0:
                Serial.println("Nem mozog");
                
                digitalWrite(LED_PIN4, LOW);
                digitalWrite(LED_PIN6, LOW);
                break;
                  case 1:
                Serial.println("LEFELÉ");
                
                digitalWrite(LED_PIN4, HIGH);
                digitalWrite(LED_PIN6, LOW);
                break;        
                  case 2:
                Serial.println("Felfelé");
                
                digitalWrite(LED_PIN4, LOW);
                digitalWrite(LED_PIN6, HIGH);
                break;  
           
               
               }
 
 
 }
Biztos vagyok benne, hogy én hibázok valamiben, de sajnos nem tudok rájönni, hogy mi okozhatja a hibát.

Kérném a tapasztaltabb Arduino programozókat, segítsenek a hiba okának feltárásában.

Köszönöm előre is a segítséget.

Üdvözlettel
Szabolcs
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Elektromos mennyezeti TV konzol vezérlése ARDUIno UNO R3-val

Hozzászólás Szerző: Robert »

Ne < meg > legyen a dekódolt érték, hanem pontos egyezés....


Ez a folyamatos vizsgálat az elején nem az igazi,....

Lehetne egy sima dekódolást látni, hogy mi a státusz/vett kód, amikor 1x nyomsz gombot illetve nyomva tartod?
http://www.tavir.hu - a gazda :)
Shadow1988
Újonc
Újonc
Hozzászólások: 2
Csatlakozott: 2021. december 31. péntek, 7:09

Re: Elektromos mennyezeti TV konzol vezérlése ARDUIno UNO R3-val

Hozzászólás Szerző: Shadow1988 »

Közben már javítottam egy két dolgot a programban, így már hasonlóan működik mint ahogyan elképzeltem.

Már van benne egy két plusz dolog is.

A folyamatos vizsgálatot így módosítottam:

Kód: Egész kijelölése

  a=0;
        string1 =results.value; //string1 = bemenet kod gombbé
        if(results.value==4294967295){    //ha bemenet kód = folyamatos jele
                string=string;                //bemenet = bemenettel
        }else if(results.value!=4294967295){ //ha bemeneti jel kisebb mint folyamatos jel 
            string= string1;
        }
a folyamatos nyomás, illetve az egyszer megnyomott gomb közötti különbség soros monitorról kimásolva, hogy én is tudjam melyik gomb milyen értéket ad vissza.

Kód: Egész kijelölése

visszatérési érték				melyik gomb
68157695 						on/off
68176055  					fel
4294967295 					folyamatosan nyomva
68208695 						le
68184215  					jobbra
4294967295					folyamatosan nyomva
68167895  					balra
68200535  					OK
Közben csináltam, egy pár feltételt, amiben megvizsgálom, hogy melyik gomb van megnyomva, ekkor egy változót módosít (0 vagy 1 értékre). Így sikerült megoldanom a "bekapcsolás" utáni funkciók engedélyezését. Amíg a bekapcsológombot nem nyomom meg addig semmilyen funkció nem működik. Ezt különm a funkciókra is megírtam, mert minden funkcióban mást kell majd csinálnom.

Kód: Egész kijelölése

if(results.value==68157695){//távirányító on/off gomb megnyomva
                       if(on_off == 0) //ha on_off változó ==0
                          {
                            on_off = 1; //Változó érték beállítása 1-re
                          }
                        else if(on_off == 1) //ha on_off változó ==1
                          {on_off = 0; //Változó érték beállítása 0-ra
                          }
                          }
A teljes kódom jelenleg így néz ki, ebben már van egy két plusz dolog, potméter állásának ellenőrzése stb. Az EEprom.h azért van meghívva, mert a későbbiekben a programozott állások értékeit szeretném menteni EEPROM-ba, hogy esetleges áramszünet után is megmaradjanak a programozott értékek. Ez még a jelenlegi kódban nincs meg.

Kód: Egész kijelölése

#include <IRremote.h>
#include <EEPROM.h>
int redPin=9;
int greenPin=10;
int bluePin=11;
int RECV_PIN = 12;
int ALLOW_PIN = 2;
int PRG_PIN = 4;
int MOVE_UP_PIN = 7;
int LED_PIN5 = 5;
int MOVE_DOWN_PIN = 8;
int POTI_PIN=A0;
int SET;
int PRG;
int on_off;
int DATA;
int a;
String string1,string;
int cmd;
int value;
int automozgas;
IRrecv irrecv(RECV_PIN);
decode_results results;



void setup() {
 Serial.begin(9600);
     
      irrecv.enableIRIn(); // Start the receiver


      pinMode(ALLOW_PIN, OUTPUT);
      pinMode(PRG_PIN, OUTPUT);
      pinMode(MOVE_UP_PIN, OUTPUT);
      pinMode(MOVE_DOWN_PIN, OUTPUT);
      pinMode(redPin,OUTPUT);
      pinMode(greenPin,OUTPUT);
      pinMode(bluePin,OUTPUT);

}

void loop() {
    value = analogRead(POTI_PIN);          //Read and save analog value from potentiometer
  value = map(value, 0, 1023, 0, 90); //Map value 0-1023 to 0-90 
  delay(100);
  Serial.println(value);
  a++;
  if (irrecv.decode(&results)) {
       // Serial.println(results.value);
if(results.value==68157695){//távirányító on/off gomb megnyomva
                       if(on_off == 0) //ha on_off változó ==0
                          {
                            on_off = 1; //Változó érték beállítása 1-re
                          }
                        else if(on_off == 1) //ha on_off változó ==1
                          {on_off = 0; //Változó érték beállítása 0-ra
                          }
                          }
if(results.value==68170445 && on_off==1){
                        if(PRG == 0) 
                          {
                          PRG = 1; 
                          }
                        else if(PRG == 1) 
                          {
                          PRG = 0; 
                          }
                          }
if(results.value==68200535){
                        if(SET == 0) 
                          {
                          SET = 1; 
                          }
                        else if(SET == 1) 
                          {
                           SET = 0; 
                          }
                          }
if(results.value==68165855){
                        if(automozgas == 0) 
                          {
                          automozgas = 1;
                          }
                        else if(automozgas == 1)
                          {
                           automozgas = 0;
                          }
                          }                          
        a=0;
        string1 =results.value; //string1 = bemenet kod gombbé
        if(results.value==4294967295){    //ha bemenet kód = folyamatos jele
                string=string;                //bemenet = bemenettel
        }else if(results.value!=4294967295){ //ha bemeneti jel kisebb mint folyamatos jel 
            string= string1;
        }
   //Bemeneti jel vizsgálat vége 
    
    irrecv.resume(); // Receive the next value
}
else if(a>5){string="0";} // ha 5 minta után bemenet = 0 kikapcsol
if(on_off ==1){
  digitalWrite(ALLOW_PIN, HIGH);
}
else 
  digitalWrite(ALLOW_PIN, LOW);


if(PRG ==1 && on_off==1){
  //digitalWrite(PRG_PIN, HIGH);
   analogWrite(redPin,255);
  analogWrite(greenPin,0);
  analogWrite(bluePin,0);
}
else 
  //digitalWrite(PRG_PIN, LOW);
  analogWrite(redPin,0);
  analogWrite(greenPin,0);
  analogWrite(bluePin,0);


if(on_off == 1){
 if(string=="68176055")cmd=2;
      else if(string=="68208695" )cmd=1;
      else if(string=="68157695")cmd=3;

      else cmd=0;    
              switch(cmd){

                  case 0:
                digitalWrite(MOVE_UP_PIN, LOW);
                digitalWrite(MOVE_DOWN_PIN, LOW);
                break;
                  case 1:
                digitalWrite(MOVE_DOWN_PIN, HIGH);
                digitalWrite(MOVE_UP_PIN, LOW);
                break;        
                  case 2:
                digitalWrite(MOVE_DOWN_PIN, LOW);
                digitalWrite(MOVE_UP_PIN, HIGH);
                break;  
           
               }
if(SET==1){
  digitalWrite(PRG_PIN, HIGH);
    PRG=0;
    SET=0;
}
else  digitalWrite(PRG_PIN, LOW);

}
/*
if(automozgas==1 && value!=77){
  digitalWrite(MOVE_DOWN_PIN, HIGH);
  
}
else digitalWrite(MOVE_DOWN_PIN, LOW);
*/
}
A program maga ledekkel már elképzelés szerint működik, a következő lépés, egy kefés szabálszó, és kefés motor pwm vezérlése lesz, ezeket mindig külön prograokkal tesztelem és ha megtaláltam a megfelelő megoldást akkor illesztem be az eredeti kódba. Nem tudom videót tudok e beilleszteni a fórumon, ha esetleg igen akkor fel tudom tölteni a működés közbeni videót is.

Nem vagyok profi programozó, biztos, hogy van az elképzeléseimnek elegánsabb megoldása is, én így tudtam megoldani.

Építő jellegű kritikát szivesen fogadok, illetve, hogy hogyan lehetne szebbé, egyszerűbbé tenni a kódomat.
Válasz küldése