Проблема с ИК-пультом дистанционного управления и кнопкой для digispark

Поскольку digispark более компактен и подходит для моего электрического применения. Следуя той же процедуре в ответеbrtiberio. Я попытался преобразовать скрипт из Arduino UNO в digispark, но безуспешно

#define irPin 2
const int buttonPin1 = 0;
const int buttonPin2 = 4;
const int relay1 = 1;
const int relay2 = 3;
int Relay1State = 0;
int Relay2State = 0;
int master1State = 0;
int master2State = 0;
int button1State;
int button2State;
int lastButton1State;
long lastDebounceTime1 = 0;
int lastButton2State;
long lastDebounceTime2 = 0;
long debounceDelay = 50;
void setup() {
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);
  digitalWrite(relay1, Relay1State);
  digitalWrite(relay2, Relay2State);
}

void loop() {
  
  int key = getIrKey();

  if(key == 7388){
    Relay1State = !Relay1State;
    if(Relay1State == true)
      digitalWrite(relay1, HIGH);
    else
      digitalWrite(relay1, LOW);
  }

  if(key == 1778){
    Relay2State = !Relay2State;
    if(Relay2State == true)
     digitalWrite(relay2, HIGH);
   else
     digitalWrite(relay2, LOW);
  }
}

int getIrKey(){
  int len = pulseIn(irPin,LOW);
  int key, temp;
  key = 0;
  //Serial.print("len=");
  //Serial.println(len);
  if(len > 6000) {
    for(int i=1;i<=32;i++){
      temp = pulseIn(irPin,HIGH);
      if(temp > 1000)
        key = key + (1<<(i-17));
    }
  }
  if(key < 0 )
    key = -key;
  
  //if(key)
    //Serial.println(key);

    delay(250);
  return key;
  //**********************//
  int reading = digitalRead(buttonPin1);
  if (reading != lastButton1State) {
    lastDebounceTime1 = millis();
  }
  if ((millis() - lastDebounceTime1) > debounceDelay) {

    if (reading != button1State) {
      button1State = reading;

      if (button1State == HIGH) {
        master1State = !master1State;
        Relay1State = master1State;
      }
    }
  }

  digitalWrite(relay1, Relay1State);
  lastButton1State = reading;
    
  //*******************************//
  int reading2 = digitalRead(buttonPin2);
  if (reading2 != lastButton2State) {
    lastDebounceTime2 = millis();
  }
  if ((millis() - lastDebounceTime2) > debounceDelay) {

    if (reading2 != button2State) {
      button2State = reading2;

      if (button2State == HIGH) {
        master2State = !master2State;
        Relay2State = master2State;
      }
    }
  }

  digitalWrite(relay2, Relay2State);
  lastButton2State = reading2; 
}

Какой-нибудь совет, пожалуйста?

, 👍1

Обсуждение

не преуспеть - это не описание проблемы, @jsotola

Не знаете, почему вы имеете в виду "преобразовать скрипт из Arduino UNO в digispark"? [Библиотека IRremote](https://github.com/Arduino-IRremote/Arduino-IRremote#supported-boards) поддерживает DigiSpark (и ATtiny85) без необходимости какого-либо преобразования., @hcheung

Какое ядро Arduino вы используете? Если вы используете [ATTinyCore](https://github.com/SpenceKonde/ATTinyCore), вы можете использовать библиотеку IRremote без каких-либо проблем., @hcheung

Удаленная часть работает хорошо. проблема только в кнопочной функции. это не работает., @Mah

@Mah не могли бы вы, пожалуйста, поделиться своими окончательными кодами? Я очень в этом нуждаюсь, @user2683752


1 ответ


Лучший ответ:

0

Ваш код кнопки находится в функции int getIrKey(). Но он никогда не выполняется, потому что перед этим вы выполняете return key;. С этим вы выходите из функции и возвращаете значение ключа. Все, что приходит после оператора return, не будет выполнено.

Ввод кода кнопки в эту функцию не имеет смысла в первую очередь (поскольку кнопки не используются для "получения нажатой ИК-клавиши"). Вместо этого попробуйте поместить его в функцию loop() после другого кода реле.

,

Спасибо крисл. Сейчас он работает нормально., @Mah

Если вы считаете, что мой ответ был правильным, вы можете отметить его как правильный, чтобы другие могли видеть и учиться на этом., @chrisl

Извините, я забыл об этом., @Mah