Hi everyone ! I'm a french student and I'm planning to use a barometric sensor to evaluate the altitude evolution of a water rocket for a preparatory school project. For that, I bought the BMP 180 sensor to gather data and also a SPI FRAM in order to save them. Those are made by adafruit. I use a Arduino Uno
I used a program indicated by this website concerning the gathering of data.
It works well.
The problem is, I can't gather data when I use a external power.
So, when the sensor is connected to the computer, I gather data. But, when I use an external power (in order to fixe it on the water rocket), the program doesn't work. It is really disturbing.
The computer display just lines of zeros when I plug the Arduino Uno after the utilisation of an external power.
If someone could help me, it would be great !
-->Here is the program in question,
#include <Wire.h>
#include <Adafruit_BMP085.h> // bibliothèques utiles
#include <SPI.h>
#include "Adafruit_FRAM_SPI.h"
// définir les ports utilisées sur le FRAM
uint8_t FRAM_CS = 10;
uint8_t FRAM_SCK= 13;
uint8_t FRAM_MISO = 12;
uint8_t FRAM_MOSI = 11;
//Or use software SPI, any pins!
Adafruit_FRAM_SPI fram = Adafruit_FRAM_SPI(FRAM_SCK, FRAM_MISO, FRAM_MOSI, FRAM_CS); // créer l'objet FRAM
#if defined(ARDUINO_ARCH_SAMD)
// créer un interface quand on relie notre capteur à un port USB
#endif
// definir les grandeurs utiles
uint32_t Recup ;
uint32_t altitronq;
float altitude;
uint16_t addrenregistre;
float time1;
float time2;
uint16_t ui16Adresse;
int i ;
uint8_t entree = 3; // l'entrée est configuré sur le port A3
uint8_t sortie = 2; // la sortie est configurée sur le port A2
int valloop ; // savoir le nombre de fois qu'on va dans la void loop
uint16_t adresse;
Adafruit_BMP085 bmp; // associer à bmp le capteur
void setup() {
Serial.begin(9600);
if (!bmp.begin()) {
Serial.println("Could not find a valid BMP085 sensor, check wiring!"); // voir si capteur est reconnu
while (1) {}
}
ui16Adresse=0x1; // initialiser l'adresse d'écriture
adresse = 0x1 ; // initialiser l'adresse de lecture sur le fram ( = Mémoire morte externe )
fram.begin();
if(fram.begin()) { // initialiser l'interface objet ordinateur et voir si le FRAM a été détecté
Serial.println("Found SPI FRAM");
} else {
Serial.println("No SPI FRAM found ... check your connections\r\n");
while (1);
}
pinMode(entree,INPUT_PULLUP); // on définit l'entrée comme une entrée PULLUP pour fixer sa valeur a HIGH OR LOW, ie d'avoir deux états élec clairs et distincts et quand le fil est relié à rien on a HIGH car on est au VCC au port 3
pinMode(sortie, OUTPUT) ; // la sortie est en mode OUTPUT
digitalWrite(sortie, LOW) ; // La sortie vaut LOW = on la met à la masse
valloop=0; // valeur nulle au départ
}
void loop() {
int valentree = digitalRead(entree);
Serial.println();
Serial.println(valentree);
if (valentree == LOW ) // programme de lecture des donnée sur le fram sans l'écriture quand on relit les fils en A2 et A3 ensemble l'entree passe en LOW car on relie le 3 à la masse
{
for (i=1 ; i <= valloop ; i++) // lire les données écrites sur le capteur pendant le décollage
{
fram.read(adresse, (uint8_t *) &Recup, 4); // lire les 4 octets pour avoir la valeur écrite de l'altitude du début des mesures à la fin des mesures
Serial.println(Recup);
Serial.println("metres");
Serial.println(adresse);
Serial.println(valloop);
Serial.println(i);
Serial.println();
adresse += 4;
delay(1000);
}
}
else // lecture du capteur
{
time1 = millis() ; // prendre l'instant réel avant les mesures
Serial.print("Pressure = ");
Serial.print(bmp.readPressure());
Serial.println(" Pa");
Serial.print("Pressure at sealevel (calculated) = ");
Serial.print(bmp.readSealevelPressure());
Serial.println(" Pa");
// mesurer la pression avec une référence prise au sol ou n'importe ou=altitude nulle
Serial.print("Real altitude = ");
Serial.print(bmp.readAltitude( 103147)); // pression au niveau du sol dans ma maison pour la référence de l'altitude
altitude = bmp.readAltitude( 103147) ;
Serial.println(" meters");
altitronq = (float) altitude*10 ; //capteur précis au dixième de mètre et la on a aucune décimale sans le x10
// Test écriture sur FRAM
fram.writeEnable(true);
//fram.write(0x1,(uint8_t*)ui16Adresse,2);
//fram.read(0x1,(uint8_t*)addrenregistre,2);
fram.write(ui16Adresse, (uint8_t *) &altitronq, 4); // séparer la valeur de l'altitude en 4x1 octects et l'écrit sur 4 octets à la suite et pareil lecture
fram.writeEnable(false);
fram.read(ui16Adresse, (uint8_t *) &Recup, 4); // lire les 4 octets pour avoir la valeur écrite séparée et voir si la valeur écrite est cohérente
Serial.print("valeur ecrite sur le FRAM = ");
Serial.print(Recup);
Serial.println();
Serial.println(valloop);
Serial.println(ui16Adresse);
Serial.println();
valloop +=1 ;
ui16Adresse += 4;
if ( ui16Adresse == 32000) // capacité max de stockage
{
while (1) ; // arret du programme = boucle " infini" qui permet d'arreter la boucle
}
else
{
do {
time2 = millis() ;
} while ( time2 <= time1 + 1000); // temps entre chaque mesure qui est le même pour l'échelle de temps
}
}
}