вариометр на BMP180, 16x2 LCD, активном пьезо-динамике

korbus
Offline
Зарегистрирован: 27.07.2016

Прошу помочь адаптировать код. Сам когда-то давно в кружке и в институте имел дело с Pascal в Delphi, но чувствую, что самому мне с программой не совладать.

Начал летать на парплане. Так как пока нет денег на заводской прибор, решил собрать на ардуино.

Вот такая схема подключения

Все это работает, для датчика давления взял библиотеку BMP180, она сразу выдает относительную высоту в метрах.(http://blog.iarduino.ru/page/novaya-biblioteka-dlya-datchika-davleniya-i-temperatury-bmp180/)

взяв за основу http://redhats.ru/variometer-arduino-2015/ немного подправил код под свою библиотеку и динамик, но что-то идет не так, прибор мищит постоянно, хоть и реагирует писками на изменения высоты (от пола до стола)

#include <BMP180.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
BMP180  sensor;
LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

float vario_down = -1.1;               // Установка СНИЖЕНИЯ
float vario_up; 
float alt[51];
float tim[51];
float beep;
float Beep_period;
float mux;
float Altitude;
const float p0 = 101325;

long Pressure = 101325;
unsigned long bounseInput4P = 0UL;

int samples=40;
int maxsamples=50;
int countPressVal = 0;

bool tmp1 = 0;
bool countPress = 0;
bool bounseInput4S = 0;
bool bounseInput4O = 0;
boolean  thermalling = false;
int p = 3;

void setup()
{
  pinMode(p, OUTPUT);
lcd.init();                      // initialize the lcd 
  lcd.init();
  // Print a message to the LCD.
  lcd.backlight();
  delay(1000);
  sensor.begin(); 
  sensor.read(0); 
}


void loop()
{
  sensor.read();
  lcd.setCursor(0,0);
  lcd.print((String)"ALT "+sensor.alti+"");
 
  //delay(1000);

   float tempo=millis();
    float vario=0;
    float N1=0;
    float N2=0;
    float N3=0;
    float D1=0;
    float D2=0;
  
  for(int cc=1;cc<=maxsamples;cc++){                                   // усреднитель
        alt[(cc-1)]=alt[cc];
        tim[(cc-1)]=tim[cc];
    };
    alt[maxsamples]=sensor.alti;
    tim[maxsamples]=tempo;
    float stime=tim[maxsamples-samples];
    for(int cc=(maxsamples-samples);cc<maxsamples;cc++){
        N1+=(tim[cc]-stime)*alt[cc];
        N2+=(tim[cc]-stime);
        N3+=(alt[cc]);
        D1+=(tim[cc]-stime)*(tim[cc]-stime);
        D2+=(tim[cc]-stime);
    };
    
    vario=1000*((samples*N1)-N2*N3)/(samples*D1-D2*D2); // рачёт звука
    if ((tempo-beep)>Beep_period)
    {
        beep=tempo;
        if (vario>vario_up && vario<15 )
        {
            Beep_period=350-(vario*5);
            tone(p,(1000+(100*vario)),300-(vario*5)); // звук на подъёме
            tone(p,(1003+(100*vario)),300-(vario*5));
            thermalling = true;
        }
        else if ((vario < 0 ) && (thermalling == true))
        {
            thermalling = false; 
         // tone(200, 800); // звук предпоток (по-желанию )
            
        }
        else if (vario< vario_down){         // звук на сливе
            Beep_period=200;
            tone(p,(300-(vario)),340);
            tone(p,(303-(vario)),340);
            thermalling = false;
        }
    }
}

также пробовал адаптировать код https://paraplan.ru/forum/topic/137109 отсюда

и http://029ah.livejournal.com/956.html отсюда, но попытки успехом не увенчались.

Не адптированный код с библиотекой BMP085 тоже не работает.

Прошу посмотреть код и указать на ошибки, тк я не программист и не могу их найти. Спасибо всем откликнувшимся.

 

Cessi71
Offline
Зарегистрирован: 21.05.2016

На хабре , если не ошибаюсь, видел готовый проект оччень хорошего исполнения. И вариометр и высотомер и т.д. размер- в шлем помещается.
З.Ы сам когда- то дельтапланеризмом занимался.

Cessi71
Offline
Зарегистрирован: 21.05.2016
korbus
Offline
Зарегистрирован: 27.07.2016

итак, есть прогресс, я выяснил, почему прибор постоянно пищит. У меня активный пьезо-динамик, там транзистор открывает 5 В или 3 В (по желанию) на пьезу. И просхоит такая фигня, что транзистор открывается сразу, как ногу (D3) объявляю выходом pinmode out. Походу с ноги начинает идти сигнал? как побороть сей недуг? просто цеплял пьезу напрямую к выходу - получается тихо.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вероятно в Вашей схеме активный уровень низкий. Тогда перед тем, как объявить пин выходом, переведите его в HIGH.

korbus
Offline
Зарегистрирован: 27.07.2016

помогло, только приходится переводить его в HIGH после каждого извлечения звука, пока оставил так. Спасибо.