Digispark ATtiny85 & TEMT6000

Тема в разделе "Закажу проект", создана пользователем Gekt, 16 авг 2019.

  1. Gekt

    Gekt Нуб

    Добрый день,
    Я не электронщик и не программист, но в моем проекте есть электронная часть в составе:
    Микроконтроллер DigisparkATtiny85
    К его аналоговым входам (P2, P3, P4) подключены 3 (три) датчика освещенности TEMT6000
    К одному цифровому выходу (P0) подключен зуммер с встроенным генератором KPX-G1203UB
    К еще одному цифровому выходу (P1) параллельно подключены два светодиода через регуляторы тока
    В качестве источника питания батарейка с напряжением 3,6 В

    Есть скетч под следующую логику:
    Если на все три датчика или хотя бы на один из них освещены, то на выходах МК – ноль, зуммер молчит, светодиоды не светят.
    Если все три датчика оказались одновременно затемнены – на выходах МК – 3,6 В, зуммер пищит, светодиоды светятся.
    Уровни минимальной освещенности подбираются эмпирическим путем и они очень низкие.

    За счет удаления стабилизатора и 2-х светодиодов с платы Digispark, а также снижения тактовой частоты МК в 16 раз удалось достигнуть приемлемого потребления энергии: 2 мА - на холостом ходу и 25 мА при включении светодиодов и зуммера.
    Все работает, но не устраивает четкость включения зуммера и светодиодов. При низком уровне освещенности, как я понимаю, происходит что-то напоминающее дребезг контактов в кнопках. Из-за этого зуммер не сразу включается на полную мощность, а еле пищит и светодиоды подмигивают - 1, 2 ,3 секунды, и каждый раз по-разному. Такая работа не устраивает и мне нужно избавиться от этого явления. Возможно причина в чем-то другом.

    Я понимаю, что искать ошибки (если они есть) в чужих программах – дело неблагодарное, поэтому готов оплатить либо доработку существующего скетча или разработку нового скетча под поставленную задачу. Главное устранить проблему «дребезга» и не за счет повышения уровня минимальной освещенности.

    Кто-нибудь возьмется?

    ПыСы. Вот скетч (который юзаю в настоящее время и который не устраивает):

    Код (C++):
    /*  15.08.2019
      Digispark ATtiny85, buzzer, LED`s, TEMT6000 light sensors

      Датчики освещенности 1 - 3 подключаются к портам 2,4,3 соответственно
      Пищалка подключается к порту 0
      Светодиод подключается к порту 1
    */


    //Если с датчика освещенности поступит значение ниже установленного порога, то плата будет считать датчик затемненным
    #define sensor1value 25 //Откорректировать значение для установки порога "отсутствия света" для 1 датчика
    #define sensor2value 25 //Откорректировать значение для установки порога "отсутствия света" для 2 датчика
    #define sensor3value 25 //Откорректировать значение для установки порога "отсутствия света" для 3 датчика

    #include <avr/power.h>

    int buzzerpin = PB0;
    int ledpin = PB1;
    boolean curstate = false;


    void setup()
    {
      pinMode(buzzerpin, OUTPUT );
      digitalWrite(buzzerpin, LOW );
      pinMode(ledpin, OUTPUT );

      //Уменьшим тактовую частоту Ардуино в 16 раз при помощи делителя
      clock_prescale_set(clock_div_16);
    }

    void loop()
    {
      if (analogRead(A1) < sensor1value)// && analogRead(A3) < sensor3value)
      {
      if (analogRead(A2) < sensor2value)
      {
      if (analogRead(A3) < sensor3value)
      curstate = 1;
      }
      }
      if (analogRead(A1) > sensor1value || analogRead(A2) > sensor2value || analogRead(A3) > sensor3value)
      curstate = 0;

      action(curstate);

      delay(2.5);
    }

    void action(boolean state)
    {
      if (state == 1)
      {
      digitalWrite(buzzerpin, HIGH );
      digitalWrite(ledpin, HIGH );
      }
      else if (state == 0)
      {
      digitalWrite(buzzerpin, LOW );
      digitalWrite(ledpin, LOW );
      }
    }
     
    Последнее редактирование: 16 авг 2019
  2. NikitOS

    NikitOS Король шутов Администратор

    Вставьте код правильно
     
    DetSimen нравится это.
  3. ИгорьК

    ИгорьК Гуру

    Много букв. Поэтому такая картинка.

    [​IMG]
     
  4. b707

    b707 Гуру

    если это "типа дребезг", то и боритесь с ним как с дребезгом - просто реагируйте на изменение уровня освещенности не сразу, а спустя некоторое время. Идею дарю бесплатно, за что тут платить то, вся доработка пара строк
     
  5. Gekt

    Gekt Нуб

    1. Я в этом не уверен, просто выдвинул версию
    2. Во все этом этом я полный профан. Для разового проекта (имхо) нет смысла инженеру-механику начинать изучать электронику и программирование + возраст уже не тот, проще заплатить спецу.
     
  6. b707

    b707 Гуру

    Gekt - чтобы надежно разобраться в причинах проблем и устранить их, исполнитель должен собрать точно такую же конструкцию и отладить код на ней. Так что если Вы заказываете подобную работу - оплачивать придется не 2 строчки в коде. а изготовление макета, тесты на нем и уж только потом код. Если вы готовы к такому раскладу - можем обсудить детали дальше.
    Но если что - я себя не навязываю, может найдутся желающие решить вашу проблему за час.
     
  7. Gekt

    Gekt Нуб

    Он у меня уже готов, лежит на рабочем столе
     
  8. b707

    b707 Гуру

    рад за вас, но для реальной отладки подобных глюков макет должен лежать на столе исполнителя..... Отлаживать подобное "по удаленке" - это выкинуть в помойку многие часы Заказчика и Исполнителя. А поскольку время стоит денег, то обычно дешевле бывает собрать макет :)
    Впрочем. это решать Вам.
     
    DetSimen нравится это.
  9. Gekt

    Gekt Нуб

    Как вариант интересно было бы попробовать.
    Зачем бесплатно, вставьте в мой скетч эти "пару строк", я заплачу.
    ПыСы. Если бы я знал, что это за пара строк и куда конкретно их надо вставить, сюда бы не обращался
     
  10. man9913

    man9913 Гик

    Сова, ты уж определись это дело пары строк или изготовления макета и отладки исполнителем. А то сначала херню сморозит, а потом ужом извивается.
     
  11. b707

    b707 Гуру

    А это противоречит друг другу? разве пару строк не нужно отлаживать?

    почему бы тебе самому не помочь страждущему? - впендюришь ему в код гистерезис, получишь честно заработанные 200р (а ТС явно не готов платить больше) - пойдешь жигулевского купишь заради пятницы...
     
  12. Gekt

    Gekt Нуб

    Этот вывод Вы сделали на основании того, что я не хочу заказывать макет? Не хочу, и меня не стоимость этого макета смущает, а время потраченное на его изготовление - недели (?), месяц (?), год (?), без гарантий удобоваримого решения.
    ПыСы. Исходные данные я выдал, назовите свою цену и сроки - это будет предметный разговор
     
  13. Gekt

    Gekt Нуб

    Видел решения проблемы "дребезга" потенциометра усреднением считываемых значений. Не?

    .
     
  14. b707

    b707 Гуру

    скорее всего решение должно быть комплексным - усреднение значений плюс программынй гистерезис (это когда переход от света к тени и от тени к свету задается на неодинаковом уровне, что предотвращает "дребезг" на границе перехода)
     
  15. b707

    b707 Гуру

    попробуйте для начала такое решение, может уже этого будет достаточно
    Код (C++):
    /*  15.08.2019
      Digispark ATtiny85, buzzer, LED`s, TEMT6000 light sensors

      Датчики освещенности 1 - 3 подключаются к портам 2,4,3 соответственно
      Пищалка подключается к порту 0
      Светодиод подключается к порту 1
    */


    //Если с датчика освещенности поступит значение ниже установленного порога, то плата будет считать датчик затемненным
    #define sensor1_ON_value 25 //Откорректировать значение для установки порога "отсутствия света" для 1 датчика
    #define sensor2_ON_value 25 //Откорректировать значение для установки порога "отсутствия света" для 2 датчика
    #define sensor3_ON_value 25 //Откорректировать значение для установки порога "отсутствия света" для 3 датчика

    //Если с датчика освещенности поступит значение выше установленного порога, то плата будет считать датчик вышедшим из тени
    #define sensor1_OFF_value 30 //Откорректировать значение для установки порога "отсутствия света" для 1 датчика
    #define sensor2_OFF_value 30 //Откорректировать значение для установки порога "отсутствия света" для 2 датчика
    #define sensor3_OFF_value 30 //Откорректировать значение для установки порога "отсутствия света" для 3 датчика

    #include <avr/power.h>

    int buzzerpin = PB0;
    int ledpin = PB1;
    boolean curstate = false;


    void setup()
    {
      pinMode(buzzerpin, OUTPUT );
      digitalWrite(buzzerpin, LOW );
      pinMode(ledpin, OUTPUT );

      //Уменьшим тактовую частоту Ардуино в 16 раз при помощи делителя
      clock_prescale_set(clock_div_16);
    }

    void loop()
    {
      if (analogRead(A1) < sensor1_ON_value)// && analogRead(A3) < sensor3value)
      {
      if (analogRead(A2) < sensor2_ON_value)
      {
      if (analogRead(A3) < sensor3_ON_value)
      curstate = 1;
      }
      }
      if (analogRead(A1) > sensor1_OFF_value || analogRead(A2) > sensor2_OFF_value || analogRead(A3) > sensor3_OFF_value)
      curstate = 0;

      action(curstate);

      delay(2.5);
    }

    void action(boolean state)
    {
      if (state == 1)
      {
      digitalWrite(buzzerpin, HIGH );
      digitalWrite(ledpin, HIGH );
      }
      else if (state == 0)
      {
      digitalWrite(buzzerpin, LOW );
      digitalWrite(ledpin, LOW );
      }
    }
     
  16. parovoZZ

    parovoZZ Гуру

    Без макета здесь ловить нечего, т.к. очевидно, что дребезг формирует датчик, а не код. В данном случае гораздо проще вообще выкинуть все это китайское барахло и сделать все с нуля на отточенной смехотехнике.
     
  17. Gekt

    Gekt Нуб

    Спасибо! Попробовал, поиграл с порогами. Более менее удобоваримый результат получил при 20 и 35.
    Но до конца эффект не исчез. Т.е. зуммер срабатывает ступенчато и со странной закономерностью. Если включить МК, дождаться его загрузки (примерно 10-15 сек) и затемнить датчики, то ступенька будет едва заметна - доли секунды зуммер еле слышно, а затем полная громкость. Если после этого осветить датчики и примерно через пару секунд снова затемнить, то "ступенька" зуммера увеличивается, т.е. период слабой мощности удлиняется. Причем если эти циклы повторять каждые 2-3 сек, то ступенька нарастает с каждым разом все больше и больше, слабый звук может уже длиться несколько секунд. Если интервал между освещением и затемнением увеличить примерно до 10 секунд, то ступенька снова составляет доли секунды.
    Что это за эффект не понимаю.
     
  18. ИгорьК

    ИгорьК Гуру

    Это очевидный недобрый флуд. Он получает предупреждение.
     
    DetSimen нравится это.
  19. b707

    b707 Гуру

    Описанные симптомы похожи на проблемы с питанием.
    Дальше уже надо держать в руках ваше железо и пробовать. Для таких тестов и нужен макет.
     
  20. Gekt

    Gekt Нуб

    Вы абсолютно правы. Батарейка которую я юзал видать сдохла, хотя напряжение без нагрузки показывала нормальное. С более свежей батарейкой эффект ступенек пропал.
    Огромное Вам спасибо!
    ПыСы. Напрягло, что батарейка Tekcell из ЧипДипа, с заявленной емкостью в 1200 мАч, так быстро сдохла от кратковременных нагрузок в 25 мА