Апну тему вопросом о датчике adxl345.
Можно ли с помощью блока, присутствующего в этой теме, подучать данные о перегрузке и использовать их в управлении чего либо?
Нашёл пример в сети, где используются эти данные, именно так как и я собираюсь. Речь идёт о ускорении (перегрузке) в следствии торможения автомобиля, где при достижении заданной отрицательного ускорения (перегрузки) (здесь 0.5G), имитируется ESS, система предупреждения о экстренном торможении.
Но как это реализовать в FLProg?
Пожалуйста, подскажите.
Пример:
#include <Adafruit_NeoPixel.h>
#include <Adafruit_ADXL345_U.h>
//несколько общих комментариев
// я отключил по одному крайнему светодиоду, т.к. они отсвечивали на декоративные панели стоек
//видно на примере этого цикла for (int i=1; i<143; i++ )
//если отключать не нужно, заменяем на for (int i=0; i<144; i++ )
//задний ход и аварийка у меня не используются, т.к. в первом случае яркость никакая, во втором надо подключать входы к лампам поворотников
//поворотники и стоп-сигнал одновременно не включаются, чтобы это реализовать, нужно переписывать соответствующий код скетча (делить ленту на три секции, подбирать тайминги миганий, менять диапазон переменных циклов).
//Дерзайте - все в ваших руках
// Пин для подключения управляющего сигнала светодной ленты
const int PinLS = 2;
//Пины для подключения датчиков
//если более удобно будет подключать контакты в другом порядке - просто поменяйте значения переменных
const int buttonPinL = 3;
const int buttonPinR = 4;
const int buttonPinS = 6;
const int buttonPinD = 5;
//начальные статусы входов (подтянуты к плюсу)
int buttonStateS = HIGH;
int buttonStateD = HIGH;
int buttonStateL = HIGH;
int buttonStateR = HIGH;
// пауза pause_pov1 (в миллисекундах) нужна, чтобы синхронизировать циклы "пробегания" полоски и включения лампочки поворотника
// такое может быть, если используется меньше половины светодиодов
// в моем случае паузы нет (pause_pov1 = 0)
int pause_pov1 = 1;
// этой паузой регулируем длительность состояния, когда все светодиоды выключены
//я определял опытным путем - включал поворотник, засекал по отдельности время ста мыргов лампочкой и ста беганий полоски, разницу делил на 100, на полученное время увеличивал или уменьшал значение переменной (в зависимости от того, отставали или убегали вперед лампочки)
int pause_pov2 = 62;
// переменная для получения значения ускорения
int ix;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(144, PinLS, NEO_GRB + NEO_KHZ800);
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);
void setup() {
pinMode(buttonPinS, INPUT);
pinMode(buttonPinD, INPUT);
pinMode(buttonPinL, INPUT);
pinMode(buttonPinR, INPUT);
strip.begin();
// гасим ленту
for (int i=0; i<144; i++ ) strip.setPixelColor(i, strip.Color(0,0,0));
strip.show();
accel.begin();
// ограничиваем измеряемый диапазон четырьмя G (этого хватит с большим запасом)
accel.setRange(ADXL345_RANGE_4_G);
accel.setDataRate(ADXL345_DATARATE_100_HZ);
}
void loop() {
// СТОПЫ: если включены - высший приоритет
//Чтобы сделать меняющуюся по ширине полоску в зависимости от интенсивности торможения
//(уточнение - никакой светомузыки, ширина полосы после нажатия на тормоз не меняется!)
//от плавного торможения до тапки в пол.
//Добавляем еще одну переменную, например, ix2,
//присваиваем ей значение ix с коэффициентом умножения,
//заодно инвертируем и округляем до целого
//ix = event.acceleration.x;
//ix2 = -round(ix*10);
//ограничиваем для плавного торможения в пробках
//(чтобы не менялась при каждом продвижении на 5 метров)
//if (ix2<10) ix2 = 0;
//и для резкого торможения.
//Реальный диапазон изменения переменной ix — от 0 до -5
//для максимальной ширины полосы при G равном или большем 0.5
//if (ix2 >50) ix2 = 50;
//затем меняем циклы в блоке СТОП for (int i=1; i<143; i++ ) на for (int i=51-ix2; i<93+ix2; i++ )
//Получаем минимальную ширину полоски ~30 см (для стояния в пробке) и максимальную для резкого торможения
//конец комментария
buttonStateS = digitalRead(buttonPinS);
if (buttonStateS == LOW)
{
sensors_event_t event;
accel.getEvent(&event);
ix = event.acceleration.x;
// проверка резкого торможения - мигающий режим
// значение 5 - это 0,5G, минус - торможение
if (ix < -5)
{
for (int is=0; is<15; is++ ) {
for (int i=1; i<143; i++ ) strip.setPixelColor(i, strip.Color(240,0,0));
strip.show();
delay(10 + is*10);
for (int i=1; i<143; i++ ) strip.setPixelColor(i, strip.Color(0,0,0));
strip.show();
delay(10 + is*3);
buttonStateS = digitalRead(buttonPinS);
if ( buttonStateS == HIGH ) return;
}
}
// помигали - и хватит, включаем постоянный режим, если педаль тормоза еще нажата
// или если не было резкого торможения и предыдущее условие не сработало
if (buttonStateS == LOW) {
for (int i=1; i<143; i++ ) strip.setPixelColor(i, strip.Color(200,0,0));
strip.show();
while(buttonStateS == LOW){
buttonStateS = digitalRead(buttonPinS);
delay(50);
}
// плавно гасим
for (int is=0; is<20; is++ ) {
for (int i=1; i<143; i++ ) strip.setPixelColor(i, strip.Color(190 - is*10,0,0));
strip.show();
delay(10);
} // СТОПЫ конец
}
}
else // если СТОПЫ выключены
{
// ЗАДНИЙ ХОД: если включен - средний приоритет
buttonStateD = digitalRead(buttonPinD);
if (buttonStateD == LOW) {
for (int i=1; i<37; i++ ) strip.setPixelColor(i, strip.Color(63,63,63));
for (int i=107; i<143; i++ ) strip.setPixelColor(i, strip.Color(63,63,63));
strip.show();
while(buttonStateD == LOW){
buttonStateD = digitalRead(buttonPinD);
delay(50);
}
//плавно гасим
for (int is=0; is<16; is++ ) {
for (int i=1; i<37; i++ ) strip.setPixelColor(i, strip.Color(60 - is*4,60 - is*4,60 - is*4));
for (int i=107; i<143; i++ ) strip.setPixelColor(i, strip.Color(60 - is*4,60 - is*4,60 - is*4));
strip.show();
delay(10);
}
}
buttonStateL = digitalRead(buttonPinL);
buttonStateR = digitalRead(buttonPinR);
// если включена аварийка
if (buttonStateL == LOW && buttonStateR == LOW) {
for (int il=0; il<71; il++ ) {
strip.setPixelColor(71-il, strip.Color(63,31,0));
strip.setPixelColor(il+72, strip.Color(63,31,0));
strip.show();
delay(pause_pov1);
}
for (int il=0; il<71; il++ ) {
strip.setPixelColor(71-il, strip.Color(0,0,0));
strip.setPixelColor(il+72, strip.Color(0,0,0));
strip.show();
delay(pause_pov1);
}
delay(pause_pov2);
}
// если включен ЛЕВЫЙ ПОВОРОТНИК
if (buttonStateL == LOW && buttonStateR == HIGH) {
for (int il=0; il<71; il++ ) {
strip.setPixelColor(il+72, strip.Color(220,120,0));
strip.show();
delay(pause_pov1);
}
for (int il=0; il<71; il++ ) {
strip.setPixelColor(il+72, strip.Color(0,0,0));
strip.show();
delay(pause_pov1);
}
delay(pause_pov2);
}
// если включен ПРАВЫЙ ПОВОРОТНИК
if (buttonStateL == HIGH && buttonStateR == LOW) {
for (int il=0; il<71; il++ ) {
strip.setPixelColor(71-il, strip.Color(220,120,0));
strip.show();
delay(pause_pov1);
}
for (int il=0; il<71; il++ ) {
strip.setPixelColor(71-il, strip.Color(0,0,0));
strip.show();
delay(pause_pov1);
}
delay(pause_pov2);
} //правый поворотник конец
} //конец условия else Стоп
// задержка для следующего опроса датчиков
delay(10);
}
Так же есть польские работы с этим датчиком adxl345, с использованием данных G: