Optymalizacja kodu w Arduino - bu.tomasz - 28-04-2016
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?
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:
RE: Optymalizacja kodu w Arduino - JasQ - 28-04-2016
Zerknę wieczorkiem
RE: Optymalizacja kodu w Arduino - bu.tomasz - 28-04-2016
Ok. Zobaczymy co wymyślisz. Przepisać na zwykły c++ nie dałbym rady
Wysłano za pomocą Commodore C64
RE: Optymalizacja kodu w Arduino - JasQ - 28-04-2016
Napisz mi w jakiej formie zapisujesz do eeprom bo widzę 4 oddzielne bajty , to są 4 oddzielne kody czy 1 kod z pilota zapisany jako osobne bajty ?
RE: Optymalizacja kodu w Arduino - bu.tomasz - 28-04-2016
Tylko jeden kod pilota jest zapisywany.
Wysłano za pomocą Commodore C64
RE: Optymalizacja kodu w Arduino - JasQ - 28-04-2016
ok to mogę go inaczej zapisać rozumiem że to 4 cyfry
RE: Optymalizacja kodu w Arduino - bu.tomasz - 28-04-2016
To zależy od pilota, założenie było takie, aby działało z każdym pilotem.
Wysłano za pomocą Commodore C64
RE: Optymalizacja kodu w Arduino - JasQ - 28-04-2016
Tutaj program . W zasadzie bez zmian tylko poukładałem wszystko a poniżej zmienione biblioteki .
IRremote.zip
Kod: #include <IRremote.h>
#include <EEPROM.h>
void EEPROMWritelong(int address, long value){
byte four = (value & 0xFF);
byte three = ((value >> 8) & 0xFF);
byte two = ((value >> 16) & 0xFF);
byte one = ((value >> 24) & 0xFF);
EEPROM.write(address, four);
EEPROM.write(address + 1, three);
EEPROM.write(address + 2, two);
EEPROM.write(address + 3, one);
}
long EEPROMReadlong(long address){
long four = EEPROM.read(address);
long three = EEPROM.read(address + 1);
long two = EEPROM.read(address + 2);
long one = EEPROM.read(address + 3);
return ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) + ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF);
}
IRrecv irrecv(11);
decode_results results;
unsigned long CurrentValue = 0;
unsigned long StoredCode = 0;
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(){
irrecv.enableIRIn(); // Start the receiver
pinMode(4, OUTPUT);
pinMode (6, INPUT);
pinMode(2, OUTPUT);
pinMode(6, OUTPUT);
}
void loop(){
if (StoredCode == 0){StoredCode = EEPROMReadlong(0);}
buttonState = digitalRead(6);
if (irrecv.decode(&results)){
CurrentValue = (results.value);
if(CurrentValue == StoredCode){
outputState = !outputState;}
if (RecordState == 1) {
StoredCode = CurrentValue;
long address=0;
EEPROMWritelong(address, StoredCode);
address+=4;
RecordState = 0;
digitalWrite(4, LOW);
}
irrecv.resume();
}else{
CurrentValue = 0;
}
if (buttonState == HIGH) {
while (buttonState == HIGH) {
buttonState = digitalRead(6);
}
digitalWrite(4, HIGH);
RecordState = 1;
}
if(outputState == 1) {
digitalWrite(2, LOW);}
else{
digitalWrite(2, HIGH);}
}
RE: Optymalizacja kodu w Arduino - bu.tomasz - 28-04-2016
Dziękuję, rano sprawdzę, wejdzie na atmege8?
Wysłano za pomocą Commodore C64
RE: Optymalizacja kodu w Arduino - JasQ - 28-04-2016
Tak sprawdziłem wejdzie bez problemu na atmegę 8 , myk polegał na usunięciu niektórych rodzajów pilotów ( te do których był tylko kod odczytu ) . Pomimo że są one rozpoznawane to biblioteki ich nie potrafią nadawać bądź są niepełne . Poza tym to były lekko egzotyczne marki więc wielkiej straty nie ma . Sony ,LG , Samsung i inne wiodące marki są w pełni obsługiwane .
|