в таком виде и оставлю до проведения лётных испытаний.
Скетч такой:
#include <Servo.h>
#include <Wire.h>
#include <BMP085.h>
BMP085 dps = BMP085();
Servo myservo1; // указатель скорости
Servo myservo2; // указатель высоты
long Altitude = 0;//переменная для высоты
long Pressure = 0;//переменная для давления
long Alt_0 = 0; //переменная для относительной высоты
int mpxv = 3; // пин подключения MPXV
int val1; // градусы отклонения указателя скорости
int val2; // градусы отклонения указателя высоты
int prev_val2; // градусы отклонения указателя высоты в предидущем такте
byte knop = 7; // кнопка установки начального уровня
byte redD = 3; //светодиод вверх
byte grinD = 2;//светодиод вниз
byte Alarm = 4;//светодиод "ОПАСНО"
byte Flag_redD = 0; //флаги для мигания
byte Flag_grinD = 0;
byte Flag_Alarm = 0;
byte on_Alarm = 0; //вкл.откл. светодиода
byte on_redD = 0;
byte on_grinD = 0;
int value =0; // переменная для хранения прочитанного значения
int timer01 = 0; //таймер мигания
int StartADC = 500;//начальное значение преобразования АЦП
int timer02 = 0; // таймер основного цикла
byte t_timer = 10; //период таймера
void setup()
{
myservo1.attach(10); // настройка сервомоторов указателей (9G)
myservo2.attach(11);
myservo1.write(0);
myservo2.write(0);
Serial.begin(9600);
Wire.begin();
delay(1000);
dps.init(); // инициализация BMP085
pinMode (knop,INPUT); // настройка кнопки
digitalWrite (knop,HIGH);
pinMode (redD,OUTPUT);//настройка светодиодов
pinMode (grinD,OUTPUT);
pinMode (Alarm,OUTPUT);
StartADC = analogRead(mpxv); //установка начального значения АЦП
}
void uroven0() // действия по нажатию кнопки
{
dps.getPressure(&Pressure);
dps.zeroCal (0,Pressure); //установка нуля высоты
myservo1.write(0); // инвертируем отклонение, что бы с лево на право
myservo2.write(0);
delay(20);
}
void loop()
{
val1 = analogRead(mpxv); // чтение аналогового датчика скорости
val1 = map(val1, StartADC, StartADC+180, 0, 180); // перевод диапазона числа АЦП в диапазон углов отклонения
dps.getAltitude(&Altitude); //получение данных о высоте с датчика BMP085
val2 = (Altitude - Alt_0)/ 100; //
val2 = map(val2, 0, 500, 0, 180); // перевод диапазона высот в диапазон углов отклонения
myservo1.write(180-val1); // инвертируем отклонение, что бы с лево на право
myservo2.write(180-val2); //
if (digitalRead(knop) == HIGH) // кнопка нуля высоты
{
uroven0();
delay(500);
}
if (val1<25) //условие включения сигнализатора ОПАСНОСТЬ,скорость меньше 60км/ч
{ on_Alarm = 1;}
else
{on_Alarm = 0;}
if ( timer02 == 25) // таймер опроса показаний высоты
{
if (val2 > prev_val2) //определение тендендции изменения высоты
{
on_redD = 0; // выключене светодиода противопольжного направления
int razn = val2 - prev_val2; //определение скорости изменения
if (razn>=1) //выбор режимов работы светодиода
{
on_grinD = 1;
}
}
if (val2 < prev_val2)
{
on_grinD = 0;
int razn = prev_val2-val2;
if (razn<=3)
{
//t_timer = 10;
on_redD = 1;
}
if (razn>4)
{
// t_timer = 5;
on_redD = 1;
}
}
if (val2 == prev_val2)
{
on_redD = 0;
on_grinD = 0;
}
prev_val2 = val2; //запоминание предидущего значения
timer02 = 0;
}
if ( timer01 == t_timer) //таймер мигания диодов
{
if (on_redD)
{
if (Flag_redD)
{
digitalWrite(redD,LOW);
Flag_redD = 0;
}
else
{
digitalWrite(redD,HIGH);
Flag_redD = 1;
}
}
else digitalWrite(redD,LOW);
if (on_grinD)
{
if (Flag_grinD)
{
digitalWrite(grinD,LOW);
Flag_grinD = 0;
}
else
{
digitalWrite(grinD, HIGH);
Flag_grinD = 1;
}
}
else digitalWrite(grinD,LOW);
if (on_Alarm)
{
if (Flag_Alarm)
{
digitalWrite(Alarm,LOW);
Flag_Alarm = 0;
}
else
{
digitalWrite(Alarm, HIGH);
Flag_Alarm = 1;
}
}
else digitalWrite(Alarm,LOW);
timer01 = 0;
}
timer01++;
timer02++;
}