0

私はArduinoに比較的慣れていません。これが私がやろうとしていたことです。

IR(InfarRet)リモートでリレー回路を制御したい。これが私が使用しているコードです:

#include <IRremote.h>
int RECV_PIN = 6;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode (5 ,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:  
  if (irrecv.decode(&results)){
    Serial.println(results.value,DEC);
    irrecv.resume();
  switch (results.value){
    case 3150073167:
      digitalWrite(5,HIGH);
      break;
    case 68850955:
      digitalWrite (5,LOW);
      break;
    }
  }
}

回路は正常に動作しており、

しかし、電源の再起動後、正常に動作しません。聞くのは簡単です:

エラー : ここに画像の説明を入力

このエラーを修正するには?

4

2 に答える 2

1

RAM は揮発性メモリであり、電源が失われると失われます (IO ポートはプルアップなしで入力モードにリセットされます)。

EEPROM を使用して最後の状態を保存し、setup() 関数で復元できます。

AVR ベースの arduino の場合、次のようなものを使用できます。

#include <EEPROM.h>

#include <IRremote.h>

const int    RELAY_PIN = 5;
const int     RECV_PIN = 6;
const int      address = 0;
byte             state = 0;
decode_results results;

IRrecv          irrecv(RECV_PIN);

void setup() {
    Serial.begin(9600);
    irrecv.enableIRIn();

    state = EEPROM.read(address);

    pinMode (RELAY_PIN, OUTPUT);
    digitalWrite(RELAY_PIN, state);
}

void loop() {

    if (irrecv.decode(&results)) {
        Serial.println(results.value,DEC);
        irrecv.resume();
        switch (results.value){
            case 3150073167LU:
                if (state == LOW) {
                    state = HIGH;
                    EEPROM.write(address, state);
                }
                break;

            case 68850955LU:
                if (state == HIGH) {
                    state = LOW;
                    EEPROM.write(address, state);
                }
                break;

            default:
                break;
        }
        digitalWrite(RELAY_PIN, state);
    }
}
于 2016-07-25T09:09:34.203 に答える