-
Notifications
You must be signed in to change notification settings - Fork 2
/
picosat_horus_v4.ino
209 lines (185 loc) · 6.55 KB
/
picosat_horus_v4.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
/*
Autor: Vinícius Azevedo
Github: https://github.com/vmeazevedo
LinkedIn: https://www.linkedin.com/in/vin%C3%ADcius-azevedo-45180ab2/
Você pode encontrar o projeto completo no diretório abaixo:
https://github.com/vmeazevedo/Picosat_Horus
*/
// Obs: realizar uma ponte entre o 3,3V para A1
// Incluir Bibliotecas
#include <Arduino.h>
#include <SFE_BMP180.h>
#include <Adafruit_BMP085.h>
#include <Adafruit_I2CDevice.h>
#include <SoftwareSerial.h>
#include <TinyGPS.h>
#include <Wire.h>
#include <RTClib.h>
#include <SD.h>
// Definições de Pin
#define SDFILE_PIN_CS 10
#define GPS_RX 4
#define GPS_TX 3
#define GPS_Serial_Baud 9600
// inicialização de objeto
Adafruit_BMP085 bmp;
RTC_DS3231 rtcDS;
File sdFile;
TinyGPS gps;
SoftwareSerial gpsSerial(GPS_RX, GPS_TX);
float ref=3.25;
void setup()
{
Serial.begin(9600);
while (!Serial) ; // Aguarde a conexão da porta serial. Necessário para USB nativo
//Serial.println("Inicializando");
// Inicializa o GPS
Serial.begin(GPS_Serial_Baud);
gpsSerial.begin(GPS_Serial_Baud);
//Inicializar dispositivo I2C
bmp.begin();
if (! rtcDS.begin()) {
Serial.println("Não foi possível encontrar RTC");
while (1);
}
if (rtcDS.lostPower()) {
Serial.println("RTC perdeu a bateria, vamos definir a hora!");
// a linha seguinte define o RTC para a data e hora em que este esboço foi compilado
rtcDS.adjust(DateTime(F(__DATE__), F(__TIME__)));
// Esta linha define o RTC com uma data e hora explícitas, por exemplo, para definir
// 21 de janeiro de 2014 às 3h:
rtcDS.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
// Defina o pino SPI SS para saída, caso contrário, as funções da biblioteca SD não funcionarão.
// O SD é configurado para usar SPI SS Arduino pino 10 como seleção de chip (CS) por padrão.
// Para alterar o pin, use SD.begin (SD_CS_PIN)
pinMode(SDFILE_PIN_CS, OUTPUT);
// Verifique se o cartão está presente e pode ser inicializado
if (!SD.begin()) {
//Serial.println(F("O cartão falhou ou não está presente"));
while(1);
}
//Serial.println(F("Cartão inicializado"));
}
void loop()
{
// Captura de tensão interna do Nano
float vcc;
int i, counts=10;
vcc=0;
for(i=0; i<counts; i++) {
vcc += ref * 1023.0 / analogRead(A1); // Conversor AD de entrada A1
}
// GPS NEO6M
bool newData = false;
unsigned long chars;
// Por um segundo, analisamos os dados do GPS e relatamos alguns valores-chaves
for (unsigned long start = millis(); millis() - start < 1000;)
{
while (gpsSerial.available())
{
char c = gpsSerial.read();
// Serial.write(c); // Apague o comentario para mostrar os dados crus
if (gps.encode(c)) // Atribui true para newData caso novos dados sejam recebidos
newData = true;
}
}
if (newData)
{
float flat, flon;
unsigned long age;
gps.f_get_position(&flat, &flon, &age);
// Latitude
Serial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
Serial.print(",");
// Longitude
Serial.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
Serial.print(",");
// Satélite
Serial.print(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites());
Serial.print(",");
// Precisão
Serial.print(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop());
Serial.print(",");
}
// BMP180 - Sensor de pressão barométrica, temperatura, altitude
// Leitura da altitude do sensor barométrico, observe que o sensor tem 1m de precisão
double bmp180Alt = bmp.readAltitude();
double bmp180Pressure = bmp.readPressure();
double bmp180TempC = bmp.readTemperature();
//Serial.print("Altitude: ");
Serial.print(bmp180Alt,1);
Serial.print(",");
Serial.print(bmp180Pressure,1);
Serial.print(",");
Serial.print(bmp180TempC,1);
Serial.print(",");
Serial.print(vcc/counts,3); // telemetria da VIN do Nano
Serial.print(",");
Serial.print(GetTemp(),1); // telemetria da temp. interna do Nano
Serial.print("");
Serial.println();
delay(1000);
// Módulo Micro SD
// O código de exemplo SD cria um arquivo datalog.txt para registrar os dados do sensor
sdFile = SD.open("datalog.txt", FILE_WRITE);
// se o arquivo existir no cartão SD, grave os dados do sensor
if (sdFile) {
// Gravar no arquivo os dados:
// ddmmaaaa,hhmmss,temperatura,pressão,altitude
// ddmmaaaa,hhmmss
DateTime now = rtcDS.now();
sdFile.print(now.day(), DEC);
sdFile.print(now.month(), DEC);
sdFile.print(now.year(), DEC);
sdFile.print(",");
sdFile.print(now.hour(), DEC);
sdFile.print(now.minute(), DEC);
sdFile.print(now.second(), DEC);
// Temperatura,Pressão,Altitude
sdFile.print(",");
sdFile.print(bmp.readTemperature());
sdFile.print(",");
sdFile.print(bmp.readPressure());
sdFile.print(",");
sdFile.print(bmp.readAltitude());
// Coordenadas de GPS
float flat, flon;
unsigned long age;
gps.f_get_position(&flat, &flon, &age);
sdFile.print(",");
sdFile.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
sdFile.print(",");
sdFile.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
sdFile.print(",");
sdFile.print(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites());
sdFile.print(",");
sdFile.print(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop());
sdFile.println();
// Fechar o arquivo
sdFile.close();
}
else {
// Se o arquivo não abriu, imprime o erro
Serial.println(F("Erro ao abrir o arquivo."));
}
delay(500);
}
// Função de captura de temp. interna
double GetTemp(void){
unsigned int wADC;
double t;
// Defina a referência interna e o mux.
ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3));
ADCSRA |= _BV(ADEN); // habilite o ADC
delay(100); // espere que as tensões se tornem estáveis.
ADCSRA |= _BV(ADSC); // Inicie o ADC
// Detectar fim de conversão
while (bit_is_set(ADCSRA,ADSC));
// O registro de leitura "ADCW" trata de como ler ADCL e ADCH.
wADC = ADCW;
// O deslocamento de 324,31 pode estar errado. É apenas uma indicação.
t = (wADC - 324.31 ) / 1.22;
// A temperatura retornada está em graus Celsius.
return (t);
}