Добрый день, Я не электронщик и не программист, но в моем проекте есть электронная часть в составе: Микроконтроллер 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 ); } }
если это "типа дребезг", то и боритесь с ним как с дребезгом - просто реагируйте на изменение уровня освещенности не сразу, а спустя некоторое время. Идею дарю бесплатно, за что тут платить то, вся доработка пара строк
1. Я в этом не уверен, просто выдвинул версию 2. Во все этом этом я полный профан. Для разового проекта (имхо) нет смысла инженеру-механику начинать изучать электронику и программирование + возраст уже не тот, проще заплатить спецу.
Gekt - чтобы надежно разобраться в причинах проблем и устранить их, исполнитель должен собрать точно такую же конструкцию и отладить код на ней. Так что если Вы заказываете подобную работу - оплачивать придется не 2 строчки в коде. а изготовление макета, тесты на нем и уж только потом код. Если вы готовы к такому раскладу - можем обсудить детали дальше. Но если что - я себя не навязываю, может найдутся желающие решить вашу проблему за час.
рад за вас, но для реальной отладки подобных глюков макет должен лежать на столе исполнителя..... Отлаживать подобное "по удаленке" - это выкинуть в помойку многие часы Заказчика и Исполнителя. А поскольку время стоит денег, то обычно дешевле бывает собрать макет Впрочем. это решать Вам.
Как вариант интересно было бы попробовать. Зачем бесплатно, вставьте в мой скетч эти "пару строк", я заплачу. ПыСы. Если бы я знал, что это за пара строк и куда конкретно их надо вставить, сюда бы не обращался
Сова, ты уж определись это дело пары строк или изготовления макета и отладки исполнителем. А то сначала херню сморозит, а потом ужом извивается.
А это противоречит друг другу? разве пару строк не нужно отлаживать? почему бы тебе самому не помочь страждущему? - впендюришь ему в код гистерезис, получишь честно заработанные 200р (а ТС явно не готов платить больше) - пойдешь жигулевского купишь заради пятницы...
Этот вывод Вы сделали на основании того, что я не хочу заказывать макет? Не хочу, и меня не стоимость этого макета смущает, а время потраченное на его изготовление - недели (?), месяц (?), год (?), без гарантий удобоваримого решения. ПыСы. Исходные данные я выдал, назовите свою цену и сроки - это будет предметный разговор
скорее всего решение должно быть комплексным - усреднение значений плюс программынй гистерезис (это когда переход от света к тени и от тени к свету задается на неодинаковом уровне, что предотвращает "дребезг" на границе перехода)
попробуйте для начала такое решение, может уже этого будет достаточно Код (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 ); } }
Без макета здесь ловить нечего, т.к. очевидно, что дребезг формирует датчик, а не код. В данном случае гораздо проще вообще выкинуть все это китайское барахло и сделать все с нуля на отточенной смехотехнике.
Спасибо! Попробовал, поиграл с порогами. Более менее удобоваримый результат получил при 20 и 35. Но до конца эффект не исчез. Т.е. зуммер срабатывает ступенчато и со странной закономерностью. Если включить МК, дождаться его загрузки (примерно 10-15 сек) и затемнить датчики, то ступенька будет едва заметна - доли секунды зуммер еле слышно, а затем полная громкость. Если после этого осветить датчики и примерно через пару секунд снова затемнить, то "ступенька" зуммера увеличивается, т.е. период слабой мощности удлиняется. Причем если эти циклы повторять каждые 2-3 сек, то ступенька нарастает с каждым разом все больше и больше, слабый звук может уже длиться несколько секунд. Если интервал между освещением и затемнением увеличить примерно до 10 секунд, то ступенька снова составляет доли секунды. Что это за эффект не понимаю.
Описанные симптомы похожи на проблемы с питанием. Дальше уже надо держать в руках ваше железо и пробовать. Для таких тестов и нужен макет.
Вы абсолютно правы. Батарейка которую я юзал видать сдохла, хотя напряжение без нагрузки показывала нормальное. С более свежей батарейкой эффект ступенек пропал. Огромное Вам спасибо! ПыСы. Напрягло, что батарейка Tekcell из ЧипДипа, с заявленной емкостью в 1200 мАч, так быстро сдохла от кратковременных нагрузок в 25 мА