Witam,
Napisałem program w Arduino IDE włącz/Wyłącz z pilota, szkic używa 8 948 bajtów a ja bym chciał to opchnąć w atmega8. dało by radę zoptymalizować kod tego programu?
A tu schemat.
TU jest biblioteka:
Napisałem program w Arduino IDE włącz/Wyłącz z pilota, szkic używa 8 948 bajtów a ja bym chciał to opchnąć w atmega8. dało by radę zoptymalizować kod tego programu?
Kod:
#include <IRremote.h>
#include <EEPROM.h>
void EEPROMWritelong(int address, long value)
{
//Decomposition from a long to 4 bytes by using bitshift.
//One = Most significant -> Four = Least significant byte
byte four = (value & 0xFF);
byte three = ((value >> 8) & 0xFF);
byte two = ((value >> 16) & 0xFF);
byte one = ((value >> 24) & 0xFF);
//Write the 4 bytes into the eeprom memory.
EEPROM.write(address, four);
EEPROM.write(address + 1, three);
EEPROM.write(address + 2, two);
EEPROM.write(address + 3, one);
}
long EEPROMReadlong(long address)
{
//Read the 4 bytes from the eeprom memory.
long four = EEPROM.read(address);
long three = EEPROM.read(address + 1);
long two = EEPROM.read(address + 2);
long one = EEPROM.read(address + 3);
//Return the recomposed long by using bitshift.
return ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) + ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF);
}
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
unsigned long CurrentValue = 0;
unsigned long StoredCode = 0;
const int buttonPin = 6; // pin przycisku
const int ledPin = 4; // pin diody LED
//const int outputPin = 3; // wyjście pinu LED
const int relayPin = 2; // pin przekaźnika
int buttonState = 0; // zmienna do odczytu stanu przycisku
int RecordState = 0; //zmienna odbiornika w trybie nagrywania
int outputState = 1; //zmienna wyjścia włączyć lub wyłączyć
void setup()
{
//Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
// Inicjalizacja pinu LED jako wyjścia:
pinMode(ledPin, OUTPUT);
// Inicjalizacja pinu przycisku jako dane wejściowe:
//pinMode(outputPin, OUTPUT);
// Inicjalizacja pin przycisku jako wejście:
pinMode (buttonPin, INPUT);
pinMode(relayPin, OUTPUT);
// Inicjalizacja pin przycisku jako wejście:
pinMode(buttonPin, OUTPUT);
}
void loop() {
if (StoredCode == 0) {
StoredCode = EEPROMReadlong(0);
}
// Odczyt stanu wartości przyciskiem:
buttonState = digitalRead(buttonPin);
// Jeśli zostanie wykryty sygnał, przechowywania wartość
if (irrecv.decode(&results)) {
CurrentValue = (results.value);
// Jeśli wartość Odebrana równa zaprogramowanej wartości, a następnie przełączyć stan wyjściowy
if(CurrentValue == StoredCode) {
outputState = !outputState;
}
// Czy tryb nagrywania jest aktywowany zapisać bieżącą wartość jako zaprogramowanej wartości
if (RecordState == 1) {
StoredCode = CurrentValue;
long address=0;
EEPROMWritelong(address, StoredCode);
address+=4;
RecordState = 0;
digitalWrite(ledPin, LOW);
// Serial.println(StoredCode); //Wyświetla zapisany kod w celach informacyjnych
//Serial.println(EEPROMReadlong(0));
}
// Otrzymuj kolejną wartość
irrecv.resume();
}
else //jeśli nie zostanie wykryty żaden sygnał, to bieżąca wartość jest równa 0
{
CurrentValue = 0;
}
// Sprawdź czy przycisk nagrywania zostanie naciśnięty.
// Jeśli tak jest, to buttonState HIGH:
if (buttonState == HIGH) {
// Oczekiwanie na przycisku ma zostać wydany
while (buttonState == HIGH) {
buttonState = digitalRead(buttonPin);
}
//Włącz LED wskazuje, że tryb nagrywania jest włączony
digitalWrite(ledPin, HIGH);
RecordState = 1;
}
//Ustaw odpowiedni stan wyjściowy
if(outputState == 1) {
// digitalWrite(outputPin, LOW);
digitalWrite(relayPin, LOW);
}
else {
// digitalWrite(outputPin, HIGH);
digitalWrite(relayPin, HIGH);
}
}
A tu schemat.
TU jest biblioteka: