Arduino GPRS väderstation - del 1 (22 / 23 steg)
Steg 22: MEGA 2560 fullständiga koden
< p > / / slav se bifogas textfil för fullständiga detaljer. < br > #include
#include "Adafruit_FONA.h"
#include
#include
#include
#include
#include
#include "DHT.h"
#define FONA_RX 2
#define FONA_TX 10
#define FONA_RST 4
#define ONE_WIRE_BUS_PIN 11
#define DHTPIN 4
#define DHTTYPE DHT11 / / DHT 11
#define DHTTYPE DHT22 / / DHT 22 (AM2302), AM2321
Stift 5 //Sends ett samtal tillbaka signal till master när framgångsrika dataöverföringen.
DHT dht (DHTPIN, DHTTYPE);
OneWire oneWire(ONE_WIRE_BUS_PIN);
DallasTemperature sensorer (& oneWire);
DeviceAddress Probe01 = {0x28, 0xFF, 0xA3, 0x4D, 0x00, 0x16, 0x03, 0xEC}; Detta är adresserna till temp sonderna DS18B20
DeviceAddress Probe02 = {0x28, 0x4E, 0xCA, 0x80, 0x04, 0x00, 0x00, 0xA0};
DeviceAddress Probe03 = {0x28, 0x7C, 0x8A, 0x5D, 0x05, 0x00, 0x00, 0xFD};
CONST long illrar = 179224;
int n = 0;
int z = 0;
int fukt = 0;
osignerade långa heatindex = 0;
osignerade långa fuktighet = 0;
osignerade långa tempDHT22 = 0;
osignerade långa vindhastigheten = 0;
osignerade långa windgust = 0;
osignerade långa avWindPulseRate = 0;
osignerade långa maxWindPulseRate = 0;
osignerade långa regn = 0;
osignerade långa windDirection = 0;
osignerade långa windway = 0;
osignerade långa moistureValue = 0;
osignerade långa tryck = 0;
osignerade långa volt = 1200; multiplicerat med 100.
osignerade långa tempint;
osignerade långa tempout;
osignerade långa tempsoil;
osignerade långa previousMillis = 0;
CONST långa intervall = 10000;
Detta är en stor buffert för svar
char replybuffer [255];
Sträng initiativtagare, dataString;
CONST char webadress [180] = "http://www.goatindustries.co.uk/weather/send.php?";
char url [180];
#include
SoftwareSerial fonaSS = SoftwareSerial (FONA_TX, FONA_RX);
SoftwareSerial * fonaSerial = & fonaSS;
Adafruit_FONA fona = Adafruit_FONA(FONA_RST);
Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);
uint8_t readline (char * buff, uint8_t maxbuff, uint16_t timeout = 0);
uint8_t typ;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
Serial.BEGIN(115200);
pinMode (5, OUTPUT); Skickar ett samtal tillbaka signalen till master när framgångsrika dataöverföringen.
pinMode (6, OUTPUT); Återställer FONA
digitalWrite(6,LOW);
fördröjning (1000);
digitalWrite(6,HIGH);
fördröjning (100);
digitalWrite(6,LOW);
DHT.BEGIN();
IF(!bmp.BEGIN())
{
/ * Ett problem upptäcka BMP085... kolla dina anslutningar * /
Serial.Print (Ooops, ingen BMP085 upptäckt... Kontrollera dina ledningar eller I2C ADDR!");
While(1);
}
Wire.BEGIN(9);
Wire.onReceive(receiveEvent);
tag (!. Seriell); Använd detta för att inleda programmet vid öppning av seriell monitor. Ta bort i normal drift.
Serial.println F ("FONA grundläggande test").
Serial.println (F ("initierar... (Kan ta 3 sekunder) "));
sensors.BEGIN(); Temperaturgivare DS18B20.
sensors.setResolution (Probe01, 11); Var på pinne 10 i version 09
sensors.setResolution (Probe02, 11);
sensors.setResolution (Probe03, 11);
fonaSerial -> begin(4800);
om (! fona.begin(*fonaSerial)) {
Serial.println (F ("kunde inte hitta FONA"));
samtidigt (1).
}
typ = fona.type();
Serial.println (F ("FONA är OK"));
Serial.Print F ("hittade").
Växla (typ) {
fall FONA800L:
Serial.println F ("FONA 800L"). bryta;
fall FONA800H:
Serial.println F ("FONA 800H"). bryta;
fall FONA808_V1:
Serial.println F ("FONA 808 (v1)"). bryta;
fall FONA808_V2:
Serial.println F ("FONA 808 (v2)"). bryta;
fall FONA3G_A:
Serial.println F ("FONA 3G (amerikansk)"). bryta;
fall FONA3G_E:
Serial.println F ("FONA 3G (Europeiska)"). bryta;
standard:
Serial.println(F("???")); bryta;
}
networkStatus(); Kontrollera att nätverket är tillgänglig. Hem är bra.
FONA test genom att skriva ut modulen IMEI nummer.
char imei [15] = {0}. MÅSTE använda en 16 tecken buffert för IMEI!
uint8_t imeiLen = fona.getIMEI(imei);
om (imeiLen > 0) {
Serial.Print ("modul IMEI:"); Serial.println(IMEI);
}
Serial.println("");
Serial.println ("Kontrollera att GPRS är avstängd till att börja med...");
fona.setGPRSNetworkSettings(F("pp.vodafone.co.uk"), F("wap"), F("wap")); Ändra dessa inställningar! (Nätverk APN, användarnamn, lösenord)
fördröjning (1000);
Stänga av GPRS:
om (! fona.enableGPRS(false))
Serial.println F ("No - det gick inte att stänga av").
Serial.println har ("om raden ovan säger OK, då GPRS bara varit avstängd");
fördröjning (1000);
Serial.println("");
Serial.println ("väntar på data från i2c...");
Serial.println("");
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
om (z > 0) / / denna loop initieras om z är större än 1. Värdet på z ges av kvitto
{/ / i2c data. Det måste finnas en andra z utvärderingen att fona att slå på sin GPRS
networkStatus(); och förhindra förlust av data i tidslucka.
volt = analogRead (0) * 4.688; Alla decimaler konverteras till heltal som vi inte vill skicka decimalen karaktär via HTTP.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Läst temperatur eller fuktighet tar cirka 250 millisekunder!
Sensormätningar kan också vara upp till 2 sekunder "gamla" (det är en mycket långsam sensor)
flyta h = dht.readHumidity();
Läs temperatur som Celsius (standard)
flyta t = dht.readTemperature();
Läs temperatur som Fahrenheit (isFahrenheit = true)
flyta f = dht.readTemperature(true);
fördröjning (3000);
Kontrollera om någon läser misslyckades och avsluta tidigt (för att försöka igen).
om (isnan(h) || isnan(t) || isnan(f)) {
Serial.println ("kunde inte läsa från DHT sensorn!");
hemkomst.
}
Beräkna Värmeindex i Fahrenheit (standard)
flyta hif = dht.computeHeatIndex (f, h);
Beräkna Värmeindex i Celsius (isFahreheit = false)
flyta hic = dht.computeHeatIndex (t, h, false);
fukt = h;
tempDHT22 = t;
heatindex = hic;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
sensors_event_t händelse;
bmp.getEvent(&event);
om (event.pressure)
{
Tryck = (event.pressure) * 100;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
sensors.requestTemperatures(); DS18B20s
vindhastigheten = avWindPulseRate * 20;
windgust = maxWindPulseRate * 20;
Windway = windDirection;
fukt = moistureValue * 1,08;
printData(); Skriver ut alla data till följetong för felsökning.
Serial.Print (F ("FONA >"));
turnOnGPRS();
turnOnGPRS();
Läs webbadress
uint16_t statuscode;
int16_t längd;
char url [180];
flushSerial();
weatherData();
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Detta är där data sammanställs i en karaktär...
dataString = initieraren + webadress + "vindhastigheten =" + vindhastigheten + "& windgust =" + windgust + "& windway =" + windway + "& tempout =" + tempout + "& tempsoil =" + tempsoil + "& regn =" + regn + "& luftfuktighet =" + fuktighet + "& Tryck =" + tryck + "& volt =" + volt + "& fukt =" + fukt + "& tempint =" + tempint + "& illrar =" + jaga ut;
int n = dataString.length();
Serial.Print ("sträng att skicka:"); Serial.println(dataString);
Serial.Print ("storleken på sträng:"); Serial.println(n);
Bygger tecknet url:
för (int aa = 0; aa < = n; aa ++)
{
URL [aa] = dataString [aa];
}
Serial.Print ("Character data att skicka:"); Serial.println(URL);
Serial.println("");
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
... och som skickas ut via HTTP till en PHP-fil som heter send.php redo att ta emot den.
Serial.Print ("Skicka url... ");
Serial.Print ("sammanställt url är:"); Serial.println(URL);
Serial.println(F("***"));
om (! fona. HTTP_GET_start(URL, &StatusCode, (uint16_t *) & längd)) {
Serial.println("failed!");
}
medan (längd > 0) {
samtidigt (fona.available()) {
char c = fona.read();
Serial.Write är för långsam, ska vi skriva direkt till seriell register!
#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
loop_until_bit_is_set (UCSR0A, UDRE0); / * Vänta tills data registrera tomma. */
UDR0 = c;
#else
digitalWrite 5, hög, Ringa tillbaka till Master säga att överförings var framgångsrik.
Tone(7,((Windway*15)+400),1000);
noTone(7);
Serial.write(c);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#endif
längd--;
om (! längd) bryta;
}
}
Serial.println(F("\n***"));
Fona. HTTP_GET_end();
Serial.println ("vänta 10 sekunder...");
Delay(500);
digitalWrite (5, låg).
fördröjning (10000);
Stänga av GPRS:
om (! fona.enableGPRS(false))
Serial.println F ("No - det gick inte att stänga av").
Serial.println ("GPRS avstängd?");
Serial.println ("väntar på data från i2c...");
spola input
flushSerial();
samtidigt (fona.available()) {
Serial.write(Fona.Read());
}
z = 0;
}
}
Slutet av huvudloop.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Funktioner:
void flushSerial() {
samtidigt (Serial.available())
Serial.Read();
}
char readBlocking() {
tag (!. Serial.available());
återvända Serial.read();
}
uint16_t readnumber() {
uint16_t x = 0;
char c;
medan (! isdigit (c = readBlocking())) {
Serial.Print(c);
}
Serial.Print(c);
x = c - '0';
medan (isdigit (c = readBlocking())) {
Serial.Print(c);
x * = 10;
x += c - '0';
}
återvändande x;
}
uint8_t readline (char * buff, uint8_t maxbuff, uint16_t timeout) {
uint16_t buffidx = 0;
booleska timeoutvalid = sant;
om (timeout == 0) timeoutvalid = false;
medan (sant) {
om (buffidx > maxbuff) {
Serial.println(F("Space"));
bryta;
}
samtidigt (Serial.available()) {
char c = Serial.read();
Serial.Print (c, HEX). Serial.Print("#"); Serial.println(c);
om (c == '\r') fortsätta;
om (c == 0xA) {
om (buffidx == 0) / / den första 0x0A ignoreras
fortsätta;
timeout = 0; den andra 0x0A är slutet av raden
timeoutvalid = sant;
bryta;
}
buff [buffidx] = c;
buffidx ++;
}
om (timeoutvalid & & timeout == 0) {
Serial.println(F("timeout"));
bryta;
}
Delay(1);
}
buff [buffidx] = 0; null sikt
återvända buffidx;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void receiveEvent (int byte) {/ / kontrollera att beställningen är densamma i master och slav.
Delay(10);
maxWindPulseRate = Wire.read();
Delay(10);
windDirection = Wire.read();
Delay(10);
regn = Wire.read();
Delay(10);
avWindPulseRate = Wire.read();
Delay(10);
moistureValue = Wire.read();
Delay(10);
z = 1;
fukt = moistureValue;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void printSoilTemperature(DeviceAddress deviceAddress)
{
float temp = sensors.getTempC(deviceAddress);
tempsoil = temp * 100;
om (tempsoil ==-127.00)
{
Serial.Print ("fel få temperatur");
}
annat
{
Serial.Print(tempsoil); Serial.Print ("grader C * 100");
}
}
void printOutsideTemperature(DeviceAddress deviceAddress)
{
float temp = sensors.getTempC(deviceAddress);
tempout = temp * 100;
om (tempout ==-127.00)
{
Serial.Print ("fel få temperatur");
}
annat
{
Serial.Print(tempout); Serial.Print ("grader C * 100");
}
}
void printInsideTemperature(DeviceAddress deviceAddress)
{
float temp = sensors.getTempC(deviceAddress);
tempint = härda;
om (tempint ==-127.00)
{
Serial.Print ("fel få temperatur");
}
annat
{
Serial.Print(tempint); Serial.Print ("grader CC * 100");
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void networkStatus()
{
Läs nätverk/cellulär status
uint8_t n = fona.getNetworkStatus();
Serial.println("");
Serial.Print F ("Network status").
Serial.Print(n);
Serial.Print (F(":"));
om (n == 0) Serial.println F ("inte registrerad").
om (n == 1) Serial.println F ("registrerad (hem)").
om (n == 2) Serial.println F ("inte registrerade (söka)").
om (n == 3) Serial.println(F("Denied"));
om (n == 4) Serial.println(F("Unknown"));
om (n == 5) Serial.println F ("registrerad" roaming").
Serial.println ("nätverksstatus måste vara" registrerad""hem"i raden ovan");
Serial.println("");
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void turnOnGPRS()
{
Serial.println ("nu försöker aktivera GPRS...");
om (! fona.enableGPRS(true))
Serial.println F ("No - det gick inte att slå på").
Serial.println ("GPRS är på om raden ovan visar"OK"");
Serial.println ("vänta i 10 sekunder för att se till att GPRS är på...");
fördröjning (10000);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void printData()
{
Serial.Print ("Probe01 (utanför) temp:");
printOutsideTemperature(Probe01);
Serial.println();
Serial.Print ("Probe02 (jord) temp:");
printSoilTemperature(Probe02);
Serial.println();
Serial.Print ("Probe03 (tempint) temp:");
printInsideTemperature(Probe03);
Serial.println();
Serial.Print ("Main batterispänning:"); Serial.println(volts);
Serial.Print ("i2c maxWindPulseRate:"); Serial.println(windgust); Inte kalibrerat ännu.
Serial.Print ("i2c avWindPulseRate:"); Serial.println(windspeed);
Serial.Print ("i2c windDirection:"); Serial.println(windDirection);
Serial.Print ("i2c regn:"); Serial.println(Rain);
Serial.Print ("i2c moistureValue:"); Serial.println(moistureValue);
Serial.Print ("lufttryck:"); Serial.Print(Pressure); Serial.println ("hPa * 100");
Serial.Print ("luftfuktighet:");
Serial.Print(humidity);
Serial.println ("% \t");
Serial.Print ("DHT22 temp:");
Serial.Print(tempDHT22);
Serial.println ("* C");
Serial.Print ("Värmeindex:");
Serial.Print(heatindex);
Serial.println ("* C");
Serial.println("");
} < /p >