Я работаю над проектом и столкнулся с этой проблемой, из-за которой данные, считанные с XBee, передаваемые с устройства по беспроводной сети на компьютер, не соответствуют тому, что читается, когда устройство подключено напрямую к компьютеру.
Одна из причин, которые я подозреваю, может быть связана с частью программирования GPS в кодировании, так что, когда GPS способен обеспечить долготу и широту, передается только один набор данных. Однако, когда GPS не работает или не подключен, данные могут обновляться и обновляться непрерывно. Другая проблема связана с функционированием GPS, мне нужно отключить и снова подключить устройство для передачи нового набора данных. Если я обновляю данные, не отключаясь, показания не отображаются. Эти 2 сценария, упомянутые выше, — это когда устройство передает данные по беспроводной сети. Когда он подключен напрямую, считывание данных является желательным и запрограммированным.
Другая причина может быть связана с программированием XBee, но я не уверен, где это пошло не так.
Может ли это быть из-за программирования GPS или из-за программирования с XBee и как это должно быть запрограммировано?
Ниже мой код Arduino:
#include "Barometer.h"#include <Wire.h>
#include <TinyGPS.h>
#include <math.h>
static void gpsdump(TinyGPS &gps);
static bool feedgps();
static void print_float(float val, float invalid, int len, int prec);
//static void print_date(TinyGPS &gps);
TinyGPS gps;
Barometer myBarometer;
#define Version 11 // version, 1.0 or 1.1, which depands on your board you use as it is
const int pinO2 = A0; // Connect Grove - Gas Sensor(O2) to A0
#if Version==11
const int AMP = 121;
#elif Version==10
const int AMP = 201;
#endif
const float K_O2 = 7.43;
const unsigned char cmd_get_sensor[] =
{
0xff, 0x01, 0x86, 0x00, 0x00,
0x00, 0x00, 0x00, 0x79
};
const int analogInPin = A0; // Analog input pin that the VBAT pin is attached to
unsigned char dataRevice[9];
unsigned long time;
unsigned char receivedChars[19];
const int buzzerPin = 12;
const int O2LED = 8;
const int pinRedLED = 6;
const int pinCO2LED = 4;
unsigned long age, date;
long interval = 1000;
long previousmillis = 0;
int noofsatellites;
int CO2ppm;
int temperature;
int sampleTime = 1000;
int BatteryValue = 0; // value read from the VBAT pin
float flat, flon;
float pressureMaximum = 14.7;
float pressureMinimum = 10;
int CO2warningvalue = 1000;
float O2maximumvalue = 21;
float O2minimumvalue = 15;
float Temperature;
float pressure;
float pressure_in_psi;
float Value_O2;
float outputValue = 0; // variable for voltage calculation
bool warningInterval;
void setup()
{
Serial3.begin(9600);
Serial.begin(9600);
myBarometer.init();
Serial2.begin(9600);
// GPS setup
Serial1.begin(4800);
}
void loop()
{
// read the analog in value:
BatteryValue = analogRead(analogInPin);
// Calculate the battery voltage value
outputValue = (float(BatteryValue) * 5) / 1023 * 2;
// print the results to the serial monitor:
Serial.print("Battery value = ");
Serial.print(BatteryValue);
Serial.print("\t Voltage = ");
Serial.print(outputValue);
Serial.println(" V");
Serial.println(" ");;
delay(2000);
// wait 1000 milliseconds before the next loop
// for the analog-to-digital converter to settle
// after the last reading:
delay(2500);
unsigned long currentmillis = millis();
if (millis() - time > sampleTime)
{
time = millis(); // update the time to get the next sample
char rc;
static boolean recvProgress = false;
static byte index = 0;
char startMarker = '<';
char endMarker = '>';
if (Serial.available())
{
//receive updated warning level value
rc = Serial.read();
if (rc == startMarker)
{
recvProgress = true;
}
if (recvProgress == true)
{
while (rc != endMarker)
{
rc = Serial.read();
receivedChars[index] = rc;
//Serial.print(receivedChars[index]);
index++;
}
//update warning lvl value
pressureMaximum = (receivedChars[0] - 48) * 10 + (receivedChars[1] - 48) + (receivedChars[3] - 48) * 0.1;
pressureMinimum = (receivedChars[4] - 48) * 10 + (receivedChars[5] - 48) + (receivedChars[7] - 48) * 0.1;
O2maximumvalue = (receivedChars[8] - 48) * 10 + (receivedChars[9] - 48);
O2minimumvalue = (receivedChars[10] - 48) * 10 + (receivedChars[11] - 48);
CO2warningvalue = (receivedChars[12] - 48) * 1000 + (receivedChars[13] - 48) * 100 + (receivedChars[14] - 48) * 10 + (receivedChars[15] - 48);
index = 0;
}
//string sUpdate = Serial.read();
//Serial.print(sUpdate);
// Serial.print(receivedChars[index]);
}
}
Serial.flush();
// GPS System
bool newdata = false;
unsigned long start = millis();
// Every second we print an update
while (millis() - start < 1000)
{
if (feedgps())
newdata = true;
}
gpsdump(gps);
if (noofsatellites < 4 || noofsatellites > 200 )
{
Serial.println("GPS not fixed");
}
// Oxygen sensor
float sensorValue;
float sensorVoltage;
sensorValue = analogRead(A0);
sensorVoltage = (sensorValue / 1024.0) * 5.0;
sensorVoltage = sensorVoltage / (float)AMP * 10000.0;
Value_O2 = sensorVoltage / K_O2;
Serial.print("O2 Level: ");
Serial.print(Value_O2, 1);
Serial.println("%");
// Carbon dioxide Sensor
if (dataReceive())
{
Serial.print("CO2: ");
Serial.print(CO2ppm);
Serial.println("ppm");
}
// Barometer Sensor
Temperature = myBarometer.bmp085GetTemperature(myBarometer.bmp085ReadUT());
pressure = myBarometer.bmp085GetPressure(myBarometer.bmp085ReadUP());
pressure_in_psi = myBarometer.bmp085GetPressure(myBarometer.bmp085ReadUP()) / 6894.7;
Serial.print("Temperature: ");
Serial.print(Temperature, 2); //display 2 decimal places
Serial.println(" C");
Serial.print("Pressure: ");
Serial.print(pressure_in_psi, 2);
Serial.println(" psi");
if (currentmillis - previousmillis > interval)
{
if (noofsatellites < 4 || noofsatellites > 40)
{
Serial3.println("GPS not fixed");
}
else
{
int year;
byte month, day, hour, minute, second, hundredths;
gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
gps.f_get_position(&flat, &flon, &age);
if (hour >= 16 && hour <= 24)
{
char dt1[32];
sprintf(dt1, "Date:%02d/%02d/%02d Time:%02d:%02d:%02d ",
month, day, year, hour - 16, minute, second);
Serial3.println(dt1);
}
else
{
char dt2[32];
sprintf(dt2, "Date:%02d/%02d/%02d Time:%02d:%02d:%02d ",
month, day, year, hour + 8, minute, second);
Serial3.println(dt2);
}
Serial3.print("Latitude: ");
Serial3.println(flat, 6);
Serial3.print("Longitude: ");
Serial3.println(flon, 6);
}
Serial3.print("O2 Level: ");
Serial3.print(Value_O2, 1);
Serial3.println("%");
Serial3.print("CO2: ");
Serial3.print(CO2ppm);
Serial3.println("ppm");
Serial3.print("Temperature: ");
Serial3.print(Temperature, 2); //display 2 decimal places
Serial3.println(" C");
Serial3.print("Pressure: ");
Serial3.print(pressure_in_psi, 2);
Serial3.println(" psi");
Serial3.print("Battery value = ");
Serial3.print(BatteryValue);
Serial3.print("\t Voltage = ");
Serial3.print(outputValue);
Serial3.println(" V");
Serial3.println(" ");
previousmillis = currentmillis;
//Serial3.flush();
}
// Alert System
//When both condition met, Buzzer continuosly alarm & Red Led On
if (((Value_O2 <= O2minimumvalue || Value_O2 >= O2maximumvalue) || (pressure_in_psi <= pressureMinimum || pressure_in_psi >= pressureMaximum)) && (CO2ppm > CO2warningvalue))
{
Alert();
digitalWrite(pinCO2LED, LOW);
digitalWrite(O2LED, LOW);
Serial.println("Warning!");
}
//When one of the condition met, Buzzer triggerred with interval, Red Led flashing
else if ((Value_O2 <= O2minimumvalue || Value_O2 >= O2maximumvalue))
{
AlertInterval();
digitalWrite(O2LED, LOW);
digitalWrite(pinCO2LED, HIGH);
Serial.println("Warning!");
}
else if (CO2ppm > CO2warningvalue)
{
AlertInterval();
digitalWrite(O2LED, HIGH);
digitalWrite(pinCO2LED, LOW);
Serial.println("Warning!");
}
else if (pressure_in_psi <= pressureMinimum || pressure_in_psi >= pressureMaximum)
{
AlertInterval();
Serial.println("Warning!");
}
else
{
digitalWrite(O2LED, HIGH);
digitalWrite(pinCO2LED, HIGH);
digitalWrite(buzzerPin, LOW);
digitalWrite(pinRedLED, LOW);
}
}
bool dataReceive(void)
{
byte data[9];
int i = 0;
//transmit command data
for (i = 0; i < sizeof(cmd_get_sensor); i++)
{
Serial2.write(cmd_get_sensor[i]);
}
delay(1000);
//begin receiving data
if (Serial2.available())
{
while (Serial2.available())
{
for (int i = 0; i < 9; i++)
{
data[i] = Serial2.read();
}
}
}
#if DEBUG
for (int j = 0; j < 9; j++)
{
Serial.print(data[j]);
Serial.print(" ");
}
Serial.println("");
#endif
if ((i != 9) || (1 + (0xFF ^ (byte)(data[1] + data[2] + data[3]
+ data[4] + data[5] + data[6] + data[7]))) != data[8])
{
return false;
}
CO2ppm = (int)data[2] * 256 + (int)data[3];
temperature = (int)data[4] - 40;
return true;
}
void AlertInterval()
{
if (warningInterval == false)
{
digitalWrite(buzzerPin, HIGH);
digitalWrite(pinRedLED, HIGH);
warningInterval = true;
}
else
{
digitalWrite(buzzerPin, LOW);
digitalWrite(pinRedLED, LOW);
warningInterval = false;
}
}
void Alert()
{
digitalWrite(buzzerPin, HIGH);
digitalWrite(pinRedLED, HIGH);
}
static void gpsdump(TinyGPS &gps)
{
noofsatellites = gps.satellites();
gps.f_get_position(&flat, &flon, &age);
Serial.print("Latitude: ");
print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 9, 6);
Serial.println();
Serial.print("Longitude: ");
print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6);
Serial.println();
}
static void print_float(float val, float invalid, int len, int prec)
{
char sz[32];
if (val == invalid)
{
strcpy(sz, "*******");
sz[len] = 0;
if (len > 0)
{
sz[len - 1] = ' ';
}
for (int i = 7; i < len; ++i)
{
sz[i] = ' ';
}
Serial.print(sz);
}
else
{
Serial.print(val, prec);
int vi = abs((int)val);
int flen = prec + (val < 0.0 ? 2 : 1);
flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
for (int i = flen; i < len; ++i)
{
Serial.print("");
}
}
feedgps();
}
static bool feedgps()
{
while (Serial1.available())
{
if (gps.encode(Serial1.read()))
{
return true;
}
}
return false;
}
Задача ещё не решена.
Других решений пока нет …