Пьезо датчик-пищалка
- Войдите на сайт для отправки комментариев
Ср, 24/07/2019 - 20:31
Чисто для общего развития.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // 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. Вопрос меня терзает почему вход не перегорает (экспериментирую не один час), ведь напряжения при ударе хватает чтоб зажечь-мигнуть светодиодом, причём при любой полярности включения (проверял). На какой ток рассчитаны внутренние защитные диоды? У кого нибудь получалось сжечь вход таким образом? Или китайские Ардуины такие надёжные? :)
Картинка для пояснения сути.
Защитные диоды 5мА. Пъезой такой ток не создать. А напряжение в схеме больше Uпит+Uдиод не будет.