• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Optymalizacja kodu w Arduino
#1
Question 
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.
[Obrazek: w704.jpg]

TU jest biblioteka:


Załączone pliki
.zip   IRremote.zip (Rozmiar: 69.08 KB / Pobrań: 2)
 
#2
Zerknę wieczorkiem
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
#3
Ok. Zobaczymy co wymyślisz. Przepisać na zwykły c++ nie dałbym rady

Wysłano za pomocą Commodore C64
 
#4
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 ?
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
#5
Tylko jeden kod pilota jest zapisywany.

Wysłano za pomocą Commodore C64
 
#6
ok to mogę go inaczej zapisać rozumiem że to 4 cyfry
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
#7
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
 
#8
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);}
}
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
#9
Dziękuję, rano sprawdzę, wejdzie na atmege8?

Wysłano za pomocą Commodore C64
 
#10
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 .
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
  


Skocz do:


Przeglądający: 1 gości