Помогите разобраться

Apokalips84
Offline
Зарегистрирован: 20.07.2019

Добрый день, помогите разобраться со скетчем. Attiny85 с подключенными две servo, HC-SR04, ик приемник. Не реагирует на пульт.

#include "Servo8bit.h" 
#define trigPin 0
#define echoPin 3

int ir_pin = 4;
int motorPinL = 1;
int motorPinR = 2;
int key;            
int start_bit = 2000; 
int bin_1 = 1000; 
int bin_0 = 400;   
unsigned long stoptimer;
boolean autoMode;
Servo8Bit motorL, motorR;

void setup() {

  pinMode(ir_pin, INPUT);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  motorL.attach(motorPinL);
  motorR.attach(motorPinR);
  //Serial.begin(9600);
  digitalWrite(0, HIGH);
}

void loop() {
  key = getIRKey();
  if (key != -1) {
    //Serial.println(key);
    if (key = 0xFF18E7){moveMotors(160, 160);} //up 2
    if (key = 0xFF4AB5){moveMotors(10, 10);} //down 8
    if (key = 0xFF10EF){moveMotors(10, 160);} //left 4
    if (key = 0xFF5AA5){moveMotors(160, 10);} //right 6
    if (key = 0xFF30CF){
      autoMode = !autoMode;
      moveMotors(94, 85);
      delay(400);
    }
    if (key = 0xFF7A85){
      motorL.detach();
      motorR.detach();
    }
  }
  stoptimer = millis();
}

void moveMotors(int speedL, int speedR){
  motorL.write(speedL);
  motorR.write(180-speedR);
}

int getIRKey() {
 int data[12];
 while(pulseIn(ir_pin, LOW, 20000) < 2200) {
   if(stoptimer+20 < millis() && !autoMode)   moveMotors(94, 85);
   if(autoMode){
     if(getDistance() < 10){
       moveMotors(94, 20);
       delay(400); 
     }
     else{
       moveMotors(120, 120); 
     }
   }
   key = 0;
 }
 stoptimer = millis()+1000;
 data[0] = pulseIn(ir_pin, LOW);
 data[1] = pulseIn(ir_pin, LOW);
 data[2] = pulseIn(ir_pin, LOW);
 data[3] = pulseIn(ir_pin, LOW);
 data[4] = pulseIn(ir_pin, LOW);
 data[5] = pulseIn(ir_pin, LOW);
 data[6] = pulseIn(ir_pin, LOW);
 data[7] = pulseIn(ir_pin, LOW);
 data[8] = pulseIn(ir_pin, LOW);
 data[9] = pulseIn(ir_pin, LOW);
 data[10] = pulseIn(ir_pin, LOW);
 data[11] = pulseIn(ir_pin, LOW);

 for(int i=0;i<=11;i++) {

   if(data[i] > bin_1) {
       data[i] = 1;
   }  else {
       if(data[i] > bin_0) { 
         data[i] = 0;
       } else {
        data[i] = 2; 
       }
   }
 }

 for(int i=0;i<=11;i++) {
   if(data[i] > 1) {
       return -1;     
   }
 }

 int result = 0;
 int seed = 1;
 for(int i=11;i>=0;i--) {    
   if(data[i] == 1) {
       result += seed;
   }
   seed = seed * 2;
 }

 return result;                  
}

int getDistance(){
  long duration;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  return (duration/2) / 29.1;
}  

 

 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Скетч сами писали? Судя по функции getIRKey() - нет. Она встречается в 100500 местах в сети, но ... Вы где-нибудь видели, чтобы кроме неё в программе было ещё что-то, да ещё и с такими ахрененными (почти по полсекунды) делэями? Люди, наоборот, её в прерывание вставляют, чтобы она немедленно обработку начинала! Чего Вы от неё, бедной, ждёте?

krokodi1
Offline
Зарегистрирован: 06.10.2019

честно говоря мне лень разбирать скетч) но у меня была проблема с тем что пульт дешевый и сигнал надо направлять с точностью до милиметра,поэтому я отказался от ик!