First part........
#include <SoftwareSerial.h>
#include <dht.h>
#include <Average.h>
#include <Time.h>
dht DHT;
#define txPin 12
#define DHT22_PIN 3
#define PIN_ANEMOMETER 2
#define MSECS_CALC_WIND_SPEED 10000
#define uint unsigned int
#define ulong unsigned long
// 3G definitions
#define unoTXPin (5)
#define unoRXPin (4)
#define powerGSMPin (8)
// AT commands related
#define AT_CREG_QUERY ("AT+CREG?")
#define AT_NETWORK_SETUP ("AT+CGSOCKCONT=1,\"IP\",\"telstra.internet\",\"0.0.0.0\",0,0")
#define AT_SMTPSRV ("AT+SMTPSRV=\"mail.bigpond.com\",25")
#define AT_SMTPAUTH ("AT+SMTPAUTH=0")
#define AT_SMTPFROM ("AT+SMTPFROM=\"user@server.com.au\"")
#define AT_SMTPRCPT ("AT+SMTPRCPT=0,0,\"recipient@server.com\"")
#define AT_PUSHOVER ("AT+SMTPRCPT=0,0,\"somebiglongalphanumerickey@api.pushover.net\"")
#define AT_SMTPSEND ("AT+SMTPSEND")
#define AT_CTZU ("AT+CTZU=1")
#define AT_CCLK ("AT+CCLK?")
#define EOS ('\0')
#define ESC (0x1A)
#define OK ("OK")
#define CTRL_Z ("\x1a")
SoftwareSerial GSMSerial(unoRXPin,unoTXPin);
SoftwareSerial LCD(0, txPin);
int temp, rh, wind, iSpeed;
int TimeHours, TimeMinutes, TimeSeconds;
float tRa, rhRa, wRa;
Average<float> Taverage(6);
Average<float> RHaverage(6);
Average<float> Waverage(60);
volatile int numRevsAnemometer = 0;
ulong nextCalcSpeed;
ulong time;
boolean AlertStatus = false;
boolean UpdateStatus = false;
boolean SendEnable = false;
char response[100];
char* valPos;
void setup() {
Serial.begin(9600);
delay(500);
pinMode(txPin, OUTPUT);
LCD.begin(9600);
clearLCD();
delay(600);
selectLineOne();
LCD.print(F("startup message"));
selectLineTwo();
LCD.print(F(" info and stuff"));
Serial.println(F("startup message"));
Serial.println("");
Serial.println(F("SYS : Initializing"));
delay (5000);
pinMode(PIN_ANEMOMETER, INPUT);
digitalWrite(PIN_ANEMOMETER, HIGH);
attachInterrupt(0, countAnemometer, FALLING);
nextCalcSpeed = millis() + MSECS_CALC_WIND_SPEED;
GSMSerial.begin(9600);
GSM_power_on();
Serial.println(F("3G : Ready"));
clearLCD();
selectLineOne();
LCD.print(F(" 3G Power ON"));
delay(2000);
while( (sendATcommand(AT_CREG_QUERY, "+CREG:0,1", 500) ||
sendATcommand(AT_CREG_QUERY, "+CREG:0,5", 500)) == 0);
Serial.println(F("3G : Registered"));
selectLineOne();
LCD.print(F(" 3G Registered"));
sendATcommand(AT_CTZU, "OK", 500);
delay(200);
SyncTime();
Serial.print(F("SYS : Time Set "));
if (hour() < 10)
Serial.print("0");
Serial.print(hour());
Serial.print(":");
if (minute() < 10)
Serial.print("0");
Serial.println(minute());
delay(5000);
clearLCD();
selectLineOne();
LCD.print(F("System Ready...."));
pinMode (6, INPUT);
digitalWrite(6, HIGH);
readDIPswitch();
sendATcommand(AT_NETWORK_SETUP,"OK",500);
sendATcommand(AT_SMTPSRV,"OK",500);
sendATcommand(AT_SMTPAUTH,"OK",500);
sendATcommand(AT_SMTPFROM,"OK",500);
sendATcommand(AT_SMTPRCPT,"OK",500);
GSMSerial.println(F("AT+SMTPSUB=\"Fire Weather Warning Station Startup OK\""));
GSMSerial.println(F("AT+SMTPBODY=\"Fire Weather Warning Station has been restarted....\""));
if (SendEnable == true){
sendATcommand(AT_SMTPSEND,"OK",500);
Serial.println(F("SYS : System Start Email Sent"));
}
delay(10000);
}
void loop(){
readDIPswitch();
if ((hour() == 0) && (minute() == 0)){
SyncTime;
}
/
calcWindSpeed();
calcTempHumd();
tRa = Taverage.rolling(temp);
rhRa = RHaverage.rolling(rh);
wRa = Waverage.rolling(wind);
if ((minute()== 0) && (UpdateStatus == false)){
SendHourlyUpdate();
}
if ((minute() != 0) && (UpdateStatus == true)){
(UpdateStatus = false);
}
clearLCD();
selectLineOne();
LCD.print(F("Tp="));
LCD.print(temp);
LCD.print(F(" Rh="));
LCD.print(rh);
LCD.print(F(" W="));
LCD.print(wind);
selectLineTwo();
DisplayTime();
DisplayAlertStatus();
DisplayEmailStatus();
if (tRa >=15 && tRa <20){
int index = rhRa/5;
int8_t windvals[] = {-1,31,35,38,40,43,45,45,49,49,53,53,56,58};
if (index >12) index =12;
if (wRa >= windvals[index]){
Serial.println(F("Trigger in 15-20 Deg range"));
GFDI_ALERT();
}
else AllClearMessage();
}
if (tRa >=20 && tRa <25){
int index = rhRa/5;
int8_t windvals[] = {-1,29,33,36,38,40,43,43,46,46,50,50,53,55};
if (index >12) index =12;
if (wRa >= windvals[index]){
Serial.println(F("Trigger in 20-25 Deg range"));
GFDI_ALERT();
}
else AllClearMessage();
}
if (tRa >=25 && tRa <30){
int index = rhRa/5;
int8_t windvals[] = {-1,27,30,33,36,38,40,40,44,44,47,47,50,52};
if (index >12) index =12;
if (wRa >= windvals[index]){
Serial.println(F("Trigger in 25-30 Deg range"));
GFDI_ALERT();
}
else AllClearMessage();
}
if (tRa >=30 && tRa <35){
int index = rhRa/5;
int8_t windvals[] = {-1,25,28,31,33,35,37,37,41,41,44,44,47,49};
if (index >12) index =12;
if (wRa >= windvals[index]){
Serial.println(F("Trigger in 30-35 Deg range"));
GFDI_ALERT();
}
else AllClearMessage();
}
if (tRa >=35 && tRa <40){
int index = rhRa/5;
int8_t windvals[] = {-1,23,26,28,31,33,35,35,38,38,41,41,44,46};
if (index >12) index =12;
if (wRa >= windvals[index]){
Serial.println(F("Trigger in 35-40 Deg range"));
GFDI_ALERT();
}
else AllClearMessage();
}
if (tRa >=40 && tRa <45){
int index = rhRa/5;
int8_t windvals[] = {-1,21,24,26,28,30,32,32,35,35,39,39,41,43};
if (index >12) index =12;
if (wRa >= windvals[index]){
Serial.println(F("Trigger in 40-45 Deg range"));
GFDI_ALERT();
}
else AllClearMessage();
}
if (tRa >=45){
int index = rhRa/5;
int8_t windvals[] = {-1,19,22,24,26,28,30,30,33,33,36,36,39,40};
if (index >12) index =12;
if (wRa >= windvals[index]){
Serial.println(F("Trigger in over 45 Deg range"));
GFDI_ALERT();
}
else AllClearMessage();
}
delay(MSECS_CALC_WIND_SPEED);
}