PROJETO ARDUSAT TRANSMISSOR/RECEPTOR
/*
PROJETO ARDUSAT TRANSMISSOR/RECEPTOR
inicialmente planejado com utilização do Atmega328
versão: 1.0
início do projeto: 31-10-2018
criador do projeto: pedroluand
licença de uso: restrito
contatos: pedroluand@gmail.com / pedroluand@hotmail.com / pedroluand@yahoo.com
*/
//bibliotecas em utilização:
#include <SD.h> //biblioteca para cartao sd
#include <SPI.h> //biblioteca para conexão spi
#include <Wire.h> //biblioteca para conexão I2C
#include <Servo.h> //biblioteca para servos
#include <EEPROM.h> //biblioteca para eeprom interna
#include <LiquidCrystal_I2C.h> //biblioteca para display lcd com modulo I2C
#include <RF24.h> //biblioteca para modulo transeptor nrf2401
#include <nRF24L01.h> //biblioteca para modulo transeptor nrf2401
//#include <printf.h> //biblioteca para modulo transeptor nrf2401
//#include <RF24_config.h> //biblioteca para modulo transeptor nrf2401
//configurações gerais:
LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7,3,POSITIVE); //configuração de endereço e pinagem do display lcd
#define BMP085_ADDRESS 0x77 //endereço fisico do modulo gy88
const unsigned char OSS = 0; //configuração do modulo gy88
int ac1; //configuração do modulo gy88
int ac2; //configuração do modulo gy88
int ac3; //configuração do modulo gy88
unsigned int ac4; //configuração do modulo gy88
unsigned int ac5; //configuração do modulo gy88
unsigned int ac6; //configuração do modulo gy88
int b1; //configuração do modulo gy88
int b2; //configuração do modulo gy88
int mb; //configuração do modulo gy88
int mc; //configuração do modulo gy88
int md; //configuração do modulo gy88
long b5; //configuração do modulo gy88
//RF24 radio(9,10); //pinos CE e CS respectivamente modulo NRF24l01
//const byte address[6] = "00001"; //endereço modulo NRF24l01
float voltagem = 0; //sensores de tensao bateria conectados na porta A0
File myFile; //nome do arquivo criado no cartao data log
//configurações globais:
#define botao 8 //botão criado naporta d8
#define led 9 //led criado na porta d9
void setup() {
// radio.begin(); //inicia o modulo NRF24l01
// radio.openWritingPipe(address); //abre o endereço do modulo NRF24l01
// radio.setChannel(100); //canal de operação do modulo NRF24l01
// radio.setDataRate(RF24_250KBPS); //taxa de tasferencia do modulo NRF24l01
// radio.setPALevel(RF24_PA_MAX); //nivel maximo do modulo NRF24l01
// radio.stopListening(); //configuração do modulo NRF24l01
lcd.begin(20,4); //definição para uso do lcd 20 linhas 4 colunas
Serial.begin(9600); //velocidade de dados do monitor serial
while (!Serial) { //inicialização do cartão data log
; //inicialização do cartão data log
}
Wire.begin(); //inicia a biblioteca wire.h
bmp085Calibration(); //calibração do modulo gy88
pinMode(botao,INPUT_PULLUP); //pino definido como entrada
pinMode(led,OUTPUT); //pino definido como saída
//teste inicial carregado somente ao ligar o equipamento
Serial.println("teste inicial..."); //imprime a mensagem no serial monitor
digitalWrite(led,HIGH); //liga o led na porta 9
delay(1000); //aguarda 1s
digitalWrite(led,LOW); //desliga o led
Serial.println("teste concluido!"); //imprime a mensagem no serial monitor
//verificação cartao sd incerido no data log
if (!SD.begin(4)) { //verificação cartao sd data log incerido
Serial.println("CARTAO NAO INSERIDO!"); //verificação cartao sd data log incerido
// tone(10,800,1000); //verificação cartao sd data log incerido
// delay(1020); //verificação cartao sd data log incerido
// lcd.print("CARTAO NAO INSERIDO!"); //verificação cartao sd data log incerido
delay(2000); //verificação cartao sd data log incerido
// lcd.clear(); //verificação cartao sd data log incerido
return; //verificação cartao sd data log incerido
}
Serial.println("DATALOG INICIADO!"); //verificação cartao sd data log incerido
// tone(10,300,200); //verificação cartao sd data log incerido
// delay(150); //verificação cartao sd data log incerido
// tone(10,200,200); //verificação cartao sd data log incerido
// delay(150); //verificação cartao sd data log incerido
// lcd.print("DATALOG INICIADO!"); //verificação cartao sd data log incerido
delay(30000); //verificação cartao sd data log incerido
}
void loop() {
//configurações do modulo gy88
float temperature = bmp085GetTemperature(bmp085ReadUT()); //calibração gy88
float pressure = bmp085GetPressure(bmp085ReadUP()); //calibração gy88
float atm = pressure / 101325; //calibração gy88
float altitude = calcAltitude(pressure); //calibração gy88
//As configurações acima devem permanecer no início do loop
//teste temporario gy88
Serial.println(altitude,2);
Serial.println(temperature,2);
Serial.println("---------------");
delay(30000);
}
void bmp085Calibration()
{
ac1 = bmp085ReadInt(0xAA);
ac2 = bmp085ReadInt(0xAC);
ac3 = bmp085ReadInt(0xAE);
ac4 = bmp085ReadInt(0xB0);
ac5 = bmp085ReadInt(0xB2);
ac6 = bmp085ReadInt(0xB4);
b1 = bmp085ReadInt(0xB6);
b2 = bmp085ReadInt(0xB8);
mb = bmp085ReadInt(0xBA);
mc = bmp085ReadInt(0xBC);
md = bmp085ReadInt(0xBE);
}
float bmp085GetTemperature(unsigned int ut){
long x1, x2;
x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
x2 = ((long)mc << 11)/(x1 + md);
b5 = x1 + x2;
float temp = ((b5 + 8)>>4);
temp = temp /10;
return temp;
}
long bmp085GetPressure(unsigned long up){
long x1, x2, x3, b3, b6, p;
unsigned long b4, b7;
b6 = b5 - 4000;
x1 = (b2 * (b6 * b6)>>12)>>11;
x2 = (ac2 * b6)>>11;
x3 = x1 + x2;
b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
x1 = (ac3 * b6)>>13;
x2 = (b1 * ((b6 * b6)>>12))>>16;
x3 = ((x1 + x2) + 2)>>2;
b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;
b7 = ((unsigned long)(up - b3) * (50000>>OSS));
if (b7 < 0x80000000) p = (b7<<1)/b4;
else p = (b7/b4)<<1;
x1 = (p>>8) * (p>>8);
x1 = (x1 * 3038)>>16;
x2 = (-7357 * p)>>16;
p += (x1 + x2 + 3791)>>4;
long temp = p;
return temp;
}
char bmp085Read(unsigned char address)
{
unsigned char data;
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(address);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 1);
while(!Wire.available())
;
return Wire.read();
}
int bmp085ReadInt(unsigned char address)
{
unsigned char msb, lsb;
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(address);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 2);
while(Wire.available()<2)
;
msb = Wire.read();
lsb = Wire.read();
return (int) msb<<8 | lsb;
}
unsigned int bmp085ReadUT(){
unsigned int ut;
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x2E);
Wire.endTransmission();
delay(5);
ut = bmp085ReadInt(0xF6);
return ut;
}
unsigned long bmp085ReadUP(){
unsigned char msb, lsb, xlsb;
unsigned long up = 0;
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x34 + (OSS<<6));
Wire.endTransmission();
delay(2 + (3<<OSS));
msb = bmp085Read(0xF6);
lsb = bmp085Read(0xF7);
xlsb = bmp085Read(0xF8);
up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
return up;
}
void writeRegister(int deviceAddress, byte address, byte val){
Wire.beginTransmission(deviceAddress);
Wire.write(address);
Wire.write(val);
Wire.endTransmission();
}
int readRegister(int deviceAddress, byte address){
int v;
Wire.beginTransmission(deviceAddress);
Wire.write(address);
Wire.endTransmission();
Wire.requestFrom(deviceAddress, 1);
while(!Wire.available()) {
}
v = Wire.read();
return v;
}
float calcAltitude(float pressure)
{
float A = pressure/101325;
float B = 1/5.25588;
float C = pow(A,B);
C = 1 - C;
C = C /0.0000225577;
return C;
}
PROJETO ARDUSAT TRANSMISSOR/RECEPTOR
inicialmente planejado com utilização do Atmega328
versão: 1.0
início do projeto: 31-10-2018
criador do projeto: pedroluand
licença de uso: restrito
contatos: pedroluand@gmail.com / pedroluand@hotmail.com / pedroluand@yahoo.com
*/
//bibliotecas em utilização:
#include <SD.h> //biblioteca para cartao sd
#include <SPI.h> //biblioteca para conexão spi
#include <Wire.h> //biblioteca para conexão I2C
#include <Servo.h> //biblioteca para servos
#include <EEPROM.h> //biblioteca para eeprom interna
#include <LiquidCrystal_I2C.h> //biblioteca para display lcd com modulo I2C
#include <RF24.h> //biblioteca para modulo transeptor nrf2401
#include <nRF24L01.h> //biblioteca para modulo transeptor nrf2401
//#include <printf.h> //biblioteca para modulo transeptor nrf2401
//#include <RF24_config.h> //biblioteca para modulo transeptor nrf2401
//configurações gerais:
LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7,3,POSITIVE); //configuração de endereço e pinagem do display lcd
#define BMP085_ADDRESS 0x77 //endereço fisico do modulo gy88
const unsigned char OSS = 0; //configuração do modulo gy88
int ac1; //configuração do modulo gy88
int ac2; //configuração do modulo gy88
int ac3; //configuração do modulo gy88
unsigned int ac4; //configuração do modulo gy88
unsigned int ac5; //configuração do modulo gy88
unsigned int ac6; //configuração do modulo gy88
int b1; //configuração do modulo gy88
int b2; //configuração do modulo gy88
int mb; //configuração do modulo gy88
int mc; //configuração do modulo gy88
int md; //configuração do modulo gy88
long b5; //configuração do modulo gy88
//RF24 radio(9,10); //pinos CE e CS respectivamente modulo NRF24l01
//const byte address[6] = "00001"; //endereço modulo NRF24l01
float voltagem = 0; //sensores de tensao bateria conectados na porta A0
File myFile; //nome do arquivo criado no cartao data log
//configurações globais:
#define botao 8 //botão criado naporta d8
#define led 9 //led criado na porta d9
void setup() {
// radio.begin(); //inicia o modulo NRF24l01
// radio.openWritingPipe(address); //abre o endereço do modulo NRF24l01
// radio.setChannel(100); //canal de operação do modulo NRF24l01
// radio.setDataRate(RF24_250KBPS); //taxa de tasferencia do modulo NRF24l01
// radio.setPALevel(RF24_PA_MAX); //nivel maximo do modulo NRF24l01
// radio.stopListening(); //configuração do modulo NRF24l01
lcd.begin(20,4); //definição para uso do lcd 20 linhas 4 colunas
Serial.begin(9600); //velocidade de dados do monitor serial
while (!Serial) { //inicialização do cartão data log
; //inicialização do cartão data log
}
Wire.begin(); //inicia a biblioteca wire.h
bmp085Calibration(); //calibração do modulo gy88
pinMode(botao,INPUT_PULLUP); //pino definido como entrada
pinMode(led,OUTPUT); //pino definido como saída
//teste inicial carregado somente ao ligar o equipamento
Serial.println("teste inicial..."); //imprime a mensagem no serial monitor
digitalWrite(led,HIGH); //liga o led na porta 9
delay(1000); //aguarda 1s
digitalWrite(led,LOW); //desliga o led
Serial.println("teste concluido!"); //imprime a mensagem no serial monitor
//verificação cartao sd incerido no data log
if (!SD.begin(4)) { //verificação cartao sd data log incerido
Serial.println("CARTAO NAO INSERIDO!"); //verificação cartao sd data log incerido
// tone(10,800,1000); //verificação cartao sd data log incerido
// delay(1020); //verificação cartao sd data log incerido
// lcd.print("CARTAO NAO INSERIDO!"); //verificação cartao sd data log incerido
delay(2000); //verificação cartao sd data log incerido
// lcd.clear(); //verificação cartao sd data log incerido
return; //verificação cartao sd data log incerido
}
Serial.println("DATALOG INICIADO!"); //verificação cartao sd data log incerido
// tone(10,300,200); //verificação cartao sd data log incerido
// delay(150); //verificação cartao sd data log incerido
// tone(10,200,200); //verificação cartao sd data log incerido
// delay(150); //verificação cartao sd data log incerido
// lcd.print("DATALOG INICIADO!"); //verificação cartao sd data log incerido
delay(30000); //verificação cartao sd data log incerido
}
void loop() {
//configurações do modulo gy88
float temperature = bmp085GetTemperature(bmp085ReadUT()); //calibração gy88
float pressure = bmp085GetPressure(bmp085ReadUP()); //calibração gy88
float atm = pressure / 101325; //calibração gy88
float altitude = calcAltitude(pressure); //calibração gy88
//As configurações acima devem permanecer no início do loop
//teste temporario gy88
Serial.println(altitude,2);
Serial.println(temperature,2);
Serial.println("---------------");
delay(30000);
}
void bmp085Calibration()
{
ac1 = bmp085ReadInt(0xAA);
ac2 = bmp085ReadInt(0xAC);
ac3 = bmp085ReadInt(0xAE);
ac4 = bmp085ReadInt(0xB0);
ac5 = bmp085ReadInt(0xB2);
ac6 = bmp085ReadInt(0xB4);
b1 = bmp085ReadInt(0xB6);
b2 = bmp085ReadInt(0xB8);
mb = bmp085ReadInt(0xBA);
mc = bmp085ReadInt(0xBC);
md = bmp085ReadInt(0xBE);
}
float bmp085GetTemperature(unsigned int ut){
long x1, x2;
x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
x2 = ((long)mc << 11)/(x1 + md);
b5 = x1 + x2;
float temp = ((b5 + 8)>>4);
temp = temp /10;
return temp;
}
long bmp085GetPressure(unsigned long up){
long x1, x2, x3, b3, b6, p;
unsigned long b4, b7;
b6 = b5 - 4000;
x1 = (b2 * (b6 * b6)>>12)>>11;
x2 = (ac2 * b6)>>11;
x3 = x1 + x2;
b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
x1 = (ac3 * b6)>>13;
x2 = (b1 * ((b6 * b6)>>12))>>16;
x3 = ((x1 + x2) + 2)>>2;
b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;
b7 = ((unsigned long)(up - b3) * (50000>>OSS));
if (b7 < 0x80000000) p = (b7<<1)/b4;
else p = (b7/b4)<<1;
x1 = (p>>8) * (p>>8);
x1 = (x1 * 3038)>>16;
x2 = (-7357 * p)>>16;
p += (x1 + x2 + 3791)>>4;
long temp = p;
return temp;
}
char bmp085Read(unsigned char address)
{
unsigned char data;
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(address);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 1);
while(!Wire.available())
;
return Wire.read();
}
int bmp085ReadInt(unsigned char address)
{
unsigned char msb, lsb;
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(address);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 2);
while(Wire.available()<2)
;
msb = Wire.read();
lsb = Wire.read();
return (int) msb<<8 | lsb;
}
unsigned int bmp085ReadUT(){
unsigned int ut;
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x2E);
Wire.endTransmission();
delay(5);
ut = bmp085ReadInt(0xF6);
return ut;
}
unsigned long bmp085ReadUP(){
unsigned char msb, lsb, xlsb;
unsigned long up = 0;
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x34 + (OSS<<6));
Wire.endTransmission();
delay(2 + (3<<OSS));
msb = bmp085Read(0xF6);
lsb = bmp085Read(0xF7);
xlsb = bmp085Read(0xF8);
up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
return up;
}
void writeRegister(int deviceAddress, byte address, byte val){
Wire.beginTransmission(deviceAddress);
Wire.write(address);
Wire.write(val);
Wire.endTransmission();
}
int readRegister(int deviceAddress, byte address){
int v;
Wire.beginTransmission(deviceAddress);
Wire.write(address);
Wire.endTransmission();
Wire.requestFrom(deviceAddress, 1);
while(!Wire.available()) {
}
v = Wire.read();
return v;
}
float calcAltitude(float pressure)
{
float A = pressure/101325;
float B = 1/5.25588;
float C = pow(A,B);
C = 1 - C;
C = C /0.0000225577;
return C;
}
Comentários
Postar um comentário