Помогите понять в чем ошибка. Attiny85 + HC-SR501 как-то странно запускается

Схема вроде простая. Тинька85 плюс 2 HC-SR501. И через реле лампа на 220В. Есть еще фоторезистор, что бы в светлое время не работала. Вот код:

//Фоторезистор
#define InLight A0
//Датчик движения 1
#define DD1 PB0
//Датчик движения 2
#define DD2 PB2
//Выход на реле
#define RELE PB3
//Выход на светодиод
#define LED PB4


boolean lockLow = true; //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
boolean takeLowTime;
long unsigned int lowIn; //Пауза, после которой движение считается оконченным
long unsigned int pause = 5000; //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
unsigned long tstab = 0;
uint16_t osv;

void setup() {
  pinMode(DD1, INPUT);
  pinMode(DD2, INPUT);
  pinMode(InLight, INPUT);
  pinMode(RELE, OUTPUT);
  pinMode(LED, OUTPUT);
  digitalWrite(DD1, LOW);   //дадим датчикам время на калибровку 30 секунд
  digitalWrite(DD2, LOW);
  for (int i = 30; i >= 0; i--)
  {
    digitalWrite(LED, HIGH);
    delay(500);
    digitalWrite(LED, LOW);
    delay(500);
  }
  delay(50);
  digitalWrite(LED, LOW);
}

void loop() {
  osv = analogRead(InLight);
  if (osv <= 100) {
    //Работаем с датчиком движения, LockLow = false при обнаружении движения, True в состоянии покоя
    if (digitalRead(DD1) == HIGH or digitalRead(DD2) == HIGH) {
      //Если еще не вывели информацию об обнаружении
      if (lockLow)
      {
        lockLow = false;
        digitalWrite(LED, LOW);
        digitalWrite(RELE, HIGH);
        tstab = millis();
      }
      takeLowTime = true;
    }
    //Если движения нет
    else
    {
      //Если время окончания движения еще не записано
      if (takeLowTime)
      {
        lowIn = millis(); //Сохраним время окончания движения
        takeLowTime = false; //Изменим значения флага, чтобы больше не брать время, пока не будет нового движения
      }
      //Если время без движение превышает паузу => движение окончено
      if (!lockLow && millis() - lowIn > pause)
      {
        //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения
        lockLow = true;
        tstab = millis();
        digitalWrite(LED, HIGH);
        digitalWrite(RELE, LOW);
      }
    }
  } 
}

Вот схема:


Так вот. Как видно из кода, при подаче питания происходит калибровка датчиков движения.
Так вот работать схема начинает только когда фоторезистор освещен. Начинает моргать светодиод. И как положено проморгается 30 раз. Но т.к. светло датчики не работают. Если же свет выключить (закрыть фоторезистор пальцем), то схема работать перестает. Если закрыть фоторезистор во время калибровки (моргания светодиода), то он перестает моргать. Как будто питание отключается от Тиньки. Но оно есть, я проверял.
Вот и не пойму, где проблема. При чем этот код для работы датчиков движения уже много где использовал без проблем. И лампу включал по датчику движения по такой же схеме.
Подскажите, может кто чего заметит.

Я не работал с Attiny85. Могу быть неправ.
Вы знаете, что PB5 это RESET?

1 лайк

Фъюзы правильно шьёте?

Что хотите сделать в строках 26 и 27?

Что делает эта переменная?

Напишите точный комментарий к каждой строчке или блоку кода -
что именно вы пытаетесь делать

Когда фоторезистор освещён, у него низкое сопротивление. Т.о. на PB5/RESET от +5в высокий уровень и схема работает. Иначе происходит сброс МК от R5. Проверяется вольтметром на /RESET. Нужно или включить фьюз RSTDISBL, или изменить схему (лучше!), с тем что бы не срабатывал сброс.
Проще всего (но не лучше) увеличить R5 до несбрасывания при затемнённом датчике. Либо параллельно датчику резистор.

1 лайк

Мошт как-то так?

Думаю, @Green1 на верном пути.
@Delphin911 , а ты в курсе что ножка либо RESET, либо PB5? Если сделать PB5, то МК не сможешь больше прошивать своим программатором.

Строки 26-37 - калибровка датчиков движения. Этот код написал не я. Еще года 4-5 назад, когда я начинал увлекаться ардуино, позаимствовал этот код. Пишут типа надо секунд 30 датчикам движения, чтоб они устаканились.

Спасибо. Это лишние строки и переменная. Код нарезал из своих старых проектов. Эта переменная в другом проекте использовалась. Убрал эти строки и переменную.

Честно говоря с Attiny мало имел дела и максимум что делал кроме заливки в них кода это прописывал загрузчик. Так что в вопросах фьюзов не силен.

целая тема есть, где этому вопросу самое место

Изменить схему… PB1 у меня свободно. Но на нем нет аналогового входа. Это значит 2 дорожки резать и перепаивать. Блин! Почти месяц ждал эту плату с JLCPCB через какого-то левого чела, который безбожно дерет за доставку оттуда. Но все равно дешевле получается, чем в России заказать.
В принципе это конечно самое простое.
Но надо развиваться. Можете скинуть ссылочку, где хорошо про прописывание фьюзов написано. Так не хочется кромсать плату. К тому же таких фонарей в деревню планирую минимум 4, а платы уже пришли.

Светодиод на PB1, датчик на PB4 и ни о чём не думай.

1 лайк

Тебе уже сказали - с этим фьюзом второй раз просто прошить МК не сможешь.

Т.е. я правильно понимаю, если как тут предлагают включить фьюз RSTDISBL, то прошить Attiny85 через Arduino я уже не смогу?
А вообще этот процесс включения фьюза он откатываемый? И насколько он трудозатратный? И вообще так можно: сначала прошить программу, а потом включить фьюз RSTDISBL. А потом если понадобится выключить его, прошить снова и включить снова.
Прошу прощения, я уже писал, что с фьюзами знаком только на уровне, что слышал про них чисто теоретически.

Да наверное так было бы лучше, но черт меня дернул на 1 ногу фоторезистор завести. Ведь знал, что там резет, но переклинило меня. :frowning:

Прошивая фьюз RSTDISBL, ты вывод делаешь обычным, не RESET. А без RESET прошивка через SPI программатором невозможна. Ежели через загрузчик Ардуинкой ИДЕ можно.

Если не хотите переделывать плату, то.
попробуйте записать загрузчик в Attiny85. И проверить загрузку через него. Скетч у вас маленький, места должно хватать. После проверки правильности работы загрузчика, проверьте удобство работы с загрузчиком без использования пина RESET. Если все устроит, то запрограммируйте фьюз RSTDISBL. После этого менять пошивку можно будет только через загрузчик.

Дополнение. В UNO bootloader выполняет загрузку только после RESET, поэтому если загрузчик для Attiny85 работает так же, то отключив RESET отключится и работа bootloader. Поэтому в исходном сообщении я и писал - обязательно проверить работу без использования пина RESET.

Ну и получается шикарно. Я как раз через ардуинку и шью, даже на плате гребенку под это поставил.
Осталось научится фьюзы устанавливат

А точно можно будет через ардуинку шить? Там ведь тоже 1 ножка тиньки задействована.

Не точно. Поэтому я советую, сначала проверить, и только после проверки менять фьюз.