Created
December 2, 2015 16:16
-
-
Save dwblair/6d226573db6191037a26 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <Adafruit_FONA.h> | |
#include <JeeLib.h> | |
char sensorIDC [] = "1"; //the sensor id | |
char sensorTypeC []="A"; //the sensor type | |
char publicKey[]="lWLkGyQJLAhGQjvw1pggH812MyD";//phant pub key | |
char privateKey[]="6M8gqBja8OsnDO9v3BllibZ87vW";//phant priv key | |
char tokenC[]="ffc15f4fa95d4893d1ba";// WEBDs token | |
char phoneNum[]="85870";// phone number to text to | |
//thermistor stuff ----------------------- | |
#define sleepMinutes 0 | |
#define THERMISTORPIN A0 | |
// resistance at 25 degrees C | |
#define THERMISTORNOMINAL 10000 | |
// temp. for nominal resistance (almost always 25 C) | |
#define TEMPERATURENOMINAL 25 | |
// how many samples to take and average, more takes longer | |
// but is more 'smooth' | |
#define NUMSAMPLES 5 | |
// The beta coefficient of the thermistor (usually 3000-4000) | |
#define BCOEFFICIENT 3950 | |
// the value of the 'other' resistor | |
#define SERIESRESISTOR 10000 | |
//fona stuff ----------------------------------- | |
#define FONA_RX 2 | |
#define FONA_TX 9 | |
#define FONA_RST 4 | |
#define FONA_KEY 8 | |
#define FONA_POWER_STATUS A1 | |
#define failCountMax 5 | |
ISR(WDT_vect) { Sleepy::watchdogEvent(); } | |
char sendBuffer[220]; | |
#ifdef __AVR__ | |
#include <SoftwareSerial.h> | |
SoftwareSerial fonaSS = SoftwareSerial(FONA_TX, FONA_RX); | |
SoftwareSerial *fonaSerial = &fonaSS; | |
#else | |
HardwareSerial *fonaSerial = &Serial1; | |
#endif | |
Adafruit_FONA fona = Adafruit_FONA(FONA_RST); | |
uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout = 0); | |
uint8_t type; | |
float rando; | |
//conductivity stuff | |
long pulseCount = 0; //a pulse counter variable | |
unsigned long pulseTime,lastTime, duration, totalDuration; | |
int samplingPeriod=3; // the number of seconds to measure 555 oscillations | |
int interruptPin = 1; //corresponds to D2 | |
void setup() { | |
//blink | |
pinMode(13, OUTPUT); | |
pinMode(FONA_POWER_STATUS,INPUT); | |
pinMode(FONA_KEY, OUTPUT); | |
// make sure the FONA power cycling key is initially pulled 'high' -- i.e. not triggered | |
digitalWrite(FONA_KEY, HIGH); //go back to non-trigger | |
Serial.begin(115200); | |
} | |
void loop() { | |
// measurements ---------------------------- | |
// conductivity -------------------------------------- | |
pulseCount=0; //reset the pulse counter | |
totalDuration=0; //reset the totalDuration of all pulses measured | |
attachInterrupt(interruptPin,onPulse,RISING); //attach an interrupt counter to interrupt pin 1 (digital pin #3) -- the only other possible pin on the 328p is interrupt pin #0 (digital pin #2) | |
pulseTime=micros(); // start the stopwatch | |
delay(samplingPeriod*1000); //give ourselves samplingPeriod seconds to make this measurement, during which the "onPulse" function will count up all the pulses, and sum the total time they took as 'totalDuration' | |
detachInterrupt(interruptPin); //we've finished sampling, so detach the interrupt function -- don't count any more pulses | |
float freqHertz; | |
if (pulseCount>0) { //use this logic in case something went wrong | |
double durationS=(totalDuration/double(pulseCount))/1000000.; //the total duration, in seconds, per pulse (note that totalDuration was in microseconds) | |
freqHertz=1./durationS; | |
} | |
else { | |
freqHertz=0.; | |
} | |
// temp ------------------------- | |
uint8_t i; | |
float average; | |
int samples[NUMSAMPLES]; | |
// take N samples in a row, with a slight delay | |
for (i=0; i< NUMSAMPLES; i++) { | |
samples[i] = analogRead(THERMISTORPIN); | |
delay(10); | |
} | |
// average all the samples out | |
average = 0; | |
for (i=0; i< NUMSAMPLES; i++) { | |
average += samples[i]; | |
} | |
average /= NUMSAMPLES; | |
// convert the value to resistance | |
average = 1023 / average - 1; | |
average = SERIESRESISTOR / average; | |
float steinhart; | |
steinhart = average / THERMISTORNOMINAL; // (R/Ro) | |
steinhart = log(steinhart); // ln(R/Ro) | |
steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro) | |
steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To) | |
steinhart = 1.0 / steinhart; // Invert | |
steinhart -= 273.15; // convert to C | |
// fona --------------------------------------- | |
power_up_fona(); | |
int fonaStatus=initialize_fona(); | |
if (!fonaStatus) { | |
power_down_fona(); | |
} | |
else{ | |
int networkStatus=fona_find_network(); | |
if ((networkStatus!=1)&&(networkStatus!=5)) { | |
} | |
if (((networkStatus==1)||(networkStatus==5))&&fonaStatus) { //then we're good to send a message! | |
fona.sendCheckReply(F("AT"), F("OK")); | |
delay(100); | |
fona.sendCheckReply(F("AT+SAPBR=3,1,\"APN\",\"internet.comcel.com.co\""), F("OK")); | |
delay(100); | |
fona.sendCheckReply(F("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\""), F("OK")); | |
delay(100); | |
fona.sendCheckReply(F("AT+SAPBR=1,1"),F("OK")); | |
delay(100); | |
fona.sendCheckReply(F("AT+CMGF=1"), F("OK")); | |
delay(5000); | |
fona.sendCheckReply(F("AT+CGATT=1"), F("OK")); | |
delay(5000); | |
uint16_t returncode; | |
char gpsbuffer[120]; | |
fona.getGSMLoc(&returncode,gpsbuffer,120); | |
char *lonC = strtok(gpsbuffer, ","); | |
char *latC = strtok(NULL,","); | |
// lat = atof(latp); | |
// lon = atof(lonp); | |
char *dateC = strtok(NULL,","); | |
char *timeC = strtok(NULL,","); | |
// get battery level | |
uint16_t battLevel; | |
fona.getBattVoltage(&battLevel); | |
// char conversions | |
char tempC[10]; | |
dtostrf(steinhart, 3, 2, tempC); | |
char conductC[10]; | |
dtostrf(freqHertz,3,2,conductC); | |
char battC[10]; | |
dtostrf(battLevel,3,2,battC); | |
char phC[]= "0"; | |
char doC[]= "0"; | |
//SHARED | |
fona.sendCheckReply(F("AT+CMGF=0"), F("OK")); | |
delay(2000); | |
fona.sendCheckReply(F("AT+HTTPTERM"), F("OK")); | |
delay(2000); | |
fona.sendCheckReply(F("AT+HTTPINIT"), F("OK")); | |
delay(2000); | |
fona.sendCheckReply(F("AT+HTTPPARA=\"CID\",1"), F("OK")); | |
delay(2000); | |
// PHANT | |
sprintf(sendBuffer,"AT+HTTPPARA=\"URL\",\"http://159.203.128.53/input/%s?private_key=%s&hr=%s&la=%s&lo=%s&da=%s&t=%s&c=%s&ph=%s&do=%s&b=%s&typ=%s&id=%s\"",publicKey,privateKey,timeC,latC,lonC,dateC,tempC,conductC,phC,doC,battC,sensorTypeC,sensorIDC); | |
fona.sendCheckReply(sendBuffer,"OK"); | |
fona.sendCheckReply(F("AT+HTTPDATA=0,1000"), F("OK")); | |
delay(5000); | |
fona.sendCheckReply(F("AT+HTTPACTION=1"), F("OK")); | |
delay(20000); | |
// WEBDs | |
fona.sendCheckReply(F("AT+HTTPPARA=\"CONTENT\",\"application/json\""), F("OK")); | |
delay(2000); | |
sprintf(sendBuffer,"AT+HTTPPARA=\"URL\",\"http://santurbanvisible.org:8282/sensor/post_data\""); | |
// sprintf(sendBuffer,"AT+HTTPPARA=\"URL\",\"http://requestb.in/1mw4zzh1\""); | |
fona.sendCheckReply(sendBuffer,"OK"); | |
sprintf(sendBuffer,"{\"hour\":\"%s\",\"lat\":%s,\"lon\":%s,\"date\":\"%s\",\"temp\":%s,\"conduct\":%s,\"ph\":%s,\"do\":%s,\"batt\":%s,\"sensorType\":\"%s\",\"sensorID\":\"%s\",\"token\":\"%s\"}",timeC,latC,lonC,dateC,tempC,conductC,phC,doC,battC,sensorTypeC,sensorIDC,tokenC); | |
fona.sendCheckReply(F("AT+HTTPDATA=1000,5000"), F("OK")); | |
fona.sendCheckReply(sendBuffer,"OK"); | |
delay(15000); | |
fona.sendCheckReply(F("AT+HTTPACTION=1"), F("OK")); | |
delay(20000); | |
fona.sendCheckReply(F("AT+HTTPTERM"), F("OK")); | |
delay(5000); | |
fona.sendCheckReply(F("AT+SAPBR=0,1"), F("OK")); | |
delay(10000); | |
/// send SMS | |
char velocityC[]= "0"; | |
char message[141]; | |
sprintf(message, "%s;%s;%s;%s;%s;%s;%s;%s",timeC,latC,lonC,dateC,tempC,conductC,phC,doC); | |
fona.sendSMS(phoneNum, message); | |
} | |
else{ | |
} | |
power_down_fona(); | |
} | |
} | |
void power_up_fona() { | |
int fonaPower=digitalRead(FONA_POWER_STATUS); | |
if (!fonaPower) { // off, so power up | |
digitalWrite(FONA_KEY, HIGH); //go back to non-trigger | |
digitalWrite(FONA_KEY, LOW); //turn on the SMS subcircuit | |
delay(2000); //so now it's on | |
digitalWrite(FONA_KEY, HIGH); //go back to non-trigger | |
} | |
else { | |
// error! was already on for some reason -- do nothing | |
} | |
} | |
int initialize_fona() { | |
int fonaStatus; | |
fonaSerial->begin(4800); | |
if (! fona.begin(*fonaSerial)) { | |
// things are bad -- couldn't find FONA | |
fonaStatus=0; | |
} | |
else { | |
//things are good -- FONA OK | |
fonaStatus=1; | |
} | |
return fonaStatus; | |
} | |
int fona_find_network() { | |
uint8_t n = fona.getNetworkStatus(); | |
int avail = fona.available(); | |
int registerCountDelaySeconds=10; | |
int registerWaitTotalSeconds=0; | |
int failCount=0; | |
while ((n!=1)&&(n!=5)&&(failCount<failCountMax)) { | |
n = fona.getNetworkStatus(); | |
//avail = fona.available(); | |
registerWaitTotalSeconds+=registerCountDelaySeconds; | |
delay(registerCountDelaySeconds*1000); | |
failCount=failCount+1; | |
} | |
return n; | |
} | |
void power_down_fona() { | |
int fonaPower=digitalRead(FONA_POWER_STATUS); | |
if (fonaPower) { // on, so power down | |
digitalWrite(FONA_KEY, HIGH); //go back to non-trigger | |
digitalWrite(FONA_KEY, LOW); //turn on the SMS subcircuit | |
delay(2000); //so now it's on | |
digitalWrite(FONA_KEY, HIGH); //go back to non-trigger | |
} | |
else { | |
// error! was already off for some reason -- do nothing | |
} | |
} | |
void go_to_sleep_minutes(int minutes) { | |
int LOG_INTERVAL_BASE = 60000; // 1 sec | |
for (int k=0;k<minutes;k++) { | |
Sleepy::loseSomeTime(LOG_INTERVAL_BASE); //-- will interfere with serial, so don't use when debugging | |
} | |
} | |
void onPulse() | |
{ | |
pulseCount++; | |
//Serial.print("pulsecount="); | |
//Serial.println(pulseCount); | |
lastTime = pulseTime; | |
pulseTime = micros(); | |
duration=pulseTime-lastTime; | |
totalDuration+=duration; | |
//Serial.println(totalDuration); | |
} | |
void flushSerial() { | |
while (Serial.available()) | |
Serial.read(); | |
} | |
uint8_t readline(char *buff, uint8_t maxbuff, uint16_t timeout) { | |
uint16_t buffidx = 0; | |
boolean timeoutvalid = true; | |
if (timeout == 0) timeoutvalid = false; | |
while (true) { | |
if (buffidx > maxbuff) { | |
//Serial.println(F("SPACE")); | |
break; | |
} | |
while (Serial.available()) { | |
char c = Serial.read(); | |
//Serial.print(c, HEX); Serial.print("#"); Serial.println(c); | |
if (c == '\r') continue; | |
if (c == 0xA) { | |
if (buffidx == 0) // the first 0x0A is ignored | |
continue; | |
timeout = 0; // the second 0x0A is the end of the line | |
timeoutvalid = true; | |
break; | |
} | |
buff[buffidx] = c; | |
buffidx++; | |
} | |
if (timeoutvalid && timeout == 0) { | |
//Serial.println(F("TIMEOUT")); | |
break; | |
} | |
delay(1); | |
} | |
buff[buffidx] = 0; // null term | |
return buffidx; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment