ESP32 cansat next: Difference between revisions
(3 intermediate revisions by the same user not shown) | |||
Line 17: | Line 17: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
To have more JSON data structure use | |||
<syntaxhighlight lang="C"> | |||
snprintf(report, sizeof(report), "{\"time\": %d, " | |||
"\"ax\": %4.2f, \"ay\": %4.2f, \"az\": %4.2f, \"temp\": %4.2f, \"p\": %4.2f, " | |||
"\"lat\": %8.7f, \"long\": %8.7f, \"alt\": %4.2f, \"speed\": %4.2f, " | |||
"\"so2\": %4.2f },", | |||
treset, | |||
ax, ay, az, t, p, | |||
lat, lng, alt, speed, | |||
so2 ); | |||
</syntaxhighlight> | |||
but there is a small problem with array of JSON. | |||
== Radio == | == Radio == | ||
Line 107: | Line 119: | ||
} | } | ||
</syntaxhighlight> | |||
=== Print the data === | |||
Again, in the loop() method include the printing methods. | |||
<syntaxhighlight lang="C"> | |||
//Printing | |||
char report[128]; | |||
memset(report, 0, sizeof(report)); | |||
snprintf(report, sizeof(report), "%d, " | |||
"%4.2f, %4.2f, %4.2f, %4.2f, %4.2f, " | |||
"%8.7f, %8.7f, %4.2f, %4.2f, " | |||
"%4.2f", | |||
treset, | |||
ax, ay, az, t, p, | |||
lat, lng, alt, speed, | |||
so2 ); | |||
// Print the data to Serial | |||
Serial.println( report ); | |||
// Save the data to SD card | |||
appendFile(filepath, report); | |||
appendFile(filepath, "\n"); | |||
// Transmit the data via radio | |||
if (treset - tradio > 5000){ | |||
tradio = millis(); | |||
//sendData( report ); | |||
Serial.println( "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" ); | |||
} | |||
} | |||
</syntaxhighlight> | </syntaxhighlight> |
Latest revision as of 15:30, 4 April 2025
Introduction
Some interesting coding stuff
snprintf
printf, print
Each ASCII character takes 1 byte. You can store exactly 128 ASCII characters in the above char array.
char report[128];
memset(report, 0, sizeof(report));
snprintf(report, sizeof(report), "%4.2f, %4.2f, %4.2f, %4.2f, %4.2f, %4.2f",
ax, ay, az, gx, gy, gz);
Serial.println(report);
To have more JSON data structure use
snprintf(report, sizeof(report), "{\"time\": %d, "
"\"ax\": %4.2f, \"ay\": %4.2f, \"az\": %4.2f, \"temp\": %4.2f, \"p\": %4.2f, "
"\"lat\": %8.7f, \"long\": %8.7f, \"alt\": %4.2f, \"speed\": %4.2f, "
"\"so2\": %4.2f },",
treset,
ax, ay, az, t, p,
lat, lng, alt, speed,
so2 );
but there is a small problem with array of JSON.
Radio
To send strings, use sendData( str );
command.
SD Card
First, open the file
const String filepath = "/filename.csv";
and then append the data and linebreak
appendFile(filepath, data);
appendFile(filepath, "\n");
Simple code
A simple code to read data and send that via radio and store to SD card.
Declare
First declare the variables:
#include <TinyGPS++.h>
#include "CanSatNeXT.h"
#define GPS_BAUDRATE 9600 // The default baudrate of NEO-6M is 9600
TinyGPSPlus gps; // the TinyGPS++ object
const String filepath = "/filename.csv";
long tradio = 0;
long treset = 0; //Time from reset
float ax;
float ay;
float az;
float t;
float p;
float lat = 0;
float lng = 0;
float alt = 0;
float speed = 0;
float so2; // Connect to pin 33
Initialize
Start the serial monitor, and software serial. Find the GPS module and start CanSatInitialization. Note that the radio needs a number in parenthesis.
void setup() {
Serial.begin(9600);
Serial2.begin(GPS_BAUDRATE, SERIAL_8N1, 16, 17);
Serial.println(F("ESP32 - GPS module"));
Serial.println(F("Lat, Lon, Alt, speed [m/s], Datetime"));
// Start all CanSatNeXT on-board systems.
CanSatInit();
}
Read data
Using the loop() method, read the data. Update the GPS only if there is new data.
void loop() {
//Get the data
treset = millis();
ax = readAccelX();
ay = readAccelY();
az = readAccelZ();
t = readTemperature();
p = readPressure();
so2 = analogRead(33); // Connect to pin 33
if (Serial2.available() > 0) {
if (gps.encode(Serial2.read())) {
if (gps.location.isValid()) {
lat = gps.location.lat();
lng = gps.location.lng();
alt = gps.altitude.meters();
}
if (gps.speed.isValid()) {
speed = gps.speed.mps();
}
}
}
Print the data
Again, in the loop() method include the printing methods.
//Printing
char report[128];
memset(report, 0, sizeof(report));
snprintf(report, sizeof(report), "%d, "
"%4.2f, %4.2f, %4.2f, %4.2f, %4.2f, "
"%8.7f, %8.7f, %4.2f, %4.2f, "
"%4.2f",
treset,
ax, ay, az, t, p,
lat, lng, alt, speed,
so2 );
// Print the data to Serial
Serial.println( report );
// Save the data to SD card
appendFile(filepath, report);
appendFile(filepath, "\n");
// Transmit the data via radio
if (treset - tradio > 5000){
tradio = millis();
//sendData( report );
Serial.println( "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" );
}
}