Schritt 22: MEGA 2560 vollständigen Code
< p > / / SLAVE siehe Anhang Textdatei für vollständige Details. < 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 / / Pin 5 //Sends ein Rückruf signal zur master bei erfolgreicher Datenübertragung. DHT Dht (DHTPIN, DHTTYPE); OneWire oneWire(ONE_WIRE_BUS_PIN); DallasTemperature Sensoren (& OneWire); DeviceAddress Probe01 = {0x28, 0xFF, 0xA3, 0x4D, 0 x 00, 0x16, 0x03, 0xEC}; Das sind die Adressen der temp Sonden DS18B20 DeviceAddress Probe02 = {0x28, 0x4E, 0xCA, 0 x 80, 0 x 04, 0 x 00, 0 x 00, 0xA0}; DeviceAddress Probe03 = {0x28, 0x7C, 0x8A, 0x5D, 0 x 05, 0 x 00, 0 x 00, 0xFD}; const lange Frettchen = 179224; Int n = 0; Int Z = 0; Int Feuchtigkeit = 0; unsigned long Heatindex = 0; unsigniert lange Feuchtigkeit = 0; unsigned long tempDHT22 = 0; unsigned long Windspeed = 0; unsigned long Windgust = 0; unsigned long AvWindPulseRate = 0; unsigned long MaxWindPulseRate = 0; unsigned long Regen = 0; unsigned long Windrichtung = 0; unsigned long Windkanal = 0; unsigned long MoistureValue = 0; unsigned long Druck = 0; unsigned long Volt = 1200; multipliziert mit 100. unsigned long Tempint; unsigned long Tempout; unsigned long Tempsoil; unsigned long PreviousMillis = 0; const langes Intervall = 10000; Dies ist ein großer Puffer für Antworten Char Replybuffer [255]; Zeichenfolge-Initiator, Datenstring; const Char WebAddress [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, Maxbuff uint8_t, uint16_t Timeout = 0); uint8_t Art; void setup() {Serial.begin(115200); PinMode (5, OUTPUT); //Sends einen Anruf zurück Signal, wenn erfolgreiche Stammdaten Übertragung. PinMode (6, OUTPUT); / / setzt FONA digitalWrite(6,LOW); / / Verzögerung (1000); / / digitalWrite(6,HIGH); / / Verzögerung (100); / / digitalWrite(6,LOW); dht.begin(); if(!bmp.begin()) {/ * gab es ein Problem erkennen die BMP085... Überprüfen Sie die Anschlüsse * / Serial.print ("Ooops, keine BMP085 erkannt... Überprüfen Sie Ihre Verkabelung oder I2C ADDR!"); while(1); } Wire.begin(9); Wire.onReceive(receiveEvent); während (!) Seriell); Verwenden Sie diese für die Initiierung Programm durch Öffnen des seriellen Monitor. Löschen Sie im Normalbetrieb. Serial.println (F ("FONA basic Test")); Serial.println (F ("Initializing... (Dauert 3 Sekunden) ")); Sensors.Begin(); Temperatur-Sensoren DS18B20. sensors.setResolution (Probe01, 11); War auf Pin 10 in Version 09 sensors.setResolution (Probe02, 11); sensors.setResolution (Probe03, 11); FonaSerial -> begin(4800); Wenn (! fona.begin(*fonaSerial)) {Serial.println (F ("konnte nicht finden FONA")); während (1);} Typ = fona.type(); Serial.println (F ("FONA ist" OK"")); Serial.Print (F ("gefunden")); Schalter (Typ) {case FONA800L: Serial.println (F ("FONA 800L")); Break; Case FONA800H: Serial.println (F ("FONA 800H")); Break; Case FONA808_V1: Serial.println (F ("FONA 808 (v1)")); Break; Case FONA808_V2: Serial.println (F ("FONA 808 (v2)")); Break; Case FONA3G_A: Serial.println (F ("FONA 3G (amerikanisch)")); Break; Case FONA3G_E: Serial.println (F ("FONA 3G (Europäischen)")); Break; Default: Serial.println(F("???")); Break;} networkStatus(); Überprüfen Sie, dass das Netzwerk verfügbar ist. Haus ist gut. FONA Test drucken Modul IMEI-Nummer. Char Imei [15] = {0}; MÜSSEN einen 16 Zeichenpuffer für IMEI verwenden! uint8_t ImeiLen = fona.getIMEI(imei); Wenn (ImeiLen > 0) {Serial.print ("Modul IMEI:"); Serial.println(IMEI); } Serial.println(""); Serial.println ("überprüfen, dass GPRS zunächst ausgeschaltet ist..."); fona.setGPRSNetworkSettings(F("pp.vodafone.co.uk"), F("wap"), F("wap")); Ändern Sie diese Einstellungen! (APN, Benutzername, Passwort) Netzwerkverzögerung (1000); GPRS deaktivieren: Wenn ()
! fona.enableGPRS(false)) Serial.println (F ("No - Fehler beim Deaktivieren")); Serial.println wurde ("Wenn die Zeile oben sagt, OK, dann GPRS nur ausgeschaltet"); Verzögerung (1000); Serial.println(""); Serial.println ("warten auf Daten von i2c..."); Serial.println("");} void loop() {wenn (Z > 0) / / diese Schleife wird ausgelöst, wenn z größer als 1 ist. Der Wert von z ergibt sich aus der Quittung {/ / i2c-Daten. Es muss eine zweite Z-Evaluierung Fona schalten Sie die GPRS-networkStatus() zu aktivieren; und Datenverlust in die zeitliche Lücke zu verhindern. Volt = AnalogRead (0) * 4.688; Alle Dezimalstellen werden in Ganzzahlen konvertiert, da wir keine Dezimalstelle Charakter durch HTTP senden möchten. / / Lesung Temperatur oder Luftfeuchtigkeit dauert ca. 250 Millisekunden! Sensor-Werte kann auch bis zu 2 Sekunden "alten" (es ist ein sehr langsam Sensor) schweben h = dht.readHumidity(); Lesen Sie Temperatur Celsius (Standard) schweben t = dht.readTemperature(); Lesen Sie Temperatur Fahrenheit (IsFahrenheit = True) schweben f = dht.readTemperature(true); Verzögerung (3000); Überprüfen Sie, ob alle Lesevorgänge gescheitert und exit früh (erneut versuchen). Wenn (isnan(h) || isnan(t) || isnan(f)) {Serial.println ("Fehler beim Lesen von DHT Sensor!"); return;} / / Compute Hitzeindex in Fahrenheit (Standard) schweben Hif = dht.computeHeatIndex (f, h); Hitzeindex in Celsius zu berechnen (IsFahreheit = False) schweben Hic = dht.computeHeatIndex (t, h, False); Luftfeuchtigkeit = h; tempDHT22 = t; Heatindex = Hic; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// sensors_event_t event; Bmp.getEvent(&event); Wenn (event.pressure) {Druck = (event.pressure) * 100;} / / / sensors.requestTemperatures(); DS18B20s Windgeschwindigkeit = AvWindPulseRate * 20; Windgust = MaxWindPulseRate * 20; Windkanal = Windrichtung; Feuchtigkeit = MoistureValue * 1,08; printData(); Druckt die Daten auf seriell zum Debuggen. Serial.Print (F ("FONA >")); turnOnGPRS(); turnOnGPRS(); Website-URL uint16_t Statuscode zu lesen; int16_t Länge; Char-Url [180]; flushSerial(); weatherData(); / / Dies ist, wo die Daten in ein Charakter... kompiliert ist Datenstring = Initiator + WebAddress + "Windstärke =" + Windspeed + "& Windgust =" + Windgust + "& Windkanal =" + Windkanal + "& Tempout =" + Tempout + "& Tempsoil =" + Tempsoil + "& Regen =" + Regen + "& Feuchtigkeit =" + feuchte + "& Druck =" + Druck + "& Volt =" + Volt + "& Feuchtigkeit =" + Feuchtigkeit + "& Tempint =" + Tempint + "& Frettchen =" + Frettchen; Int n = dataString.length(); Serial.Print ("Daten-String senden:"); Serial.println(dataString); Serial.Print ("Größe der Zeichenfolge:"); Serial.println(n); Baut das Url-Zeichen: für (Int aa = 0; aa < = n; aa ++) {Url [aa] = Datenstring [aa];} Serial.Print ("Charakter der zu sendenden Daten:"); Serial.println(URL); Serial.println(""); / /... und an Sie per HTTP eine PHP-Datei namens send.php bereit, es zu empfangen. Serial.Print ("Url senden... "); Serial.Print ("Compiled Url ist:"); Serial.println(URL); Serial.println(F("***")); Wenn (! Fona. HTTP_GET_start(URL, &Statuscode, (uint16_t *) & Länge)) {Serial.println("Failed!");} (Länge > 0) {während (fona.available()) {Char c = fona.read(); / / Serial.write ist zu langsam, wir schreiben direkt an seriellen Register! #if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__) Loop_until_bit_is_set (UCSR0A, UDRE0); / * warten Sie, bis Daten leer. registrieren * / UDR0 = c; #else DigitalWrite (5, HIGH); / / Rückruf an Meister zu sagen, dass potentielle war erfolgreich. Ton (7 ((windway*15) + 400), 1000); noTone(7); Serial.Write(c); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #endif length--; Wenn (! Länge) brechen; {}} Serial.println(F("\n***")); FONA. HTTP_GET_end(); Serial.println ("warten Sie 10 Sekunden..."); Delay(500); DigitalWrite (5, LOW); Verzögerung (10000); GPRS deaktivieren: Wenn (! fona.enableGPRS(false)) Serial.println (F ("No - Fehler beim Deaktivieren")); Serial.println ("GPRS deaktiviert?"); Serial.println ("warten auf Daten von i2c..."); Spülen Sie Eingabe flushSerial(); während (fona.available()) {Serial.write(fona.read());} Z = 0; {}} / / Ende der Hauptschleife. / / Funktionen: void flushSerial() {während (Serial.available()) Serial.read();} readBlocking() char {Weile (!) Serial.available()); Rückkehr Serial.read(); } uint16_t readnumber() {uint16_t X = 0; char c; zwar (! Isdigit (c = readBlocking())) {/ / Serial.print(c);} Serial.Print(c); X = c - '0'; während (Isdigit (c = readBlocking())) {Serial.print(c); X * = 10; X += c - '0';} return x; } uint8_t "ReadLine" (Char * Buff, Maxbuff uint8_t, uint16_t Timeout) {uint16_t Buffidx = 0; boolesche Timeoutvalid = True; wenn (Timeout == 0) Timeoutvalid = False; zwar (True) {wenn (Buffidx > Maxbuff) {/ / Serial.println(F("SPACE")); Break;} während (Serial.available()) {Char c = Serial.read(); //Serial.print (c, HEX); Serial.Print("#"); Serial.println(c); Wenn (c == '\r') weiter; Wenn (c == 0xA) {wenn (Buffidx == 0) / / die erste 0x0A ignoriert weiter; Timeout = 0; / / die zweite 0x0A ist das Ende der Zeile Timeoutvalid = True; Break;} Buff [Buffidx] = c; Buffidx ++; } Wenn (Timeoutvalid & & Timeout == 0) {/ / Serial.println(F("TIMEOUT")); Break;} delay(1); } Buff [Buffidx] = 0; null Begriff Rückkehr Buffidx; } / / / void ReceiveEvent (Int Byte) {/ / sicherstellen, dass die Reihenfolge entspricht in Master und Slave. delay(10); MaxWindPulseRate = Wire.read(); delay(10); Windrichtung = Wire.read(); delay(10); Regen = Wire.read(); delay(10); AvWindPulseRate = Wire.read(); delay(10); MoistureValue = Wire.read(); delay(10); Z = 1; Feuchtigkeit = MoistureValue;} / / / void PrintSoilTemperature (DeviceAddress DeviceAddress) {Float Temp = sensors.getTempC(deviceAddress); Tempsoil = Temp * 100; wenn (Tempsoil ==-127.00) {Serial.print ("Fehler beim Abrufen Temperatur");} Else {Serial.print(tempsoil); Serial.Print ("Grad C * 100"); {}} void PrintOutsideTemperature (DeviceAddress DeviceAddress) {Float Temp = sensors.getTempC(deviceAddress); Tempout = Temp * 100; wenn (Tempout ==-127.00) {Serial.print ("Fehler beim Abrufen Temperatur");} Else {Serial.print(tempout); Serial.Print ("Grad C * 100"); {}} void PrintInsideTemperature (DeviceAddress DeviceAddress) {Float Temp = sensors.getTempC(deviceAddress); Tempint = Temp; wenn (Tempint ==-127.00) {Serial.print ("Fehler beim Abrufen Temperatur");} Else {Serial.print(tempint); Serial.Print ("Grad CC * 100"); {}} / / / void networkStatus() {/ / Netzwerk/Mobilfunk Status uint8_t n zu lesen = fona.getNetworkStatus(); Serial.println(""); Serial.Print (F ("Netzwerk-Status")); Serial.Print(n); Serial.Print (F(":")); Wenn (n == 0) Serial.println (F ("nicht registriert")); Wenn (n == 1) Serial.println (F ("registriert (Heim)")); Wenn (n == 2) Serial.println (F ("nicht registrierte (Suche)")); Wenn (n == 3) Serial.println(F("Denied")); Wenn (n == 4) Serial.println(F("Unknown")); Wenn (n == 5) Serial.println (F ("Registered roaming")); Serial.println ("Netzwerk-Status muss" registriert werden""zu Hause"in der Zeile oberhalb"); Serial.println("");} void turnOnGPRS() {Serial.println ("jetzt Versuch, GPRS aktivieren..."); Wenn ()! fona.enableGPRS(true)) Serial.println (F ("No - Fehler beim Schalten")); Serial.println ("GPRS ist auf, wenn die Zeile oben zeigt"OK""); Serial.println ("warten auf 10 Sekunden, um sicherzustellen, dass GPRS auf..."); Verzögerung (10000); } / / / void printData() {Serial.print ("Probe01 (außen) Temp:"); printOutsideTemperature(Probe01); Serial.println(); Serial.Print ("Probe02 (Boden) Temp:"); printSoilTemperature(Probe02); Serial.println(); Serial.Print ("Probe03 (Tempint) Temp:"); printInsideTemperature(Probe03); Serial.println(); Serial.Print ("Main Batteriespannung:"); Serial.println(Volts); Serial.Print ("i2c-MaxWindPulseRate:"); Serial.println(windgust); Noch kalibriert nicht. Serial.Print ("i2c-AvWindPulseRate:"); Serial.println(Windspeed); Serial.Print ("i2c Windrichtung:"); Serial.println(windDirection); Serial.Print ("i2c Regen:"); Serial.println(Rain); Serial.Print ("i2c-MoistureValue:"); Serial.println(moistureValue); Serial.Print ("atmosphärischen Druck:"); Serial.Print(Pressure); Serial.println ("hPa * 100"); Serial.Print ("Feuchtigkeit:"); Serial.Print(Humidity); Serial.println ("% \t"); Serial.Print ("DHT22 Temp:"); Serial.Print(tempDHT22); Serial.println ("* C"); Serial.Print ("Hitzeindex:"); Serial.Print(heatindex); Serial.println ("* C"); Serial.println("");} </p >