Обсуждаем контроллеры компании Atmel.
Ответить

ATTiny13A вопрос про EEPROM

Пт июн 11, 2021 16:13:21

Правильно ли я использовал EEPROM
Код:
#include <EEPROM.h>
#define INIT_ADDR 7  // номер резервной ячейки
#define INIT_KEY 50
#define LAMPA_POV PB0
#define SIGNAL_POV PB1
#define SIGNAL_BLIZ PB3
#define KNOPKA_YARK PB4
void yarkost();
bool state;
unsigned char bri = 125;
uint32_t btnTimer, myTimer1, timeCounter;
void setup() {
  pinMode(SIGNAL_BLIZ, INPUT); // объявляем пин 7 как вход
  pinMode(LAMPA_POV, OUTPUT); // объявляем пин 5 как выход
  pinMode(SIGNAL_POV, INPUT); // объявляем пин 6 как вход
  pinMode(KNOPKA_YARK, INPUT_PULLUP); // кнопка настройки яркости

}
void loop() {
  boolean test;
  boolean  pov = digitalRead(SIGNAL_POV);
  boolean  bliz = digitalRead(SIGNAL_BLIZ);
  static bool flag = false;
  if (EEPROM.read(INIT_ADDR) != INIT_KEY) {
    EEPROM.write(INIT_ADDR, INIT_KEY);
    EEPROM.put(0, bri);
  }

  state = !digitalRead(KNOPKA_YARK);
  if (state && !flag && millis() - btnTimer > 100) {
    flag = true;
    btnTimer = millis();
  }
  if (state && flag && millis() - btnTimer > 600 && bliz == 1) {
    btnTimer = millis();
    yarkost();
  }
  if (!state && flag && millis() - btnTimer > 500) {
    flag = false;
    btnTimer = millis();
  }
  if (pov == 0 && bliz == 1) { //При выполнение этого условия программа зависает и не выходит отсюда
    EEPROM.get(0, bri);
    analogWrite(LAMPA_POV, bri);   
  } else {
    if (pov == 0) {
      digitalWrite(LAMPA_POV, HIGH);
    }
    else {
      test = 0;
      while (test == 0) {
        pov = digitalRead(SIGNAL_POV);
        if ( pov == 1) {
          digitalWrite(LAMPA_POV, HIGH);
          myTimer1 = millis();
        } else if ( millis() - myTimer1 < 2000 && pov < 1 ) {
          digitalWrite(LAMPA_POV, LOW);
        } else {
          test = test + 1;
        }
      }
    }
  }
}

void yarkost() {
  static bool flag = true;
  uint32_t morgalka, regyark;
  byte yark;
  bri = 0;
  yark = 0;
  while (state && flag && yark < 3) {
    state = !digitalRead(KNOPKA_YARK);
    morgalka = millis();
    while (millis () - morgalka < 400) {
      digitalWrite(LAMPA_POV, LOW);
    }
    while (millis() - regyark > 500 && state && flag) {
      state = !digitalRead(KNOPKA_YARK);
      bri += 25;
      bri = constrain(bri, 0, 255);
      EEPROM.put(0, bri);
      morgalka = millis();
      while (millis () - morgalka < 700) {
        analogWrite(LAMPA_POV, bri);
      }
      regyark = millis();
      if (bri == 250) {
        digitalWrite(LAMPA_POV, LOW);
        while (yark != 10) {
          analogWrite(LAMPA_POV, bri);
          morgalka = millis();
          while (millis () - morgalka < 300) {
            digitalWrite(LAMPA_POV, LOW);
          }
          morgalka = millis();
          while (millis () - morgalka < 200) {
            analogWrite(LAMPA_POV, bri);
          }
          yark += 1;
          state = !digitalRead(KNOPKA_YARK);
        }
      }
    }
  }
}

А при нажатие на кнопку регулировки яркости просто гаснет лампа

Re: ATTiny13A вопрос про EEPROM

Сб июн 12, 2021 12:23:01

Ну какбы тема дубли получается.

EEPROM в китайских контролерах не советую вообще использовать, если уж очень надо, то лучше внешний, или покупать оригинальные контролеры в нормальных магазинах.

Если он для сохранения позиции настройки, то будь готов к глюкам, или сразу, или со временем
Ответить