All,
I have a data logger installed on a small go cart and I've built a wireless transmitter to send data back to the pit using HC-12's. Whats the best way to send data? currently i'm creating a comma delimited string, sending that, then parsing it on the receiving end. Works, but is there a better way? To increase range i'm sending at 1200 baud.
Requirements
- send 40-50 bytes every second
- distance 1000 meters or so (range may be an issue, but i don't need 100% reliability)
- car speed around 25 MPH
- security needs, none really. If another team can figure out how to get our data--they can have it
My stripped down code is attached if you want to have a look.
//////////////////////////
// transmitter code
// uses HC-12
#include <SoftwareSerial.h>
SoftwareSerial mySerial(7, 8);
unsigned long point, cartime;
double volts, amps, carspeed;
String Parameter[10];
String data;
void setup() {
Serial.begin(1200);
mySerial.begin(1200);
mySerial.setTimeout(50);
}
void loop() {
ComputeData();
SendData;
PrintData();
}
void SendData() {
// build the string
data = String(point) + "," +
String(cartime, 2) + "," +
String(volts, 1) + "," +
String(amps, 1) + "," +
String(carspeed, 1);
// note string will look something like this
// "1224,23.32,24.4,15.2,25.2"
mySerial.print(data);
}
void ComputeData() {
// i have functions to get this, but hard codeing examples for example
point++;
cartime = millis() / 1000.0;
volts = 24.4;
amps = 15.2;
carspeed = 25.2;
}
void PrintData() {
Serial.println("Data****************************");
Serial.print("point ");
Serial.println(point);
Serial.print("curtime ");
Serial.println(cartime, 2);
Serial.print("volts ");
Serial.println(volts, 1);
Serial.print("amps ");
Serial.println(amps, 1);
Serial.print("carspeed ");
Serial.println(carspeed, 1);
}
// end transmitter code
//////////////////////////////////////////////////
//////////////////////////////////////////////////
// receiver code
// uses HC-12
#include <SoftwareSerial.h>
SoftwareSerial mySerial(6, 3);
unsigned long point, cartime;
double volts, amps, carspeed;
String Parameter[10];
String data;
void setup() {
Serial.begin(1200);
mySerial.begin(1200);
mySerial.setTimeout(100);
pinMode(6, INPUT);
pinMode(3, OUTPUT);
}
void loop(void) {
GetData();
PrintData();
}
void GetData() {
if (mySerial.available() > 0) {
data = mySerial.readString();
// note data will look something like this
// "1224,23.32,24.4,15.2,25.2"
ParseData(data, ',', Parameter);
point = Parameter[0].toFloat();
cartime = Parameter[1].toFloat();
volts = Parameter[2].toFloat();
amps = Parameter[3].toFloat();
carspeed = Parameter[8].toFloat();
}
}
void ParseData(String sInput, char cDelim, String sParams[]) {
int iPosDelim, iPosStart = 0;
int iParamCount = 0;
while (iPosDelim != sInput.length()) {
iPosDelim = sInput.indexOf(cDelim, iPosStart);
if (iPosDelim == -1) {
iPosDelim = sInput.length();
}
sParams[iParamCount] = sInput.substring(iPosStart, iPosDelim );
iParamCount++;
iPosStart = iPosDelim + 1;
}
}
void PrintData() {
Serial.println("Data****************************");
Serial.print("point ");
Serial.println(point);
Serial.print("curtime ");
Serial.println(cartime);
Serial.print("volts ");
Serial.println(volts);
Serial.print("amps ");
Serial.println(amps);
Serial.print("carspeed ");
Serial.println(carspeed);
}
// end receiver code
//////////////////////////////////////////////////