More memory optimizations
This commit is contained in:
49
README.md
49
README.md
@@ -1,4 +1,13 @@
|
||||
# MISE À JOUR #
|
||||
DIY Arduino variometer
|
||||
==================
|
||||
|
||||
- [Mise à jour](#mise-à-jour)
|
||||
- [Présentation](#présentation)
|
||||
- [Schéma](#schéma)
|
||||
- [Installation](#installation)
|
||||
- [Interface et utilisation](#interface-et-utilisation)
|
||||
|
||||
## MISE À JOUR
|
||||
|
||||
**Attention !** Lors de la dernière mise à jour le schéma de connection de l'écran a été modifié pour des soucis d'optimisations du montage.
|
||||
|
||||
@@ -14,23 +23,15 @@ Bien sûr vous pouvez adapter le code suivant l'ordre des branchements de l'écr
|
||||
Cela est valable aussi avec l'encodeur digital pour inverser le sens de rotation en remplaçant ```
|
||||
Encoder knob(3, 2);``` par ``` Encoder knob(2, 3);```
|
||||
|
||||
**Il faut également ré-initialiser la mémoire EEPROM en téléversant une première fois avec la variable initialisation à true puis re-téléverser avec initialisation à false (voir partie [Installation](#installation)).**
|
||||
|
||||
|
||||
DIY Arduino variometer
|
||||
==================
|
||||
|
||||
- [Vidéo](#vidéo)
|
||||
- [Matériel et coût](#matériel-et-coût)
|
||||
- [Schéma](#schéma)
|
||||
- [Installation](#installation)
|
||||
- [Interface](#interface)
|
||||
|
||||
## Vidéo
|
||||
## Présentation
|
||||
### Vidéo de démo
|
||||
|
||||
[](http://www.youtube.com/watch?v=KeNAhEgbHnc)
|
||||
|
||||
|
||||
## Matériel et coût
|
||||
### Matériel et coût
|
||||
|
||||
Le but de ce projet est de fabriquer un variomètre à faible coût pour une utilisation en vol libre (dans mon cas la pratique du parapente).
|
||||
Voici à titre indicatif le matériel utilisé et leur prix d'achat sur eBay international (prix de janvier 2014) :
|
||||
@@ -59,22 +60,32 @@ Voici à titre indicatif le matériel utilisé et leur prix d'achat sur eBay int
|
||||
|
||||
## Installation
|
||||
|
||||
Une fois votre montage terminé il faut compiler et téléverser le code sur votre Arduino. Pour cela il vous faudra utiliser l'IDE Arduino.
|
||||
|
||||
**Il faut utiliser [au minimum la version 1.5 de l'IDE Arduino](http://arduino.cc/en/main/software#toc3), sinon des erreurs de compilation apparaissent !**
|
||||
|
||||
Lors du premier téléversement du programme sur l'Arduino il est important de passer la variable *initialisation* à *true*.
|
||||
Celle-ci permet d'initisaliser correctement la mémoire Eeprom (stockant les statistiques et les options).
|
||||
Tout d'abord vous devez installer les librairies fournies avec le projet. Copiez le contenu du dossier librairies dans le dossier librairies de votre installation (par exemple C:\Users\Toto\Documents\Arduino\libraries)
|
||||
|
||||
Ensuite éditez avec l'IDE Arduino le fichier Variometer/Variometer.ino et cliquez sur le bouton "Vérifier" en haut du logiciel. Après un certain temps le message "Compilation terminée" devrait apparaitre. Si vous avez des erreurs vérifiez que les librairies sont bien installées (cf plus haut).
|
||||
|
||||
Une fois la compilation OK il faut téléverser le programme sur l'Arduino à l'aide d'un câble USB par exemple et en cliquant sur le bouton "Téléverser" de l'IDE. **Mais avant cela lisez ce qui suit !**
|
||||
|
||||
**Lors du premier téléversement du programme sur l'Arduino il est important de mettre dans le code la variable initialisation à true.
|
||||
Celle-ci permet d'initisaliser correctement la mémoire Eeprom (stockant les statistiques et les options).**
|
||||
|
||||
```
|
||||
bool initialisation = true;
|
||||
```
|
||||
|
||||
Une fois le premier allumage fait il faut donc re-téléverser le code avec cette fois-ci *initialisation* à *false*. Si cela n’est pas fait la mémoire Eeprom sera effacée à chaque allumage.
|
||||
**Une fois le premier allumage fait il faut donc re-téléverser le code avec cette fois-ci initialisation à false. Si cela n’est pas fait la mémoire Eeprom sera effacée à chaque allumage !**
|
||||
|
||||
```
|
||||
bool initialisation = false;
|
||||
```
|
||||
|
||||
## Interface
|
||||
|
||||
## Interface et utilisation
|
||||
|
||||
|
||||
Ce variomètre utilise un minimum de commande pour naviguer dans le menu et interagir avec l'interface. Nous utilisons un encodeur digital permettant trois actions: Gauche - Droite - Valider.
|
||||
|
||||
@@ -120,9 +131,9 @@ Lors d'un appui long sur le poussoir de l'encodeur, les statistiques sont réini
|
||||
|
||||
L'enregistrement des statistiques de vol se déclenche automatiquement.
|
||||
Pour cela le variomètre détecte une prise ou une baisse d'altitude significative entrainant le statut "en vol".
|
||||
Lorsqu'il n'y a pas de baisse ou de prise d'altitude significative depuis un certain temps, le statut "en vol" s'arrête.
|
||||
Lorsqu'il n'y a pas de baisse ou de prise d'altitude significative pendant un certain temps, le statut "en vol" s'arrête.
|
||||
|
||||
A la fin du vol les statistiques sont enregistrés en dur donc ne sont pas perdus à l'extinction du variomètre.
|
||||
A la fin du vol les statistiques sont sauvegardées et ne sont pas perdues à l'extinction du variomètre.
|
||||
|
||||
Ce programme peut enregistrer 5 rapports de vol. Une fois un vol terminé, la piste suivante d'enregistrement est sélectionnée. Si celle-ci n'est pas vide elle n'est pas écrasée. Il faut alors manuellement effacer la plage de stat en cours ou reset toutes les plages.
|
||||
|
||||
|
||||
@@ -134,16 +134,16 @@ struct Conf
|
||||
0.3, -1.1 , 0, 0, 50, true, 1040.00, 0
|
||||
};
|
||||
|
||||
// Statistic structure (176 bits)
|
||||
#define NB_STATS 5
|
||||
// Statistic structure (128 bits)
|
||||
#define NB_STATS 6
|
||||
struct Stat
|
||||
{
|
||||
uint32_t chrono_start;
|
||||
uint16_t chrono;
|
||||
int alti_max;
|
||||
int alti_min;
|
||||
float txchutemax;
|
||||
float txchutemin;
|
||||
uint8_t txchutemax;
|
||||
uint8_t txchutemin;
|
||||
float cumul_alt;
|
||||
} stat = {
|
||||
0, 0, -20000, 20000, 0, 0, 0
|
||||
@@ -202,8 +202,7 @@ void resetAllStats()
|
||||
void playConfirmMelody()
|
||||
{
|
||||
if (true == conf.volume){
|
||||
toneAC(700, 150);
|
||||
toneAC(500, 150);
|
||||
toneAC(700, 300);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -269,10 +268,17 @@ void renderVario()
|
||||
// set up my_temperature
|
||||
display.setCursor(62, 9);
|
||||
bmp085.getTemperature(&my_temperature);
|
||||
display.print((int)my_temperature);
|
||||
display.drawCircle(75, 10, 1, BLACK);
|
||||
display.setCursor(72, 9);
|
||||
display.print(F(" C"));
|
||||
display.print((int)my_temperature);
|
||||
display.drawPixel(75, 9, BLACK);
|
||||
display.drawPixel(76, 9, BLACK);
|
||||
display.drawPixel(74, 10, BLACK);
|
||||
display.drawPixel(74, 11, BLACK);
|
||||
display.drawPixel(75, 12, BLACK);
|
||||
display.drawPixel(76, 12, BLACK);
|
||||
display.drawPixel(77, 10, BLACK);
|
||||
display.drawPixel(77, 11, BLACK);
|
||||
display.setCursor(79, 9);
|
||||
display.print(F("C"));
|
||||
}
|
||||
|
||||
//Vario
|
||||
@@ -345,15 +351,6 @@ void renderStatItem(float value, const __FlashStringHelper *unit, bool integer =
|
||||
}
|
||||
else {
|
||||
display.print(value, 1);
|
||||
/*
|
||||
if (value < 0)
|
||||
display.print(F("-"));
|
||||
float value_abs = abs(value);
|
||||
uint8_t m = floor(value_abs);
|
||||
display.print(m);
|
||||
display.print(F("."));
|
||||
display.print(round(10 * value_abs) - (10 * m));
|
||||
*/
|
||||
}
|
||||
display.print(unit);
|
||||
}
|
||||
@@ -657,8 +654,8 @@ void renderMenu(MenuItem newMenuItem = menu.getCurrent(), uint8_t dir = 2)
|
||||
display.println();
|
||||
|
||||
display.print(F("m/s:"));
|
||||
renderStatItem(stat_to_display.txchutemax, F("|"));
|
||||
renderStatItem(stat_to_display.txchutemin, F(""));
|
||||
renderStatItem(-(float)stat_to_display.txchutemax/10, F("|"));
|
||||
renderStatItem((float)stat_to_display.txchutemin/10, F(""));
|
||||
display.println();
|
||||
|
||||
display.print(F("Cumul:"));
|
||||
@@ -811,7 +808,7 @@ void updateAltitude(bool reset = false)
|
||||
sensors_event_t event;
|
||||
bmp085.getEvent(&event);
|
||||
// put it in smooth filter and take average
|
||||
average_pressure = (true == reset)? event.pressure : average_pressure * 0.94 + event.pressure * 0.06;
|
||||
average_pressure = (true == reset)? event.pressure : average_pressure * 0.95 + event.pressure * 0.05;
|
||||
// take new altitude in meters
|
||||
Altitude = bmp085.pressureToAltitude(conf.p0, average_pressure) + conf.currentAltitude;
|
||||
}
|
||||
@@ -927,11 +924,12 @@ void loop()
|
||||
stat.alti_max = Altitude;
|
||||
if (Altitude < stat.alti_min)
|
||||
stat.alti_min = Altitude;
|
||||
|
||||
if (vario < stat.txchutemax)
|
||||
stat.txchutemax = vario;
|
||||
if (vario > stat.txchutemin)
|
||||
stat.txchutemin = vario;
|
||||
|
||||
int decivario = (int)(vario*10);
|
||||
if (decivario < -stat.txchutemax)
|
||||
stat.txchutemax = -decivario;
|
||||
if (decivario > stat.txchutemin)
|
||||
stat.txchutemin = decivario;
|
||||
}
|
||||
|
||||
alt = Altitude;
|
||||
|
||||
@@ -133,12 +133,12 @@ static const unsigned char font[] PROGMEM = {
|
||||
0x3C, 0x40, 0x30, 0x40, 0x3C, //119 w
|
||||
0x44, 0x28, 0x10, 0x28, 0x44, //120 x
|
||||
0x4C, 0x90, 0x90, 0x90, 0x7C, //121 y
|
||||
0x44, 0x64, 0x54, 0x4C, 0x44 //122 z
|
||||
// 0x00, 0x08, 0x36, 0x41, 0x00, //123 {
|
||||
// 0x00, 0x00, 0x77, 0x00, 0x00, //124 |
|
||||
// 0x00, 0x41, 0x36, 0x08, 0x00, //125 }
|
||||
// 0x02, 0x01, 0x02, 0x04, 0x02, //126 ~
|
||||
// 0x3C, 0x26, 0x23, 0x26, 0x3C, //127 (delete)
|
||||
0x44, 0x64, 0x54, 0x4C, 0x44, //122 z
|
||||
0x00, 0x08, 0x36, 0x41, 0x00, //123 {
|
||||
0x00, 0x00, 0x77, 0x00, 0x00, //124 |
|
||||
0x00, 0x41, 0x36, 0x08, 0x00, //125 }
|
||||
0x02, 0x01, 0x02, 0x04, 0x02, //126 ~
|
||||
0x3C, 0x26, 0x23, 0x26, 0x3C //127 (delete)
|
||||
// 0x1E, 0xA1, 0xA1, 0x61, 0x12, //128 €
|
||||
// 0x3A, 0x40, 0x40, 0x20, 0x7A, //129
|
||||
// 0x38, 0x54, 0x54, 0x55, 0x59, //130 ‚
|
||||
|
||||
Reference in New Issue
Block a user