Hierbij een draadje voor mensen die interesse hebben in, of vragen over de Poor Mans Vario.
Wat is de Poor Mans Vario?
Het is een op Arduino gebaseerde variometer, waarbij het het doel is om tegen zo laag mogelijke kosten een werkende variometer te hebben die zelfstandig kan werken. Dus niet afhankelijk van telemetrie.
Denk aan hooguit €20 tot €30,- voor een werkende basic vario met ontvanger.
Op zich is het al leuk om je in Arduino te verdiepen. De laatste keer dat ik iets programmeerde was in Basic op de Commodore 64, dus ik was weer beginner.
Beter goed gejat, dan slecht verzonnen. Ik heb mijn eerste prototype dan ook gebouwd volgens de instructies in dit draadje
Foto van Prototype II, op basis van de Arduino Pro Mini
Hieronder de opsomming van de componenten om de poor-mans-vario te maken.
De Arduino Nano is wellicht het geschiktste model om mee te beginnen. Deze kan direct op 5 volt worden aangesloten en heeft een micro USB poort, zodat je hem direct op je PC kunt aansluiten. Iets lastiger maar kleiner is de Arduino Pro Mini die ik voor mijn tweede prototype heb gebruikt. Die heeft geen USB poort.
De Arduino Nano kun je oa kopen bij HK of via Ebay
Vervolgens koop je een druksensor gebaseerd op de MS5611 sensormodule.
Let op dat je een exemplaar koopt op een printplaatje met een voltage regulator die 5volt ingangsspanning naar 3,3 volt omzet. de sensormodule kan geen 5 volt aan.
Ik heb deze module gekocht via Ebay
(mocht deze link inmiddels niet meer werken, zoek dan in Ebay op MS5611
Een goedkopere sensor is de BOSCH BMP180. Deze reageert niet zo snel als de MS5611, maar het scheelt je ongeveer €10,-. Er is aparte code voor de MS5611 en voor de BMP180 (die ook op zijn tragere voorganger BMP085 werkt). Je vindt ze allebei hieronder.
Hardwarematig koppel je alle sensoren op dezelfde wijze aan de Arduino. Je kunt ook eerst met een BMP180 sensor beginnen en dan later upgraden naar de MS5611 sensor.
Ik heb voor 5 volt uitvoeringen gekozen, omdat ik naast de voeding vanuit de ontvanger ook het servokanaal vanuit de ontvanger gebruik om mijn "afroep hoogte" commando aan de Vario te geven. Je moet niet zomaar een 3,3 Volt Arduino een 5 Volt PWM servo signaal op zijn input poort geven. Dan moet je een weerstand plaatsen volgens dit schema.
Het volgende stukje hardware is een zendertje/ontvangertje combinatie. Ik heb diverse goedkope modules uitgeprobeerd en de superheterodyne werkt bij mij goed.
Edit: later ben ik gaan testen en kwam er achter dat niet alle even goed werken. Zie hier.
Je kunt met deze onderdelen en de informatie uit het RC-groups draadje een werkende vario bouwen. Om het geluid uit de ontvanger beter hoorbaar te maken heb ik er nog een 20x audio versterker trapje achter gebouwd obv de TILM386
Foto: Het ontvanger gedeelte is een combinatie van de superheterodyne ontvanger gesoldeerd op een printje met het audio versterkertje
Ik heb inmiddels de software zelf aangepast, zodat ik ook de hoogte t.o.v. de startlocatie kan laten afroepen door middel van een serie pieptoontjes.
Hier is de code, zoals ik hem zelf in mijn Vario gebruik. Er zitten nog wat debug regels in, maar die zijn grotendeels met // op non-actief gesteld.
Let op deze code is alleen voor gebruik met de MS5611 sensor
Let op deze code is alleen voor gebruik met de BMP180 en BMP085 sensor
Ook nog even een filmpje gemaakt. Geen spannend filmpje hoor, maar je kunt horen hoe de Poor Mans Vario klinkt (MS5611 sensor) en op een gegeven moment hoor je een lange piep en vier kortere piepjes er achteraan. Dat is het opvragen van de hoogte. De eerste serie geeft de honderdtallen aan, waarbij een lange piep voor het cijfer "nul" staat. De tweede serie heeft een hogere toon en geeft de tientallen aan. In dit geval zijn dat 4 piepjes, dus de hoogte is in dit geval 40 meter, boven het niveau waar de Poor Mans Vario werd ingeschakeld.
Zodra je hem inschakelt, onthoudt hij de druk van dat moment en ziet dat als veldhoogte vanwaaruit hij de hoogte zal berekenen.
Nadeel: Poor Mans Vario werkt met hele goedkope zendertjes/ontvangertjes, die je normaal voor bijvoorbeeld het openen van een garagedeur gebruikt.. Deze werken op 433MHz en kennen geen verdere kanalen. Je kunt er praktisch gezien per vlieglocatie dus geen twee tegelijk gebruiken. Ze bestaan voor de Amerikaanse markt op de 315 MHz, maar dan ben je in theorie een zendpiraat
EDIT: Op verzoek even de beschrijving van hoe de vlieghoogte wordt doorgegeven.
De vario kent twee standen. Default is de "Vario" stand, waarin je kunt horen of je stijgt of daalt. Deze stand staat ook aan als je alleen 5 volt aansluit en geen servo kanaal.
Als je de vario op een servo kanaal aansluit kan de vario tussen 2 standen worden geschakeld (sluit hem bijv. aan op een servo tester of op je gaskanaal). Nu kun je ook kiezen voor de hoogte afroep. Aan het kanaal kun je het beste een schakelaar toewijzen, die je standaard in de "vario" positie laat staan. Wil je hoogte afroep, dan doe je die schakelaar heel even naar de andere stand en zet hem weer terug. De Vario zal dan éénmaal de hoogte afroep routine doorlopen en daarna vanzelf weer de Vario routine opstarten.
De hoogte afroep klinkt als volgt:
Eerst worden de honderdtallen uitgezonden door pieptonen van 900Hz. Een lange toon is "0" en een korte toon is 100 meter. Hoor je dus 3 korte toontjes achter elkaar dan heb je in elk geval 300 meter.
Vervolgens komen de tientallen met een 1100 Hz toon (klinkt dus hoger) Een lange toon is weer "0" en een korte toon is nu 10 meter. Hoor je dus 7 korte toontjes achter elkaar dan mag je nog 70 meter optellen bij de honderdtallen. Totaal was het in dit voorbeeld 370 meter hoogte.
De DLG versie heeft als optie de mogelijkheid (bij bestellen aangeven) om beneden de honderd meter ook nog de hoogte in hele meters door te geven. Dat gebeurt dan met een aanvullende serie pieptonen op 1300 Hz. Het idee hierachter is het meten van je werphoogte.
Nog wat voorbeelden:
Lange toon 900Hz en lange toon 1100Hz is (0 x 100) + (0 x 10) = 0 meter. Dat is dus wat je hoort als je hem op de grond aan zet.
Lange toon 900Hz en 5 korte tonen 1100Hz is (0 x 100) + (5 x 10) = 50 meter
2 korte tonen 900Hz en 8 korte tonen 1100Hz is (2 x 100) + (8 x 10) = 280 meter.
1 korte toon 900Hz en een lange toon 1100Hz is (1 x 100) + (0 x 10) = 100 meter. enz.
DLG voorbeelden:
Lange toon 900Hz, lange toon 1100Hz en lange toon 1300 Hz is (0 x 100) + (0 x 10) + (0 x 1) = 0 meter. Dat is dus wat je hoort als je hem op de grond aan zet.
Lange toon 900Hz, 5 korte tonen 1100Hz en 7 korte tonen 1300Hz is (0 x 100) + (5 x 10) + (7 x 1) = 57 meter
2 korte tonen 900Hz en 8 korte tonen 1100Hz is (2 x 100) + (8 x 10) = 280 meter.
1 korte toon 900Hz en een lange toon 1100Hz is (1 x 100) + (0 x 10) = 100 meter. enz.
(merk op dat de DLG versie boven de 100 meter dus hetzelfde gaat werken als de full size versie)
Hans
Wat is de Poor Mans Vario?
Het is een op Arduino gebaseerde variometer, waarbij het het doel is om tegen zo laag mogelijke kosten een werkende variometer te hebben die zelfstandig kan werken. Dus niet afhankelijk van telemetrie.
Denk aan hooguit €20 tot €30,- voor een werkende basic vario met ontvanger.
Op zich is het al leuk om je in Arduino te verdiepen. De laatste keer dat ik iets programmeerde was in Basic op de Commodore 64, dus ik was weer beginner.
Beter goed gejat, dan slecht verzonnen. Ik heb mijn eerste prototype dan ook gebouwd volgens de instructies in dit draadje
Foto van Prototype II, op basis van de Arduino Pro Mini

Hieronder de opsomming van de componenten om de poor-mans-vario te maken.
De Arduino Nano is wellicht het geschiktste model om mee te beginnen. Deze kan direct op 5 volt worden aangesloten en heeft een micro USB poort, zodat je hem direct op je PC kunt aansluiten. Iets lastiger maar kleiner is de Arduino Pro Mini die ik voor mijn tweede prototype heb gebruikt. Die heeft geen USB poort.
De Arduino Nano kun je oa kopen bij HK of via Ebay
Vervolgens koop je een druksensor gebaseerd op de MS5611 sensormodule.
Let op dat je een exemplaar koopt op een printplaatje met een voltage regulator die 5volt ingangsspanning naar 3,3 volt omzet. de sensormodule kan geen 5 volt aan.
Ik heb deze module gekocht via Ebay
(mocht deze link inmiddels niet meer werken, zoek dan in Ebay op MS5611
Een goedkopere sensor is de BOSCH BMP180. Deze reageert niet zo snel als de MS5611, maar het scheelt je ongeveer €10,-. Er is aparte code voor de MS5611 en voor de BMP180 (die ook op zijn tragere voorganger BMP085 werkt). Je vindt ze allebei hieronder.
Hardwarematig koppel je alle sensoren op dezelfde wijze aan de Arduino. Je kunt ook eerst met een BMP180 sensor beginnen en dan later upgraden naar de MS5611 sensor.
Ik heb voor 5 volt uitvoeringen gekozen, omdat ik naast de voeding vanuit de ontvanger ook het servokanaal vanuit de ontvanger gebruik om mijn "afroep hoogte" commando aan de Vario te geven. Je moet niet zomaar een 3,3 Volt Arduino een 5 Volt PWM servo signaal op zijn input poort geven. Dan moet je een weerstand plaatsen volgens dit schema.
Het volgende stukje hardware is een zendertje/ontvangertje combinatie. Ik heb diverse goedkope modules uitgeprobeerd en de superheterodyne werkt bij mij goed.
Edit: later ben ik gaan testen en kwam er achter dat niet alle even goed werken. Zie hier.
Je kunt met deze onderdelen en de informatie uit het RC-groups draadje een werkende vario bouwen. Om het geluid uit de ontvanger beter hoorbaar te maken heb ik er nog een 20x audio versterker trapje achter gebouwd obv de TILM386
Foto: Het ontvanger gedeelte is een combinatie van de superheterodyne ontvanger gesoldeerd op een printje met het audio versterkertje

Ik heb inmiddels de software zelf aangepast, zodat ik ook de hoogte t.o.v. de startlocatie kan laten afroepen door middel van een serie pieptoontjes.
Hier is de code, zoals ik hem zelf in mijn Vario gebruik. Er zitten nog wat debug regels in, maar die zijn grotendeels met // op non-actief gesteld.
Let op deze code is alleen voor gebruik met de MS5611 sensor
Code:
[FONT=Arial][SIZE=3]
//**********************************
//* MS5611 sensor version *
//**********************************
[/SIZE][/FONT]//[FONT=Arial][SIZE=3][FONT=Verdana][SIZE=2] This is the Poor Mans Vario code for the MS5611 sensor [/SIZE][/FONT][/SIZE][/FONT]
// All code by Rolf R Bakke, Oct 2012
// Modified by Hans Meijdam, June 2013. added altitude feature
// Modified by Hans Meijdam, November 2013.
// Led on Arduino is in sync with audio
// Bug fixed that now "Vario Mode" is default mode if no servo channel PWM data is present on pin D3
// Improved documentation here and there
#include <Wire.h>
const byte led = 13;
unsigned int calibrationData[7];
unsigned long time = 0;
float toneFreq, toneFreqLowpass, pressure, lowpassFast, lowpassSlow;
float p0; // this will be used to store the airfield elevation pressure
int altitude;
int ch1; // Here's where we'll keep our channel values
int ddsAcc;
void setup()
{
Wire.begin();
Serial.begin(9600); // in case you want to use the included serial.print debugging commands that are currently commented out
delay(200);
setupSensor();
for (int p0=0; p0 <= 100; p0++){
pressure = getPressure(); // warming up the sensor for ground level setting
}
p0 = getPressure(); // Setting the ground level pressure
lowpassFast = lowpassSlow = pressure;
pinMode(3, INPUT); // Set our input pins as such for altitude command input from receiver via pin D3
}
void loop()
{
pressure = getPressure();
// Serial.print(p0);
// Serial.print(" ");
// Serial.print(pressure);
altitude = (float)44330 * (1 - pow(((float) pressure/p0), 0.190295));
// Serial.print(" ");
// Serial.println(altitude);
lowpassFast = lowpassFast + (pressure - lowpassFast) * 0.1;
lowpassSlow = lowpassSlow + (pressure - lowpassSlow) * 0.05;
toneFreq = (lowpassSlow - lowpassFast) * 50;
toneFreqLowpass = toneFreqLowpass + (toneFreq - toneFreqLowpass) * 0.1;
toneFreq = constrain(toneFreqLowpass, -500, 500);
ddsAcc += toneFreq * 100 + 2000;
if (toneFreq < 0 || ddsAcc > 0)
{
tone(2, toneFreq + 510);
ledOn(); // the Arduino led will blink if the Vario plays a tone, so you can test without having audio connected
}
else
{
noTone(2);
ledOff();
}
int ones = altitude%10;
int tens = (altitude/10)%10;
int hundreds = (altitude/100)%10;
int thousands = (altitude/1000)%10;
// Serial.print ("thousands: ");
// Serial.println (thousands);
// Serial.print ("hundreds: ");
// Serial.println (hundreds);
// Serial.print ("tens: ");
// Serial.println (tens);
// Serial.print ("ones: ");
// Serial.println (ones);
while (millis() < time); //loop frequency timer
time += 20;
ch1 = pulseIn(3, HIGH, 25000); // Read the pulse width of servo signal connected to pin D3
// if(ch1>1000){
// Serial.println("Left Switch: Engaged");
// }
// if(ch1<1000){
// Serial.println("Left Switch: Disengaged");
// }
if((map(ch1, 1000,2000,-500,500)) > 0) // interpret the servo channel pulse, if the Vario should beep altitude or send vario sound
{
noTone(2); // create 750 ms of silence, or you won't hear the first altitude beep
ledOff();
delay(750);
if(hundreds == 0)
{
tone(2,900); //long duration tone if the number is zero
ledOn();
delay(600);
noTone(2);
ledOff();
}
else
for(char a = 0; a < hundreds; a++) //this loop makes a beep for each hundred meters altitude
{
tone(2,900); // 900 Hz tone frequency for the hundreds
ledOn();
delay(200);
noTone(2);
ledOff();
delay(200);
}
delay(750); //longer delay between hundreds and tens
if(tens == 0)
{
tone(2,1100); //long pulse if the number is zero
ledOn();
delay(600);
noTone(2);
ledOff();
}
else
for(char a = 0; a < tens; a++) //this loop makes a beep for each ten meters altitude
{
tone(2,1100); //1100 Hz tone frequency for the tens
ledOn();
delay(200);
noTone(2);
ledOff();
delay(200);
}
for (int p0=0; p0 <= 40; p0++)
{
pressure = getPressure(); // warming up the sensor again, by reading it 40 times
}
}
}
long getPressure()
{
long D1, D2, dT, P;
float TEMP;
int64_t OFF, SENS;
D1 = getData(0x48, 10);
D2 = getData(0x50, 1);
dT = D2 - ((long)calibrationData[5] << 8);
TEMP = (2000 + (((int64_t)dT * (int64_t)calibrationData[6]) >> 23)) / (float)100;
OFF = ((unsigned long)calibrationData[2] << 16) + (((int64_t)calibrationData[4] * dT) >> 7);
SENS = ((unsigned long)calibrationData[1] << 15) + (((int64_t)calibrationData[3] * dT) >> 8);
P = (((D1 * SENS) >> 21) - OFF) >> 15;
// Serial.println(TEMP);
//Serial.println(P);
return P;
}
long getData(byte command, byte del)
{
long result = 0;
twiSendCommand(0x77, command);
delay(del);
twiSendCommand(0x77, 0x00);
Wire.requestFrom(0x77, 3);
if(Wire.available()!=3) Serial.println("Error: raw data not available");
for (int i = 0; i <= 2; i++)
{
result = (result<<8) | Wire.read();
}
return result;
}
void setupSensor()
{
twiSendCommand(0x77, 0x1e);
delay(100);
for (byte i = 1; i <=6; i++)
{
unsigned int low, high;
twiSendCommand(0x77, 0xa0 + i * 2);
Wire.requestFrom(0x77, 2);
if(Wire.available()!=2) Serial.println("Error: calibration data not available");
high = Wire.read();
low = Wire.read();
calibrationData[i] = high<<8 | low;
Serial.print("calibration data #");
Serial.print(i);
Serial.print(" = ");
Serial.println( calibrationData[i] );
}
}
void twiSendCommand(byte address, byte command)
{
Wire.beginTransmission(address);
if (!Wire.write(command)) Serial.println("Error: write()");
if (Wire.endTransmission())
{
Serial.print("Error when sending command: ");
Serial.println(command, HEX);
}
}
void ledOn()
{
digitalWrite(led,1);
}
void ledOff()
{
digitalWrite(led,0);
}
Let op deze code is alleen voor gebruik met de BMP180 en BMP085 sensor
Code:
//**********************************
//* BMP085 and BMP180 version *
//**********************************
// This is the Poor Mans Vario code for the cheaper BMP085 and the BMP180 sensor by BOSCH Sensortec
// Arduino <> Sensor: Connect VCC to VCC and GND to GND, SCL goes to analogue pin 5, SDA to analogue pin4.
// Servo signal input, connect to Arduino pin D3
// Audio output to transmitter on pin D2
// All code by Rolf R Bakke, Oct 2012
// Modified by Hans Meijdam, June 2013: added altitude feature
// Modified by Hans Meijdam, November 2013: Sensor routine created for BMP085 and BMP180
//
#include "Wire.h"
const byte led = 13;
unsigned long time = 0;
float toneFreq, toneFreqLowpass, flpressure, lowpassFast, lowpassSlow ;
float p0; // this will be used to store the airfield elevation pressure
int altitude;
int ch1; // Here's where we'll keep our channel values
int ddsAcc;
#define I2C_ADDRESS 0x77
const unsigned char oversampling_setting = 3; //oversamplig for measurement
const unsigned char pressure_waittime[4] = {
5, 8, 14, 26 };
//Sensor parameters taken from the BMP085 datasheet
int ac1, ac2, ac3;
unsigned int ac4, ac5, ac6;
int b1, b2, mb, mc, md;
int temperature;
long pressure;
void setup()
{
Serial.begin(9600); // start serial for output
Serial.println("Setting up BMP085");
Wire.begin();
bmp085_get_cal_data();
bmp085_read_temperature_and_pressure(&temperature,&pressure);
flpressure=pressure;// move long type pressure into float type flpressure
p0 = lowpassFast = lowpassSlow = flpressure;
Serial.print(" p0 = ");
Serial.println(p0);
pinMode(3, INPUT); // Set our input pins as such for altitude command input from receiver via pin D3
}
void loop()
{
bmp085_read_temperature_and_pressure(&temperature,&pressure);
// Serial.print(temperature,DEC);
// Serial.print(" ");
// Serial.print(pressure,DEC);
// Serial.print(" ");
flpressure = pressure;// move long type pressure into float type flpressure
altitude = (float)44330 * (1 - pow(((float) flpressure/p0), 0.190295));
// Serial.print(" ");
// Serial.println(altitude);
lowpassFast = lowpassFast + (flpressure - lowpassFast) * 0.3;
lowpassSlow = lowpassSlow + (flpressure - lowpassSlow) * 0.15;
toneFreq = (lowpassSlow - lowpassFast) * 50;
toneFreqLowpass = toneFreqLowpass + (toneFreq - toneFreqLowpass) * 0.1;
toneFreq = constrain(toneFreqLowpass, -1000, 1000);
ddsAcc += toneFreq * 100 + 2000;
if (toneFreq < 0 || ddsAcc > 0)
{
tone(2, toneFreq + 510);
ledOn(); // the Arduino led will blink if the Vario plays a tone, so you can test without having audio connected
}
else
{
noTone(2);
ledOff();
}
while (millis() < time); //loop frequency timer
time += 20;
int ones = altitude%10;
int tens = (altitude/10)%10;
int hundreds = (altitude/100)%10;
int thousands = (altitude/1000)%10;
// Serial.print ("thousands: ");
// Serial.println (thousands);
// Serial.print ("hundreds: ");
// Serial.println (hundreds);
// Serial.print ("tens: ");
// Serial.println (tens);
// Serial.print ("ones: ");
// Serial.println (ones);
ch1 = pulseIn(3, HIGH, 25000); // Read the pulse width of servo signal connected to pin D3
// Serial.print (ch1);
//
// if(ch1>1000){
// Serial.println("Left Switch: Engaged");
// }
// if(ch1<1000){
// Serial.println("Left Switch: Disengaged");
// }
if((map(ch1, 1000,2000,-500,500)) > 0) // interpret the servo channel pulse, if the Vario should beep altitude or send vario sound
{
noTone(2); // create 750 ms of silence, or you won't hear the first altitude beep
ledOff();
delay(750);
if(hundreds == 0)
{
tone(2,900); //long duration tone if the number is zero
ledOn();
delay(600);
noTone(2);
ledOff();
}
else
for(char a = 0; a < hundreds; a++) //this loop makes a beep for each hundred meters altitude
{
tone(2,900); // 900 Hz tone frequency for the hundreds
ledOn();
delay(200);
noTone(2);
ledOff();
delay(200);
}
delay(750); //longer delay between hundreds and tens
if(tens == 0)
{
tone(2,1100); //long pulse if the number is zero
ledOn();
delay(600);
noTone(2);
ledOff();
}
else
for(char a = 0; a < tens; a++) //this loop makes a beep for each ten meters altitude
{
tone(2,1100); //1100 Hz tone frequency for the tens
ledOn();
delay(200);
noTone(2);
ledOff();
delay(200);
}
for (int p0=0; p0 <= 20; p0++)
{
// warming up the sensor again, by reading it 20 times
bmp085_read_temperature_and_pressure(&temperature,&pressure);
}
}
}
void bmp085_read_temperature_and_pressure(int* temperature, long* pressure) {
int ut= bmp085_read_ut();
long up = bmp085_read_up();
long x1, x2, x3, b3, b5, b6, p;
unsigned long b4, b7;
//calculate the temperature
x1 = ((long)ut - ac6) * ac5 >> 15;
x2 = ((long) mc << 11) / (x1 + md);
b5 = x1 + x2;
*temperature = (b5 + 8) >> 4;
//calculate the pressure
b6 = b5 - 4000;
x1 = (b2 * (b6 * b6 >> 12)) >> 11;
x2 = ac2 * b6 >> 11;
x3 = x1 + x2;
if (oversampling_setting == 3) b3 = ((int32_t) ac1 * 4 + x3 + 2) << 1;
if (oversampling_setting == 2) b3 = ((int32_t) ac1 * 4 + x3 + 2);
if (oversampling_setting == 1) b3 = ((int32_t) ac1 * 4 + x3 + 2) >> 1;
if (oversampling_setting == 0) b3 = ((int32_t) ac1 * 4 + x3 + 2) >> 2;
x1 = ac3 * b6 >> 13;
x2 = (b1 * (b6 * b6 >> 12)) >> 16;
x3 = ((x1 + x2) + 2) >> 2;
b4 = (ac4 * (uint32_t) (x3 + 32768)) >> 15;
b7 = ((uint32_t) up - b3) * (50000 >> oversampling_setting);
p = b7 < 0x80000000 ? (b7 * 2) / b4 : (b7 / b4) * 2;
x1 = (p >> 8) * (p >> 8);
x1 = (x1 * 3038) >> 16;
x2 = (-7357 * p) >> 16;
*pressure = p + ((x1 + x2 + 3791) >> 4);
}
unsigned int bmp085_read_ut() {
write_register(0xf4,0x2e);
delay(5); //longer than 4.5 ms
return read_int_register(0xf6);
}
void bmp085_get_cal_data() {
Serial.println("Reading Calibration Data");
ac1 = read_int_register(0xAA);
Serial.print("AC1: ");
Serial.println(ac1,DEC);
ac2 = read_int_register(0xAC);
Serial.print("AC2: ");
Serial.println(ac2,DEC);
ac3 = read_int_register(0xAE);
Serial.print("AC3: ");
Serial.println(ac3,DEC);
ac4 = read_int_register(0xB0);
Serial.print("AC4: ");
Serial.println(ac4,DEC);
ac5 = read_int_register(0xB2);
Serial.print("AC5: ");
Serial.println(ac5,DEC);
ac6 = read_int_register(0xB4);
Serial.print("AC6: ");
Serial.println(ac6,DEC);
b1 = read_int_register(0xB6);
Serial.print("B1: ");
Serial.println(b1,DEC);
b2 = read_int_register(0xB8);
Serial.print("B2: ");
Serial.println(b2,DEC);
mb = read_int_register(0xBA);
Serial.print("MB: ");
Serial.println(mb,DEC);
mc = read_int_register(0xBC);
Serial.print("MC: ");
Serial.println(mc,DEC);
md = read_int_register(0xBE);
Serial.print("MD: ");
Serial.println(md,DEC);
}
long bmp085_read_up() {
write_register(0xf4,0x34+(oversampling_setting<<6));
delay(pressure_waittime[oversampling_setting]);
unsigned char msb, lsb, xlsb;
Wire.beginTransmission(I2C_ADDRESS);
Wire.write(0xf6); // register to read
Wire.endTransmission();
Wire.requestFrom(I2C_ADDRESS, 3); // read a byte
while(!Wire.available()) {
// waiting
}
msb = Wire.read();
while(!Wire.available()) {
// waiting
}
lsb |= Wire.read();
while(!Wire.available()) {
// waiting
}
xlsb |= Wire.read();
return (((long)msb<<16) | ((long)lsb<<8) | ((long)xlsb)) >>(8-oversampling_setting);
}
void write_register(unsigned char r, unsigned char v)
{
Wire.beginTransmission(I2C_ADDRESS);
Wire.write(r);
Wire.write(v);
Wire.endTransmission();
}
char read_register(unsigned char r)
{
unsigned char v;
Wire.beginTransmission(I2C_ADDRESS);
Wire.write(r); // register to read
Wire.endTransmission();
Wire.requestFrom(I2C_ADDRESS, 1); // read a byte
while(!Wire.available()) {
// waiting
}
v = Wire.read();
return v;
}
int read_int_register(unsigned char r)
{
unsigned char msb, lsb;
Wire.beginTransmission(I2C_ADDRESS);
Wire.write(r); // register to read
Wire.endTransmission();
Wire.requestFrom(I2C_ADDRESS, 2); // read a byte
while(!Wire.available()) {
// waiting
}
msb = Wire.read();
while(!Wire.available()) {
// waiting
}
lsb = Wire.read();
return (((int)msb<<8) | ((int)lsb));
}
void ledOn()
{
digitalWrite(led,1);
}
void ledOff()
{
digitalWrite(led,0);
}
Zodra je hem inschakelt, onthoudt hij de druk van dat moment en ziet dat als veldhoogte vanwaaruit hij de hoogte zal berekenen.
Nadeel: Poor Mans Vario werkt met hele goedkope zendertjes/ontvangertjes, die je normaal voor bijvoorbeeld het openen van een garagedeur gebruikt.. Deze werken op 433MHz en kennen geen verdere kanalen. Je kunt er praktisch gezien per vlieglocatie dus geen twee tegelijk gebruiken. Ze bestaan voor de Amerikaanse markt op de 315 MHz, maar dan ben je in theorie een zendpiraat

EDIT: Op verzoek even de beschrijving van hoe de vlieghoogte wordt doorgegeven.
De vario kent twee standen. Default is de "Vario" stand, waarin je kunt horen of je stijgt of daalt. Deze stand staat ook aan als je alleen 5 volt aansluit en geen servo kanaal.
Als je de vario op een servo kanaal aansluit kan de vario tussen 2 standen worden geschakeld (sluit hem bijv. aan op een servo tester of op je gaskanaal). Nu kun je ook kiezen voor de hoogte afroep. Aan het kanaal kun je het beste een schakelaar toewijzen, die je standaard in de "vario" positie laat staan. Wil je hoogte afroep, dan doe je die schakelaar heel even naar de andere stand en zet hem weer terug. De Vario zal dan éénmaal de hoogte afroep routine doorlopen en daarna vanzelf weer de Vario routine opstarten.
De hoogte afroep klinkt als volgt:
Eerst worden de honderdtallen uitgezonden door pieptonen van 900Hz. Een lange toon is "0" en een korte toon is 100 meter. Hoor je dus 3 korte toontjes achter elkaar dan heb je in elk geval 300 meter.
Vervolgens komen de tientallen met een 1100 Hz toon (klinkt dus hoger) Een lange toon is weer "0" en een korte toon is nu 10 meter. Hoor je dus 7 korte toontjes achter elkaar dan mag je nog 70 meter optellen bij de honderdtallen. Totaal was het in dit voorbeeld 370 meter hoogte.
De DLG versie heeft als optie de mogelijkheid (bij bestellen aangeven) om beneden de honderd meter ook nog de hoogte in hele meters door te geven. Dat gebeurt dan met een aanvullende serie pieptonen op 1300 Hz. Het idee hierachter is het meten van je werphoogte.
Nog wat voorbeelden:
Lange toon 900Hz en lange toon 1100Hz is (0 x 100) + (0 x 10) = 0 meter. Dat is dus wat je hoort als je hem op de grond aan zet.
Lange toon 900Hz en 5 korte tonen 1100Hz is (0 x 100) + (5 x 10) = 50 meter
2 korte tonen 900Hz en 8 korte tonen 1100Hz is (2 x 100) + (8 x 10) = 280 meter.
1 korte toon 900Hz en een lange toon 1100Hz is (1 x 100) + (0 x 10) = 100 meter. enz.
DLG voorbeelden:
Lange toon 900Hz, lange toon 1100Hz en lange toon 1300 Hz is (0 x 100) + (0 x 10) + (0 x 1) = 0 meter. Dat is dus wat je hoort als je hem op de grond aan zet.
Lange toon 900Hz, 5 korte tonen 1100Hz en 7 korte tonen 1300Hz is (0 x 100) + (5 x 10) + (7 x 1) = 57 meter
2 korte tonen 900Hz en 8 korte tonen 1100Hz is (2 x 100) + (8 x 10) = 280 meter.
1 korte toon 900Hz en een lange toon 1100Hz is (1 x 100) + (0 x 10) = 100 meter. enz.
(merk op dat de DLG versie boven de 100 meter dus hetzelfde gaat werken als de full size versie)
Hans
Laatst bewerkt: