Пьезо датчик-пищалка

leks
Offline
Зарегистрирован: 22.10.2017

Чисто для общего развития.

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Arduino UNO
//
////////////////////////
//ПОВТОРИТЕЛЬ СТУКОВ
//
#define V1  7 //вывод датчика, например 7
int P=1500;//переменная минимальной длительности между сериями стуков-ударов 
int p=50;//переменная длительности задержки между проверками уровня сигнала датчика
long Y=0;//переменная для фиксации моментов времени ударов
long Y1=0;//переменная для фиксации времени

int i=0;//счётчик
int j=0;//счётчик
int g=50;//число элементов в массиве
byte flag_A=0;//флаг состояний фиксации длительности между последовательными ударами
boolean flag_B=0;//флаг состояний исполнения и запоминания стуков
int tabl[50]={};// массив длительностей между ударами

//////////////////////////////////////////
void setup()
{
    pinMode(V1, INPUT);//вход сигнала с пьезодатчика
   // pinMode(13, OUTPUT);//вывод для пьезоизлучателя
   // digitalWrite(13,LOW);
    for(j=0;j<g;j++){tabl[j]=0;}//ПРИСВОЕНИЕ НАЧАЛЬНЫХ ЗНАЧЕНИЙ ЭЛЕМЕНТАМ МАССИВА
}
///////////////////////////////////////////
void loop()
{
if(flag_B==1)//условие исполнения записанных стуков
{
 pinMode(V1, OUTPUT);//ПЕРЕВОДИМ ВЫВОД В РЕЖИМ ВЫХОДА ДЛЯ ЗВУКА 
 
for(j=0;j<=g;j++)
{  
if(tabl[j]!=0){tone(V1,1000,2*p);delay(tabl[j]);tone(V1,1000,2*p);}//стук -пауза нужная- стук
}

flag_B=!flag_B;//переключаем в режим ожидания - постоянно вызываем функцию STUK()
delay(2*p);// пауза, позволяющая делать два режима исполнения - бесконечный повтор исполнений и исполнение по одному стуку 
pinMode(V1, INPUT);//ВОЗВРАТ ВЫВОДА В РЕЖИМ ВХОДА ДЛЯ ПЬЕЗОДАТЧИКА  
}
else{STUK();}
}
///////////////////////////////////////////
void STUK()
{
 if(flag_A==0&&digitalRead(V1)==LOW){Y=millis();flag_A=1;delay(p);}//если уловили удар ждём пока он пройдёт
 if(flag_A==1&&digitalRead(V1)==HIGH){flag_A=2;}//фиксируем с помощью флага, что удар прошёл
 if(flag_A==2&&(millis()-Y>P)){flag_A=0; for(j=i;j<g;j++){tabl[j]=0;}i=g-1;flag_B=1;}//если пауза между ударами большая переходим к следующей серии ударов
 if(flag_A==2&&digitalRead(V1)==LOW)//если уловили следующий удар-стук, запоминаем длительность между ним и предидущим, заносим значение в массив
 {Y=(int)(millis()-Y);tabl[i]=Y;i++;if(i>g-1){i=0;}flag_A=0;} 
}

Пьезопищалка работает как датчик удара. Настучал ритм пальцем, она повторила. Пробовал в двух вариантах с подключением на GND, +5V. Вопрос меня терзает почему вход не перегорает (экспериментирую не один час), ведь напряжения при ударе хватает чтоб зажечь-мигнуть светодиодом, причём при любой полярности включения (проверял). На какой ток рассчитаны внутренние защитные диоды? У кого нибудь получалось сжечь вход таким образом? Или китайские Ардуины такие надёжные?  :)  

Картинка для пояснения сути.

nik182
Offline
Зарегистрирован: 04.05.2015

Защитные диоды 5мА. Пъезой такой ток не создать. А напряжение в схеме больше Uпит+Uдиод не будет.