В общем скетч на основе листинга oops1 для распознавания импульсов работает. Только я снимаю длительности "ноля". Так удобнее определить начала пакета.
PHP код:
#include <TimerOne.h>
#define BTNPIN 2
volatile uint16_t startImpuls;
volatile uint16_t lengthImpuls;
volatile uint16_t timerCount=0;
byte posInPacket=0;
byte Packet[60];
byte startBYTE = 0;
void setup()
{ /*
LOW — вызов прерывания всякий раз, когда на порту низкий уровень напряжения;
CHANGE – прерывание вызывается при изменении значения на входе;
RISING – вызов прерывания при изменении уровня напряжения с низкого (LOW) на высокое(HIGH)
FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкое (LOW)
*/
startImpuls=0;
lengthImpuls=0;
pinMode(BTNPIN, INPUT);
Serial.begin(115200);
Timer1.initialize(10);
Timer1.attachInterrupt(callback); // attaches callback() as a timer overflow interrupt
attachInterrupt(0, fireDown, FALLING);
}
void callback() { timerCount++; }
void loop()
{
if (lengthImpuls > 0)
{
uint16_t li = lengthImpuls;
lengthImpuls=0;
// получен стартовый импульс > 300
if (li > 200 && li < 400) {
startBYTE = 1;
// Serial.println("Start");
}
// Получен "1"
if (li >20 && li <50 && startBYTE == 1)
{
Packet[posInPacket] = 1;
posInPacket ++;
}
// Получен "0"
else if (li >60 && li <80 && startBYTE == 1)
{
Packet[posInPacket] = 0;
posInPacket ++;
}
// Отправить пакет "большему брату"
if (posInPacket > 56)
{
detachInterrupt(0);
for(int j=16;j<57;j++)
Serial.print(Packet[j],DEC);
Serial.println(" ");
posInPacket = 0;
startBYTE = 0;
attachInterrupt(0, fireUp, FALLING);
}
}
}
// Функция обработки прерывания на подъем
void fireUp()
{
detachInterrupt(0);
startImpuls = timerCount;
attachInterrupt(0, fireDown, RISING);
}
// Функция обработки прерывания на спад
void fireDown()
{
detachInterrupt(0);
lengthImpuls = timerCount - startImpuls;
startImpuls=0;
timerCount=0;
attachInterrupt(0, fireUp, FALLING);
}
Но, как оказалось, это не самая главная проблема. Проблема в том что я не могу "вычислить" протокол - не очень как то понятно "Ху ис ху". Понятно что все данные укладываются в один пакет, пакет всегда заканчивается "1". Где в нем данные расстояния, где признак датчика
Для примера прилагаю снятые данные пакета в разных режимах (на байты разделил условно):
PHP код:
00000000 00000000 00000000 11010000 11010000 1 сенсор A --
01001100 00000000 00000000 00110000 01111100 1 сенсор A 60
10000000 00000000 00000000 11110000 00001000 1 сенсор A 20
00000000 00000000 00000000 00001101 00001101 1 сенсор B --
00000000 00000000 01010000 00000000 01010000 1 сенсор C --
00000000 00000000 00000101 00000000 00000101 1 сенсор D --
00000000 01111000 00001101 00000000 01110011 1 сенсор D 60
00000000 10000000 00001111 00000000 10001111 1 сенсор D 20
00000000 00000000 00000001 11101000 01101001 1 сенсоры A+D --
Может у кого появятся мысли на этот счет?