Народ, подскажите, что может быть не так в коде

Тема в разделе "Arduino & Shields", создана пользователем Delphin911, 25 фев 2020.

  1. akl

    akl Гуру

    я чет ваще не понимаю зачем там digitalWrite(pirPin, 0). оно ведь в режиме входа ничего не делает кроме как отключает внутренний подтяжечный резистор. а в режим выхода его переключать не стоит, т.к. можно подпалить выход датчика
     
  2. akl

    akl Гуру

    а каким образом он там стоит? может он и мешает аттини воспринять сигнал с датчика?
    тыкать тестером надо в ногу аттини, чтоб понять какие на ней напряжения устанавливаются когда датчик срабатывает и когда не срабатывает
     
  3. Delphin911

    Delphin911 Нерд

    Ну это делается при калибровке датчика. Один товарищ пишет, что так в даташите сказано надо делать при включении питания. Но он (датчик) реально первые секунд 10-20 не работает). А я подумал подать 0 на PirPin, потому что там 1 откуда при выключении возникает. Датчик не спалит (если имеется ввиду сам PIR датчик), т.к. после него идет схема на BISS0001 (схема полностью содрана с датчика для ардуино, что на алиэкспрессе продается. https://chipster.ru/catalog/arduino...C4AdtPbPI2hopKQKu3jY5pmCjrjR_3CxoCtUoQAvD_BwE
    Со 2 вывода BISS0001 поставил светодиод соответственно на него плюсом, на землю через 200Ом. Но поставил я его уже когда моя схема гдючила, т.е. уже шло постоянное включение после плавного отключения. Ставил собственно чтобы щупом туда не тыкать. ну и вчера я его отключал, тоже думал может в нем дело. не помогло.
     
  4. akl

    akl Гуру

    1 там может появиться только от самого датчика, т.к. ноги аттини при включении в hi-z состоянии находятся, то есть тупо ни к чему не подключены (но может быть это наводки если и выходная нога микросхемы модуля датчика тоже в этот момент hi-z

    если это именно этот модуль https://chipster.ru/upload/files/datasheet/2/4/8/248_file.pdf

    то может его надо переключить repeatable trigger режим, чтобы он всегда выдавал единицу пока что-то шевелится?
     
  5. Delphin911

    Delphin911 Нерд

    Он у меня именно в этом режиме. Суть в том чтобы когда человек подошел к фонарю, пока он там находится, свет горел.
     
  6. akl

    akl Гуру

    тогда я не понимаю в чем причина проблем. в repeatable trigger режиме на ногу аттини должно приходить 3,3 вольта все время пока датчик триггерится, а когда датчик перестает срабатывать - через 20-300 секунд (смотря как накручено) на ноге должен появиться постоянный 0 вольт.

    в коде я не вижу ничего, что может привести к переходу в режим включения при нуле вольт на этой ноге. да и запускаю я этот кусок на виндосе тут и всё работает нормально.

    может там сам датчик реагирует на что-то? вобщем кнопка или провод вместо датчика - так проще всего проверить сам код.
     
  7. Delphin911

    Delphin911 Нерд

    так я по этой же причине вчера и обратился за помощью. Тоже в плане схемотехники много чего перепробовал. Уже почти был уверен, что в коде что-то у меня не так вот и спросил на форуме. Самое противное, что если вместо Attiny ставить ардуино, то все работает. Там с помощью монитора порта можно было бы что-то отловить. А в Attiny такой возможности нет. Ну в общем еще вечерок помучаюсь сегодня и, если не решу проблему, оставлю плавное включение и мгновенное выключение. тем более, что по сути, во время выключения никого уже рядом с датчиком быть не должно уже как минуту. (хочу минуту задержки перед выключением установить). Собственно если бы мне жена не сказала, мол ярко сразу ночью вспыхивает, давно бы уже распаивал все на платки и настраивал бы окончательно фонари.
     
  8. akl

    akl Гуру

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

    как вариант не использовать диджиталврайт (заменить на макросы с регистрами), а вместо миллис использовать топорный дилей
     
  9. Delphin911

    Delphin911 Нерд

    Да нет. Если памяти не хватает, она при прошивке ругается и не шьется. Эта программа моя занимает порядка 84 чтоль процентов. Я пока с ней мучался, много чего перечитал по сокращению использования памяти. Оттуда и замена объявления портов и обрезаный analogWrite. Могу конечно попробовать не 13 тиньку взять. У меня и на 2кб и на 4 и на 8 тиньки в наличии. Попробую прошить. Ну это уже танцы с бубном называется.:cool:
     
  10. akl

    akl Гуру

    я в этом не шарю, но слышал что нехватку оперативки не всегда можно определить и оно может глючить так что и не поймешь из-за чего.
    а оной оперативки там всего 64 байта.
     
  11. Delphin911

    Delphin911 Нерд

    Ну я попробую тиньку с большей оперативой вечером прошить, благо ничего сложного.
     
  12. akl

    akl Гуру

    тут еще с этим плавным способом может быть такой баг, что если значение на ноге pirpin поменяется раньше чем закончится процесс затухания, то оно подзалипнет
    чтобы этого избежать можно сделать вот так
    Код (C++):

        if(digitalRead(pirPin)==1)
        {
            if (!work)
            {
                if(plavno(light,255,10,millis())==0)
                {
                    work=true;
                }
            }else
            {
                light=255;
            }
        }
        if(digitalRead(pirPin)==0)
        {
            if (work)
            {
                if(plavno(light,0,10,millis())==0)
                {
                    work=false;
                }
            }else
            {
                light=0;
            }
        }
        if(light_old!=light)
        {
            light_old=light;
            analogWriteOUT(light);
        }
     
    но тащемта лучше вообще отказаться от этих миллис и асинхронности и сделать все через delay.
     
    Последнее редактирование: 26 фев 2020
  13. Delphin911

    Delphin911 Нерд

    Да это я насмотрелся на ютубе. Я начинал с видео товарища Алекса Гайвера. Ну и он там всегда говорил, что если использовать Delay в коде, то взрослые дяди не поймут и засмеют. Вот я как-то и пытаюсь всегда не использовать Delay.
    Об этой теме тоже в мыслях у меня про залипание или не успевание отработать. Попробую.
     
  14. akl

    akl Гуру

    это в общем случае правильно, но и не самоцель, особенно когда ресурсы так ограничены как в случае аттини13

    вот еще вариант как избежать залипания
    не факт что это что-то экономит, т.к. еще одна переменная добавляется, но зато выглядит получше
    Код (C++):

        if(digitalRead(pirPin)==1)
        {
            if (!work)
            {
                light_new=255;
                work=true;
            }
        }
        if(digitalRead(pirPin)==0)
        {
            if (work)
            {
                light_new=0;
                work=false;
            }
        }
        plavno(light,light_new,10,millis());
        if(light_old!=light)
        {
            light_old=light;
            analogWriteOUT(light);
        }
     
    еще совет по использованию millis() - можно не вызывать его непосредственно каждый раз как понадобится, а завести переменную "текущее время", в которую один раз где-нибудь в цикле складывать значение миллис, а потом уже везде использовать эту переменную.
     
  15. Daniil

    Daniil Гуру

    Я смотрю последний код от ТС (пост №16)
    Нет ли ошибки с указателем?
    Я обычно пишу
    Код (C++):
    int plavno (usign int *var)
    {
      код
    }
    а при вызове процедуры:
    Код (C++):
    ...
    d=plavno(&var);
    ...
    определение функции
    tst1.png
    вызов
    tst32.png
    работает

    Проблема с нехваткой памяти у меня была на уне, вроде место свободное есть, а глючила. А может и нет. Не могу найти историю:(
     
    Последнее редактирование: 26 фев 2020
  16. akl

    akl Гуру

    это не указатель, это ссылка.
    вроде работает.
    но для верности можно и на указатель переделать. или вообще глобальную переменную менять никуда не передавая
     
  17. Delphin911

    Delphin911 Нерд

    Попробовал оба варианта, все так же. Плюнул на millis и использовал delay, все заработало. Ну и так и оставлю. Спасибо за помощь akl! Кое чему я у вас научился!
     
    Daniil нравится это.
  18. akl

    akl Гуру

    чет внезапно подумал - ведь миллис тут получается использует тот же таймер что и шим. может в этом и загвоздка? но таймер здесь только один, так что точно проверить эту теорию к сожалению не получится.