Как использовать библиотеку IRremote с atmega8a

Несколько дней назад я тестировал схему на макетной плате на базе ATmega8a с внутренним генератором 1 МГц. Он может включать и выключать реле на основе полученного ИК-кода, и если он соответствует коду, запрограммированному в EEPROM, он должен включать или отключать реле. Теперь я разработал печатную плату и спаял все вместе, но теперь она не работает. На Arduino Nano все работает нормально.

#include <IRremote.h>
#include <EEPROM.h>

int RECV_PIN = 11;
int RELAY_PIN = 4;
int setpin = 3;
unsigned long work_at;
unsigned long adres;
unsigned long irbuffer;
IRrecv irrecv(RECV_PIN);
decode_results results;

void dump(decode_results *results) {

    if(digitalRead(setpin) == 0){
      work_at = results->value; 
      Serial.println(work_at, HEX);    
    }
    irbuffer = results->value;

}

void eeprom_writer(){
  if (irrecv.decode(&results)) {
    if(digitalRead(setpin) == 0 && work_at != 0){
      EEPROM.put(0, work_at); //помещаем значение
      Serial.println(work_at, HEX);
      adres = work_at;
      Serial.println(adres, HEX);
      delay(1000); //ждать
   }
  }
}
void setup()
{
  EEPROM.get(0, adres);
  pinMode(setpin, INPUT_PULLUP);
  pinMode(RELAY_PIN, OUTPUT);
  Serial.begin(9600);
  irrecv.enableIRIn(); // Запускаем приемник
}

int on = 0;
unsigned long last = millis();

void loop() {
  if (irrecv.decode(&results)) {
    // Если прошло не менее 1/4 секунды с момента последнего
    // ИК получен, переключаем реле
  // if(&results == адрес){
      dump(&results);
      if (millis() - last > 250) {
        on = !on;
        if(on == true && adres == irbuffer){
          delay(5000);
          digitalWrite(RELAY_PIN, on ? HIGH : LOW);
          dump(&results); 
        }else if(on != true  && adres == irbuffer){
          digitalWrite(RELAY_PIN, on ? HIGH : LOW);        
          dump(&results); 
          delay(5000);
        }
      }
    //}
// Serial.println(dump(&results));
// Serial.println(count, DEC);

    eeprom_writer();
    last = millis();      
    irrecv.resume(); // Получаем следующее значение
  }
}

, 👍1


1 ответ


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

0

Помогло изменение внутреннего генератора на 8 МГц.

,