Code: Select all
#include <Adafruit_GPS.h>
#include <SoftwareSerial.h>
#include "DHT.h"
SoftwareSerial mySerial(8, 7);
Adafruit_GPS GPS(&mySerial);
#define GPSECHO true
#define DHTTYPE DHT22 // DHT 22 (AM2302)
uint32_t timer = millis();
void setup()
{
Serial.begin(9600);
delay(5000);
Serial.println("Adafruit GPS library basic test!");
GPS.begin(9600);
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz update rate
GPS.sendCommand(PGCMD_ANTENNA);
delay(1000);
mySerial.println(PMTK_Q_RELEASE);
}
void loop() // run over and over again
{
char c = GPS.read();
if ((c) && (GPSECHO))
// Serial.write(c);
if (GPS.newNMEAreceived())
{
if (!GPS.parse(GPS.lastNMEA())) // this also sets the newNMEAreceived() flag to false
return; // we can fail to parse a sentence in which case we should just wait for another
}
if (timer > millis()) timer = millis();
if (millis() - timer > 1000)
{
timer = millis(); // reset the timer
Serial.println(GPS.fix); // THIS IS TO DEBUG
if (GPS.fix)
{
String dataString = "";
// THIS SECTION ADDS TIME TO THE DATASTRING
dataString += 'H';
dataString += ',';
dataString += String(GPS.hour, DEC);
dataString += ',';
dataString += String(GPS.minute, DEC);
dataString += ',';
dataString += String(GPS.seconds, DEC);
dataString += ',';
dataString += String(GPS.milliseconds, DEC);
dataString += ',';
dataString += 'F';
dataString += ',';
dataString += String(GPS.day, DEC);
dataString += ',';
dataString += String(GPS.month, DEC);
dataString += ',';
dataString += String(GPS.year, DEC);
dataString += ',';
dataString += 'Q';
dataString += ',';
dataString += String((int)GPS.fix);
dataString += ',';
dataString += String((int)GPS.fixquality);
dataString += ',';
// THIS ADDS LATITUDE TO THE STRING
dataString += "LAT";
dataString += ',';
int gradoslat = int((GPS.latitude) / 100); // EXTRACTS THE DEGREES
dataString += String(gradoslat); // ADDS DEGREES TO THE STRING
dataString += ',';
int minutoslat = (GPS.latitude - gradoslat * 100); // EXTTRACTS MINUTES
dataString += String(minutoslat); // ADDS MINUTES TO THE STRING
dataString += '.';
int decimlat = (GPS.latitude - int(GPS.latitude)) * 1000; // EXTRCTS MINUTE DECIMALS
dataString += String(decimlat); // ADDS MINUTE DECIMALS TO THE STRING
dataString += ',';
dataString += String(GPS.lat); // ADDS THE HEMISPHERE TO THE STRING
dataString += ',';
// THIS ADDS LONGITUDE TO THE STRING
dataString += "LONG";
dataString += ',';
int gradoslong = int((GPS.longitude) / 100); // EXTRACTS DEGREES
dataString += String(gradoslong); // ADDS DEGREES TO THE STRING
dataString += ',';
int minutoslong = (GPS.longitude - gradoslong * 100); // EXTRCTS MINUTES
dataString += String(minutoslong); // ADDS MINUTES TO THE STRING
dataString += '.';
int decimlong = (GPS.longitude - int(GPS.longitude)) * 1000; // EXTRACTS MINUTE DECIMALS
dataString += String(decimlong); // ADDS MINUTE DECIMALS TO THE STRING
dataString += ',';
dataString += String(GPS.lon); // ADDS W_E LONGITUDE TO THE STRING
dataString += ',';
// THIS SECTION ADDS THE ALTITUDE TO THE STRING
dataString += "ALT";
dataString += ',';
dataString += String(int(GPS.altitude)); // ADDS THE INTEGER PART OF THE ALTITUDE
dataString += '.';//
unsigned int altura = (GPS.altitude - int(GPS.altitude)) * 10; // EXTRACTS THE DECIMAL PART
dataString += String(altura); // ADDS THE DECIMAL PART TO THE STRING
dataString += ',';
// THIS SECTION ADDS THE NUMBER OF SATELLITES TO THE STRING
dataString += "SAT";
dataString += ',';
dataString += String(int(GPS.satellites)); // ADDS THE NUMBER OF SATELLITES TO THE STRING
dataString += ',';
// THIS SECTION ADDS TO THE STRING THE DATA FROM FIVE DHT22 TEMPERATURE AND HUMIDITY SENSORS HOOKED TO PINS 2, 3, 4, 5 AND 6
dataString += "DHT22";
dataString += ',';
int dhtPins[] = {2, 3, 4, 5, 6}; // DEFINE THE PINS
for (int i = 0; i < 4; i++)
{
#define DHTPIN dhtPins[i]
DHT dht(DHTPIN, DHTTYPE);
dht.begin();
float h = dht.readHumidity();// READS HUMIDITY
unsigned int frach;
dataString += String(int(h)); // ADDS INTEGER PART OF THE HUMIDITY TO THE STRING
dataString += '.';// ADDS THE DECIMAL POINT
frach = (h - int(h)) * 10; // EXTRACTS THE DECIMAL PART OF THE HUMIDITY
dataString += String(int(frach));// ADDS THE DECIMALS TO THE STRING
dataString += ',';
float t = dht.readTemperature();// READS TEMPERATURE FROM THE DHT22
unsigned int fract;
dataString += String(int(t));// ADDS THE INTEGER PART OF THE TEMPERATURE TO THE STRING
dataString += '.';
if (t >= 0)// IS TEMPERATURE POSITIVE?
{
fract = (t - int(t)) * 10; // CREATES A FLOAT VARIABLE WITH THE DECIMAL PART
dataString += String(int(fract)); // ADDS THE DECIMAL PART TO THE STRING
}
else
{
fract = (int(t) - t) *10;
dataString += String(int(fract));
}
dataString += ',';
}
Serial.println(dataString);
}
}
}
# include <SPI.h>
# include <SD.h>
the string starts doing weird things. I suspect it has to do with some kind of interaction with the DHT22 sensors, because their data are the first to fail, apparently. Including more lines just makes it worse.
Code: Select all
#include <Adafruit_GPS.h>
#include <SoftwareSerial.h>
#include "DHT.h"
// #include <SPI.h> // ARDUINO DATALOGGER SKETCH
// #include <SD.h> // ARDUINO DATALOGGER SKETCH
// const int chipSelect = 10; // ARDUINO DATALOGGER SKETCH
// File dataFile; // ARDUINO DATALOGGER SKETCH
SoftwareSerial mySerial(8, 7);
Adafruit_GPS GPS(&mySerial);
#define GPSECHO true
#define DHTTYPE DHT22 // DHT 22 (AM2302)
uint32_t timer = millis();
void setup()
{
Serial.begin(9600);
delay(5000);
Serial.println("Adafruit GPS library basic test!");
GPS.begin(9600);
GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); // 1 Hz update rate
GPS.sendCommand(PGCMD_ANTENNA);
delay(1000);
mySerial.println(PMTK_Q_RELEASE);
// Serial.print("Initializing SD card..."); // ARDUINO DATALOGGER SKETCH
// pinMode(SS, OUTPUT); // ARDUINO DATALOGGER SKETCH
// if (!SD.begin(chipSelect)) { // ARDUINO DATALOGGER SKETCH
// Serial.println("Card failed, or not present"); // ARDUINO DATALOGGER SKETCH
// while (1) ; // ARDUINO DATALOGGER SKETCH
// } // ARDUINO DATALOGGER SKETCH
// Serial.println("card initialized."); // ARDUINO DATALOGGER SKETCH
// dataFile = SD.open("datalog.txt", FILE_WRITE); // ARDUINO DATALOGGER SKETCH
// if (! dataFile) { // ARDUINO DATALOGGER SKETCH
// Serial.println("error opening datalog.txt"); // ARDUINO DATALOGGER SKETCH
// while (1) ; // ARDUINO DATALOGGER SKETCH
// } // ARDUINO DATALOGGER SKETCH
}
void loop() // run over and over again
{
char c = GPS.read();
if ((c) && (GPSECHO))
// Serial.write(c);
if (GPS.newNMEAreceived())
{
if (!GPS.parse(GPS.lastNMEA())) // this also sets the newNMEAreceived() flag to false
return; // we can fail to parse a sentence in which case we should just wait for another
}
if (timer > millis()) timer = millis();
if (millis() - timer > 1000)
{
timer = millis(); // reset the timer
Serial.println(GPS.fix); // THIS IS TO DEBUG
if (GPS.fix)
{
String dataString = "";
// THIS SECTION ADDS TIME TO THE DATASTRING
dataString += 'H';
dataString += ',';
dataString += String(GPS.hour, DEC);
dataString += ',';
dataString += String(GPS.minute, DEC);
dataString += ',';
dataString += String(GPS.seconds, DEC);
dataString += ',';
dataString += String(GPS.milliseconds, DEC);
dataString += ',';
dataString += 'F';
dataString += ',';
dataString += String(GPS.day, DEC);
dataString += ',';
dataString += String(GPS.month, DEC);
dataString += ',';
dataString += String(GPS.year, DEC);
dataString += ',';
dataString += 'Q';
dataString += ',';
dataString += String((int)GPS.fix);
dataString += ',';
dataString += String((int)GPS.fixquality);
dataString += ',';
// THIS ADDS LATITUDE TO THE STRING
dataString += "LAT";
dataString += ',';
int gradoslat = int((GPS.latitude) / 100); // EXTRACTS THE DEGREES
dataString += String(gradoslat); // ADDS DEGREES TO THE STRING
dataString += ',';
int minutoslat = (GPS.latitude - gradoslat * 100); // EXTTRACTS MINUTES
dataString += String(minutoslat); // ADDS MINUTES TO THE STRING
dataString += '.';
int decimlat = (GPS.latitude - int(GPS.latitude)) * 1000; // EXTRCTS MINUTE DECIMALS
dataString += String(decimlat); // ADDS MINUTE DECIMALS TO THE STRING
dataString += ',';
dataString += String(GPS.lat); // ADDS THE HEMISPHERE TO THE STRING
dataString += ',';
// THIS ADDS LONGITUDE TO THE STRING
dataString += "LONG";
dataString += ',';
int gradoslong = int((GPS.longitude) / 100); // EXTRACTS DEGREES
dataString += String(gradoslong); // ADDS DEGREES TO THE STRING
dataString += ',';
int minutoslong = (GPS.longitude - gradoslong * 100); // EXTRCTS MINUTES
dataString += String(minutoslong); // ADDS MINUTES TO THE STRING
dataString += '.';
int decimlong = (GPS.longitude - int(GPS.longitude)) * 1000; // EXTRACTS MINUTE DECIMALS
dataString += String(decimlong); // ADDS MINUTE DECIMALS TO THE STRING
dataString += ',';
dataString += String(GPS.lon); // ADDS W_E LONGITUDE TO THE STRING
dataString += ',';
// THIS SECTION ADDS THE ALTITUDE TO THE STRING
dataString += "ALT";
dataString += ',';
dataString += String(int(GPS.altitude)); // ADDS THE INTEGER PART OF THE ALTITUDE
dataString += '.';//
unsigned int altura = (GPS.altitude - int(GPS.altitude)) * 10; // EXTRACTS THE DECIMAL PART
dataString += String(altura); // ADDS THE DECIMAL PART TO THE STRING
dataString += ',';
// THIS SECTION ADDS THE NUMBER OF SATELLITES TO THE STRING
dataString += "SAT";
dataString += ',';
dataString += String(int(GPS.satellites)); // ADDS THE NUMBER OF SATELLITES TO THE STRING
dataString += ',';
// THIS SECTION ADDS TO THE STRING THE DATA FROM FIVE DHT22 TEMPERATURE AND HUMIDITY SENSORS HOOKED TO PINS 2, 3, 4, 5 AND 6
dataString += "DHT22";
dataString += ',';
int dhtPins[] = {2, 3, 4, 5, 6}; // DEFINE THE PINS
for (int i = 0; i < 4; i++)
{
#define DHTPIN dhtPins[i]
DHT dht(DHTPIN, DHTTYPE);
dht.begin();
float h = dht.readHumidity();// READS HUMIDITY
unsigned int frach;
dataString += String(int(h)); // ADDS INTEGER PART OF THE HUMIDITY TO THE STRING
dataString += '.';// ADDS THE DECIMAL POINT
frach = (h - int(h)) * 10; // EXTRACTS THE DECIMAL PART OF THE HUMIDITY
dataString += String(int(frach));// ADDS THE DECIMALS TO THE STRING
dataString += ',';
float t = dht.readTemperature();// READS TEMPERATURE FROM THE DHT22
unsigned int fract;
dataString += String(int(t));// ADDS THE INTEGER PART OF THE TEMPERATURE TO THE STRING
dataString += '.';
if (t >= 0)// IS TEMPERATURE POSITIVE?
{
fract = (t - int(t)) * 10; // CREATES A FLOAT VARIABLE WITH THE DECIMAL PART
dataString += String(int(fract)); // ADDS THE DECIMAL PART TO THE STRING
}
else
{
fract = (int(t) - t) *10;
dataString += String(int(fract));
}
dataString += ',';
}
Serial.println(dataString);
// dataFile.println(dataString); // ARDUINO DATALOGGER SKETCH
// dataFile.flush(); // ARDUINO DATALOGGER SKETCH
// delay(5000); // ARDUINO DATALOGGER SKETCH
}
}
}