Работа двигается потихоньку осталось решить два вопроса
1. Это у меня не работает функция Serial.Write(), приходится использовать Serial.print(), вот что она выводит.
1е число содержит бит-флаг-- есть препятствие и номер датчика
2е число расстояние до препятствия в сантиметрах
PHP код:
137 255 0 0 ------
------
138 255 0 0 ------
------
136 255 0 0 ------
------
139 255 0 0 ------
------
137 255 0 0 ------
------
2. Адаптировать плугин из центрифуги под ардуно.
Все оказалось настолько просто что у меня возник вопрос почему ни кто это ранее не делал ?
Собственно скетч.
PHP код:
#include <TimerOne.h>
#define LEDPIN 13 // Вывод светодиода
#define BTNPIN 2
#define BUFFER_LENGTH 100
volatile uint16_t startImpuls;
volatile uint16_t lengthImpuls;
volatile uint16_t timerCount=0;
byte buffPos = 0;
byte Buffer[BUFFER_LENGTH];
byte packet[4];
byte posInPacket=0;
byte startBYTE = 15;
void setup()
{ /*
LOW — вызов прерывания всякий раз, когда на порту низкий уровень напряжения;
CHANGE – прерывание вызывается при изменении значения на входе;
RISING – вызов прерывания при изменении уровня напряжения с низкого (LOW) на высокое(HIGH)
FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкое (LOW)
*/
startImpuls=0;
lengthImpuls=0;
pinMode(BTNPIN, INPUT);
for(int i=0; i< BUFFER_LENGTH; i++)
Buffer[i]=0;
Serial.begin(115200);
Timer1.initialize(20);
Timer1.attachInterrupt(callback); // attaches callback() as a timer overflow interrupt
attachInterrupt(0, fireUp, RISING);
}
void callback() { timerCount++; }
void loop()
{
if (lengthImpuls > 0)
{
uint16_t temp=0;
uint16_t li = lengthImpuls;
lengthImpuls=0;
//--------------------------//
// получена приамбула "1 1 1 1"
if (li >50 && li <60)
{
posInPacket =0;
}
// Расчитываю позицию массиве
temp = posInPacket / 8;
uint16_t bitPos = posInPacket;
// Разворачиваю позицию для метода bitSet(x,n)
bitPos = 7 - bitPos;
if (bitPos >= 8)
{
bitPos = posInPacket - (8*temp);
}
// Получен "0"
if (li >4 && li <6)
{
posInPacket ++;
}
// Получен "1"
else if (li >10 && li <15)
{
bitSet(packet[temp],bitPos);
posInPacket ++;
}
//digitalWrite(13,LOW);
// Отправить пакет "большему брату"
if (posInPacket > 15)
{
detachInterrupt(0);
Serial.println("------");
for(int i=0; i<4; i++)
{
Serial.print(packet[i], DEC);
Serial.print(" ");
packet[i]=0;
}
Serial.println("------");
posInPacket = 0;
attachInterrupt(0, fireUp, RISING);
}
//--------------------------//
}
}
// Функция обработки прерывания на подъем
void fireUp()
{
detachInterrupt(0);
startImpuls = timerCount;
attachInterrupt(0, fireDown, FALLING);
}
// Функция обработки прерывания на подъем
void fireDown()
{
detachInterrupt(0);
lengthImpuls = timerCount - startImpuls;
startImpuls=0;
timerCount=0;
attachInterrupt(0, fireUp, RISING);
}