Извиняюсь за такое обяснение... Вот последний рабочий скетч. На данный момент средний уровень устанавливается нажатием кнопки CentrSet (когда D12==HIGH) хотелось бы реализовать это автаматически. Тоесть при включении arduino выполнялась одноразовая команда "записать длинну сигнала в переменную centr
PHP код:
#include <TimerOne.h>
#define BTNPIN 2 // Вход сигнала
#define SET 12 // Кнопка CentrSet
#define L 5 // Выход на H-Мост вращение в лево
#define R 6 // Выход на H-Мост вращение в право
int centr = 150; //значение по умолчанию пока не будет нажата кнопка CentrSet
volatile uint16_t lengthImpuls, timerCount;
void setup()
{
/* LOW — вызов прерывания всякий раз,
когда на порту низкий уровень напряжения;
CHANGE – прерывание вызывается при изменении
значения на входе;
RISING – вызов прерывания при изменении уровня
напряжения с низкого (LOW) на высокое(HIGH)
FALLING – вызов прерывания при изменении уровня
напряжения с высокого (HIGH) на низкое (LOW)*/
lengthImpuls=0;
pinMode (BTNPIN, INPUT);
pinMode (SET, INPUT);
pinMode (L, OUTPUT);
pinMode (R, OUTPUT);
analogWrite (L, 0);
analogWrite (R, 0);
Timer1.initialize(10);
Timer1.attachInterrupt(callback);
attachInterrupt(0, fireUp, RISING);
}
void callback() { timerCount++; }
void loop()
{
uint16_t li = lengthImpuls;
if (li > (centr-50) && li < (centr+50))
{
if (li > (centr+1)) {analogWrite (R, (li-centr)*5); analogWrite (L, 0);}
else if (li > (centr+45)) {analogWrite (R, 255); analogWrite (L, 0);}
if (li < (centr-1)) {analogWrite (L, (centr-li)*5); analogWrite (R, 0);}
else if (li < (centr-45)) {analogWrite (L, 255); analogWrite (R, 0);}
if (li > (centr-1) && li < (centr+1)) {analogWrite (L, 0); analogWrite (R, 0);}
if (digitalRead (12)== HIGH) {centr = li;}
}
}
// Функция обработки прерывания на подъем
void fireUp()
{
timerCount=0;
detachInterrupt(0);
attachInterrupt(0, fireDown, FALLING);
}
// Функция обработки прерывания на падение
void fireDown()
{
lengthImpuls = timerCount;
detachInterrupt(0);
attachInterrupt(0, fireUp, RISING);
}