RGB LED - EEPROM

Odpovědět
Ardwin
Příspěvky: 4
Registrován: 12 čer 2021, 14:46
Reputation: 0

RGB LED - EEPROM

Příspěvek od Ardwin » 12 čer 2021, 14:54

Dobrý den,
jsem začáteník a ,potřeboval bych, aby se uložil poslední mode do EEPROM.
A při restartu se načet.
Attiny13

Kód: Vybrat vše

#include <EEPROM.h>

const int buttonPin = PB3;
const int redPin = PB0;
const int greenPin = PB1;
const int bluePin = PB2;
byte mode;

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);

  EEPROM.read(mode);
  
}

void loop() {
  int buttonState;
  buttonState = digitalRead(buttonPin);
  
  if (buttonState == LOW) {
    mode++;
    delay(250);
  }
  
  else if (mode == 0) {
    digitalWrite(redPin, LOW);
    digitalWrite(greenPin, LOW);
    digitalWrite(bluePin, LOW);
    
    
  }
  
  else if (mode == 1) {
    digitalWrite(redPin, HIGH);
    digitalWrite(greenPin, HIGH);
    digitalWrite(bluePin, HIGH);
    EEPROM.update(mode,1);
    delay(300);
    
  }
  
  else if (mode == 2) {
    digitalWrite(redPin, HIGH);
    digitalWrite(greenPin,LOW );
    digitalWrite(bluePin, LOW);
     EEPROM.update(mode,2);
    delay(300);
  }
  
  else if (mode == 3) {
    digitalWrite(redPin, LOW);
    digitalWrite(greenPin,HIGH);
    digitalWrite(bluePin,LOW );
    EEPROM.update(mode,3);
 delay(300);
  }

   else if (mode == 4) {
    digitalWrite(redPin, LOW);
    digitalWrite(greenPin, LOW);
    digitalWrite(bluePin, HIGH);
    EEPROM.update(mode,4);
     delay(300);
  }

   else if (mode == 5) {
    digitalWrite(redPin, HIGH);
    digitalWrite(greenPin, HIGH);
    digitalWrite(bluePin, LOW);
     EEPROM.update(mode,5);
      delay(300);
  }

   else if (mode == 6) {
    digitalWrite(redPin, LOW);
    digitalWrite(greenPin, HIGH);
    digitalWrite(bluePin, HIGH);
    EEPROM.update(mode,6);
     delay(300);
  }

   else if (mode == 7) {
    digitalWrite(redPin, HIGH);
    digitalWrite(greenPin, LOW);
    digitalWrite(bluePin, HIGH);
     EEPROM.update(mode,7);
      delay(300);
  }
  
  
  else {
    mode = 0;
  }
}

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: RGB LED - EEPROM

Příspěvek od martinius96 » 12 čer 2021, 15:41

Robíš to zle, aj zápis, aj načítanie.

Keď sa pozrieš do Arduino Reference na funkciu EEPROM.update, uvidíš, že má dva parametre.
Prvý parameter je adresa (ofset), kde začíname zápis.
Druhý parameter je konkrétna hodnota.

Takže potrebuješ si zvoliť ofset, napríklad 0, alebo 10, kde budeš stále zapisovať a odkiaľ budeš stále čítať hodnotu z totožného pamäťového bloku. EEPROM pamäť, ktorú v AtTiny13 máš má veľkosť 64B, teda môžeš zapisovať na ofset 0 až 63.
Ty to používaš s premennou (byte) mode, kde si nepriradil hodnotu adresy (podľa tvojho kódu tu chceš získať hodnotu z EEPROM, nie je to adresa, hoci sa to tak snažíš použiť).

Taktiež pri čítaní EEPROM potrebuješ priradiť načítanú hodnotu tvojej premennej mode.
Ten kód nemáš dobre navrhnutý, čo sa týka debouncingu, máš tam delaye, ktoré ti blokujú program, čo ťa bude limitovať, ak budeš potrebovať obsluhovať viac vecí zároveň. Taktiež by bolo viac efektívne a aj krajšie použiť v tom kóde switch pre jednotlivé stavy, ktoré nadobudneš inkrementáciou počítadla. Doplním ti opravu do tvojho kódu, čo sa týka tej EEPROM časti.
Robíš zápis do EEPROM, ale napríklad pri stave mode 0 tam nič nezapisuješ, neviem či je to správne z pohľadu použitia.

Tiež je tam kritická chyba, zapisuješ do EEPROM stále, lebo vykonávaš zápis vždy, keď je tlačidlo NESTLAČENÉ a overuješ práve vtedy aj stav nastavenej premennej mode, používaš tam else if proti stavu vstupu, to som ti neupravoval. Neviem či to tak chceš používať, lebo tú EEPROM prepíšeš na limit životnosti za krátku dobu. Podľa kódu tam zapisuješ 3x za sekundu (každých 300ms), ak práve tlačidlo nedržíš stlačené.

Kód: Vybrat vše

#include <EEPROM.h>

const int buttonPin = PB3;
const int redPin = PB0;
const int greenPin = PB1;
const int bluePin = PB2;
byte mode;

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);

 mode = EEPROM.read(10); //priradím byte hodnotu z EEPROM z ofsetu 10 k premennej mode
  
}

void loop() {
  int buttonState;
  buttonState = digitalRead(buttonPin);
  
  if (buttonState == LOW) {
    mode++; //mode+1
    delay(250);
  }
  else if (mode == 0) {
    digitalWrite(redPin, LOW);
    digitalWrite(greenPin, LOW);
    digitalWrite(bluePin, LOW);
    
    
  }
  
  else if (mode == 1) {
    digitalWrite(redPin, HIGH);
    digitalWrite(greenPin, HIGH);
    digitalWrite(bluePin, HIGH);
    EEPROM.update(10,1);
    delay(300);
    
  }
  
  else if (mode == 2) {
    digitalWrite(redPin, HIGH);
    digitalWrite(greenPin,LOW );
    digitalWrite(bluePin, LOW);
     EEPROM.update(10,2);
    delay(300);
  }
  
  else if (mode == 3) {
    digitalWrite(redPin, LOW);
    digitalWrite(greenPin,HIGH);
    digitalWrite(bluePin,LOW );
    EEPROM.update(10,3);
 delay(300);
  }

   else if (mode == 4) {
    digitalWrite(redPin, LOW);
    digitalWrite(greenPin, LOW);
    digitalWrite(bluePin, HIGH);
    EEPROM.update(10,4);
     delay(300);
  }

   else if (mode == 5) {
    digitalWrite(redPin, HIGH);
    digitalWrite(greenPin, HIGH);
    digitalWrite(bluePin, LOW);
     EEPROM.update(10,5);
      delay(300);
  }

   else if (mode == 6) {
    digitalWrite(redPin, LOW);
    digitalWrite(greenPin, HIGH);
    digitalWrite(bluePin, HIGH);
    EEPROM.update(10,6);
     delay(300);
  }

   else if (mode == 7) {
    digitalWrite(redPin, HIGH);
    digitalWrite(greenPin, LOW);
    digitalWrite(bluePin, HIGH);
     EEPROM.update(10,7);
      delay(300);
  }
  
  
  else {
    mode = 0;
    //EEPROM o tejto hodnote nevie, lebo ju tam nezapisuješ, ostane nastavena v EEPROM 7 a nasledne po inkrementacii skoci na 1.
  }
}

Ardwin
Příspěvky: 4
Registrován: 12 čer 2021, 14:46
Reputation: 0

Re: RGB LED - EEPROM

Příspěvek od Ardwin » 12 čer 2021, 16:50

Kod jsem upravoval z internetu.Chtěl bych ,aby při stisku tlačítka se přehodil mod a při tak 5 sekundach se uložil do EEPROM ,a pak už neukládal znova ve smyčce.
Až při změně modu.

Ardwin
Příspěvky: 4
Registrován: 12 čer 2021, 14:46
Reputation: 0

Re: RGB LED - EEPROM

Příspěvek od Ardwin » 12 čer 2021, 21:09

@martinius96
Kod jsem upravoval z internetu.Chtěl bych ,aby při stisku tlačítka se přehodil mod a při tak 5 sekundach se uložil do EEPROM ,a pak už neukládal znova ve smyčce po 300mil/sekund.

Ardwin
Příspěvky: 4
Registrován: 12 čer 2021, 14:46
Reputation: 0

Re: RGB LED - EEPROM

Příspěvek od Ardwin » 13 čer 2021, 21:16

Vyřešeno.Děkuji za odpověd

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 10 hostů