Автор Тема: DTMF управлениe  (Прочетена 10223 пъти)

kalos

  • Робо-Новак
  • *****
  • Публикации: 14
    • Профил
DTMF управлениe
« -: Октомври 10, 2011, 12:28:29 pm »
Здравейте,
от доста време насам съм започнал да изработвам устройство за управление чрез DTMF от общ характер. Като начало ще го разработя да си паля колата зимата :)
Идеята е освен самото запалване да може да се контролират 5-6 консуматора (вентилатор на парното, светлини и други).
За приемник и декодер на DTMF използвам чип 8870.

Поради недостига на свободно време е силно изразен в моето ежедневие, съм стигнал до "разкодирането" на постъпващите цифри и съм забил тук.

int   Q1_PIN     = 2;
int   Q2_PIN     = 4;
int   Q3_PIN     = 7;
int   Q4_PIN     = 8;
int   StD_PIN    = 13;
int   LED_PIN    = 3;
int   tempNum;
char  tempChar;
int   inKey[3];    //array for incomming password store
int   myKey[3] = {1, 2, 3, 4}; //Password
void setup()
{
  pinMode(Q1_PIN, INPUT);
  pinMode(Q2_PIN, INPUT);
  pinMode(Q3_PIN, INPUT);
  pinMode(Q4_PIN, INPUT);
  pinMode(StD_PIN, INPUT);
  pinMode(LED_PIN, OUTPUT);

  analogWrite(LED_PIN,255);
  delay(100);
  for(int i=255;i>=10;i--)
  {
    analogWrite(LED_PIN,i);
    delay(4);
  }

  Serial.begin(9600);
  Serial.println("Ready for DTMF...");
}


void loop()
{
  while (digitalRead(StD_PIN) == 0); //waiting for StD signal
  int q1= digitalRead(Q4_PIN);
  int q2= digitalRead(Q3_PIN);
  int q3= digitalRead(Q2_PIN);
  int q4= digitalRead(Q1_PIN);

  if (q4 == HIGH){
    tempNum = 1;  //make tempNum equal 1 if q4 is high
  }
  else{
    tempNum = 0;  // if q1 is low make it zero
  }
  if (q3 == HIGH) tempNum = tempNum + 2;  //add "2" to tempNum if q3 is high
  if (q2 == HIGH) tempNum = tempNum + 4;  //add "4" to tempNum if q2 is high
  if (q1 == HIGH) tempNum = tempNum + 8;  //add "8" to tempNum if q1 is high

  switch (tempNum) {
   
  case 10:
    tempNum = 0;
    break;
  case 11:
    tempChar = '*';
    break;
  case 12:
    tempChar = '#';
    break;
  case 13:
    tempChar = 'A';
    break;
  case 14:
    tempChar = 'B';
    break;
  case 15:
    tempChar = 'C';
    break;
  case 0:
    tempNum  = 16;
    tempChar = 'D';
    break;
  }

  Serial.println(tempNum);
  while (digitalRead(StD_PIN) == 1); //waiting for StD signal

 


}







Алгоритъма който желая да постигна е следния:

1.Въвеждане на парола (4 символа)
    Сверяване на паролата if(inKey==myKey)...
  1.1 Грешна парола (изчакване 20 сек)
  1.2 Вярна парола (продължаваме)

Разбирам, че това е в основата на целия проект, но познанията ми не достигат за да продължа нататък. Надявам се някой да ми даде пример как да записвам подаваните стойности в масив или по друг начин.

Поздрави, Калин

kalos

  • Робо-Новак
  • *****
  • Публикации: 14
    • Профил
DTMF управлениe
« Отговор #1 -: Октомври 10, 2011, 10:47:10 pm »
Към момента стигам до тук:

int   Q1_PIN     = 2;
int   Q2_PIN     = 4;
int   Q3_PIN     = 7;
int   Q4_PIN     = 8;
int   StD_PIN    = 13;
int   ignRelay = 12;
int   engingeTemp = 0; //analog input
int   shiftPos = 1;  //analog input
int   startRelay = 3;
int   Relay1 = 1;
int   Relay2 = 5;
//,,,,,6,,,9,10,11,, free pins
int   tempNum;
char  tempChar;
int   inKey[3];    //array for incomming password store
int   myKey[3] = {1, 2, 3, 4}; //Password *1234#
int   haveStar;
int   tempCount;
void setup()
{
  pinMode(Q1_PIN, INPUT);
  pinMode(Q2_PIN, INPUT);
  pinMode(Q3_PIN, INPUT);
  pinMode(Q4_PIN, INPUT);
  pinMode(StD_PIN, INPUT);
  pinMode(ignRelay,OUTPUT);
  pinMode(startRelay, OUTPUT);
  pinMode(Relay1, OUTPUT);
  pinMode(Relay2, OUTPUT);
  haveStar=0;
  tempCount=0;
  Serial.begin(9600);
  Serial.println("Ready for DTMF...");
}

void wrongKey(){ //if the key is wrong
       inKey[]={-1, -1, -1, -1}; //make temp. var. for input key negative
      haveStar=0;
      tempCount=0; // make all temp. key 0
      Serial.println("Wrong KEY!!! Wait 10sec befor another try");
      delay(10000); //wait 10sec befor another try
      return;
}

void startEngine
{//how to start the engine :)
// if the shift isnt Neutral, do not close startRelay.
//if engine coolant temp. greater than 110 cut off the engine

}

void loop()
{
  while (digitalRead(StD_PIN) == 0); //waiting for StD signal
 
  if(haveStar==1)tempCount++;
 
  int q1= digitalRead(Q4_PIN);
  int q2= digitalRead(Q3_PIN);
  int q3= digitalRead(Q2_PIN);
  int q4= digitalRead(Q1_PIN);

  if (q4 == HIGH){
    tempNum = 1;  //make tempNum equal 1 if q4 is high
  }
  else{
    tempNum = 0;  // if q1 is low make it zero
  }
  if (q3 == HIGH) tempNum = tempNum + 2;  //add "2" to tempNum if q3 is high
  if (q2 == HIGH) tempNum = tempNum + 4;  //add "4" to tempNum if q2 is high
  if (q1 == HIGH) tempNum = tempNum + 8;  //add "8" to tempNum if q1 is high

  switch (tempNum) {
   
  case 10:
    tempNum = 0;
    break;
  case 11:
    tempChar = '*';
    break;
  case 12:
    tempChar = '#';
    break;
  case 13:
    tempChar = 'A';
    break;
  case 14:
    tempChar = 'B';
    break;
  case 15:
    tempChar = 'C';
    break;
  case 0:
    tempNum  = 16;
    tempChar = 'D';
    break;
  }
  Serial.println(tempNum);
  while (digitalRead(StD_PIN) == 1); //waiting for StD signal
  if (tempNum==11) // check for * (the password key must be like *1234#)
      {
        haveStar=1;
        tempCount=0;
       }
  if (tempCount==1) inKey[0]=tempNum; //write first digit
  if (tempCount==2) inKey[1]=tempNum; //write second digit
  if (tempCount==3) inKey[2]=tempNum; //write third digit
  if (tempCount==4) inKey[3]=tempNum; //write fourth digit
  if (tempCount==5) {
    if(tempNum==12) // check for # in the end of password
    {
      if (myKey==inKey) // check for correct key
      { Serial.println("Have correct key!");//have correct
          }
         else wrongKey(); //heve incorrect key
    else  //dont have # in the end of key
      wrongKey();
    }
  }
 
}



Все още не съм тествал написаното и дори не съм сигурен дали съм изразил правилно логически и технически :)