IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: RGB LED - EEPROM - UKLÁDÁNÍ

Aktivity
Avatar
ardwin
Člen
Avatar
ardwin:12.6.2021 21:35

Ahoj 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.

#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.
  }
}
 
Odpovědět
12.6.2021 21:35
Avatar
ardwin
Člen
Avatar
ardwin:12.6.2021 21:47

A je to pro Attiny13

 
Nahoru Odpovědět
12.6.2021 21:47
Avatar
Jan Kerhart
Člen
Avatar
Jan Kerhart:13.6.2021 17:04

Ahoj, funguje ten tvůj kód? Pokud ano, nemusíš již nic řešit. Je to napsané s těma podmínkami zbytečně zdlouhavě a šlo by to udělat mnohem elegantněji na pár řádků, ale fungovat by to mělo.

To, že do EEPROM "zapisuješ" (ve skutečnosti nezapisuješ, viz dále) každých 300 ms vůbec nevadí, protože k tomu používáš funkci update(), která, narozdíl od EEPROM.write(), ve skutečnosti do EEPROM zapíše pouze tehdy, pokud se zapisovaná hodnota liší od již zapsané. Tudíž EEPROM se příliš častými zápisy ničit nebude a není důvod cokoliv dál řešit...

Zde je pro ilustraci deklarace update() v Arduino knihovně:

EERef &update( uint8_t in )          { return  in != *this ? *this = in : *this; }
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
13.6.2021 17:04
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.